Class: Bundler::CLI

Inherits:
Thor
  • Object
show all
Includes:
Thor::Actions
Defined in:
lib/bundler/cli.rb,
lib/bundler/cli/gem.rb

Defined Under Namespace

Modules: Common Classes: Add, Binstubs, Cache, Check, Clean, Config, Console, Doctor, Exec, Fund, Gem, Info, Init, Inject, Install, Issue, List, Lock, Open, Outdated, Platform, Plugin, Pristine, Remove, Show, Update, Viz

Constant Summary collapse

AUTO_INSTALL_CMDS =
%w[show binstubs outdated exec open console licenses clean].freeze
PARSEABLE_COMMANDS =
%w[check config help exec platform show version].freeze
EXTENSIONS =
["c", "rust"].freeze
COMMAND_ALIASES =
{
  "check" => "c",
  "install" => "i",
  "plugin" => "",
  "list" => "ls",
  "exec" => ["e", "ex", "exe"],
  "cache" => ["package", "pack"],
  "version" => ["-v", "--version"],
}.freeze

Constants included from Thor::Actions

Thor::Actions::WARNINGS

Constants inherited from Thor

Thor::AmbiguousTaskError, Thor::Correctable, Thor::DynamicTask, Thor::HELP_MAPPINGS, Thor::HiddenTask, Thor::TEMPLATE_EXTNAME, Thor::THOR_RESERVED_WORDS, Thor::Task, Thor::UndefinedTaskError, Thor::VERSION

Instance Attribute Summary

Attributes included from Thor::Actions

#behavior

Attributes included from Thor::Base

#args, #options, #parent_options

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Thor::Actions

#action, #append_to_file, #apply, #chmod, #comment_lines, #copy_file, #create_file, #create_link, #destination_root, #destination_root=, #directory, #empty_directory, #find_in_source_paths, #get, #gsub_file, #in_root, included, #inject_into_class, #inject_into_module, #insert_into_file, #inside, #link_file, #prepend_to_file, #relative_to_original_destination_root, #remove_file, #run, #run_ruby_script, #source_paths, #template, #thor, #uncomment_lines

Methods inherited from Thor

check_unknown_options!, check_unknown_options?, command_help, default_command, deprecation_warning, desc, disable_required_check!, disable_required_check?, help, long_desc, map, method_option, method_options, package_name, printable_commands, register, stop_on_unknown_option!, stop_on_unknown_option?, subcommand, subcommand_classes, subcommands

Methods included from Thor::Base

included, register_klass_file, subclass_files, subclasses

Constructor Details

#initialize(*args) ⇒ CLI

Returns a new instance of CLI.



58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
# File 'lib/bundler/cli.rb', line 58

def initialize(*args)
  super

  custom_gemfile = options[:gemfile] || Bundler.settings[:gemfile]
  if custom_gemfile && !custom_gemfile.empty?
    Bundler::SharedHelpers.set_env "BUNDLE_GEMFILE", File.expand_path(custom_gemfile)
    Bundler.reset_settings_and_root!
  end

  Bundler.self_manager.restart_with_locked_bundler_if_needed

  Bundler.settings.set_command_option_if_given :retry, options[:retry]

  current_cmd = args.last[:current_command].name
  auto_install if AUTO_INSTALL_CMDS.include?(current_cmd)
rescue UnknownArgumentError => e
  raise InvalidOption, e.message
ensure
  self.options ||= {}
  unprinted_warnings = Bundler.ui.unprinted_warnings
  Bundler.ui = UI::Shell.new(options)
  Bundler.ui.level = "debug" if options["verbose"]
  unprinted_warnings.each {|w| Bundler.ui.warn(w) }
end

Class Method Details

.aliases_for(command_name) ⇒ Object



54
55
56
# File 'lib/bundler/cli.rb', line 54

def self.aliases_for(command_name)
  COMMAND_ALIASES.select {|k, _| k == command_name }.invert
end

.all_aliasesObject



40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/bundler/cli.rb', line 40

def self.all_aliases
  @all_aliases ||= begin
                     command_aliases = {}

                     COMMAND_ALIASES.each do |name, aliases|
                       Array(aliases).each do |one_alias|
                         command_aliases[one_alias] = name
                       end
                     end

                     command_aliases
                   end
end

.check_deprecated_ext_option(arguments) ⇒ Object



763
764
765
766
767
768
769
770
# File 'lib/bundler/cli.rb', line 763

