123456789_123456789_123456789_123456789_123456789_

Class: Bundler::CLI

Relationships & Source Files
Namespace Children
Modules:
Classes:
Super Chains via Extension / Inclusion / Inheritance
Class Chain:
self, Thor
Instance Chain:
Inherits: Bundler::Thor
Defined in: lib/bundler/cli.rb,
lib/bundler/cli/gem.rb

Constant Summary

Thor - Inherited

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

Thor::Actions - Included

WARNINGS

Class Method Summary

Thor - Inherited

.at_least_one
.check_unknown_options!

Extend check unknown options to accept a hash of conditions.

.command_help

Prints help information for the given command.

.default_command

Sets the default command when thor is executed without an explicit command to be called.

.default_task
.desc

Defines the usage and the description of the next command.

.disable_required_check!

Disable the check for required options for the given commands.

.exclusive
.help

Prints help information for this class.

.long_desc

Defines the long description of the next command.

.map

Maps an input to a command.

.method_at_least_one

Adds and declares option group for required at least one of options in the block of arguments.

.method_exclusive

Adds and declares option group for exclusive options in the block and arguments.

.method_option

Adds an option to the set of method options.

.method_options

Declares the options for the next command to be declared.

.option
.options
.package_name

Allows for custom “Command” package naming.

.printable_commands

Returns commands ready to be printed.

.printable_tasks
.register

Registers another Thor subclass as a command.

.stop_on_unknown_option!

Stop parsing of options as soon as an unknown option or a regular argument is encountered.

.subcommand, .subcommand_classes, .subcommands,
.subtask

Alias for Thor.subcommand.

.subtasks

Alias for Thor.subcommands.

.task_help
.banner

The banner for this class.

.create_task
.find_command_possibilities

this is the logic that takes the command name passed in by the user and determines whether it is an unambiguous substrings of a command or alias name.

.find_task_possibilities
.normalize_task_name
.retrieve_task_name
.sort_commands!

Sort the commands, lexicographically by default.

.subcommand_help,
.subtask_help
.check_unknown_options?

Overwrite check_unknown_options? to take subcommands and options into account.

.deprecation_warning, .disable_required_check?, .stop_on_unknown_option?, .baseclass, .create_command,
.disable_required_check

help command has the required check disabled by default.

.dispatch

The method responsible for dispatching given the args.

.dynamic_command_class, .initialize_added,
.method_at_least_one_option_names

Returns this class at least one of required options array set.

.method_exclusive_option_names

Returns this class exclusive options array set.

.normalize_command_name

receives a (possibly nil) command name and returns a name that is in the commands hash.

.print_at_least_one_required_options, .print_exclusive_options,
.retrieve_command_name

Retrieve the command name from given args.

.stop_on_unknown_option

Instance Attribute Summary

Thor::Actions - Included

#behavior,
#destination_root

Returns the root for this thor class (also aliased as destination root).

#destination_root=

Sets the root for this thor class.

#output_buffer

Thor::Base - Included

Instance Method Summary

Thor::Actions - Included

#add_file
#add_link
#append_file
#append_to_file

Append text to a file.

#apply

Loads an external file and execute it in the instance binding.

#chmod

Changes the mode of the given file or directory.

#comment_lines

Comment all lines matching a given regex.

#copy_file

Examples.

#create_file

Create a new file relative to the destination root with the given data, which is the return value of a block or a data string.

#create_link

Create a new file relative to the destination root from the given source.

#directory

Copies recursively the files from source directory to root directory.

#empty_directory

Creates an empty directory.

#find_in_source_paths

Receives a file or directory and search for it in the source paths.

#get

Gets the content at the given address and places it at the given relative destination.

#gsub_file

Run a regular expression replacement on a file.

#in_root

Goes to the root and execute the given block.

#initialize

Extends initializer to add more configuration options.

#inject_into_class

Injects text right after the class definition.

#inject_into_file
#inject_into_module

Injects text right after the module definition.

#insert_into_file,
#inside

Do something in the root or on a provided subfolder.

#link_file

Links the file from the relative source to the relative destination.

#prepend_file
#prepend_to_file

Prepend text to a file.

#relative_to_original_destination_root

Returns the given path relative to the absolute root (ie, root where the script started).

#remove_dir
#remove_file

Removes a file at the given location.

#run

Executes a command returning the contents of the command.

#run_ruby_script

Executes a ruby script (taking into account WIN32 platform quirks).

