Class: SvgConform::QualityMetrics::ComplexityCalculator

Inherits:
Object
  • Object
show all
Defined in:
lib/svg_conform/quality_metrics/complexity_calculator.rb

Overview

Calculates complexity index (1-10) for SVG documents.

Examples:

config = Configuration.default
calculator = ComplexityCalculator.new(config)

metrics = calculator.calculate(element_count: 150, features: FeatureFlags.new(...))
puts metrics.index  # => 6.5
puts metrics.complexity_level  # => :complex

Instance Method Summary collapse

Constructor Details

#initialize(config) ⇒ ComplexityCalculator

Returns a new instance of ComplexityCalculator.

Parameters:



17
18
19
# File 'lib/svg_conform/quality_metrics/complexity_calculator.rb', line 17

def initialize(config)
  @config = config
end

Instance Method Details

#calculate(element_count:, features:, max_depth: nil) ⇒ ComplexityMetrics

Calculate complexity metrics

Parameters:

  • element_count (Integer)

    Number of elements in the document

  • features (FeatureFlags)

    Detected features

  • max_depth (Integer, nil) (defaults to: nil)

    Maximum nesting depth (optional, calculated if nil)

Returns:



27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/svg_conform/quality_metrics/complexity_calculator.rb', line 27

def calculate(element_count:, features:, max_depth: nil)
  element_score = Math.log10([element_count, 1].max) * @config.complexity.base_element_multiplier
  depth_score = (max_depth || 0) * @config.complexity.depth_weight
  feature_bonus = calculate_feature_bonus(features)

  complexity = element_score + depth_score + feature_bonus
  max_index = @config.complexity.max_index

  ComplexityMetrics.new(
    index: [complexity.clamp(1.0, max_index), 1.0].max,
    element_count: element_count,
    max_depth: max_depth || 0,
  )
end

#calculate_from_content(content:, features:) ⇒ ComplexityMetrics

Calculate complexity from raw content

Parameters:

Returns:



47
48
49
50
51
52
# File 'lib/svg_conform/quality_metrics/complexity_calculator.rb', line 47

def calculate_from_content(content:, features:)
  element_count = count_elements(content)
  max_depth = calculate_max_depth(content)

  calculate(element_count: element_count, features: features, max_depth: max_depth)
end