Class: SvgConform::QualityMetrics::Configuration

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

Overview

Immutable, type-safe configuration for SVG quality metrics.

Loads from YAML and provides typed access to all configuration values. Configuration is completely encapsulated - no raw hash exposure.

Examples:

config = Configuration.default

# Access typed values
config.severity_weight(:critical)  # => 5
config.quality_level_for(85)       # => :good

Custom configuration

custom = Configuration.from_hash({
  "severity_levels" => {"critical" => {"default_weight" => 10}}
})
merged = config.merge(custom)

Defined Under Namespace

Classes: ComplexityConfig, ContentHealthConfig, QualityFormula, QualityLevel, SeverityLevel

Constant Summary collapse

DEFAULT_CONFIG_PATH =
File.join(__dir__,
"../../../config/quality_metrics.yml").freeze

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(hash) ⇒ Configuration

Returns a new instance of Configuration.



54
55
56
57
# File 'lib/svg_conform/quality_metrics/configuration.rb', line 54

def initialize(hash)
  @hash = hash.freeze
  freeze
end

Class Method Details

.defaultConfiguration

Returns Default configuration from bundled YAML.

Returns:



31
32
33
# File 'lib/svg_conform/quality_metrics/configuration.rb', line 31

def default
  from_yaml(DEFAULT_CONFIG_PATH)
end

.from_hash(hash) ⇒ Configuration

Parameters:

  • hash (Hash)

    Configuration hash

Returns:



49
50
51
# File 'lib/svg_conform/quality_metrics/configuration.rb', line 49

def from_hash(hash)
  new(hash)
end

.from_yaml(path) ⇒ Configuration

Parameters:

  • path (String)

    Path to YAML file

Returns:



37
38
39
40
41
42
43
44
45
# File 'lib/svg_conform/quality_metrics/configuration.rb', line 37

def from_yaml(path)
  unless File.exist?(path)
    raise ArgumentError, "Configuration file not found: #{path}"
  end

  hash = YAML.safe_load_file(path, permitted_classes: [Symbol],
                                   permitted_symbols: [], aliases: true)
  new(hash)
end

Instance Method Details

#complexityComplexityConfig

Returns:



182
183
184
# File 'lib/svg_conform/quality_metrics/configuration.rb', line 182

def complexity
  @complexity ||= ComplexityConfig.new(@hash["complexity"] || {})
end

#content_healthContentHealthConfig

Returns:



200
201
202
# File 'lib/svg_conform/quality_metrics/configuration.rb', line 200

def content_health
  @content_health ||= ContentHealthConfig.new(@hash["content_health"] || {})
end

#feature_patternsHash<Symbol, Regexp>

Returns:

  • (Hash<Symbol, Regexp>)


191
192
193
# File 'lib/svg_conform/quality_metrics/configuration.rb', line 191

def feature_patterns
  @feature_patterns ||= compile_patterns(@hash["feature_patterns"] || {})
end

#merge(other) ⇒ Configuration

Returns Merged configuration.

Parameters:

Returns:



61
62
63
64
# File 'lib/svg_conform/quality_metrics/configuration.rb', line 61

def merge(other)
  merged = deep_merge(@hash, other.instance_variable_get(:@hash))
  Configuration.from_hash(merged)
end

#non_remediable?(violation_type) ⇒ Boolean

Parameters:

  • violation_type (Symbol)

Returns:

  • (Boolean)


125
126
127
# File 'lib/svg_conform/quality_metrics/configuration.rb', line 125

def non_remediable?(violation_type)
  non_remediable_types.include?(violation_type)
end

#non_remediable_typesSet<Symbol>

Returns Non-remediable violation types.

Returns:

  • (Set<Symbol>)

    Non-remediable violation types



111
112
113
114
115
# File 'lib/svg_conform/quality_metrics/configuration.rb', line 111

