Module: Docscribe::CLI::ConfigBuilder

Defined in:
lib/docscribe/cli/config_builder.rb

Class Method Summary collapse

Class Method Details

.build(base, options) ⇒ Docscribe::Config

Note:

module_function: when included, also defines #build (instance visibility: private)

Build an effective config by applying CLI overrides on top of a base config.

CLI overrides currently affect:

  • method/file include and exclude filters

  • RBS enablement and additional signature directories

  • Sorbet enablement and RBI directories

If no relevant CLI override is present, the original config is returned unchanged.

Parameters:

  • base (Docscribe::Config)

    base config loaded from YAML/defaults

  • options (Hash)

    parsed CLI options

Returns:



23
24
25
26
27
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
# File 'lib/docscribe/cli/config_builder.rb', line 23

def build(base, options)
  needs_override =
    options[:include].any?      ||
    options[:exclude].any?      ||
    options[:include_file].any? ||
    options[:exclude_file].any? ||
    options[:rbs]               ||
    options[:rbs_collection]    ||
    options[:sig_dirs].any?     ||
    options[:sorbet]            ||
    options[:rbi_dirs].any?

  return base unless needs_override

  raw = Marshal.load(Marshal.dump(base.raw))

  raw['filter'] ||= {}
  raw['filter']['include'] = Array(raw['filter']['include']) + options[:include]
  raw['filter']['exclude'] = Array(raw['filter']['exclude']) + options[:exclude]

  raw['filter']['files'] ||= {}
  raw['filter']['files']['include'] = Array(raw['filter']['files']['include']) + options[:include_file]
  raw['filter']['files']['exclude'] = Array(raw['filter']['files']['exclude']) + options[:exclude_file]

  if options[:rbs] || options[:sig_dirs].any?
    raw['rbs'] ||= {}
    raw['rbs']['enabled'] = true
    raw['rbs']['sig_dirs'] = Array(raw['rbs']['sig_dirs']) + options[:sig_dirs] if options[:sig_dirs].any?

    if options[:rbs_collection]
      require 'docscribe/types/rbs/collection_loader'
      collection_path = Docscribe::Types::RBS::CollectionLoader.resolve
      if collection_path
        raw['rbs']['sig_dirs'] = Array(raw['rbs']['sig_dirs']) + [collection_path]
      else
        warn 'Docscribe: rbs_collection.lock.yaml not found or collection not installed. ' \
             'Run `bundle exec rbs collection install` first.'
      end
    end
  end

  if options[:sorbet] || options[:rbi_dirs].any?
    raw['sorbet'] ||= {}
    raw['sorbet']['enabled'] = true
    raw['sorbet']['rbi_dirs'] = Array(raw['sorbet']['rbi_dirs']) + options[:rbi_dirs] if options[:rbi_dirs].any?
  end

  Docscribe::Config.new(raw)
end