Class: SixthSense::Config

Inherits:
Object
  • Object
show all
Defined in:
lib/sixth_sense/config.rb

Constant Summary collapse

DEFAULT =
{
  "guardrail" => {
    "fail_under" => {},
    "require_level" => 0,
    "ratchet" => false,
    "tolerance" => 1.0,
    "diff_only" => false,
    "diff_ref" => "origin/main"
  },
  "quality" => {
    "assertion_roulette_threshold" => 3,
    "assertion_density_min" => 0.05,
    "smell_cap" => 5
  },
  "adequacy" => {
    "coverage_transform" => "raw",
    "coverage_gamma" => 0.5
  },
  "coverage" => {
    "enabled" => true,
    "load_path" => "lib",
    "checked_mode" => "windowed",
    "checked_window" => 20
  },
  "mutation" => {
    "engine" => "mutant",
    "mode" => "score",
    "score_engine" => "auto",
    "version_requirement" => ">= 0",
    "timeout" => 10,
    "timeout_policy" => "killed",
    "jobs" => "auto",
    "cache_dir" => ".sixth_sense_cache/kill_matrix",
    "neutral_runs" => 2,
    "max_mutants" => 500,
    "equivalent_threshold" => 0.2,
    "operators" => {
      "exclude" => []
    }
  }
}.freeze

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(data = DEFAULT) ⇒ Config

Returns a new instance of Config.



79
80
81
# File 'lib/sixth_sense/config.rb', line 79

def initialize(data = DEFAULT)
  @data = data
end

Instance Attribute Details

#dataObject (readonly)

Returns the value of attribute data.



49
50
51
# File 'lib/sixth_sense/config.rb', line 49

def data
  @data
end

Class Method Details

.deep_dup(value) ⇒ Object



68
69
70
71
72
73
74
75
76
77
# File 'lib/sixth_sense/config.rb', line 68

def self.deep_dup(value)
  case value
  when Hash
    value.each_with_object({}) { |(key, nested), copy| copy[key] = deep_dup(nested) }
  when Array
    value.map { |nested| deep_dup(nested) }
  else
    value
  end
end

.deep_merge(left, right) ⇒ Object



56
57
58
59
60
61
62
63
64
65
66
# File 'lib/sixth_sense/config.rb', line 56

def self.deep_merge(left, right)
  merged = deep_dup(left)
  right.each do |key, value|
    merged[key] = if merged[key].is_a?(Hash) && value.is_a?(Hash)
                    deep_merge(merged[key], value)
                  else
                    deep_dup(value)
                  end
  end
  merged
end

.load(path = ".sixth_sense.yml") ⇒ Object



51
52
53
54
# File 'lib/sixth_sense/config.rb', line 51

def self.load(path = ".sixth_sense.yml")
  file_data = File.file?(path) ? YAML.load_file(path) : {}
  new(deep_merge(DEFAULT, file_data || {}))
end

Instance Method Details

#fetch(*keys, default: nil) ⇒ Object



83
84
85
86
87
88
89
# File 'lib/sixth_sense/config.rb', line 83

def fetch(*keys, default: nil)
  keys.reduce(data) do |current, key|
    break default unless current.respond_to?(:fetch)

    current.fetch(key.to_s) { current.fetch(key.to_sym, default) }
  end
end