diff options
author | Andreas Hellwig <a5308y@gmail.com> | 2015-10-10 11:16:37 +0200 |
---|---|---|
committer | Andreas Hellwig <a5308y@gmail.com> | 2015-10-10 12:24:00 +0200 |
commit | 4b7d61bc0414d1a7b15ae32f5f449290d6ce1f2a (patch) | |
tree | ddba3f82d945fc88d51708c1c96a6d3a2e0aaa1f | |
parent | 21b1e3b6ff0f4fc9ff7ffeaded1fefdd42bcf8eb (diff) | |
download | bundler-4b7d61bc0414d1a7b15ae32f5f449290d6ce1f2a.tar.gz |
Refactoring config.rb
My main goal was to show the structure of the run method:
1. Guard Clauses
2. Message to user
3. Save new settings
and to separate the message texts from the rest of the logic.
So the class and methods are easier to understand read.
While doing that I reduced the complexity of the run method by
extracting methods. This should improve the Code Climate rating of
Bundler::CLI::Config substantially.
-rw-r--r-- | lib/bundler/cli/config.rb | 128 |
1 files changed, 70 insertions, 58 deletions
diff --git a/lib/bundler/cli/config.rb b/lib/bundler/cli/config.rb index 0caabfb0..cfb8b660 100644 --- a/lib/bundler/cli/config.rb +++ b/lib/bundler/cli/config.rb @@ -1,88 +1,100 @@ module Bundler class CLI::Config - attr_reader :options, :thor + attr_reader :name, :options, :scope, :thor attr_accessor :args def initialize(options, args, thor) @options = options @args = args @thor = thor + @name = peek = args.shift + @scope = "global" + if peek && peek =~ /^\-\-/ + @name = args.shift + @scope = $' + end end def run - peek = args.shift + unless name + confirm_all + return + end - if peek && peek =~ /^\-\-/ - name = args.shift - scope = $' - else - name = peek - scope = "global" + unless valid_scope?(scope) + Bundler.ui.error "Invalid scope --#{scope} given. Please use --local or --global." + exit 1 end - unless name - Bundler.ui.confirm "Settings are listed in order of priority. The top value will be used.\n" + if scope == "delete" + Bundler.settings.set_local(name, nil) + Bundler.settings.set_global(name, nil) + return + end - Bundler.settings.all.each do |setting| - Bundler.ui.confirm "#{setting}" - thor.with_padding do - Bundler.settings.pretty_values_for(setting).each do |line| - Bundler.ui.info line - end - end - Bundler.ui.confirm "" - end + if args.empty? + confirm(name) return end - case scope - when "delete" - Bundler.settings.set_local(name, nil) - Bundler.settings.set_global(name, nil) - when "local", "global" - if args.empty? - Bundler.ui.confirm "Settings for `#{name}` in order of priority. The top value will be used" - thor.with_padding do - Bundler.settings.pretty_values_for(name).each {|line| Bundler.ui.info line } - end - return - end + Bundler.ui.info(message) if message + Bundler.settings.send("set_#{scope}", name, new_value) + end - new_value = args.join(" ") - locations = Bundler.settings.locations(name) + private - if scope == "global" - if locations[:local] - Bundler.ui.info "Your application has set #{name} to #{locations[:local].inspect}. " \ - "This will override the global value you are currently setting" - end + def confirm_all + 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 - if locations[:env] - Bundler.ui.info "You have a bundler environment variable for #{name} set to " \ - "#{locations[:env].inspect}. This will take precedence over the global value you are setting" - 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 - if locations[:global] && locations[:global] != new_value - Bundler.ui.info "You are replacing the current global value of #{name}, which is currently " \ - "#{locations[:global].inspect}" - end - end + def new_value + pathname = Pathname.new(args.join(" ")) + if name.match(/\Alocal\./) && pathname.directory? + pathname.expand_path.to_s + else + args.join(" ") + end + end - if scope == "local" && locations[:local] != new_value - Bundler.ui.info "You are replacing the current local value of #{name}, which is currently " \ - "#{locations[:local].inspect}" + def message + locations = Bundler.settings.locations(name) + if scope == "global" + if locations[:local] + "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] && locations[:global] != args.join(" ") + "You are replacing the current global value of #{name}, which is currently " \ + "#{locations[:global].inspect}" end + elsif scope == "local" && locations[:local] != args.join(" ") + "You are replacing the current local value of #{name}, which is currently " \ + "#{locations[:local].inspect}" + end + end - if name.match(/\Alocal\./) - pathname = Pathname.new(args.join(" ")) - new_value = pathname.expand_path.to_s if pathname.directory? + def show_pretty_values_for(setting) + thor.with_padding do + Bundler.settings.pretty_values_for(setting).each do |line| + Bundler.ui.info line end - - Bundler.settings.send("set_#{scope}", name, new_value) - else - Bundler.ui.error "Invalid scope --#{scope} given. Please use --local or --global." - exit 1 end end + + def valid_scope?(scope) + %w(delete local global).include?(scope) + end end end |