.vbw-planning/milestones/03-coverage-analysis-quick-wins-critical-path-test-co/phases/03-large-file-refactoring/PLAN-02.md
Extract the 12 nested classes from lib/source_monitor/configuration.rb (655 lines) into individual files under lib/source_monitor/configuration/. Each nested class (HTTPSettings, FetchingSettings, HealthSettings, RealtimeSettings + SolidCableOptions, ScrapingSettings, RetentionSettings, ScraperRegistry, Events, Models, ModelDefinition + ConcernDefinition, ValidationDefinition, AuthenticationSettings + Handler) becomes its own file. The main configuration.rb retains only the Configuration class shell with constructor, queue_name_for, concurrency_for, attr_accessors, and attr_readers. The public API (SourceMonitor.configure { |c| ... }) remains unchanged.
Decomposition rationale: The Configuration file is large solely because it contains 12 independently testable classes. Unlike FeedFetcher (which requires careful method delegation), this extraction is mechanical: move each class to its own file, add require statements, and verify. The classes have no circular dependencies between them -- they're all leaf nodes of the Configuration tree.
Trade-offs considered:
realtime_settings.rb) since SolidCableOptions is only used by RealtimeSettings.model_definition.rb).authentication_settings.rb).What constrains the structure:
Configuration::HTTPSettings, Configuration::Events, etc.SourceMonitor::Configuration::EventsClass or through SourceMonitor.config.events -- both patterns must continue workingfrozen_string_literal: true pragma on all new files
</context>
lib/source_monitor/configuration/http_settings.rb (new)lib/source_monitor/configuration/fetching_settings.rb (new)lib/source_monitor/configuration/health_settings.rb (new)lib/source_monitor/configuration/scraping_settings.rb (new)lib/source_monitor/configuration.rblib/source_monitor/configuration/ directory. For each of the four settings classes (HTTPSettings lines 256-292, FetchingSettings lines 294-314, HealthSettings lines 316-336, ScrapingSettings lines 132-164), create a new file with the class defined as SourceMonitor::Configuration::ClassName. Each file gets frozen_string_literal: true. Add require statements at the top of configuration.rb: require "source_monitor/configuration/http_settings" etc. Remove the class bodies from configuration.rb. Verify the class is still accessible as SourceMonitor::Configuration::HTTPSettings.ruby -c lib/source_monitor/configuration/http_settings.rb lib/source_monitor/configuration/fetching_settings.rb lib/source_monitor/configuration/health_settings.rb lib/source_monitor/configuration/scraping_settings.rb exits 0 AND bin/rails test test/lib/source_monitor/configuration_test.rb exits 0lib/source_monitor/configuration/realtime_settings.rb (new, includes SolidCableOptions)lib/source_monitor/configuration/retention_settings.rb (new)lib/source_monitor/configuration/authentication_settings.rb (new, includes Handler struct)lib/source_monitor/configuration.rbruby -c lib/source_monitor/configuration/realtime_settings.rb lib/source_monitor/configuration/retention_settings.rb lib/source_monitor/configuration/authentication_settings.rb exits 0 AND bin/rails test test/lib/source_monitor/configuration_test.rb exits 0lib/source_monitor/configuration/scraper_registry.rb (new)lib/source_monitor/configuration/events.rb (new)lib/source_monitor/configuration/models.rb (new)lib/source_monitor/configuration/model_definition.rb (new, includes ConcernDefinition)lib/source_monitor/configuration/validation_definition.rb (new)lib/source_monitor/configuration.rbruby -c lib/source_monitor/configuration/scraper_registry.rb lib/source_monitor/configuration/events.rb lib/source_monitor/configuration/models.rb lib/source_monitor/configuration/model_definition.rb lib/source_monitor/configuration/validation_definition.rb exits 0 AND bin/rails test test/lib/source_monitor/configuration_test.rb exits 0 AND wc -l lib/source_monitor/configuration.rb shows fewer than 120 lineslib/source_monitor/configuration.rblib/source_monitor/configuration/*.rbwc -l on all extracted files and the main configuration.rb. Verify no extracted file exceeds 300 lines. Verify the main file is under 120 lines. Run bin/rubocop lib/source_monitor/configuration.rb lib/source_monitor/configuration/ to verify style compliance. Run bin/rails test for the full suite. Fix any RuboCop issues (likely just the frozen_string_literal pragma which should already be present).wc -l lib/source_monitor/configuration.rb shows fewer than 120 lines AND no file in lib/source_monitor/configuration/ exceeds 300 lines AND bin/rails test exits 0 with 760+ runs AND bin/rubocop lib/source_monitor/configuration.rb lib/source_monitor/configuration/ exits 0wc -l lib/source_monitor/configuration.rb shows fewer than 120 linesls lib/source_monitor/configuration/*.rb | wc -l shows 12 filesbin/rails test test/lib/source_monitor/configuration_test.rb exits 0bin/rails test exits 0 (no regressions)bin/rubocop lib/source_monitor/configuration.rb lib/source_monitor/configuration/ exits 0