claide 0.4.0 → 0.5.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 36f21c6747d3cf6f375f617e2e9a5dda06c6bf62
4
- data.tar.gz: 8e127974a2cca76d6c727eed4f3c2afaf5bac18a
3
+ metadata.gz: c48ac46a6dd1a3d4b6e9b31d6e7e0a9b4697ecc7
4
+ data.tar.gz: aafaf22c16450580a41154a005103b321654fddf
5
5
  SHA512:
6
- metadata.gz: b9a061458ebfb79695b865f757f09e6f46e775a2695612b810d7bdb813e4ef1a6c4e79346b89fcc69a4a3d9a855039a305a84bbe669c2f8baafc76ab96dc5688
7
- data.tar.gz: 68f8dfc688c182c00ac906789c5cb74d89534b5b76c8d9bf8c5e8d4cea19b61af4c0778371be238c18aca1d50e47e7932439e4b4819d31633779ea0546c182b5
6
+ metadata.gz: 9f2a2db1a5e9632761d90bd3486376fe856b6f4012f69391ea093b810c3883cd1f8b9b1b271f42bec2b3b105ba2ef3a14adf1a07ec2fa45f97edb6785f0dedaf
7
+ data.tar.gz: ee607530bb899f4a376bcb6a262a9dbf8bd7790cf85a568f99234ad156249f23e38f5f2cd9f364da6c626ef9fba0501c0c8277b9508cce99cc34f835462288cc
data/lib/claide.rb CHANGED
@@ -9,11 +9,11 @@ module CLAide
9
9
  #
10
10
  # CLAide’s version, following [semver](http://semver.org).
11
11
  #
12
- VERSION = '0.4.0'
12
+ VERSION = '0.5.0'
13
13
 
14
- require 'claide/argv.rb'
15
- require 'claide/command.rb'
16
- require 'claide/help.rb'
17
- require 'claide/informative_error.rb'
14
+ require 'claide/argv'
15
+ require 'claide/command'
16
+ require 'claide/help'
17
+ require 'claide/informative_error'
18
18
 
19
19
  end
data/lib/claide/argv.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # encoding: utf-8
2
+
1
3
  module CLAide
2
4
 
3
5
  # This class is responsible for parsing the parameters specified by the user,
@@ -1,3 +1,5 @@
1
+ # encoding: utf-8
2
+
1
3
  require 'claide/command/banner'
2
4
 
3
5
  module CLAide
@@ -53,6 +55,17 @@ module CLAide
53
55
  attr_accessor :abstract_command
54
56
  alias_method :abstract_command?, :abstract_command
55
57
 
58
+ # @return [Boolean] Indicates whether or not this command is used during
59
+ # command parsing and whether or not it should be shown in the
60
+ # help banner or to show its subcommands instead.
61
+ #
62
+ # Setting this to `true` implies it’s an abstract command.
63
+ attr_reader :ignore_in_command_lookup
64
+ alias_method :ignore_in_command_lookup?, :ignore_in_command_lookup
65
+ def ignore_in_command_lookup=(flag)
66
+ @ignore_in_command_lookup = self.abstract_command = flag
67
+ end
68
+
56
69
  # @return [String] The subcommand which an abstract command should invoke
57
70
  # by default.
58
71
  #
@@ -80,21 +93,39 @@ module CLAide
80
93
  #
81
94
  attr_accessor :arguments
82
95
 
83
- # @return [Boolean] The default value for {Command#colorize_output}. This
84
- # defaults to `true` if `String` has the instance methods
85
- # `#green` and `#red`. Which are defined by, for instance, the
86
- # [colored](https://github.com/defunkt/colored) gem.
87
- #
88
- def colorize_output
89
- if @colorize_output.nil?
90
- @colorize_output = String.method_defined?(:red) &&
91
- String.method_defined?(:green)
96
+ # @return [Boolean] The default value for {Command#ansi_output}. This
97
+ # defaults to `true` if `STDOUT` is connected to a TTY and
98
+ # `String` has the instance methods `#red`, `#green`, and
99
+ # `#yellow` (which are defined by, for instance, the
100
+ # [colored](https://github.com/defunkt/colored) gem).
101
+ #
102
+ def ansi_output
103
+ if @ansi_output.nil?
104
+ @ansi_output = STDOUT.tty? &&
105
+ String.method_defined?(:red) &&
106
+ String.method_defined?(:green) &&
107
+ String.method_defined?(:yellow)
92
108
  end