def self.check_deprecated_ext_option(arguments)
  # when deprecated version of `--ext` is called
  # print out deprecation warning and pretend `--ext=c` was provided
  if deprecated_ext_value?(arguments)
    SharedHelpers.major_deprecation 2, "Extensions can now be generated using C or Rust, so `--ext` with no arguments has been deprecated. Please select a language, e.g. `--ext=rust` to generate a Rust extension. This gem will now be generated as if `--ext=c` was used."
    arguments[arguments.index("--ext")] = "--ext=c"
  end
end

.deprecated_ext_value?(arguments) ⇒ Boolean

Returns:

  • (Boolean)


772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
# File 'lib/bundler/cli.rb', line 772

def self.deprecated_ext_value?(arguments)
  index = arguments.index("--ext")
  next_argument = arguments[index+1]

  # it is ok when --ext is followed with valid extension value
  # for example `bundle gem hello --ext c`
  return false if EXTENSIONS.include?(next_argument)

  # deprecated call when --ext is called with no value in last position
  # for example `bundle gem hello_gem --ext`
  return true if next_argument.nil?

  # deprecated call when --ext is followed by other parameter
  # for example `bundle gem --ext --no-ci hello_gem`
  return true if next_argument.start_with?("-")

  # deprecated call when --ext is followed by gem name
  # for example `bundle gem --ext hello_gem`
  return true if next_argument

  false
end

.dispatchObject



33
34
35
36
37
38
# File 'lib/bundler/cli.rb', line 33

def self.dispatch(*)
  super do |i|
    i.send(:print_command)
    i.send(:warn_on_outdated_bundler)
  end
end

.handle_no_command_error(command, has_namespace = $thor_runner) ⇒ Object



142
143
144
145
146
147
148
149
150
# File 'lib/bundler/cli.rb', line 142

def self.handle_no_command_error(command, has_namespace = $thor_runner)
  if Bundler.feature_flag.plugins? && Bundler::Plugin.command?(command)
    return Bundler::Plugin.exec_command(command, ARGV[1..-1])
  end

  return super unless command_path = Bundler.which("bundler-#{command}")

  Kernel.exec(command_path, *ARGV[1..-1])
end

.reformatted_help_args(args) ⇒ Object

Reformat the arguments passed to bundle that include a –help flag into the corresponding ‘bundle help #command` call



736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
# File 'lib/bundler/cli.rb', line 736

def self.reformatted_help_args(args)
  bundler_commands = (COMMAND_ALIASES.keys + COMMAND_ALIASES.values).flatten

  help_flags = %w[--help -h]
  exec_commands = ["exec"] + COMMAND_ALIASES["exec"]

  help_used = args.index {|a| help_flags.include? a }
  exec_used = args.index {|a| exec_commands.include? a }

  command = args.find {|a| bundler_commands.include? a }
  command = all_aliases[command] if all_aliases[command]

  if exec_used && help_used
    if exec_used + help_used == 1
      %w[help exec]
    else
      args
    end
  elsif help_used
    args = args.dup
    args.delete_at(help_used)
    ["help", command || args].flatten.compact
  else
    args
  end
end

.source_rootObject



622
623
624
# File 'lib/bundler/cli.rb', line 622

def self.source_root
  File.expand_path("templates", __dir__)
end

.startObject



25
26
27
28
29
30
31
# File 'lib/bundler/cli.rb', line 25

def self.start(*)
  check_deprecated_ext_option(ARGV) if ARGV.include?("--ext")

  super
ensure
  Bundler::SharedHelpers.print_major_deprecations!
end

Instance Method Details

#add(*gems) ⇒ Object



390
391
392
393
# File 'lib/bundler/cli.rb', line 390

def add(*gems)
  require_relative "cli/add"
  Add.new(options.dup, gems).run
end

#binstubs(*gems) ⇒ Object



368
369
370
371
# File 'lib/bundler/cli.rb', line 368

def binstubs(*gems)
  require_relative "cli/binstubs"
  Binstubs.new(options, gems).run
end

#cacheObject



459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
# File 'lib/bundler/cli.rb', line 459

