Class: BBK::Utils::Cli::Docs

Inherits:
Object
  • Object
show all
Defined in:
lib/bbk/utils/cli/docs.rb

Overview

Класс для генерации документации по конфигурации BBK

Обеспечивает парсинг аргументов командной строки, загрузку конфигурации и генерацию документации в форматах JSON и Markdown

Defined Under Namespace

Classes: Builder, Markdown

Instance Method Summary collapse

Constructor Details

#initialize(argv) ⇒ Docs

Инициализирует объект генератора документации

Parameters:

  • argv (Array<String>)

    аргументы командной строки



16
17
18
# File 'lib/bbk/utils/cli/docs.rb', line 16

def initialize(argv)
  @argv = argv
end

Instance Method Details

#extract_bbk_configHash

Извлекает конфигурацию BBK и преобразует её в удобный формат

Returns:

  • (Hash)

    конфигурация BBK с дополнительной информацией о типах



117
118
119
120
121
122
123
124
125
126
127
128
# File 'lib/bbk/utils/cli/docs.rb', line 117

def extract_bbk_config
  bbk_cfg = BBK::Utils::Config.instance.as_json.deep_dup
  bbk_cfg = bbk_cfg[BBK::Utils::Config.instance.name] unless BBK::Utils::Config.instance.name.nil?

  BBK::Utils::Config.instance.send(:store_with_subconfigs).each do |k, v|
    bbk_cfg[k][:default] = v[:default].original if v[:default]&.class&.to_s == 'Fugit::Duration'

    bbk_cfg[k][:_class] = v[:default].class.to_s unless v[:default].nil?
  end

  bbk_cfg.deep_symbolize_keys
end

#load_configuration(*files) ⇒ Hash

Загружает и объединяет конфигурации из нескольких файлов

Parameters:

  • files (Array<String>)

    пути к файлам конфигурации YAML

Returns:

  • (Hash)

    объединенная конфигурация с символизированными ключами



90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
# File 'lib/bbk/utils/cli/docs.rb', line 90

def load_configuration(*files)
  files.each_with_object({}) do |file, config|
    loaded = YAML.load_file(file).deep_symbolize_keys!

    config.deep_merge!(loaded) do |key, oldv, newv|
      result = newv

      if oldv.is_a?(Hash) || newv.is_a?(Hash)
        result = (oldv || {}).deep_merge(newv || {})
      elsif oldv.is_a?(Array) || newv.is_a?(Array)
        result = if key.to_s == 'patterns' || key.to_s == 'envs'
                   ([oldv].flatten + [newv].flatten).compact.map(&:to_s).map(&:strip)
                 else
                   (newv || [])
                 end
      else
        newv
      end

      result
    end
  end
end

#parse!(argv) ⇒ Hash

Парсит аргументы командной строки

Parameters:

  • argv (Array<String>)

    аргументы командной строки

Returns:

  • (Hash)

    хеш с опциями конфигурации



54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
# File 'lib/bbk/utils/cli/docs.rb', line 54

def parse!(argv)
  options = {
    config: './.bbkdocs.yml',
    output: './bbkdocs.md',
    categories: './bbkdocs.json'
  }

  OptionParser.new do |opts|
    opts.banner = 'Usage: bundle exec bin/bbkdocs [options]'

    opts.on('-c', '--config CONFIG', "Path to config file (default: #{options[:config]})") do |path|
      options[:config] = File.absolute_path(path.to_s.strip)
    end

    opts.on('-o', '--output OUTPUT', "Path to output file (default: #{options[:output]})") do |path|
      options[:output] = File.absolute_path(path.to_s.strip)
    end

    opts.on('-g', '--categories CATEGORIES',
            "Path to categories output file (default: #{options[:categories]})") do |path|
      options[:categories] = File.absolute_path(path.to_s.strip)
    end

    opts.on('-h', '--help', 'Prints this help') do
      puts opts
      exit
    end
  end.parse!(argv)

  options
end

#run(argv = @argv) ⇒ void

This method returns an undefined value.

Основной метод запуска генерации документации

Parameters:

  • argv (Array<String>) (defaults to: @argv)

    аргументы командной строки



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
# File 'lib/bbk/utils/cli/docs.rb', line 24

def run(argv = @argv)
  options = parse!(argv)

  bbk = extract_bbk_config

  config = load_configuration("#{__dir__}/bbkdocs.yml", options[:config])

  @builder = Builder.new(bbk, config).tap do |b|
    b.run
  end

  FileUtils.mkdir_p File.dirname(options[:categories])

  File.open(options[:categories], 'w') do |file|
    file << JSON.pretty_generate(@builder.as_json)
    puts "Documentation JSON saved to: #{options[:categories]}"
  end

  FileUtils.mkdir_p File.dirname(options[:output])

  File.open(options[:output], 'w') do |file|
    file << @builder.to_markdown
    puts "Documentation MArkdown saved to: #{options[:output]}"
  end
end