93
- @colorize_output
109
+ @ansi_output
110
+ end
111
+ attr_writer :ansi_output
112
+ alias_method :ansi_output?, :ansi_output
113
+
114
+ def colorize_output
115
+ warn "[!] The use of `CLAide::Command.colorize_output` has been " \
116
+ "deprecated. Use `CLAide::Command.ansi_output` instead. " \
117
+ "(Called from: #{caller.first})"
118
+ ansi_output
94
119
  end
95
- attr_writer :colorize_output
96
120
  alias_method :colorize_output?, :colorize_output
97
121
 
122
+ def colorize_output=(flag)
123
+ warn "[!] The use of `CLAide::Command.colorize_output=` has been " \
124
+ "deprecated. Use `CLAide::Command.ansi_output=` instead. " \
125
+ "(Called from: #{caller.first})"
126
+ self.ansi_output = flag
127
+ end
128
+
98
129
  # @return [String] The name of the command. Defaults to a snake-cased
99
130
  # version of the class’ name.
100
131
  #
@@ -105,7 +136,10 @@ module CLAide
105
136
  end
106
137
  attr_writer :command
107
138
 
108
- # @return [String] The full command up-to this command.
139
+ # @return [String] The full command up-to this command, as it would be
140
+ # looked up during parsing.
141
+ #
142
+ # @note (see #ignore_in_command_lookup)
109
143
  #
110
144
  # @example
111
145
  #
@@ -113,19 +147,49 @@ module CLAide
113
147
  #
114
148
  def full_command
115
149
  if superclass == Command
116
- "#{command}"
150
+ ignore_in_command_lookup? ? '' : command
117
151
  else
118
- "#{superclass.full_command} #{command}"
152
+ if ignore_in_command_lookup?
153
+ superclass.full_command
154
+ else
155
+ "#{superclass.full_command} #{command}"
156
+ end
119
157
  end
120
158
  end
121
159
 
122
- # @return [Array<Class>] A list of command classes that are nested under
123
- # this command.
160
+ # @return [Array<Class>] A list of all command classes that are nested
161
+ # under this command.
124
162
  #
125
163
  def subcommands
126
164
  @subcommands ||= []
127
165
  end
128
166
 
167
+ # @return [Array<Class>] A list of command classes that are nested under
168
+ # this command _or_ the subcommands of those command classes in
169
+ # case the command class should be ignored in command lookup.
170
+ #
171
+ def subcommands_for_command_lookup
172
+ subcommands.map do |subcommand|
173
+ if subcommand.ignore_in_command_lookup?
174
+ subcommand.subcommands_for_command_lookup
175
+ else
176
+ subcommand
177
+ end
178
+ end.flatten
179
+ end
180
+
181
+ # Searches the list of subcommands that should not be ignored for command
182
+ # lookup for a subcommand with the given `name`.
183
+ #
184
+ # @param [String] name
185
+ # The name of the subcommand to be found.
186
+ #
187
+ # @return [CLAide::Command, nil] The subcommand, if found.
188
+ #
189
+ def find_subcommand(name)
190
+ subcommands_for_command_lookup.find { |sc| sc.command == name }
191
+ end
192
+
129
193
  # @visibility private
130
194
  #
131
195
  # Automatically registers a subclass as a subcommand.
@@ -158,8 +222,8 @@ module CLAide
158
222
  ['--verbose', 'Show more debugging information'],
159
223
  ['--help', 'Show help banner of specified command'],
160
224
  ]
161
- if Command.colorize_output?
162
- options.unshift(['--no-color', 'Show output without color'])
225
+ if Command.ansi_output?
226
+ options.unshift(['--no-ansi', 'Show output without ANSI codes'])
163
227
  end
164
228
  options
165
229
  end
@@ -174,14 +238,14 @@ module CLAide
174
238
  def parse(argv)
175
239
  argv = ARGV.new(argv) unless argv.is_a?(ARGV)
