Class: Travis::CLI::Command
Constant Summary
collapse
- MINUTE =
60
- HOUR =
3600
- DAY =
86400
- WEEK =
604800
Tools::Assets::BASE
Instance Attribute Summary collapse
Class Method Summary
collapse
Instance Method Summary
collapse
asset, asset_path
Methods included from Parser
new, on, on_initialize
Constructor Details
#initialize(options = {}) ⇒ Command
Returns a new instance of Command.
90
91
92
93
94
95
96
97
98
99
|
# File 'lib/travis/cli/command.rb', line 90
def initialize(options = {})
@on_signal = []
@formatter = Travis::Tools::Formatter.new
self.output = $stdout
self.input = $stdin
options.each do |key, value|
public_send("#{key}=", value) if respond_to? "#{key}="
end
@arguments ||= []
end
|
Instance Attribute Details
#arguments ⇒ Object
Returns the value of attribute arguments.
86
87
88
|
# File 'lib/travis/cli/command.rb', line 86
def arguments
@arguments
end
|
#config ⇒ Object
Returns the value of attribute config.
86
87
88
|
# File 'lib/travis/cli/command.rb', line 86
def config
@config
end
|
#debug(line) ⇒ Object
Returns the value of attribute debug.
86
87
88
|
# File 'lib/travis/cli/command.rb', line 86
def debug
@debug
end
|
#force_interactive ⇒ Object
Returns the value of attribute force_interactive.
86
87
88
|
# File 'lib/travis/cli/command.rb', line 86
def force_interactive
@force_interactive
end
|
Returns the value of attribute formatter.
86
87
88
|
# File 'lib/travis/cli/command.rb', line 86
def formatter
@formatter
end
|
Returns the value of attribute input.
87
88
89
|
# File 'lib/travis/cli/command.rb', line 87
def input
@input
end
|
#output ⇒ Object
Returns the value of attribute output.
87
88
89
|
# File 'lib/travis/cli/command.rb', line 87
def output
@output
end
|
Class Method Details
.abstract ⇒ Object
58
59
60
|
# File 'lib/travis/cli/command.rb', line 58
def self.abstract
@@abstract << self
end
|
.abstract? ⇒ Boolean
54
55
56
|
# File 'lib/travis/cli/command.rb', line 54
def self.abstract?
@@abstract.include? self
end
|
.command_name ⇒ Object
49
50
51
|
# File 'lib/travis/cli/command.rb', line 49
def self.command_name
name[/[^:]*$/].split(/(?=[A-Z])/).map(&:downcase).join('-')
end
|
.description(description = nil) ⇒ Object
66
67
68
69
|
# File 'lib/travis/cli/command.rb', line 66
def self.description(description = nil)
@description = description if description
@description ||= ""
end
|
.skip(*names) ⇒ Object
62
63
64
|
# File 'lib/travis/cli/command.rb', line 62
def self.skip(*names)
names.each { |n| define_method(n) {} }
end
|
.subcommands(*list) ⇒ Object
71
72
73
74
75
76
77
78
79
80
81
82
83
84
|
# File 'lib/travis/cli/command.rb', line 71
def self.subcommands(*list)
return @subcommands ||= [] if list.empty?
@subcommands = list
define_method :run do |subcommand, *args|
error "Unknown subcommand. Available: #{list.join(', ')}." unless list.include? subcommand.to_sym
send(subcommand, *args)
end
define_method :usage do
usages = list.map { |c| color(usage_for("#{command_name} #{c}", c), :command) }
"\nUsage: #{usages.join("\n ")}\n\n"
end
end
|
Instance Method Details
#check_completion ⇒ Object
#check_ruby ⇒ Object
185
186
187
188
|
# File 'lib/travis/cli/command.rb', line 185
def check_ruby
return if RUBY_VERSION > '1.9.2' or skip_version_check?
warn "Your Ruby version is outdated, please consider upgrading, as we will drop support for #{RUBY_VERSION} soon!"
end
|
#check_version ⇒ Object
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
|
# File 'lib/travis/cli/command.rb', line 140
def check_version
last_check.clear if last_check['version'] != Travis::VERSION
seconds_since = Time.now.to_i - last_check['at'].to_i
return if skip_version_check?
return if seconds_since < MINUTE
case seconds_since
when MINUTE .. HOUR then timeout = 0.5
when HOUR .. DAY then timeout = 1.0
when DAY .. WEEK then timeout = 2.0
else timeout = 10.0
end
Timeout.timeout(timeout) do
response = Faraday.get('https://rubygems.org/api/v1/gems/travis.json', {}, 'If-None-Match' => last_check['etag'].to_s)
last_check['etag'] = response.['etag']
last_check['version'] = JSON.parse(response.body)['version'] if response.status == 200
end
last_check['at'] = Time.now.to_i
unless Tools::System.recent_version? Travis::VERSION, last_check['version']
warn "Outdated CLI version, run `gem install travis`."
end
rescue Timeout::Error, Faraday::Error::ClientError => error
debug "#{error.class}: #{error.message}"
end
|
#command_name ⇒ Object
218
219
220
|
# File 'lib/travis/cli/command.rb', line 218
def command_name
self.class.command_name
end
|
#debug? ⇒ Object
Returns the value of attribute debug.
88
89
90
|
# File 'lib/travis/cli/command.rb', line 88
def debug
@debug
end
|
#execute ⇒ Object
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
|
# File 'lib/travis/cli/command.rb', line 190
def execute
setup_trap
check_ruby
check_arity(method(:run), *arguments)
load_config
check_version
check_completion
setup
run(*arguments)
clear_error
store_config
rescue Travis::Client::NotLoggedIn => e
raise(e) if explode?
error "#{e.message} - try running #{command("login#{endpoint_option}")}"
rescue Travis::Client::NotFound => e
raise(e) if explode?
error "resource not found (#{e.message})"
rescue Travis::Client::Error => e
raise(e) if explode?
error e.message
rescue StandardError => e
raise(e) if explode?
message = e.message
message += color("\nfor a full error report, run #{command("report#{endpoint_option}")}", :error) if interactive?
store_error(e)
error(message)
end
|
#help(info = "") ⇒ Object
242
243
244
245
|
# File 'lib/travis/cli/command.rb', line 242
def help(info = "")
parser.banner = usage
self.class.description.sub(/./) { |c| c.upcase } + ".\n" + info + parser.to_s
end
|
#info(line) ⇒ Object
267
268
269
270
271
|
# File 'lib/travis/cli/command.rb', line 267
def info(line)
write_to($stderr) do
say color(line, :info)
end
end
|
#last_check ⇒ Object
132
133
134
135
136
137
138
|
# File 'lib/travis/cli/command.rb', line 132
def last_check
config['last_check'] ||= {
'at' => config.delete('last_version_check'),
'etag' => config.delete('etag')
}
end
|
#on_signal(&block) ⇒ Object
273
274
275
|
# File 'lib/travis/cli/command.rb', line 273
def on_signal(&block)
@on_signal << block
end
|
#parse(args) ⇒ Object
122
123
124
125
126
127
|
# File 'lib/travis/cli/command.rb', line 122
def parse(args)
rest = parser.parse(args)
arguments.concat(rest)
rescue OptionParser::ParseError => e
error e.message
end
|
#say(data, format = nil, style = nil) ⇒ Object
247
248
249
|
# File 'lib/travis/cli/command.rb', line 247
def say(data, format = nil, style = nil)
terminal.say format(data, format, style)
end
|
#setup ⇒ Object
129
130
|
# File 'lib/travis/cli/command.rb', line 129
def setup
end
|
#terminal ⇒ Object
101
102
103
|
# File 'lib/travis/cli/command.rb', line 101
def terminal
@terminal ||= HighLine.new(input, output)
end
|
#time(info, callback = Proc.new) ⇒ Object
258
259
260
261
262
263
264
265
|
# File 'lib/travis/cli/command.rb', line 258
def time(info, callback = Proc.new)
return callback.call unless debug?
start = Time.now
debug(info)
callback.call
duration = Time.now - start
debug(" took %.2g seconds" % duration)
end
|
#usage ⇒ Object
222
223
224
|
# File 'lib/travis/cli/command.rb', line 222
def usage
"Usage: " << color(usage_for(command_name, :run), :command)
end
|
#usage_for(prefix, method) ⇒ Object
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
|
# File 'lib/travis/cli/command.rb', line 226
def usage_for(prefix, method)
usage = "travis #{prefix}"
method = method(method)
if method.respond_to? :parameters
method.parameters.each do |type, name|
name = name.upcase
name = "[#{name}]" if type == :opt
name = "[#{name}..]" if type == :rest
usage << " #{name}"
end
elsif method.arity != 0
usage << " ..."
end
usage << " [OPTIONS]"
end
|
#write_to(io) ⇒ Object
115
116
117
118
119
120
|
# File 'lib/travis/cli/command.rb', line 115
def write_to(io)
io_was, self.output = output, io
yield
ensure
self.output = io_was if io_was
end
|