1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
|
require 'rubygems/user_interaction'
module Bundler
class UI
def warn(message, newline = nil)
end
def debug(message, newline = nil)
end
def trace(message, newline = nil)
end
def error(message, newline = nil)
end
def info(message, newline = nil)
end
def confirm(message, newline = nil)
end
def quiet?
false
end
def debug?
false
end
def ask(message)
end
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
class RGProxy < ::Gem::SilentUI
def initialize(ui)
@ui = ui
super()
end
def say(message)
if message =~ /native extensions/
@ui.info "with native extensions "
else
@ui.debug(message)
end
end
end
end
end
|