176
240
  cmd = argv.arguments.first
177
- if cmd && subcommand = subcommands.find { |sc| sc.command == cmd }
241
+ if cmd && subcommand = find_subcommand(cmd)
178
242
  argv.shift_argument
179
243
  subcommand.parse(argv)
180
244
  elsif abstract_command? && default_subcommand
181
- subcommand = subcommands.find { |sc| sc.command == default_subcommand }
245
+ subcommand = find_subcommand(default_subcommand)
182
246
  unless subcommand
183
- raise "Unable to find the default subcommand `#{default_subcommand}` " \
184
- "for command `#{self}`."
247
+ raise "Unable to find the default subcommand " \
248
+ "`#{default_subcommand}` for command `#{self}`."
185
249
  end
186
250
  result = subcommand.parse(argv)
187
251
  result.invoked_as_default = true
@@ -244,28 +308,40 @@ module CLAide
244
308
 
245
309
  # @visibility private
246
310
  #
247
- # @raise [Help]
311
+ # @param [String] error_message
312
+ # The error message to show to the user.
313
+ #
314
+ # @param [Boolean] ansi_output
315
+ # Whether or not to use ANSI codes to prettify output.
316
+ #
317
+ # @param [Class] help_class
318
+ # The class to use to raise a ‘help’ error.
319
+ #
320
+ # @raise [Help]
248
321
  #
249
322
  # Signals CLAide that a help banner for this command should be shown,
250
323
  # with an optional error message.
251
324
  #
252
325
  # @return [void]
253
326
  #
254
- def help!(error_message = nil, colorize = false)
255
- raise Help.new(banner(colorize), error_message, colorize)
327
+ def help!(error_message = nil, ansi_output = false, help_class = Help)
328
+ raise help_class.new(banner(ansi_output), error_message, ansi_output)
256
329
  end
257
330
 
258
331
  # @visibility private
259
332
  #
260
333
  # Returns the banner for the command.
261
334
  #
262
- # @param [Bool] colorize
263
- # Whether the banner should be returned colorized.
335
+ # @param [Boolean] ansi
336
+ # Whether the banner should use ANSI codes to prettify output.
337
+ #
338
+ # @param [Class] banner_class
339
+ # The class to use to format help banners.
264
340
  #
265
341
  # @return [String] The banner for the command.
266
342
  #
267
- def banner(colorize = false)
268
- Banner.new(self, colorize).formatted_banner
343
+ def banner(ansi_output = false, banner_class = Banner)
344
+ banner_class.new(self, ansi_output).formatted_banner
269
345
  end
270
346
 
271
347
  # Load additional plugins via rubygems looking for:
@@ -304,8 +380,20 @@ module CLAide
304
380
  message << "\n#{exception.class} - #{exception.message}"
305
381
  message << "\n#{exception.backtrace.join("\n")}"
306
382
  message << "\n---------------------------------------------\n"
307
- message = colorize_output ? message.yellow : message
308
- puts message
383
+ puts prettify_plugin_load_error(message)
384
+ end
385
+
386
+ # Override to control how to print the warning that’s shown when an
387
+ # exception occurs during plugin loading.
388
+ #
389
+ # By default this will be displayed in yellow if `#ansi_output?` returns
390
+ # `true`.
391
+ #
392
+ # @param [String] message
393
+ # The plugin load error message.
394
+ #
395
+ def prettify_plugin_load_error(message)
396
+ ansi_output? ? message.yellow : message
309
397
  end
310
398
  end
311
399
 
@@ -327,19 +415,35 @@ module CLAide
327
415
  attr_accessor :verbose
328
416
  alias_method :verbose?, :verbose
329
417
 
330
- # Set to `true` if {Command.colorize_output} returns `true` and the user
331
- # did **not** specify the `--no-color` option.
418
+ # Set to `true` if {Command.ansi_output} returns `true` and the user
419
+ # did **not** specify the `--no-ansi` option.
332
420
  #
333
421
  # @note (see #verbose)
334
422
  #
335
423
  # @return [Boolean]
336
424
  #
337
- # Wether or not to color {InformativeError} exception messages red and
425
+ # Whether or not to use ANSI codes to prettify output. For instance, by
426
+ # default {InformativeError} exception messages will be colored red and
338
427
  # subcommands in help banners green.