#source_paths

Holds source paths in instance so they can be manipulated.

#template

Gets an ERB template at the relative source, executes it and makes a copy at the relative destination.

#thor

Run a thor command.

#uncomment_lines

Uncomment all lines matching a given regex.

#capture, #concat,
#action

Wraps an action object and call it accordingly to the thor class behavior.

#_cleanup_options_and_set,
#_shared_configuration

Allow current root to be shared between invocations.

#with_output_buffer

Thor - Inherited

Thor::Base - Included

#initialize

It receives arguments in an Array and two hashes, one for options and other for configuration.

Constructor Details

.new(*args) ⇒ CLI

[ GitHub ]

  
# File 'lib/bundler/cli.rb', line 59

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.auto_switch

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

  current_cmd = args.last[:current_command].name
  Bundler.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)

[ GitHub ]

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

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

.all_aliases

[ GitHub ]

  
# File 'lib/bundler/cli.rb', line 41

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)

[ GitHub ]

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

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)
    message = "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."
    removed_message = "Extensions can now be generated using C or Rust, so `--ext` with no arguments has been removed. Please select a language, e.g. `--ext=rust` to generate a Rust extension."
    SharedHelpers.major_deprecation 2, message, removed_message: removed_message
    arguments[arguments.index("--ext")] = "--ext=c"
  end
end

.deprecated_ext_value?(arguments) ⇒ Boolean

[ GitHub ]

  
# File 'lib/bundler/cli.rb', line 719

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

.dispatch

[ GitHub ]

  
# File 'lib/bundler/cli.rb', line 34

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)

[ GitHub ]

  
# File 'lib/bundler/cli.rb', line 145

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)

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

[ GitHub ]

  
# File 'lib/bundler/cli.rb', line 682

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 }

  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_root

[ GitHub ]

  
# File 'lib/bundler/cli.rb', line 588

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

.start

[ GitHub ]

  
# File 'lib/bundler/cli.rb', line 26

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)

[ GitHub ]

  
# File 'lib/bundler/cli.rb', line 357

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

#binstubs(*gems)

[ GitHub ]

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

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

#cache

[ GitHub ]

  
# File 'lib/bundler/cli.rb', line 417

def cache
  print_remembered_flag_deprecation("--all", "cache_all", "true") if ARGV.include?("--all")

  if ARGV.include?("--path")
    message =
      "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"
    removed_message =
      "The `--path` flag has been removed because its semantics were 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."
    SharedHelpers.major_deprecation 2, message, removed_message: removed_message
  end

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

#check

[ GitHub ]

  
# File 'lib/bundler/cli.rb', line 177

def check
  remembered_flag_deprecation("path")

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

#clean

[ GitHub ]

  
# File 'lib/bundler/cli.rb', line 595

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

#cli_help

[ GitHub ]

  
# File 'lib/bundler/cli.rb', line 88

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)

[ GitHub ]

  
# File 'lib/bundler/cli.rb', line 484

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

#current_command (private)

[ GitHub ]

  
# File 'lib/bundler/cli.rb', line 744

def current_command
  _, _, config = @_initializer
  config[:current_command]
end

#doctor

[ GitHub ]

  
# File 'lib/bundler/cli.rb', line 650

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

#env

[ GitHub ]

  
# File 'lib/bundler/cli.rb', line 638

def env
  Env.write($stdout)
end

#exec(*args)

[ GitHub ]

  
# File 'lib/bundler/cli.rb', line 447

def exec(*args)
  if ARGV.include?("--no-keep-file-descriptors")
    message = "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"
    removed_message = "The `--no-keep-file-descriptors` has been removed. `bundle exec` no longer mess with your file descriptors. Close them in the exec'd script if you need to"
    SharedHelpers.major_deprecation(2, message, removed_message: removed_message)
  end

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

#flag_deprecation(name, flag_name, option) (private)

[ GitHub ]

  
# File 'lib/bundler/cli.rb', line 804

def flag_deprecation(name, flag_name, option)
  name_index = ARGV.find {|arg| flag_name == arg.split("=")[0] }
  return unless name_index

  value = options[name]
  value = value.join(" ").to_s if option.type == :array
  value = "'#{value}'" unless option.type == :boolean

  print_remembered_flag_deprecation(flag_name, name.tr("-", "_"), value)
end

#fund

[ GitHub ]

  
# File 'lib/bundler/cli.rb', line 394

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