def non_remediable_types
  @non_remediable_types ||= Set.new(
    (@hash["non_remediable_types"] || []).map(&:to_sym),
  )
end

#quality_formulaQualityFormula

Returns:



134
135
136
# File 'lib/svg_conform/quality_metrics/configuration.rb', line 134

def quality_formula
  @quality_formula ||= QualityFormula.new(@hash["quality_formula"] || {})
end

#quality_level_for(score) ⇒ Symbol

Get quality level name for a score

Parameters:

  • score (Integer, Float)

Returns:

  • (Symbol)


150
151
152
153
154
155
# File 'lib/svg_conform/quality_metrics/configuration.rb', line 150

def quality_level_for(score)
  quality_levels.sort_by { |_, v| v.min_score }.reverse_each do |name, level|
    return name if score >= level.min_score
  end
  :critical
end

#quality_levelsHash<Symbol, QualityLevel>

Returns:



143
144
145
# File 'lib/svg_conform/quality_metrics/configuration.rb', line 143

def quality_levels
  @quality_levels ||= build_quality_levels
end

#remediable?(violation_type) ⇒ Boolean

Parameters:

  • violation_type (Symbol)

Returns:

  • (Boolean)


119
120
121
# File 'lib/svg_conform/quality_metrics/configuration.rb', line 119

def remediable?(violation_type)
  remediable_types.include?(violation_type)
end

#remediable_typesSet<Symbol>

Returns Remediable violation types.

Returns:

  • (Set<Symbol>)

    Remediable violation types



104
105
106
107
108
# File 'lib/svg_conform/quality_metrics/configuration.rb', line 104

def remediable_types
  @remediable_types ||= Set.new(
    (@hash["remediable_types"] || []).map(&:to_sym),
  )
end

#severity_for(violation_type) ⇒ Symbol?

Get severity level for a violation type

Parameters:

  • violation_type (Symbol)

Returns:

  • (Symbol, nil)

    :critical, :high, :medium, :low, or nil



78
79
80
81
82
83
# File 'lib/svg_conform/quality_metrics/configuration.rb', line 78

def severity_for(violation_type)
  severity_levels.each do |name, level|
    return name if level.violation_types.include?(violation_type)
  end
  nil
end

#severity_levelsHash<Symbol, SeverityLevel>

Returns:



71
72
73
# File 'lib/svg_conform/quality_metrics/configuration.rb', line 71

def severity_levels
  @severity_levels ||= build_severity_levels
end

#severity_max_penalty(level) ⇒ Integer

Get max penalty for a severity level

Parameters:

  • level (Symbol)

Returns:

  • (Integer)


95
96
97
# File 'lib/svg_conform/quality_metrics/configuration.rb', line 95

def severity_max_penalty(level)
  severity_levels[level]&.max_penalty || 0
end

#severity_weight(level) ⇒ Integer

Get weight for a severity level

Parameters:

  • level (Symbol)

Returns:

  • (Integer)


88
89
90
# File 'lib/svg_conform/quality_metrics/configuration.rb', line 88

def severity_weight(level)
  severity_levels[level]&.default_weight || 0
end

#size_categoriesHash<Symbol, Integer>

Returns Category to threshold in KB.

Returns:

  • (Hash<Symbol, Integer>)

    Category to threshold in KB



162
163
164
165
166
# File 'lib/svg_conform/quality_metrics/configuration.rb', line 162

def size_categories
  @size_categories ||= @hash["size_categories"].to_h do |name, value|
    [name.to_sym, value.to_i]
  end
end

#size_category_for(size_kb) ⇒ Symbol

Parameters:

  • size_kb (Float)

Returns:

  • (Symbol)


170
171
172
173
174
175
# File 'lib/svg_conform/quality_metrics/configuration.rb', line 170

def size_category_for(size_kb)
  size_categories.sort_by { |_, v| v }.reverse_each do |name, threshold|
    return name if size_kb >= threshold
  end
  :huge
end