Class: RubyLLM::Generators::Provider::CLI

Inherits:
Object
  • Object
show all
Defined in:
lib/generators/ruby_llm/provider/cli.rb

Overview

Command-line interface for public provider gem generation.

Defined Under Namespace

Classes: HelpRequested

Constant Summary collapse

ACTION_LABELS =

:nodoc: all

{ written: 'create', updated: 'update', skipped: 'skip' }.freeze

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(argv, out:, err:) ⇒ CLI

Returns a new instance of CLI.



25
26
27
28
29
# File 'lib/generators/ruby_llm/provider/cli.rb', line 25

def initialize(argv, out:, err:)
  @argv = argv.dup
  @out = out
  @err = err
end

Class Method Details

.parse_options(argv, mode:) ⇒ Object



21
22
23
# File 'lib/generators/ruby_llm/provider/cli.rb', line 21

def self.parse_options(argv, mode:)
  new(argv, out: StringIO.new, err: StringIO.new).parse_provider_options(mode:)
end

.run(argv, out: $stdout, err: $stderr) ⇒ Object



17
18
19
# File 'lib/generators/ruby_llm/provider/cli.rb', line 17

def self.run(argv, out: $stdout, err: $stderr)
  new(argv, out:, err:).run
end

Instance Method Details

#parse_provider_options(mode:) ⇒ Object

Raises:

  • (ArgumentError)


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
85
86
87
88
89
90
91
92
93
94
# File 'lib/generators/ruby_llm/provider/cli.rb', line 54

def parse_provider_options(mode:)
  options = { mode: mode }
  options[:destination] = Dir.pwd if mode == 'core'
  parser = OptionParser.new
  parser.banner = "Usage: #{command_for(mode)} [options]"
  parser.on('--destination PATH', 'Exact directory to write into') { |value| options[:destination] = value }
  parser.on('--api-base URL', 'Provider API base URL') { |value| options[:api_base] = value }
  parser.on('--api-key-env NAME', 'Environment variable for the provider API key') do |value|
    options[:api_key_env] = value
  end
  parser.on('--api-base-env NAME', 'Environment variable for the provider API base') do |value|
    options[:api_base_env] = value
  end
  parser.on('--dialect NAME', "Wire dialect: #{Scaffold::SUPPORTED_DIALECTS.join(', ')}") do |value|
    options[:dialect] = value
  end
  if mode == 'core'
    parser.on('--models-dev-provider NAME', 'models.dev provider key for first-party core providers') do |value|
      options[:models_dev_provider] = value
    end
  end
  parser.on('--[no-]dynamic-models', 'Allow model ids that are not in the registry') do |value|
    options[:dynamic_models] = value
  end
  if mode == 'gem'
    parser.on('--gem-name NAME', 'RubyGems package name') { |value| options[:gem_name] = value }
    parser.on('--github-owner OWNER', 'GitHub owner or organization for generated metadata') do |value|
      options[:github_owner] = value
    end
    parser.on('--skip-bundle', 'Do not run bundle install') { options[:skip_bundle] = true }
  end
  parser.on('--force', 'Overwrite existing generated files') { options[:force] = true }
  parser.on('-h', '--help', 'Print help') { raise HelpRequested, parser.to_s }

  parser.parse!(@argv)
  name = @argv.shift
  raise ArgumentError, parser.to_s unless name
  raise ArgumentError, "Unexpected arguments: #{@argv.join(' ')}" if @argv.any?

  [name, options]
end

#runObject



31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/generators/ruby_llm/provider/cli.rb', line 31

def run
  command = @argv.shift

  case command
  when 'provider-gem'
    generate_provider_gem
  when nil, 'help', '-h', '--help'
    @out.puts help
    0
  else
    @err.puts "Unknown command: #{command}"
    @err.puts
    @err.puts help
    1
  end
rescue HelpRequested => e
  @out.puts e.message
  0
rescue ArgumentError, OptionParser::ParseError => e
  @err.puts e.message
  1
end