339
428
  #
340
- attr_accessor :colorize_output
429
+ attr_accessor :ansi_output
430
+ alias_method :ansi_output?, :ansi_output
431
+
432
+ def colorize_output
433
+ warn "[!] The use of `CLAide::Command#colorize_output` has been " \
434
+ "deprecated. Use `CLAide::Command#ansi_output` instead. " \
435
+ "(Called from: #{caller.first})"
436
+ ansi_output
437
+ end
341
438
  alias_method :colorize_output?, :colorize_output
342
439
 
440
+ def colorize_output=(flag)
441
+ warn "[!] The use of `CLAide::Command#colorize_output=` has been " \
442
+ "deprecated. Use `CLAide::Command#ansi_output=` instead. " \
443
+ "(Called from: #{caller.first})"
444
+ self.ansi_output = flag
445
+ end
446
+
343
447
  # @return [Bool] Whether the command was invoked by an abstract command by
344
448
  # default.
345
449
  #
@@ -350,9 +454,9 @@ module CLAide
350
454
  # they support from `argv` _before_ calling `super`.
351
455
  #
352
456
  # The `super` implementation sets the {#verbose} attribute based on whether
353
- # or not the `--verbose` option is specified; and the {#colorize_output}
354
- # attribute to `false` if {Command.colorize_output} returns `true`, but the
355
- # user specified the `--no-color` option.
457
+ # or not the `--verbose` option is specified; and the {#ansi_output}
458
+ # attribute to `false` if {Command.ansi_output} returns `true`, but the
459
+ # user specified the `--no-ansi` option.
356
460
  #
357
461
  # @param [ARGV, Array] argv
358
462
  #
@@ -361,7 +465,15 @@ module CLAide
361
465
  def initialize(argv)
362
466
  argv = ARGV.new(argv) unless argv.is_a?(ARGV)
363
467
  @verbose = argv.flag?('verbose')
364
- @colorize_output = argv.flag?('color', Command.colorize_output?)
468
+ @ansi_output = argv.flag?('ansi', Command.ansi_output?)
469
+
470
+ color = argv.flag?('color')
471
+ unless color.nil?
472
+ warn "[!] The use of the `--color`/`--no-color` flag has been " \
473
+ "deprecated. Use `--ansi`/`--no-ansi` instead."
474
+ @ansi_output = color
475
+ end
476
+
365
477
  @argv = argv
366
478
  end
367
479
 
@@ -388,8 +500,8 @@ module CLAide
388
500
  # @return [void
389
501
  #
390
502
  def run
391
- raise "A subclass should override the Command#run method to actually " \
392
- "perform some work."
503
+ raise "A subclass should override the `CLAide::Command#run` method to " \
504
+ "actually perform some work."
393
505
  end
394
506
 
395
507
  protected
@@ -407,7 +519,7 @@ module CLAide
407
519
  else
408
520
  command = self.class
409
521
  end
410
- command = command.help!(error_message, colorize_output?)
522
+ command = command.help!(error_message, ansi_output?)
411
523
  end
412
524
 
413
525
  #-------------------------------------------------------------------------#
@@ -1,3 +1,5 @@
1
+ # encoding: utf-8
2
+
1
3
  module CLAide
2
4
  class Command
3
5
 
@@ -12,15 +14,30 @@ module CLAide
12
14
 
13
15
  # @return [Bool]
14
16
  #
15
- attr_accessor :colorize_output
17
+ attr_accessor :ansi_output
18
+ alias_method :ansi_output?, :ansi_output
19
+
20
+ def colorize_output
21
+ warn "[!] The use of `CLAide::Command::Banner#colorize_output` has " \
22
+ "been deprecated. Use `CLAide::Command::Banner#ansi_output` " \
23
+ "instead. (Called from: #{caller.first})"
24
+ ansi_output
25
+ end
16
26
  alias_method :colorize_output?, :colorize_output
17
27
 
28
+ def colorize_output=(flag)
29
+ warn "[!] The use of `CLAide::Command::Banner#colorize_output=` has " \
30
+ "been deprecated. Use `CLAide::Command::Banner#ansi_output=` " \
31
+ "instead. (Called from: #{caller.first})"
32
+ self.ansi_output = flag
33
+ end
34
+
18
35
  # @param [Class] command @see command
