rhc 1.6.8 → 1.7.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/autocomplete/rhc_bash +1167 -0
- data/features/README.md +1 -1
- data/features/domain.feature +1 -1
- data/features/lib/rhc_helper/persistable.rb +4 -1
- data/features/multiple_cartridge.feature +4 -3
- data/features/sshkey.feature +3 -3
- data/features/support/assumptions.rb +3 -3
- data/features/support/env.rb +10 -0
- data/features/support/platform_support.rb +2 -2
- data/lib/rhc.rb +6 -0
- data/lib/rhc/auth/token.rb +4 -0
- data/lib/rhc/autocomplete.rb +50 -52
- data/lib/rhc/autocomplete_templates/{rhc.erb → bash.erb} +8 -2
- data/lib/rhc/cartridge_helpers.rb +1 -1
- data/lib/rhc/cli.rb +1 -7
- data/lib/rhc/command_runner.rb +45 -16
- data/lib/rhc/commands.rb +75 -55
- data/lib/rhc/commands/account.rb +7 -51
- data/lib/rhc/commands/alias.rb +26 -17
- data/lib/rhc/commands/app.rb +75 -39
- data/lib/rhc/commands/authorization.rb +4 -2
- data/lib/rhc/commands/base.rb +31 -29
- data/lib/rhc/commands/cartridge.rb +66 -44
- data/lib/rhc/commands/domain.rb +20 -8
- data/lib/rhc/commands/git_clone.rb +3 -3
- data/lib/rhc/commands/logout.rb +51 -0
- data/lib/rhc/commands/port_forward.rb +15 -11
- data/lib/rhc/commands/setup.rb +25 -0
- data/lib/rhc/commands/snapshot.rb +20 -10
- data/lib/rhc/commands/sshkey.rb +21 -7
- data/lib/rhc/commands/tail.rb +2 -2
- data/lib/rhc/commands/threaddump.rb +2 -2
- data/lib/rhc/context_helper.rb +0 -4
- data/lib/rhc/core_ext.rb +96 -76
- data/lib/rhc/exceptions.rb +6 -0
- data/lib/rhc/help_formatter.rb +19 -2
- data/lib/rhc/helpers.rb +32 -194
- data/lib/rhc/highline_extensions.rb +412 -0
- data/lib/rhc/output_helpers.rb +31 -67
- data/lib/rhc/rest.rb +4 -2
- data/lib/rhc/rest/alias.rb +0 -2
- data/lib/rhc/rest/application.rb +9 -4
- data/lib/rhc/rest/authorization.rb +0 -2
- data/lib/rhc/rest/base.rb +1 -1
- data/lib/rhc/rest/client.rb +11 -9
- data/lib/rhc/rest/domain.rb +5 -1
- data/lib/rhc/rest/gear_group.rb +0 -2
- data/lib/rhc/rest/key.rb +0 -2
- data/lib/rhc/rest/mock.rb +32 -10
- data/lib/rhc/ssh_helpers.rb +2 -2
- data/lib/rhc/usage_templates/command_help.erb +20 -13
- data/lib/rhc/usage_templates/command_syntax_help.erb +1 -3
- data/lib/rhc/usage_templates/help.erb +15 -16
- data/lib/rhc/usage_templates/options_help.erb +7 -9
- data/lib/rhc/wizard.rb +193 -159
- data/spec/rest_spec_helper.rb +2 -2
- data/spec/rhc/cli_spec.rb +36 -5
- data/spec/rhc/command_spec.rb +94 -42
- data/spec/rhc/commands/account_spec.rb +1 -75
- data/spec/rhc/commands/alias_spec.rb +28 -28
- data/spec/rhc/commands/app_spec.rb +141 -33
- data/spec/rhc/commands/apps_spec.rb +4 -4
- data/spec/rhc/commands/authorization_spec.rb +8 -8
- data/spec/rhc/commands/cartridge_spec.rb +18 -9
- data/spec/rhc/commands/domain_spec.rb +16 -16
- data/spec/rhc/commands/git_clone_spec.rb +3 -3
- data/spec/rhc/commands/logout_spec.rb +86 -0
- data/spec/rhc/commands/port_forward_spec.rb +9 -9
- data/spec/rhc/commands/server_spec.rb +5 -5
- data/spec/rhc/commands/setup_spec.rb +19 -5
- data/spec/rhc/commands/snapshot_spec.rb +12 -12
- data/spec/rhc/commands/sshkey_spec.rb +11 -11
- data/spec/rhc/commands/tail_spec.rb +5 -5
- data/spec/rhc/commands/threaddump_spec.rb +3 -3
- data/spec/rhc/config_spec.rb +6 -6
- data/spec/rhc/helpers_spec.rb +72 -219
- data/spec/rhc/highline_extensions_spec.rb +269 -0
- data/spec/rhc/rest_application_spec.rb +28 -1
- data/spec/rhc/rest_client_spec.rb +20 -21
- data/spec/rhc/rest_spec.rb +10 -0
- data/spec/rhc/wizard_spec.rb +72 -32
- data/spec/spec_helper.rb +86 -56
- data/spec/wizard_spec_helper.rb +7 -4
- metadata +165 -160
- data/spec/spec.opts +0 -1
@@ -0,0 +1,412 @@
|
|
1
|
+
require 'delegate'
|
2
|
+
|
3
|
+
#
|
4
|
+
# Add specific improved functionality
|
5
|
+
#
|
6
|
+
class HighLineExtension < HighLine
|
7
|
+
[:ask, :agree].each do |sym|
|
8
|
+
define_method(sym) do |*args, &block|
|
9
|
+
separate_blocks
|
10
|
+
r = super(*args, &block)
|
11
|
+
@last_line_open = false
|
12
|
+
r
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
# OVERRIDE
|
17
|
+
def say(msg)
|
18
|
+
if msg.respond_to? :to_str
|
19
|
+
separate_blocks
|
20
|
+
|
21
|
+
statement = msg.to_str
|
22
|
+
return statement unless statement.present?
|
23
|
+
|
24
|
+
template = ERB.new(statement, nil, "%")
|
25
|
+
statement = template.result(binding)
|
26
|
+
|
27
|
+
statement = statement.textwrap_ansi(@wrap_at, false).join("#{indentation}\n") unless @wrap_at.nil?
|
28
|
+
statement = send(:page_print, statement) unless @page_at.nil?
|
29
|
+
|
30
|
+
@output.print(indentation) unless @last_line_open
|
31
|
+
|
32
|
+
@last_line_open =
|
33
|
+
if statement[-1, 1] == " " or statement[-1, 1] == "\t"
|
34
|
+
@output.print(statement)
|
35
|
+
@output.flush
|
36
|
+
true
|
37
|
+
else
|
38
|
+
@output.puts(statement)
|
39
|
+
false
|
40
|
+
end
|
41
|
+
|
42
|
+
elsif msg.respond_to? :each
|
43
|
+
separate_blocks
|
44
|
+
|
45
|
+
@output.print if @last_line_open
|
46
|
+
@last_line_open = false
|
47
|
+
|
48
|
+
color = msg.color if msg.respond_to? :color
|
49
|
+
@output.print HighLine::Style(color).code if color
|
50
|
+
|
51
|
+
msg.each do |s|
|
52
|
+
@output.print indentation
|
53
|
+
@output.puts s
|
54
|
+
end
|
55
|
+
|
56
|
+
@output.print HighLine::CLEAR if color
|
57
|
+
@output.flush
|
58
|
+
end
|
59
|
+
|
60
|
+
msg
|
61
|
+
end
|
62
|
+
|
63
|
+
# given an array of arrays "items", construct an array of strings that can
|
64
|
+
# be used to print in tabular form.
|
65
|
+
def table(items, opts={}, &block)
|
66
|
+
items = items.map(&block) if block_given?
|
67
|
+
opts[:width] ||= default_max_width
|
68
|
+
Table.new(items, opts)
|
69
|
+
end
|
70
|
+
|
71
|
+
def table_args(indent=nil, *args)
|
72
|
+
opts = {}
|
73
|
+
opts[:indent] = indent
|
74
|
+
opts[:width] = [default_max_width, *args]
|
75
|
+
opts
|
76
|
+
end
|
77
|
+
|
78
|
+
def default_max_width
|
79
|
+
@wrap_at ? @wrap_at - indentation.length : nil
|
80
|
+
end
|
81
|
+
|
82
|
+
def header(str,opts = {}, &block)
|
83
|
+
say Header.new(str, default_max_width, ' ')
|
84
|
+
if block_given?
|
85
|
+
indent &block
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
#:nocov:
|
90
|
+
# Backport from Highline 1.6.16
|
91
|
+
unless HighLine.method_defined? :indent
|
92
|
+
#
|
93
|
+
# Outputs indentation with current settings
|
94
|
+
#
|
95
|
+
def indentation
|
96
|
+
@indent_size ||= 2
|
97
|
+
@indent_level ||= 0
|
98
|
+
return ' '*@indent_size*@indent_level
|
99
|
+
end
|
100
|
+
|
101
|
+
#
|
102
|
+
# Executes block or outputs statement with indentation
|
103
|
+
#
|
104
|
+
def indent(increase=1, statement=nil, multiline=nil)
|
105
|
+
@indent_size ||= 2
|
106
|
+
@indent_level ||= 0
|
107
|
+
@indent_level += increase
|
108
|
+
multi = @multi_indent
|
109
|
+
@multi_indent = multiline unless multiline.nil?
|
110
|
+
if block_given?
|
111
|
+
yield self
|
112
|
+
else
|
113
|
+
say(statement)
|
114
|
+
end
|
115
|
+
ensure
|
116
|
+
@multi_indent = multi
|
117
|
+
@indent_level -= increase
|
118
|
+
end
|
119
|
+
end
|
120
|
+
#:nocov:
|
121
|
+
|
122
|
+
##
|
123
|
+
# section
|
124
|
+
#
|
125
|
+
# highline helper mixin which correctly formats block of say and ask
|
126
|
+
# output to have correct margins. section remembers the last margin
|
127
|
+
# used and calculates the relitive margin from the previous section.
|
128
|
+
# For example:
|
129
|
+
#
|
130
|
+
# section(bottom=1) do
|
131
|
+
# say "Hello"
|
132
|
+
# end
|
133
|
+
#
|
134
|
+
# section(top=1) do
|
135
|
+
# say "World"
|
136
|
+
# end
|
137
|
+
#
|
138
|
+
# Will output:
|
139
|
+
#
|
140
|
+
# > Hello
|
141
|
+
# >
|
142
|
+
# > World
|
143
|
+
#
|
144
|
+
# with only one newline between the two. Biggest margin wins.
|
145
|
+
#
|
146
|
+
# params:
|
147
|
+
# top - top margin specified in lines
|
148
|
+
# bottom - bottom margin specified in line
|
149
|
+
#
|
150
|
+
def section(params={}, &block)
|
151
|
+
top = params[:top] || 0
|
152
|
+
bottom = params[:bottom] || 0
|
153
|
+
|
154
|
+
# the first section cannot take a newline
|
155
|
+
top = 0 unless @margin
|
156
|
+
@margin = [top, @margin || 0].max
|
157
|
+
|
158
|
+
value = block.call
|
159
|
+
|
160
|
+
say "\n" if @last_line_open
|
161
|
+
@margin = [bottom, @margin].max
|
162
|
+
|
163
|
+
value
|
164
|
+
end
|
165
|
+
|
166
|
+
##
|
167
|
+
# paragraph
|
168
|
+
#
|
169
|
+
# highline helper which creates a section with margins of 1, 1
|
170
|
+
#
|
171
|
+
def paragraph(&block)
|
172
|
+
section(:top => 1, :bottom => 1, &block)
|
173
|
+
end
|
174
|
+
|
175
|
+
def pager
|
176
|
+
#:nocov:
|
177
|
+
return if RHC::Helpers.windows?
|
178
|
+
return unless @output.tty?
|
179
|
+
|
180
|
+
read, write = IO.pipe
|
181
|
+
|
182
|
+
unless Kernel.fork # Child process
|
183
|
+
STDOUT.reopen(write)
|
184
|
+
STDERR.reopen(write) if STDERR.tty?
|
185
|
+
read.close
|
186
|
+
write.close
|
187
|
+
return
|
188
|
+
end
|
189
|
+
|
190
|
+
# Parent process, become pager
|
191
|
+
STDIN.reopen(read)
|
192
|
+
read.close
|
193
|
+
write.close
|
194
|
+
|
195
|
+
ENV['LESS'] = 'FSRX' # Don't page if the input is short enough
|
196
|
+
|
197
|
+
Kernel.select [STDIN] # Wait until we have input before we start the pager
|
198
|
+
pager = ENV['PAGER'] || 'less'
|
199
|
+
exec pager rescue exec "/bin/sh", "-c", pager
|
200
|
+
#:nocov:
|
201
|
+
end
|
202
|
+
|
203
|
+
private
|
204
|
+
def separate_blocks
|
205
|
+
if (@margin ||= 0) > 0 && !@last_line_open
|
206
|
+
@output.print "\n" * @margin
|
207
|
+
@margin = 0
|
208
|
+
end
|
209
|
+
end
|
210
|
+
end
|
211
|
+
|
212
|
+
#
|
213
|
+
# An element capable of being split into multiple logical rows
|
214
|
+
#
|
215
|
+
module RowBased
|
216
|
+
extend Forwardable
|
217
|
+
def_delegators :rows, :each, :to_a, :join
|
218
|
+
alias_method :each_line, :each
|
219
|
+
end
|
220
|
+
|
221
|
+
class HighLine::Header < Struct.new(:text, :width, :indent, :color)
|
222
|
+
include RowBased
|
223
|
+
|
224
|
+
protected
|
225
|
+
def rows
|
226
|
+
@rows ||= begin
|
227
|
+
if !width || width == 0
|
228
|
+
[text.is_a?(Array) ? text.join(' ') : text]
|
229
|
+
|
230
|
+
elsif text.is_a? Array
|
231
|
+
widths = text.map{ |s| s.strip_ansi.length }
|
232
|
+
chars, join, indented = 0, 1, (indent || '').length
|
233
|
+
narrow = width - indented
|
234
|
+
text.zip(widths).inject([]) do |rows, (section, w)|
|
235
|
+
if rows.empty?
|
236
|
+
if w > width
|
237
|
+
rows.concat(section.textwrap_ansi(width))
|
238
|
+
else
|
239
|
+
rows << section.dup
|
240
|
+
chars += w
|
241
|
+
end
|
242
|
+
else
|
243
|
+
if w + chars + join > narrow
|
244
|
+
rows.concat(section.textwrap_ansi(narrow).map{ |s| "#{indent}#{s}" })
|
245
|
+
chars = 0
|
246
|
+
elsif chars == 0
|
247
|
+
rows << "#{indent}#{section}"
|
248
|
+
chars += w + indented
|
249
|
+
else
|
250
|
+
rows[-1] << " #{section}"
|
251
|
+
chars += w + join
|
252
|
+
end
|
253
|
+
end
|
254
|
+
rows
|
255
|
+
end
|
256
|
+
else
|
257
|
+
text.textwrap_ansi(width)
|
258
|
+
end
|
259
|
+
end.tap do |rows|
|
260
|
+
rows << '-' * rows.map{ |s| s.strip_ansi.length }.max
|
261
|
+
end
|
262
|
+
end
|
263
|
+
end
|
264
|
+
|
265
|
+
#
|
266
|
+
# Represent a columnar layout of items with wrapping and flexible layout.
|
267
|
+
#
|
268
|
+
class HighLine::Table
|
269
|
+
include RowBased
|
270
|
+
|
271
|
+
def initialize(items=nil,options={},&mapper)
|
272
|
+
@items, @options, @mapper = items, options, mapper
|
273
|
+
end
|
274
|
+
|
275
|
+
def color
|
276
|
+
opts[:color]
|
277
|
+
end
|
278
|
+
|
279
|
+
protected
|
280
|
+
attr_reader :items
|
281
|
+
|
282
|
+
def opts
|
283
|
+
@options
|
284
|
+
end
|
285
|
+
|
286
|
+
def align
|
287
|
+
opts[:align] || []
|
288
|
+
end
|
289
|
+
def joiner
|
290
|
+
opts[:join] || ' '
|
291
|
+
end
|
292
|
+
def indent
|
293
|
+
opts[:indent] || ''
|
294
|
+
end
|
295
|
+
def heading
|
296
|
+
@heading ||= opts[:heading] ? HighLine::Header.new(opts[:heading], max_width, indent) : nil
|
297
|
+
end
|
298
|
+
|
299
|
+
def source_rows
|
300
|
+
@source_rows ||= begin
|
301
|
+
(@mapper ? (items.map &@mapper) : items).each do |row|
|
302
|
+
row.map!{ |col| col.is_a?(String) ? col : col.to_s }
|
303
|
+
end
|
304
|
+
end
|
305
|
+
end
|
306
|
+
|
307
|
+
def headers
|
308
|
+
@headers ||= opts[:header] ? [Array(opts[:header])] : []
|
309
|
+
end
|
310
|
+
|
311
|
+
def columns
|
312
|
+
@columns ||= source_rows.map(&:length).max
|
313
|
+
end
|
314
|
+
|
315
|
+
def column_widths
|
316
|
+
@column_widths ||= begin
|
317
|
+
widths = Array.new(columns){ Width.new(0,0,0) }
|
318
|
+
(source_rows + headers).each do |row|
|
319
|
+
row.each_with_index do |col, i|
|
320
|
+
w = widths[i]
|
321
|
+
s = col.strip_ansi
|
322
|
+
word_length = s.scan(/\b\S+/).inject(0){ |l, word| l = word.length if l <= word.length; l }
|
323
|
+
w.min = word_length unless w.min > word_length
|
324
|
+
w.max = s.length unless w.max > s.length
|
325
|
+
end
|
326
|
+
end
|
327
|
+
widths
|
328
|
+
end
|
329
|
+
end
|
330
|
+
|
331
|
+
Width = Struct.new(:min, :max, :set)
|
332
|
+
|
333
|
+
def allocate_widths_for(available)
|
334
|
+
available -= (columns-1) * joiner.length + indent.length
|
335
|
+
return column_widths.map{ |w| w.max } if available >= column_widths.inject(0){ |sum, w| sum + w.max } || column_widths.inject(0){ |sum, w| sum + w.min } > available
|
336
|
+
|
337
|
+
fair = available / columns
|
338
|
+
column_widths.each do |w|
|
339
|
+
if w.set > 0
|
340
|
+
available -= w.set
|
341
|
+
next
|
342
|
+
end
|
343
|
+
w.set = if w.max <= fair
|
344
|
+
available -= w.max
|
345
|
+
w.max
|
346
|
+
else
|
347
|
+
0
|
348
|
+
end
|
349
|
+
end
|
350
|
+
|
351
|
+
remaining = column_widths.inject(0){ |sum, w| if w.set == 0; sum += w.max; available -= w.min; end; sum }
|
352
|
+
fair = available.to_f / remaining.to_f
|
353
|
+
|
354
|
+
column_widths.
|
355
|
+
each do |w|
|
356
|
+
if w.set == 0
|
357
|
+
available -= (alloc = (w.max * fair).to_i)
|
358
|
+
w.set = alloc + w.min
|
359
|
+
end
|
360
|
+
end.
|
361
|
+
each{ |w| if available > 0 && w.set < w.max; w.set += 1; available -= 1; end }.
|
362
|
+
map(&:set)
|
363
|
+
end
|
364
|
+
|
365
|
+
def widths
|
366
|
+
@widths ||= begin
|
367
|
+
case w = opts[:width]
|
368
|
+
when Array
|
369
|
+
column_widths.zip(w[1..-1]).each do |width, col|
|
370
|
+
width.set = col || 0
|
371
|
+
width.max = width.set if width.set > width.max
|
372
|
+
end
|
373
|
+
allocate_widths_for(w.first || 0)
|
374
|
+
when Integer
|
375
|
+
allocate_widths_for(w)
|
376
|
+
else
|
377
|
+
column_widths.map{ |w| w.max }
|
378
|
+
end
|
379
|
+
end
|
380
|
+
end
|
381
|
+
|
382
|
+
def max_width
|
383
|
+
@max_width ||= opts[:width].is_a?(Array) ? opts[:width].first : (opts[:width] ? opts[:width] : 0)
|
384
|
+
end
|
385
|
+
|
386
|
+
def header_rows
|
387
|
+
@header_rows ||= begin
|
388
|
+
headers << column_widths.map{ |w| '-' * (w.set > 0 ? w.set : w.max) } if headers.present?
|
389
|
+
headers
|
390
|
+
end
|
391
|
+
end
|
392
|
+
|
393
|
+
def rows
|
394
|
+
@rows ||= begin
|
395
|
+
fmt = "#{indent}#{widths.zip(align).map{ |w, al| "%#{al == :right ? '' : '-'}#{w}s" }.join(joiner)}"
|
396
|
+
|
397
|
+
body = (header_rows + source_rows).inject([]) do |a,row|
|
398
|
+
row = row.zip(widths).map{ |column,w| w && w > 0 ? column.textwrap_ansi(w, false) : [column] }
|
399
|
+
row.map(&:length).max.times do |i|
|
400
|
+
a << (fmt % row.map{ |r| r[i] }).rstrip
|
401
|
+
end
|
402
|
+
a
|
403
|
+
end
|
404
|
+
|
405
|
+
body = heading.to_a.concat(body) if heading
|
406
|
+
body
|
407
|
+
end
|
408
|
+
end
|
409
|
+
end
|
410
|
+
|
411
|
+
$terminal = HighLineExtension.new
|
412
|
+
$terminal.indent_size = 2 if $terminal.respond_to? :indent_size
|
data/lib/rhc/output_helpers.rb
CHANGED
@@ -34,35 +34,23 @@ module RHC
|
|
34
34
|
# Application information
|
35
35
|
#---------------------------
|
36
36
|
def display_app(app,cartridges = nil)
|
37
|
-
heading = "%s @ %s (uuid: %s)" % [app.name, app.app_url, app.uuid]
|
38
37
|
paragraph do
|
39
|
-
header
|
38
|
+
header [app.name, "@ #{app.app_url}", "(uuid: #{app.uuid})"] do
|
40
39
|
section(:bottom => 1) do
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
40
|
+
say format_table \
|
41
|
+
nil,
|
42
|
+
get_properties(
|
43
|
+
app,
|
44
|
+
:creation_time,
|
45
|
+
:gear_info,
|
46
|
+
:git_url,
|
47
|
+
:initial_git_url,
|
48
|
+
:ssh_string,
|
49
|
+
:aliases
|
50
|
+
),
|
51
|
+
:delete => true
|
49
52
|
end
|
50
|
-
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
def display_app_properties(app,*properties)
|
56
|
-
say_table \
|
57
|
-
nil,
|
58
|
-
get_properties(app,*properties),
|
59
|
-
:delete => true
|
60
|
-
end
|
61
|
-
|
62
|
-
def display_included_carts(carts)
|
63
|
-
carts.each do |c|
|
64
|
-
section(:bottom => 1) do
|
65
|
-
display_cart(c)
|
53
|
+
cartridges.each{ |c| section(:bottom => 1){ display_cart(c) } } if cartridges
|
66
54
|
end
|
67
55
|
end
|
68
56
|
end
|
@@ -71,13 +59,14 @@ module RHC
|
|
71
59
|
[
|
72
60
|
cart.name,
|
73
61
|
cart.name != cart.display_name ? "(#{cart.display_name})" : nil,
|
74
|
-
].compact
|
62
|
+
].compact
|
75
63
|
end
|
76
64
|
|
77
65
|
def format_scaling_info(scaling)
|
78
66
|
"x%d (minimum: %s, maximum: %s) on %s gears" %
|
79
67
|
[:current_scale, :scales_from, :scales_to, :gear_profile].map{ |key| format_value(key, scaling[key]) } if scaling
|
80
68
|
end
|
69
|
+
|
81
70
|
def format_cart_gears(cart)
|
82
71
|
if cart.scalable?
|
83
72
|
format_scaling_info(cart.scaling)
|
@@ -87,6 +76,7 @@ module RHC
|
|
87
76
|
"%d %s" % [format_value(:current_scale, cart.current_scale), format_value(:gear_profile, cart.gear_profile)]
|
88
77
|
end
|
89
78
|
end
|
79
|
+
|
90
80
|
def format_gear_info(info)
|
91
81
|
"%d (defaults to %s)" %
|
92
82
|
[:gear_count, :gear_profile].map{ |key| format_value(key, info[key]) } if info
|
@@ -97,25 +87,19 @@ module RHC
|
|
97
87
|
#---------------------------
|
98
88
|
|
99
89
|
def display_cart(cart, *properties)
|
100
|
-
|
101
|
-
|
102
|
-
say_table \
|
90
|
+
say format_table \
|
103
91
|
format_cart_header(cart),
|
104
92
|
get_properties(cart, *properties).
|
105
93
|
concat([[cart.scalable? ? :scaling : :gears, format_cart_gears(cart)]]).
|
106
94
|
concat(cart.properties.map{ |p| ["#{table_heading(p['name'])}:", p['value']] }.sort{ |a,b| a[0] <=> b[0] }),
|
107
95
|
:delete => true
|
108
|
-
|
109
|
-
|
110
|
-
if cart.usage_rate?
|
111
|
-
say "\n"
|
112
|
-
say format_usage_message(cart)
|
113
|
-
end
|
96
|
+
|
97
|
+
say format_usage_message(cart) if cart.usage_rate?
|
114
98
|
end
|
115
99
|
|
116
100
|
def display_key(key, *properties)
|
117
101
|
properties = [:fingerprint, :visible_to_ssh?] if properties.empty?
|
118
|
-
|
102
|
+
say format_table(
|
119
103
|
properties.include?(:name) ? nil : format_key_header(key),
|
120
104
|
get_properties(key, *properties),
|
121
105
|
{
|
@@ -126,7 +110,7 @@ module RHC
|
|
126
110
|
end
|
127
111
|
|
128
112
|
def display_authorization(auth, default=nil)
|
129
|
-
|
113
|
+
say format_table(
|
130
114
|
auth.note || "<no description>",
|
131
115
|
get_properties(auth, :token, :scopes, :creation_time, :expires_in_seconds),
|
132
116
|
{
|
@@ -140,59 +124,39 @@ module RHC
|
|
140
124
|
[
|
141
125
|
key.name,
|
142
126
|
"(type: #{key.type})",
|
143
|
-
].compact
|
127
|
+
].compact
|
144
128
|
end
|
145
129
|
|
146
130
|
def display_cart_storage_info(cart, title="Storage Info")
|
147
|
-
|
131
|
+
say format_table \
|
148
132
|
title,
|
149
133
|
get_properties(cart,:base_gear_storage,:additional_gear_storage)
|
150
134
|
end
|
151
135
|
|
152
136
|
def display_cart_storage_list(carts)
|
153
|
-
carts.each
|
154
|
-
puts
|
155
|
-
display_cart_storage_info(cart, cart.display_name)
|
156
|
-
end
|
137
|
+
carts.each{ |cart| paragraph{ display_cart_storage_info(cart, cart.display_name) } }
|
157
138
|
end
|
158
139
|
|
159
140
|
def format_usage_message(cart)
|
160
141
|
"This gear costs an additional $#{cart.usage_rate} per gear after the first 3 gears."
|
161
142
|
end
|
162
143
|
|
163
|
-
#---------------------------
|
164
|
-
# Misc information
|
165
|
-
#---------------------------
|
166
|
-
|
167
|
-
def display_no_info(type)
|
168
|
-
say_table \
|
169
|
-
nil,
|
170
|
-
[["This #{type} has no information to show"]]
|
171
|
-
end
|
172
|
-
|
173
144
|
private
|
174
|
-
def
|
175
|
-
@table_displayed = true
|
176
|
-
|
145
|
+
def format_table(heading,values,opts = {})
|
177
146
|
values = values.to_a if values.is_a? Hash
|
178
147
|
values.delete_if do |arr|
|
179
148
|
arr[0] = "#{table_heading(arr.first)}:" if arr[0].is_a? Symbol
|
180
149
|
opts[:delete] and arr.last.blank?
|
181
150
|
end
|
182
151
|
|
183
|
-
table
|
184
|
-
|
152
|
+
table(values, :heading => heading, :indent => heading ? ' ' : nil, :color => opts[:color])
|
153
|
+
end
|
185
154
|
|
186
|
-
|
187
|
-
|
188
|
-
header(heading, opts) do
|
189
|
-
say table
|
190
|
-
end
|
191
|
-
else
|
192
|
-
say table
|
193
|
-
end
|
155
|
+
def format_no_info(type)
|
156
|
+
["This #{type} has no information to show"]
|
194
157
|
end
|
195
158
|
|
159
|
+
|
196
160
|
# This uses the array of properties to retrieve them from an object
|
197
161
|
def get_properties(object,*properties)
|
198
162
|
properties.map do |prop|
|