Class: Ace::TestRunner::Molecules::ConfigLoader
- Inherits:
-
Object
- Object
- Ace::TestRunner::Molecules::ConfigLoader
- Defined in:
- lib/ace/test_runner/molecules/config_loader.rb
Overview
Load configuration using Ace::Support::Config.create() API Follows ADR-022: Configuration Default and Override Pattern
Configuration priority (highest to lowest):
-
CLI options (handled by merge_with_options)
-
Explicit config_path if provided
-
Project config: .ace/test/runner.yml (nearest wins via cascade)
-
User config: ~/.ace/test/runner.yml
-
Gem defaults: ace-test-runner/.ace-defaults/test-runner/config.yml
Class Method Summary collapse
-
.deep_symbolize_keys(obj) ⇒ Object
Class method version for use in self.load_gem_defaults.
-
.load_gem_defaults ⇒ Hash
Load gem defaults for direct access (used by tests).
-
.reset_gem_defaults! ⇒ Object
Reset method for test isolation (no-op since we don’t cache at class level).
Instance Method Summary collapse
Class Method Details
.deep_symbolize_keys(obj) ⇒ Object
Class method version for use in self.load_gem_defaults
119 120 121 122 123 124 125 126 127 128 129 130 |
# File 'lib/ace/test_runner/molecules/config_loader.rb', line 119 def self.deep_symbolize_keys(obj) case obj when Hash obj.each_with_object({}) do |(key, value), result| result[key.to_sym] = deep_symbolize_keys(value) end when Array obj.map { |item| deep_symbolize_keys(item) } else obj end end |
.load_gem_defaults ⇒ Hash
Load gem defaults for direct access (used by tests)
22 23 24 25 26 27 28 29 30 31 32 33 34 |
# File 'lib/ace/test_runner/molecules/config_loader.rb', line 22 def self.load_gem_defaults gem_root = Gem.loaded_specs["ace-test-runner"]&.gem_dir || File.("../../../..", __dir__) resolver = Ace::Support::Config.create( config_dir: ".ace", defaults_dir: ".ace-defaults", gem_path: gem_root ) config = resolver.resolve_namespace("test-runner").data deep_symbolize_keys(config) end |
.reset_gem_defaults! ⇒ Object
Reset method for test isolation (no-op since we don’t cache at class level)
37 38 39 |
# File 'lib/ace/test_runner/molecules/config_loader.rb', line 37 def self.reset_gem_defaults! # No-op: Ace::Support::Config.create() is called fresh each time end |
Instance Method Details
#load(config_path = nil) ⇒ Object
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 |
# File 'lib/ace/test_runner/molecules/config_loader.rb', line 41 def load(config_path = nil) gem_root = Gem.loaded_specs["ace-test-runner"]&.gem_dir || File.("../../../..", __dir__) resolver = Ace::Support::Config.create( config_dir: ".ace", defaults_dir: ".ace-defaults", gem_path: gem_root ) # Get merged config from cascade config = resolver.resolve_file(["test-runner/config.yml", "test/runner.yml"]).data # If explicit config_path provided, merge it on top if config_path && File.exist?(config_path) user_config = load_from_file(config_path) config = Ace::Support::Config::Atoms::DeepMerger.merge(config, user_config) end # Convert to symbol keys for backward compatibility config = deep_symbolize_keys(config) validate_config(config) normalize_config(config) rescue => e warn "Warning: Could not load ace-test-runner config: #{e.}" if ENV["DEBUG"] # Return minimal valid config on error normalize_config({version: 1}) end |
#merge_with_options(config, options) ⇒ Object
71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 |
# File 'lib/ace/test_runner/molecules/config_loader.rb', line 71 def (config, ) merged = deep_copy(config) # Override defaults with command-line options if [:format] merged[:defaults] ||= {} merged[:defaults][:reporter] = [:format] end if .key?(:color) merged[:defaults] ||= {} merged[:defaults][:color] = [:color] end if .key?(:fail_fast) merged[:defaults] ||= {} merged[:defaults][:fail_fast] = [:fail_fast] end if [:report_dir] merged[:defaults] ||= {} merged[:defaults][:report_dir] = [:report_dir] end # Override failure limits with command-line options if [:max_display] merged[:failure_limits] ||= {} merged[:failure_limits][:max_display] = [:max_display] end OpenStruct.new(merged) end |