diff options
author | Andre Arko <andre@arko.net> | 2014-01-08 18:46:51 -0800 |
---|---|---|
committer | Andre Arko <andre@arko.net> | 2014-01-08 18:46:51 -0800 |
commit | 1135748f311901029731608cf326e54c56428ff1 (patch) | |
tree | c8dd67d66e1175ac5e5a39dba008a6b1fb41371e /lib/bundler/ui | |
parent | 92e54825b0f0c099e543b869c15aca6cbd7bc9dd (diff) | |
download | bundler-1135748f311901029731608cf326e54c56428ff1.tar.gz |
break out UI::Shell
Diffstat (limited to 'lib/bundler/ui')
-rw-r--r-- | lib/bundler/ui/shell.rb | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/lib/bundler/ui/shell.rb b/lib/bundler/ui/shell.rb new file mode 100644 index 0000000000..8b0d56fca2 --- /dev/null +++ b/lib/bundler/ui/shell.rb @@ -0,0 +1,100 @@ +require 'bundler/ui' + +module Bundler + class UI + class Shell < UI + LEVELS = %w(silent error warn confirm info debug) + + attr_writer :shell + + def initialize(options = {}) + if options["no-color"] || !STDOUT.tty? + Thor::Base.shell = Thor::Shell::Basic + end + @shell = Thor::Base.shell.new + @level = ENV['DEBUG'] ? "debug" : "info" + end + + def info(msg, newline = nil) + tell_me(msg, nil, newline) if level("info") + end + + def confirm(msg, newline = nil) + tell_me(msg, :green, newline) if level("confirm") + end + + def warn(msg, newline = nil) + tell_me(msg, :yellow, newline) if level("warn") + end + + def error(msg, newline = nil) + tell_me(msg, :red, newline) if level("error") + end + + def debug(msg, newline = nil) + tell_me(msg, nil, newline) if level("debug") + end + + def debug? + # needs to be false instead of nil to be newline param to other methods + level("debug") + end + + def quiet? + LEVELS.index(@level) <= LEVELS.index("warn") + end + + def ask(msg) + @shell.ask(msg) + end + + def level=(level) + raise ArgumentError unless LEVELS.include?(level.to_s) + @level = level + end + + def level(name = nil) + name ? LEVELS.index(name) <= LEVELS.index(@level) : @level + end + + def trace(e, newline = nil) + msg = ["#{e.class}: #{e.message}", *e.backtrace].join("\n") + if debug? + tell_me(msg, nil, newline) + elsif @trace + STDERR.puts "#{msg}#{newline}" + end + end + + def silence + old_level, @level = @level, "silent" + yield + ensure + @level = old_level + end + + private + + # valimism + def tell_me(msg, color = nil, newline = nil) + msg = word_wrap(msg) if newline.is_a?(Hash) && newline[:wrap] + if newline.nil? + @shell.say(msg, color) + else + @shell.say(msg, color, newline) + end + end + + def strip_leading_spaces(text) + spaces = text[/\A\s+/, 0] + spaces ? text.gsub(/#{spaces}/, '') : text + end + + def word_wrap(text, line_width = @shell.terminal_width) + strip_leading_spaces(text).split("\n").collect do |line| + line.length > line_width ? line.gsub(/(.{1,#{line_width}})(\s+|$)/, "\\1\n").strip : line + end * "\n" + end + end + end +end
\ No newline at end of file |