Class: CreateRubyGem::CLI

Inherits:
Object
  • Object
show all
Defined in:
lib/create_ruby_gem/cli.rb

Overview

Main entry point that orchestrates the entire create-ruby-gem flow.

Parses CLI flags, detects runtime versions, runs the interactive wizard (or loads a preset), builds the bundle gem command, and executes it. All collaborators are injected via constructor for testability.

Examples:

Run from the command line

CreateRubyGem::CLI.start(ARGV)

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(argv:, out:, err:, store:, detector:, runner:, prompter:, palette:) ⇒ CLI



57
58
59
60
61
62
63
64
65
66
67
# File 'lib/create_ruby_gem/cli.rb', line 57

def initialize(argv:, out:, err:, store:, detector:, runner:, prompter:, palette:)
  @argv = argv.dup
  @out = out
  @err = err
  @store = store
  @detector = detector
  @runner = runner
  @prompter = prompter
  @palette = palette || UI::Palette.new
  @options = {}
end

Class Method Details

.start(argv = ARGV, out: $stdout, err: $stderr, store: Config::Store.new, detector: Detection::Runtime.new, runner: nil, prompter: nil, palette: nil) ⇒ Integer

Constructs and runs a CLI instance with the given arguments.



26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# File 'lib/create_ruby_gem/cli.rb', line 26

def self.start(
  argv = ARGV,
  out: $stdout,
  err: $stderr,
  store: Config::Store.new,
  detector: Detection::Runtime.new,
  runner: nil,
  prompter: nil,
  palette: nil
)
  instance = new(
    argv: argv,
    out: out,
    err: err,
    store: store,
    detector: detector,
    runner: runner || Runner.new(out: out),
    prompter: prompter,
    palette: palette
  )
  instance.run
end

Instance Method Details

#runInteger

Runs the CLI: parses flags, dispatches to the appropriate action, and returns an exit code.



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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
# File 'lib/create_ruby_gem/cli.rb', line 73

def run
  parse_options!

  validate_top_level_flags!

  return print_version if @options[:version]
  return doctor if @options[:doctor]
  return list_presets if @options[:list_presets]
  return show_preset if @options[:show_preset]
  return delete_preset if @options[:delete_preset]

  runtime_versions = resolved_runtime_versions
  compatibility_entry = Compatibility::Matrix.for(runtime_versions.bundler)
  builder = CommandBuilder.new(compatibility_entry: compatibility_entry)
  bundler_defaults = Detection::BundlerDefaults.new.detect
  last_used = symbolize_keys(@store.last_used)

  gem_name = resolve_gem_name!
  selected_options =
    if @options[:preset]
      load_preset_options!
    else
      run_interactive_wizard!(
        gem_name: gem_name,
        builder: builder,
        compatibility_entry: compatibility_entry,
        last_used: last_used,
        runtime_versions: runtime_versions,
        bundler_defaults: bundler_defaults
      )
    end

  Options::Validator.new(compatibility_entry).validate!(gem_name: gem_name, options: selected_options)
  command = builder.build(gem_name: gem_name, options: selected_options)
  @runner.run!(command, dry_run: @options[:dry_run])
  @store.save_last_used(selected_options)
  save_preset_if_requested(selected_options)
  0
rescue OptionParser::ParseError, Error => e
  @err.puts(e.message)
  1
rescue Interrupt
  @err.puts(::CLI::UI.fmt('{{green:See ya!}}'))
  130
end