19
- # @param [Class] colorize_output@see colorize_output
36
+ # @param [Class] ansi_output @see ansi_output
20
37
  #
21
- def initialize(command, colorize_output = false)
38
+ def initialize(command, ansi_output = false)
22
39
  @command = command
23
- @colorize_output = colorize_output
40
+ @ansi_output = ansi_output
24
41
  end
25
42
 
26
43
  # @return [String]
@@ -52,8 +69,27 @@ module CLAide
52
69
  #
53
70
  def formatted_options_description
54
71
  opts = command.options
55
- size = opts.map { |opt| opt.first.size }.max
56
- opts.map { |key, desc| " #{key.ljust(size)} #{desc}" }.join("\n")
72
+ max_key_size = opts.map { |opt| opt.first.size }.max
73
+
74
+ desc_start = max_key_size + 7 # fixed whitespace in `result` var
75
+ desc_width = terminal_width - desc_start
76
+
77
+ opts.map do |key, desc|
78
+ space = ' ' * (max_key_size - key.size)
79
+ result = " #{prettify_option_name(key)}#{space} "
80
+ if terminal_width == 0
81
+ result << desc
82
+ else
83
+ space = ' ' * desc_start
84
+ result << word_wrap(desc, desc_width).split("\n").join("\n#{space}")
85
+ end
86
+ end.join("\n")
87
+ end
88
+
89
+ # @return [String]
90
+ #
91
+ def prettify_option_name(name)
92
+ name
57
93
  end
58
94
 
59
95
  # @return [String]
@@ -63,21 +99,28 @@ module CLAide
63
99
  message = strip_heredoc(message)
64
100
  message = message.split("\n").map { |line| " #{line}" }.join("\n")
65
101
  args = " #{command.arguments}" if command.arguments
66
- " $ #{command.full_command}#{args}\n\n#{message}"
102
+ cmd = "$ #{command.full_command}#{args}"
103
+ " #{prettify_command_in_usage_description(cmd)}\n\n#{message}"
67
104
  end
68
105
  end
69
106
 
107
+ # @return [String]
108
+ #
109
+ def prettify_command_in_usage_description(command)
110
+ command
111
+ end
112
+
70
113
  # @return [String]
71
114
  #
72
115
  def formatted_subcommand_summaries
73
- subcommands = command.subcommands.reject do |subcommand|
116
+ subcommands = command.subcommands_for_command_lookup.reject do |subcommand|
74
117
  subcommand.summary.nil?
75
118
  end.sort_by(&:command)
76
119
  unless subcommands.empty?
77
120
  command_size = subcommands.map { |cmd| cmd.command.size }.max
78
121
  subcommands.map do |subcommand|
79
122
  subcommand_string = subcommand.command.ljust(command_size)
80
- subcommand_string = subcommand_string.green if colorize_output?
123
+ subcommand_string = prettify_subcommand_name(subcommand_string)
81
124
  is_default = subcommand.command == command.default_subcommand
82
125
  if is_default
83
126
  bullet_point = '-'
@@ -89,6 +132,12 @@ module CLAide
89
132
  end
90
133
  end
91
134
 
135
+ # @return [String]
136
+ #
137
+ def prettify_subcommand_name(name)
138
+ ansi_output? ? name.green : name
139
+ end
140
+
92
141
  private
93
142
 
94
143
  # @!group Private helpers
@@ -105,6 +154,24 @@ module CLAide
105
154
  end
106
155
  end
107
156
 