#gem(name) (private)

[ GitHub ]

  
# File 'lib/bundler/cli.rb', line 563

def gem(name)
end

#help(cli = nil)

[ GitHub ]

  
# File 'lib/bundler/cli.rb', line 117

def help(cli = nil)
  cli = self.class.all_aliases[cli] if self.class.all_aliases[cli]

  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.match?(%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)

[ GitHub ]

  
# File 'lib/bundler/cli.rb', line 318

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

#init

[ GitHub ]

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

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

#inject(name, version)

[ GitHub ]

  
# File 'lib/bundler/cli.rb', line 610

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

#install

[ GitHub ]

  
# File 'lib/bundler/cli.rb', line 234

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 without with].each do |option|
    remembered_flag_deprecation(option)
  end

  print_remembered_flag_deprecation("--system", "path.system", "true") if ARGV.include?("--system")

  remembered_negative_flag_deprecation("no-deployment")

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

#issue

[ GitHub ]

  
# File 'lib/bundler/cli.rb', line 656

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

#licenses

[ GitHub ]

  
# File 'lib/bundler/cli.rb', line 507

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

#list

[ GitHub ]

  
# File 'lib/bundler/cli.rb', line 308

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

#lock

[ GitHub ]

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

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

#open(name)

[ GitHub ]

  
# File 'lib/bundler/cli.rb', line 477

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

#outdated(*gems)

[ GitHub ]

  
# File 'lib/bundler/cli.rb', line 387

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

#platform

[ GitHub ]

  
# File 'lib/bundler/cli.rb', line 602

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

#pristine(*gems)

[ GitHub ]

  
# File 'lib/bundler/cli.rb', line 667

def pristine(*gems)
  require_relative "cli/pristine"
  Bundler.settings.temporary(no_install: false) do
    Pristine.new(gems).run
  end
end

#remembered_flag_deprecation(name) (private)

[ GitHub ]

  
# File 'lib/bundler/cli.rb', line 797

def remembered_flag_deprecation(name)
  option = current_command.options[name]
  flag_name = option.switch_name

  flag_deprecation(name, flag_name, option)
end

#remembered_negative_flag_deprecation(name) (private)

[ GitHub ]

  
# File 'lib/bundler/cli.rb', line 789

def remembered_negative_flag_deprecation(name)
  positive_name = name.gsub(/\Ano-/, "")
  option = current_command.options[positive_name]
  flag_name = "--no-" + option.switch_name.gsub(/\A--/, "")

  flag_deprecation(positive_name, flag_name, option)
end

#remove(*gems)

[ GitHub ]

  
# File 'lib/bundler/cli.rb', line 191

def remove(*gems)
  if ARGV.include?("--install")
    message = "The `--install` flag has been deprecated. `bundle install` is triggered by default."
    removed_message = "The `--install` flag has been removed. `bundle install` is triggered by default."
    SharedHelpers.major_deprecation(2, message, removed_message: removed_message)
  end

  require_relative "cli/remove"
  Remove.new(gems, options).run
end

#show(gem_name = nil)

[ GitHub ]

  
# File 'lib/bundler/cli.rb', line 293

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

#update(*gems)

[ GitHub ]

  
# File 'lib/bundler/cli.rb', line 276

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

#version

[ GitHub ]

  
# File 'lib/bundler/cli.rb', line 491

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

#viz

[ GitHub ]

  
# File 'lib/bundler/cli.rb', line 532

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

#warn_on_outdated_bundler (private)

[ GitHub ]

  
# File 'lib/bundler/cli.rb', line 765

def warn_on_outdated_bundler
  return if Bundler.settings[:disable_version_check]

  command_name = current_command.name
  return if PARSEABLE_COMMANDS.include?(command_name)

  return unless SharedHelpers.md5_available?

  require_relative "vendored_uri"
  remote = Source::Rubygems::Remote.new(Gem::URI("https://rubygems.org"))
  cache_path = Bundler.user_cache.join("compact_index", remote.cache_slug)
  latest = Bundler::CompactIndexClient.new(cache_path).latest_version("bundler")
  return unless latest

  current = Gem::Version.new(VERSION)
  return if current >= latest

  Bundler.ui.warn \
    "The latest bundler is #{latest}, but you are currently running #{current}.\n" \
    "To update to the most recent version, run `bundle update --bundler`"
rescue RuntimeError
  nil
end