Class: SvgConform::QualityMetrics::QualityCalculator

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

Overview

Calculates quality score (0-100) and determines quality level.

Examples:

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

score = calculator.calculate(validation_result, error_breakdown, 10240)
puts score.value   # => 85
puts score.level    # => :good
puts score.good?    # => true

Instance Method Summary collapse

Constructor Details

#initialize(config) ⇒ QualityCalculator

Returns a new instance of QualityCalculator.

Parameters:



18
19
20
# File 'lib/svg_conform/quality_metrics/quality_calculator.rb', line 18

def initialize(config)
  @config = config
end

Instance Method Details

#calculate(_validation_result, error_breakdown, file_size_bytes) ⇒ QualityScore

Calculate quality score

Parameters:

Returns:



28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# File 'lib/svg_conform/quality_metrics/quality_calculator.rb', line 28

def calculate(_validation_result, error_breakdown, file_size_bytes)
  formula = @config.quality_formula
  base_score = 100.0

  if error_breakdown.clean?
    return QualityScore.new(
      value: (base_score + formula.valid_structure_bonus).clamp(0, 100).to_i,
      level: :excellent,
    )
  end

  # 1. Penalize error density (errors per KB)
  file_size_kb = file_size_bytes.to_f / 1024.0
  error_density = error_breakdown.total.to_f / [file_size_kb, 0.1].max
  density_penalty = (error_density * formula.error_density_weight).clamp(
    0,
    formula.error_density_max_penalty,
  )
  base_score -= density_penalty

  # 2. Penalize non-remediable errors
  non_remediable_penalty = (error_breakdown.non_remediable * formula.non_remediable_weight).clamp(
    0,
    formula.non_remediable_max_penalty,
  )
  base_score -= non_remediable_penalty

  # 3. Penalize critical errors
  critical_penalty = (error_breakdown.critical * formula.critical_weight).clamp(
    0,
    formula.critical_max_penalty,
  )
  base_score -= critical_penalty

  # 4. Penalize high-severity errors
  high_penalty = (error_breakdown.high * formula.high_weight).clamp(
    0,
    formula.high_max_penalty,
  )
  base_score -= high_penalty

  score_value = base_score.clamp(0, 100).to_i
  score_level = @config.quality_level_for(score_value)

  QualityScore.new(value: score_value, level: score_level)
end

#calculate_all(validation_result:, file_path:, file_size_bytes:, error_breakdown:, complexity_metrics:, feature_flags:) ⇒ QualityResult

Calculate all quality metrics at once

Parameters:

Returns:



84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
# File 'lib/svg_conform/quality_metrics/quality_calculator.rb', line 84

def calculate_all(validation_result:, file_path:, file_size_bytes:,
                 error_breakdown:, complexity_metrics:, feature_flags:)
  quality_score = calculate(validation_result, error_breakdown, file_size_bytes)
  file_size_kb = file_size_bytes.to_f / 1024.0

  QualityResult.new(
    file_path: file_path,
    file_size_kb: file_size_kb.round(2),
    quality_score: quality_score,
    error_breakdown: error_breakdown,
    complexity: complexity_metrics,
    features: feature_flags,
    content_health: determine_content_health(error_breakdown),
    size_category: @config.size_category_for(file_size_kb),
  )
end