def cache
  SharedHelpers.major_deprecation 2,
    "The `--all` flag is deprecated because it relies on being " \
    "remembered across bundler invocations, which bundler will no longer " \
    "do in future versions. Instead please use `bundle config set cache_all true`, " \
    "and stop using this flag" if ARGV.include?("--all")

  SharedHelpers.major_deprecation 2,
    "The `--path` flag is deprecated because its semantics are unclear. " \
    "Use `bundle config cache_path` to configure the path of your cache of gems, " \
    "and `bundle config path` to configure the path where your gems are installed, " \
    "and stop using this flag" if ARGV.include?("--path")

  require_relative "cli/cache"
  Cache.new(options).run
end

#checkObject



177
178
179
180
181
182
# File 'lib/bundler/cli.rb', line 177

def check
  remembered_flag_deprecation("path")

  require_relative "cli/check"
  Check.new(options).run
end

#cleanObject



631
632
633
634
# File 'lib/bundler/cli.rb', line 631

def clean
  require_relative "cli/clean"
  Clean.new(options.dup).run
end

#cli_helpObject



87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
# File 'lib/bundler/cli.rb', line 87

def cli_help
  version
  Bundler.ui.info "\n"

  primary_commands = ["install", "update", "cache", "exec", "config", "help"]

  list = self.class.printable_commands(true)
  by_name = list.group_by {|name, _message| name.match(/^bundle (\w+)/)[1] }
  utilities = by_name.keys.sort - primary_commands
  primary_commands.map! {|name| (by_name[name] || raise("no primary command #{name}")).first }
  utilities.map! {|name| by_name[name].first }

  shell.say "Bundler commands:\n\n"

  shell.say "  Primary commands:\n"
  shell.print_table(primary_commands, :indent => 4, :truncate => true)
  shell.say
  shell.say "  Utilities:\n"
  shell.print_table(utilities, :indent => 4, :truncate => true)
  shell.say
  self.class.send(:class_options_help, shell)
end

#console(group = nil) ⇒ Object



521
522
523
524
# File 'lib/bundler/cli.rb', line 521

def console(group = nil)
  require_relative "cli/console"
  Console.new(options, group).run
end

#doctorObject



706
707
708
709
# File 'lib/bundler/cli.rb', line 706

def doctor
  require_relative "cli/doctor"
  Doctor.new(options).run
end

#envObject



692
693
694
# File 'lib/bundler/cli.rb', line 692

def env
  Env.write($stdout)
end

#exec(*args) ⇒ Object



486
487
488
489
490
491
492
493
# File 'lib/bundler/cli.rb', line 486

def exec(*args)
  if ARGV.include?("--no-keep-file-descriptors")
    SharedHelpers.major_deprecation(2, "The `--no-keep-file-descriptors` has been deprecated. `bundle exec` no longer mess with your file descriptors. Close them in the exec'd script if you need to")
  end

  require_relative "cli/exec"
  Exec.new(options, args).run
end

#fundObject



433
434
435
436
# File 'lib/bundler/cli.rb', line 433

def fund
  require_relative "cli/fund"
  Fund.new(options).run
end

#help(cli = nil) ⇒ Object



116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
# File 'lib/bundler/cli.rb', line 116

def help(cli = nil)
  case cli
  when "gemfile" then command = "gemfile"
  when nil       then command = "bundle"
  else command = "bundle-#{cli}"
  end

  man_path = File.expand_path("man", __dir__)
  man_pages = Hash[Dir.glob(File.join(man_path, "**", "*")).grep(/.*\.\d*\Z/).collect do |f|
    [File.basename(f, ".*"), f]
  end]

  if man_pages.include?(command)
    man_page = man_pages[command]
    if Bundler.which("man") && man_path !~ %r{^file:/.+!/META-INF/jruby.home/.+}
      Kernel.exec "man #{man_page}"
    else
      puts File.read("#{man_path}/#{File.basename(man_page)}.ronn")
    end
  elsif command_path = Bundler.which("bundler-#{cli}")
    Kernel.exec(command_path, "--help")
  else
    super
  end
end

#info(gem_name) ⇒ Object



345
346
347
348
# File 'lib/bundler/cli.rb', line 345

def info(gem_name)
  require_relative "cli/info"
  Info.new(options, gem_name).run
end

#initObject



160
161
162
163
# File 'lib/bundler/cli.rb', line 160

def init
  require_relative "cli/init"
  Init.new(options.dup).run
end

#inject(name, version) ⇒ Object



649
650
651
652
653
# File 'lib/bundler/cli.rb', line 649

def inject(name, version)
  SharedHelpers.major_deprecation 2, "The `inject` command has been replaced by the `add` command"
  require_relative "cli/inject"
  Inject.new(options.dup, name, version).run
