summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Hellwig <a5308y@gmail.com>2015-10-10 11:16:37 +0200
committerAndreas Hellwig <a5308y@gmail.com>2015-10-10 12:24:00 +0200
commit4b7d61bc0414d1a7b15ae32f5f449290d6ce1f2a (patch)
treeddba3f82d945fc88d51708c1c96a6d3a2e0aaa1f
parent21b1e3b6ff0f4fc9ff7ffeaded1fefdd42bcf8eb (diff)
downloadbundler-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.rb128
1 files changed, 70 insertions, 58 deletions
diff --git a/lib/bundler/cli/config.rb b/lib/bundler/cli/config.rb
index 0caabfb0a0..cfb8b660e8 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