157
+ # @return [String] Lifted straight from ActionView. Thanks guys!
158
+ #
159
+ def word_wrap(line, line_width)
160
+ line.gsub(/(.{1,#{line_width}})(\s+|$)/, "\\1\n").strip
161
+ end
162
+
163
+ # @return [Fixnum] The width of the current terminal, unless being piped.
164
+ #
165
+ def terminal_width
166
+ @terminal_width ||= begin
167
+ if STDOUT.tty? && system('which tput > /dev/null 2>&1')
168
+ `tput cols`.to_i
169
+ else
170
+ 0
171
+ end
172
+ end
173
+ end
174
+
108
175
  end
109
176
  end
110
177
  end
data/lib/claide/help.rb CHANGED
@@ -1,6 +1,8 @@
1
+ # encoding: utf-8
2
+
1
3
  module CLAide
2
4
 
3
- require 'claide/informative_error.rb'
5
+ require 'claide/informative_error'
4
6
 
5
7
  # The exception class that is raised to indicate a help banner should be
6
8
  # shown while running {Command.run}.
@@ -18,9 +20,18 @@ module CLAide
18
20
  #
19
21
  attr_reader :error_message
20
22
 
21
- # @return [Bool] Whether the error message should be colorized.
23
+ # @return [Bool] Whether the error message should use ANSI codes to
24
+ # prettify output.
22
25
  #
23
- attr_reader :colorize
26
+ attr_reader :ansi_output
27
+ alias_method :ansi_output?, :ansi_output
28
+
29
+ def colorize
30
+ warn "[!] The use of `CLAide::Help#colorize` has been " \
31
+ "deprecated. Use `CLAide::Help#ansi_output` instead. " \
32
+ "(Called from: #{caller.first})"
33
+ ansi_output
34
+ end
24
35
  alias_method :colorize?, :colorize
25
36
 
26
37
  # @param [String] banner @see banner
@@ -30,10 +41,10 @@ module CLAide
30
41
  # terminate the program with, will be set to `1`, otherwise a {Help}
31
42
  # exception is treated as not being a real error and exits with `0`.
32
43
  #
33
- def initialize(banner, error_message = nil, colorize = false)
44
+ def initialize(banner, error_message = nil, ansi_output = false)
34
45
  @banner = banner
35
46
  @error_message = error_message
36
- @colorize = colorize
47
+ @ansi_output = ansi_output
37
48
  @exit_status = @error_message.nil? ? 0 : 1
38
49
  end
39
50
 
@@ -43,10 +54,16 @@ module CLAide
43
54
  def formatted_error_message
44
55
  if error_message
45
56
  message = "[!] #{error_message}"
46
- colorize? ? message.red : message
57
+ prettify_error_message(message)
47
58
  end
48
59
  end
49
60
 
61
+ # @return [String]
62
+ #
63
+ def prettify_error_message(message)
64
+ ansi_output? ? message.red : message
65
+ end
66
+
50
67
  # @return [String] The optional error message, combined with the help
51
68
  # banner of the command.
52
69
  #
@@ -1,3 +1,5 @@
1
+ # encoding: utf-8
2
+
1
3
  module CLAide
2
4
 
3
5
  # Including this module into an exception class will ensure that when raised,
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: claide
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eloy Duran
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-11-14 00:00:00.000000000 Z
12
+ date: 2014-03-26 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description:
15
15
  email:
@@ -19,14 +19,14 @@ executables: []
19
19
  extensions: []
20
20
  extra_rdoc_files: []
21
21
  files:
22
+ - LICENSE
23
+ - README.markdown
24
+ - lib/claide.rb
22
25
  - lib/claide/argv.rb
23
- - lib/claide/command/banner.rb
24
26
  - lib/claide/command.rb
27
+ - lib/claide/command/banner.rb
25
28
  - lib/claide/help.rb
26
29
  - lib/claide/informative_error.rb
27
- - lib/claide.rb
28
- - README.markdown
29
- - LICENSE
30
30
  homepage: https://github.com/CocoaPods/CLAide
31
31
  licenses:
32
32
  - MIT
@@ -37,17 +37,17 @@ require_paths:
37
37
  - lib
38
38
  required_ruby_version: !ruby/object:Gem::Requirement
39
39
  requirements:
40
- - - '>='
40
+ - - ">="
41
41
  - !ruby/object:Gem::Version
42
42
  version: '0'
43
43
  required_rubygems_version: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - '>='
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
47
  version: '0'
48
48
  requirements: []
49
49
  rubyforge_project:
50
- rubygems_version: 2.0.3
50
+ rubygems_version: 2.2.2
51
51
  signing_key:
52
52
  specification_version: 3
53
53
  summary: A small command-line interface framework.