end

#installObject



250
251
252
253
254
255
256
257
258
259
260
261
262
263
# File 'lib/bundler/cli.rb', line 250

def install
  SharedHelpers.major_deprecation(2, "The `--force` option has been renamed to `--redownload`") if ARGV.include?("--force")

  %w[clean deployment frozen no-prune path shebang system without with].each do |option|
    remembered_flag_deprecation(option)
  end

  remembered_negative_flag_deprecation("no-deployment")

  require_relative "cli/install"
  Bundler.settings.temporary(:no_install => false) do
    Install.new(options.dup).run
  end
end

#issueObject



712
713
714
715
# File 'lib/bundler/cli.rb', line 712

def issue
  require_relative "cli/issue"
  Issue.new.run
end

#licensesObject



544
545
546
547
548
549
550
551
552
553
554
555
# File 'lib/bundler/cli.rb', line 544

def licenses
  Bundler.load.specs.sort_by {|s| s.license.to_s }.reverse_each do |s|
    gem_name = s.name
    license  = s.license || s.licenses

    if license.empty?
      Bundler.ui.warn "#{gem_name}: Unknown"
    else
      Bundler.ui.info "#{gem_name}: #{license}"
    end
  end
end

#listObject



335
336
337
338
# File 'lib/bundler/cli.rb', line 335

def list
  require_relative "cli/list"
  List.new(options).run
end

#lockObject



686
687
688
689
# File 'lib/bundler/cli.rb', line 686

def lock
  require_relative "cli/lock"
  Lock.new(options).run
end

#open(name) ⇒ Object



514
515
516
517
# File 'lib/bundler/cli.rb', line 514

def open(name)
  require_relative "cli/open"
  Open.new(options, name).run
end

#outdated(*gems) ⇒ Object



425
426
427
428
# File 'lib/bundler/cli.rb', line 425

def outdated(*gems)
  require_relative "cli/outdated"
  Outdated.new(options, gems).run
end

#platformObject



639
640
641
642
# File 'lib/bundler/cli.rb', line 639

def platform
  require_relative "cli/platform"
  Platform.new(options).run
end

#pristine(*gems) ⇒ Object



723
724
725
726
# File 'lib/bundler/cli.rb', line 723

def pristine(*gems)
  require_relative "cli/pristine"
  Pristine.new(gems).run
end

#remove(*gems) ⇒ Object



192
193
194
195
196
# File 'lib/bundler/cli.rb', line 192

def remove(*gems)
  SharedHelpers.major_deprecation(2, "The `--install` flag has been deprecated. `bundle install` is triggered by default.") if ARGV.include?("--install")
  require_relative "cli/remove"
  Remove.new(gems, options).run
end

#show(gem_name = nil) ⇒ Object



324
325
326
327
328
# File 'lib/bundler/cli.rb', line 324

def show(gem_name = nil)
  SharedHelpers.major_deprecation(2, "the `--outdated` flag to `bundle show` was undocumented and will be removed without replacement") if ARGV.include?("--outdated")
  require_relative "cli/show"
  Show.new(options, gem_name).run
end

#update(*gems) ⇒ Object



307
308
309
310
311
312
313
# File 'lib/bundler/cli.rb', line 307

def update(*gems)
  SharedHelpers.major_deprecation(2, "The `--force` option has been renamed to `--redownload`") if ARGV.include?("--force")
  require_relative "cli/update"
  Bundler.settings.temporary(:no_install => false) do
    Update.new(options, gems).run
  end
end

#versionObject



528
529
530
531
532
533
534
535
536
537
538
539
# File 'lib/bundler/cli.rb', line 528

def version
  cli_help = current_command.name == "cli_help"
  if cli_help || ARGV.include?("version")
    build_info = " (#{BuildMetadata.built_at} commit #{BuildMetadata.git_commit_sha})"
  end

  if !cli_help && Bundler.feature_flag.print_only_version_number?
    Bundler.ui.info "#{Bundler::VERSION}#{build_info}"
  else
    Bundler.ui.info "Bundler version #{Bundler::VERSION}#{build_info}"
  end
end

#vizObject



569
570
571
572
573
# File 'lib/bundler/cli.rb', line 569

def viz
  SharedHelpers.major_deprecation 2, "The `viz` command has been renamed to `graph` and moved to a plugin. See https://github.com/rubygems/bundler-graph"
  require_relative "cli/viz"
  Viz.new(options.dup).run
end