diff options
author | Samuel Giddins <segiddins@segiddins.me> | 2017-08-29 18:07:06 -0500 |
---|---|---|
committer | Samuel Giddins <segiddins@segiddins.me> | 2017-08-30 15:38:19 -0500 |
commit | 9d618dde0a9a733540e5e46cd280829a331e7961 (patch) | |
tree | 72067070117f0f525036b5ff25dba90f0ce8da60 | |
parent | da7973dfb3f1bd6a39a5afb142d4a9ff4d6b0cf5 (diff) | |
download | bundler-9d618dde0a9a733540e5e46cd280829a331e7961.tar.gz |
[CLI] Implement config subcommands
-rw-r--r-- | lib/bundler/cli.rb | 10 | ||||
-rw-r--r-- | lib/bundler/cli/config.rb | 241 |
2 files changed, 150 insertions, 101 deletions
diff --git a/lib/bundler/cli.rb b/lib/bundler/cli.rb index 92730355d7..b8e570e380 100644 --- a/lib/bundler/cli.rb +++ b/lib/bundler/cli.rb @@ -436,14 +436,8 @@ module Bundler will show the current value, as well as any superceded values and where they were specified. D - method_option :parseable, :type => :boolean, :banner => "Use minimal formatting for more parseable output" - method_option :global, :type => :boolean, :banner => "global" - method_option :local, :type => :boolean, :banner => "local" - method_option :delete, :type => :boolean, :banner => "delete" - def config(name = nil, *value) - require "bundler/cli/config" - Config.new(options, name, value, self).run - end + require "bundler/cli/config" + subcommand "config", Config desc "open GEM", "Opens the source directory of the given bundled gem" def open(name) diff --git a/lib/bundler/cli/config.rb b/lib/bundler/cli/config.rb index 7ec7bf56d5..e39b4f138d 100644 --- a/lib/bundler/cli/config.rb +++ b/lib/bundler/cli/config.rb @@ -1,126 +1,181 @@ # frozen_string_literal: true module Bundler - class CLI::Config - attr_reader :name, :value, :options, :scope, :thor - - def initialize(options, name, value, thor) - @options = options - @name = name - value = Array(value) - @value = value.empty? ? nil : value.join(" ") - @thor = thor - validate_scope! + class CLI::Config < Thor + class_option :parseable, :type => :boolean, :banner => "Use minimal formatting for more parseable output" + + def self.scope_options + method_option :global, :type => :boolean, :banner => "Only change the global config" + method_option :local, :type => :boolean, :banner => "Only change the local config" + end + private_class_method :scope_options + + desc "base NAME [VALUE]", "The Bundler 1 config interface", :hide => true + scope_options + method_option :delete, :type => :boolean, :banner => "delete" + def base(name = nil, *value) + SharedHelpers.major_deprecation 3, + "Using the `config` command without a subcommand [list, get, set, unset]" + Base.new(options, name, value, self).run + end + + desc "list", "List out all configured settings" + def list + Base.new(options, nil, nil, self).run + end + + desc "get NAME", "Returns the value for the given key" + def get(name) + Base.new(options, name, nil, self).run + end + + desc "set NAME VALUE", "Sets the given value for the given key" + scope_options + def set(name, *value) + Base.new(options, name, value, self).run + end + + desc "unset NAME", "Unsets the value for the given key" + scope_options + def unset(name) + options[:delete] = true + Base.new(options, name, nil, self).run end - def run - unless name - confirm_all - return + default_task :base + + class Base + attr_reader :name, :value, :options, :scope, :thor + + def initialize(options, name, value, thor) + @options = options + @name = name + value = Array(value) + @value = value.empty? ? nil : value.join(" ") + @thor = thor + validate_scope! end - if options[:delete] - if !@explicit_scope || scope != "global" - Bundler.settings.set_local(name, nil) - end - if !@explicit_scope || scope != "local" - Bundler.settings.set_global(name, nil) + def run + unless name + warn_unused_scope "Ignoring --#{scope}" + confirm_all + return end - return - end - if value.nil? - if options[:parseable] - if value = Bundler.settings[name] - Bundler.ui.info("#{name}=#{value}") + if options[:delete] + if !explicit_scope? || scope != "global" + Bundler.settings.set_local(name, nil) + end + if !explicit_scope? || scope != "local" + Bundler.settings.set_global(name, nil) end return end - confirm(name) - return - end + if value.nil? + warn_unused_scope "Ignoring --#{scope} since no value to set was given" - Bundler.ui.info(message) if message - Bundler.settings.send("set_#{scope}", name, new_value) - end + if options[:parseable] + if value = Bundler.settings[name] + Bundler.ui.info("#{name}=#{value}") + end + return + end - private + confirm(name) + return + end - def confirm_all - if @options[:parseable] - thor.with_padding do + Bundler.ui.info(message) if message + Bundler.settings.send("set_#{scope}", name, new_value) + end + + def confirm_all + if @options[:parseable] + thor.with_padding do + Bundler.settings.all.each do |setting| + val = Bundler.settings[setting] + Bundler.ui.info "#{setting}=#{val}" + end + end + else + Bundler.ui.confirm "Settings are listed in order of priority. The top value will be used.\n" Bundler.settings.all.each do |setting| - val = Bundler.settings[setting] - Bundler.ui.info "#{setting}=#{val}" + Bundler.ui.confirm "#{setting}" + show_pretty_values_for(setting) + Bundler.ui.confirm "" end end - else - Bundler.ui.confirm "Settings are listed in order of priority. The top value will be used.\n" - Bundler.settings.all.each do |setting| - Bundler.ui.confirm "#{setting}" - show_pretty_values_for(setting) - Bundler.ui.confirm "" - end end - end - def confirm(name) - Bundler.ui.confirm "Settings for `#{name}` in order of priority. The top value will be used" - show_pretty_values_for(name) - end + def confirm(name) + Bundler.ui.confirm "Settings for `#{name}` in order of priority. The top value will be used" + show_pretty_values_for(name) + end - def new_value - pathname = Pathname.new(value) - if name.start_with?("local.") && pathname.directory? - pathname.expand_path.to_s - else - value + def new_value + pathname = Pathname.new(value) + if name.start_with?("local.") && pathname.directory? + pathname.expand_path.to_s + else + value + end end - end - def message - locations = Bundler.settings.locations(name) - if @options[:parseable] - "#{name}=#{new_value}" if new_value - elsif scope == "global" - if !locations[:local].nil? - "Your application has set #{name} to #{locations[:local].inspect}. " \ - "This will override the global value you are currently setting" - elsif locations[:env] - "You have a bundler environment variable for #{name} set to " \ - "#{locations[:env].inspect}. This will take precedence over the global value you are setting" - elsif !locations[:global].nil? && locations[:global] != value - "You are replacing the current global value of #{name}, which is currently " \ - "#{locations[:global].inspect}" + def message + locations = Bundler.settings.locations(name) + if @options[:parseable] + "#{name}=#{new_value}" if new_value + elsif scope == "global" + if !locations[:local].nil? + "Your application has set #{name} to #{locations[:local].inspect}. " \ + "This will override the global value you are currently setting" + elsif locations[:env] + "You have a bundler environment variable for #{name} set to " \ + "#{locations[:env].inspect}. This will take precedence over the global value you are setting" + elsif !locations[:global].nil? && locations[:global] != value + "You are replacing the current global value of #{name}, which is currently " \ + "#{locations[:global].inspect}" + end + elsif scope == "local" && !locations[:local].nil? && locations[:local] != value + "You are replacing the current local value of #{name}, which is currently " \ + "#{locations[:local].inspect}" end - elsif scope == "local" && !locations[:local].nil? && locations[:local] != value - "You are replacing the current local value of #{name}, which is currently " \ - "#{locations[:local].inspect}" end - end - def show_pretty_values_for(setting) - thor.with_padding do - Bundler.settings.pretty_values_for(setting).each do |line| - Bundler.ui.info line + def show_pretty_values_for(setting) + thor.with_padding do + Bundler.settings.pretty_values_for(setting).each do |line| + Bundler.ui.info line + end end end - end - def validate_scope! - @explicit_scope = true - scopes = %w[global local] - scopes.reject! {|s| options[s].nil? } - case scopes.size - when 0 - @scope = "global" - @explicit_scope = false - when 1 - @scope = scopes.first - else - raise InvalidOption, - "The options #{scopes.join " and "} were specified. Please only use one of the switches at a time." + def explicit_scope? + @explicit_scope + end + + def warn_unused_scope(msg) + return unless explicit_scope? + return if options[:parseable] + + Bundler.ui.warn(msg) + end + + def validate_scope! + @explicit_scope = true + scopes = %w[global local].select {|s| options[s] } + case scopes.size + when 0 + @scope = "global" + @explicit_scope = false + when 1 + @scope = scopes.first + else + raise InvalidOption, + "The options #{scopes.join " and "} were specified. Please only use one of the switches at a time." + end end end end |