claide 0.6.1 → 0.7.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: c401c5a5be0c7e2652c31c9cc82a46dca6a8b4b2
4
- data.tar.gz: 76dc8118415015daf186720e9c188f86bd37c512
3
+ metadata.gz: fa421ae80f05ff7766c67d15049c75363ea796ca
4
+ data.tar.gz: 6c85d3c205a7f365992cb83913663e923eaf89e0
5
5
  SHA512:
6
- metadata.gz: 0b38f9c3ef3e9a08dc2b6f52002aa928e48216f3b1fe3997d1613499c1f1716566e6f865a498c4f2e3854aaf4db9e2308a5b02549d884fd115ec5477da7a1077
7
- data.tar.gz: 636d2249e8aacb1a0cfe05f88131c7aa46b4fb9904c45075ad51647c5f801442ac7ed312b0b58eefc8997089dd233f130ea125956d32c4af088197d420d65ae5
6
+ metadata.gz: 125926a5f8beb325d3e5a8a8b834de3db972cf402d62dab2c7afcfba52dd8738f152c30dceb02ce41a42a5ed5715d135b49d155e0ecfd2c021a8f64c9dd3b5ab
7
+ data.tar.gz: 99bf6357be57b12289b94501bd708c558b4ac45c9ada4321f0927b4e9f087e39c971bdfbdf20ed7cb0530ae42522c245d8fc70f0a853a00bbc71cba995d6f90a
data/lib/claide/ansi.rb CHANGED
@@ -43,7 +43,7 @@ module CLAide
43
43
  :underline => 4,
44
44
  :blink => 5,
45
45
  :reverse => 7,
46
- :hidden => 8
46
+ :hidden => 8,
47
47
  }
48
48
 
49
49
  # @return [Hash{Symbol => Fixnum}] The codes to disable a text attribute by
@@ -54,7 +54,7 @@ module CLAide
54
54
  :underline => 24,
55
55
  :blink => 25,
56
56
  :reverse => 27,
57
- :hidden => 28
57
+ :hidden => 28,
58
58
  }
59
59
 
60
60
  # Return [String] The escape sequence to reset the graphics.
@@ -71,7 +71,7 @@ module CLAide
71
71
  :blue => 4,
72
72
  :magenta => 5,
73
73
  :cyan => 6,
74
- :white => 7
74
+ :white => 7,
75
75
  }
76
76
 
77
77
  # Return [String] The escape sequence for the default foreground color.
@@ -0,0 +1,62 @@
1
+ # encoding: utf-8
2
+
3
+ module CLAide
4
+ # This class is used to represent individual arguments to present to
5
+ # the command help banner
6
+ #
7
+ class Argument
8
+ # The string used for ellipsis / repeatable arguments in the banner
9
+ #
10
+ ELLIPSIS = '...'
11
+
12
+ # @return [Array<String>]
13
+ # List of alternate names for the parameters
14
+ attr_reader :names
15
+
16
+ # @return [Boolean]
17
+ # Indicates if the argument is required (not optional)
18
+ #
19
+ attr_accessor :required
20
+ alias_method :required?, :required
21
+
22
+ # @return [Boolean]
23
+ # Indicates if the argument is repeatable (= can appear multiple
24
+ # times in the command, which is indicated by '...' in the banner)
25
+ #
26
+ attr_accessor :repeatable
27
+ alias_method :repeatable?, :repeatable
28
+
29
+ # @param [String,Array<String>] names
30
+ # List of the names of each parameter alternatives.
31
+ # For convenience, if there is only one alternative for that
32
+ # parameter, we can use a String instead of a 1-item Array
33
+ #
34
+ # @param [Boolean] required
35
+ # true if the parameter is required, false if it is optional
36
+ #
37
+ # @param [Boolean] repeatable
38
+ # If true, the argument can appear multiple times in the command.
39
+ # In that case, an ellipsis will be appended after the argument
40
+ # in the help banner.
41
+ #
42
+ # @example
43
+ #
44
+ # # A required parameter that can be either a NAME or URL
45
+ # Argument.new(%(NAME URL), true)
46
+ #
47
+ def initialize(names, required, repeatable = false)
48
+ @names = Array(names)
49
+ @required = required
50
+ @repeatable = repeatable
51
+ end
52
+
53
+ # @return [Boolean] true on equality
54
+ #
55
+ # @param [Argument] other the Argument compared against
56
+ #
57
+ def ==(other)
58
+ other.is_a?(Argument) &&
59
+ names == other.names && required == other.required
60
+ end
61
+ end
62
+ end
@@ -18,11 +18,11 @@ module CLAide
18
18
  components = [
19
19
  [command, :green],
20
20
  [subcommand, :green],
21
- [argument, :magenta]
21
+ [argument, :magenta],
22
22
  ]
23
23
  components.reduce('') do |memo, (string, ansi_key)|
24
- memo << ' ' << string.ansi.apply(ansi_key) unless string.empty?
25
- memo
24
+ next memo if !string || string.empty?
25
+ memo << ' ' << string.ansi.apply(ansi_key)
26
26
  end.lstrip
27
27
  end
28
28
 
@@ -30,12 +30,14 @@ module CLAide
30
30
  #
31
31
  def self.prettify_message(command, message)
32
32
  message = message.dup
33
- [[command.arguments, :magenta],
34
- [command.options, :blue]].each do |(list, ansi_key)|
35
- list.map(&:first).each do |name|
36
- message.gsub!(/`#{name}`/, "`#{name}`".ansi.apply(ansi_key))
33
+ command.arguments.each do |arg|
34
+ arg.names.each do |name|
35
+ message.gsub!("`#{name.gsub(/\.{3}$/, '')}`", '\0'.ansi.magenta)
37
36
  end
38
37
  end
38
+ command.options.each do |(name, _description)|
39
+ message.gsub!("`#{name}`", '\0'.ansi.blue)
40
+ end
39
41
  message
40
42
  end
41
43
 
@@ -24,7 +24,7 @@ module CLAide
24
24
  sections = [
25
25
  ['Usage', formatted_usage_description],
26
26
  ['Commands', formatted_subcommand_summaries],
27
- ['Options', formatted_options_description]
27
+ ['Options', formatted_options_description],
28
28
  ]
29
29
  banner = sections.map do |(title, body)|
30
30
  [prettify_title("#{title}:"), body] unless body.empty?
@@ -65,8 +65,10 @@ module CLAide
65
65
  # @return [String] The signature of the command.
66
66
  #
67
67
  def signature
68
- result = prettify_signature(
69
- command.full_command, signature_sub_command, signature_arguments)
68
+ full_command = command.full_command
69
+ sub_command = signature_sub_command
70
+ arguments = signature_arguments
71
+ result = prettify_signature(full_command, sub_command, arguments)
70
72
  result.insert(0, '$ ')
71
73
  result.insert(0, ' ' * (TEXT_INDENT - '$ '.size))
72
74
  end
@@ -74,19 +76,18 @@ module CLAide
74
76
  # @return [String] The subcommand indicator of the signature.
75
77
  #
76
78
  def signature_sub_command
77
- if command.subcommands.any?
78
- command.default_subcommand ? '[COMMAND]' : 'COMMAND'
79
- end
80
- ''
79
+ return '[COMMAND]' if command.default_subcommand
80
+ return 'COMMAND' if command.subcommands.any?
81
81
  end
82
82
 
83
83
  # @return [String] The arguments of the signature.
84
84
  #
85
85
  def signature_arguments
86
- command.arguments.reduce('') do |memo, (name, type)|
87
- name = "[#{name}]" if type == :optional
88
- memo << ' ' << name
89
- end.lstrip
86
+ command.arguments.map do |arg|
87
+ names = arg.names.join('|')
88
+ names.concat(' ' + Argument::ELLIPSIS) if arg.repeatable?
89
+ arg.required? ? names : "[#{names}]"
90
+ end.join(' ')
90
91
  end
91
92
 
92
93
  # @return [String] The section describing the subcommands of the command.
@@ -10,7 +10,7 @@ module CLAide
10
10
  #
11
11
  DEFAULT_ROOT_OPTIONS = [
12
12
  ['--completion-script', 'Print the auto-completion script'],
13
- ['--version', 'Show the version of the tool']
13
+ ['--version', 'Show the version of the tool'],
14
14
  ]
15
15
 
16
16
  # @return [Array<Array<String, String>>] The default options implemented
@@ -19,7 +19,7 @@ module CLAide
19
19
  DEFAULT_OPTIONS = [
20
20
  ['--verbose', 'Show more debugging information'],
21
21
  ['--no-ansi', 'Show output without ANSI codes'],
22
- ['--help', 'Show help banner of specified command']
22
+ ['--help', 'Show help banner of specified command'],
23
23
  ]
24
24
 
25
25
  # @return [Array<Array<String, String>>] The list of the default
@@ -67,9 +67,8 @@ module CLAide
67
67
  def self.print_version(command)
68
68
  puts command.class.version
69
69
  if command.verbose?
70
- prefix = command.class.plugin_prefix
71
- PluginsHelper.plugin_load_paths(prefix).each do |path|
72
- puts PluginsHelper.plugin_info(path)
70
+ PluginsHelper.specifications.each do |spec|
71
+ puts "#{spec.name}: #{spec.version}"
73
72
  end
74
73
  end
75
74
  end
@@ -2,72 +2,77 @@
2
2
 
3
3
  module CLAide
4
4
  class Command
5
- module PluginsHelper
6
- # Loads additional plugins via rubygems looking for files named after the
7
- # `PLUGIN_PREFIX_plugin`.
5
+ # Handles plugin related logic logic for the `Command` class.
6
+ #
7
+ # Plugins are loaded the first time a command run and are identified by the
8
+ # prefix specified in the command class. Plugins must adopt the following
9
+ # conventions:
10
+ #
11
+ # - Support being loaded by a file located under the
12
+ # `lib/#{plugin_prefix}_plugin` relative path.
13
+ # - Be stored in a folder named after the plugin.
14
+ #
15
+ class PluginsHelper
16
+ class << self
17
+ # @return [Array<Pathname>] The list of the root directories of the
18
+ # loaded plugins.
19
+ #
20
+ attr_reader :plugin_paths
21
+ end
22
+
23
+ # @return [Array<String>] Loads plugins via RubyGems looking for files
24
+ # named after the `PLUGIN_PREFIX_plugin` and returns the paths of
25
+ # the gems loaded successfully. Plugins are required safely.
8
26
  #
9
27
  def self.load_plugins(plugin_prefix)
28
+ return if plugin_paths
10
29
  paths = PluginsHelper.plugin_load_paths(plugin_prefix)
11
- loaded_paths = []
30
+ plugin_paths = []
12
31
  paths.each do |path|
13
- if PluginsHelper.safe_require(path)
14
- loaded_paths << path
32
+ if PluginsHelper.safe_require(path.to_s)
33
+ plugin_paths << Pathname(path + './../../').cleanpath
15
34
  end
16
35
  end
17
- loaded_paths
36
+
37
+ @plugin_paths = plugin_paths
18
38
  end
19
39
 
20
- # Returns the name and the version of the plugin with the given path.
21
- #
22
- # @param [String] path
23
- # The load path of the plugin.
24
- #
25
- # @return [String] A string including the name and the version or a
26
- # failure message.
40
+ # @return [Array<Specification>] The RubyGems specifications for the
41
+ # loaded plugins.
27
42
  #
28
- def self.plugin_info(path)
29
- if gemspec = find_gemspec(path)
30
- spec = Gem::Specification.load(gemspec)
31
- end
32
-
33
- if spec
34
- "#{spec.name}: #{spec.version}"
35
- else
36
- "[!] Unable to load a specification for `#{path}`"
37
- end
43
+ def self.specifications
44
+ PluginsHelper.plugin_paths.map do |path|
45
+ specification(path)
46
+ end.compact
38
47
  end
39
48
 
40
- # @return [String] Finds the path of the gemspec of a path. The path is
41
- # iterated upwards until a dir with a single gemspec is found.
49
+ # @return [Array<Specification>] The RubyGems specifications for the
50
+ # plugin with the given root path.
42
51
  #
43
- # @param [String] path
44
- # The load path of a plugin.
52
+ # @param [#to_s] path
53
+ # The root path of the plugin.
45
54
  #
46
- def self.find_gemspec(path)
47
- reverse_ascending_paths(path).find do |candidate_path|
48
- glob = Dir.glob("#{candidate_path}/*.gemspec")
49
- if glob.count == 1
50
- return glob.first
51
- end
55
+ def self.specification(path)
56
+ glob = Dir.glob("#{path}/*.gemspec")
57
+ spec = Gem::Specification.load(glob.first) if glob.count == 1
58
+ unless spec
59
+ warn '[!] Unable to load a specification for the plugin ' \
60
+ "`#{path}`".ansi.yellow
52
61
  end
53
- nil
62
+ spec
54
63
  end
55
64
 
56
- # @return [String] Returns the list of the parents paths of a path.
65
+ # @return [Array<String>] The list of the plugins whose root path appears
66
+ # in the backtrace of an exception.
57
67
  #
58
- # @param [String] path
59
- # The path for which the list is needed.
68
+ # @param [Exception] exception
69
+ # The exception to analyze.
60
70
  #
61
- def self.reverse_ascending_paths(path)
62
- components = path.split('/')[0...-1]
63
- progress = nil
64
- components.map do |component|
65
- if progress
66
- progress = progress + '/' + component
67
- else
68
- progress = component
69
- end
70
- end.reverse
71
+ def self.plugins_involved_in_exception(exception)
72
+ paths = plugin_paths.select do |plugin_path|
73
+ exception.backtrace.any? { |line| line.include?(plugin_path.to_s) }
74
+ end
75
+ paths.map { |path| path.to_s.split('/').last }
71
76
  end
72
77
 
73
78
  # Returns the paths of the files to require to load the available
@@ -77,10 +82,11 @@ module CLAide
77
82
  #
78
83
  def self.plugin_load_paths(plugin_prefix)
79
84
  if plugin_prefix && !plugin_prefix.empty?
85
+ pattern = "#{plugin_prefix}_plugin"
80
86
  if Gem.respond_to? :find_latest_files
81
- Gem.find_latest_files("#{plugin_prefix}_plugin")
87
+ Gem.find_latest_files(pattern)
82
88
  else
83
- Gem.find_files("#{plugin_prefix}_plugin")
89
+ Gem.find_files(pattern)
84
90
  end
85
91
  else
86
92
  []
@@ -18,10 +18,7 @@ module CLAide
18
18
  type = ARGV::Parser.argument_type(string)
19
19
  list = suggestion_list(command_class, type)
20
20
  suggestion = ValidationHelper.suggestion(string, list)
21
- pretty_suggestion = prettify_validation_suggestion(suggestion, type)
22
- string_type = type == :arg ? 'command' : 'option'
23
- "Unknown #{string_type}: `#{string}`\n" \
24
- "Did you mean: #{pretty_suggestion}"
21
+ suggestion_message(suggestion, type, string)
25
22
  end
26
23
 
27
24
  # @return [Array<String>] The list of the valid arguments for a command
@@ -58,6 +55,29 @@ module CLAide
58
55
  sorted.first
59
56
  end
60
57
 
58
+ # @return [String] Returns a message including a suggestion for the given
59
+ # suggestion.
60
+ #
61
+ # @param [String, Nil] suggestion
62
+ # The suggestion.
63
+ #
64
+ # @param [Symbol] type
65
+ # The type of the suggestion.
66
+ #
67
+ # @param [String] string
68
+ # The unrecognized string.
69
+ #
70
+ def self.suggestion_message(suggestion, type, string)
71
+ string_type = type == :arg ? 'command' : 'option'
72
+ if suggestion
73
+ pretty_suggestion = prettify_validation_suggestion(suggestion, type)
74
+ "Unknown #{string_type}: `#{string}`\n" \
75
+ "Did you mean: #{pretty_suggestion}"
76
+ else
77
+ "Unknown #{string_type}: `#{string}`"
78
+ end
79
+ end
80
+
61
81
  # Prettifies the given validation suggestion according to the type.
62
82
  #
63
83
  # @param [String] suggestion
@@ -89,44 +89,34 @@ module CLAide
89
89
  #
90
90
  attr_accessor :plugin_prefix
91
91
 
92
- # @return [Array<Array<String,Symbol>>]
92
+ # @return [Array<Argument>]
93
93
  # A list of arguments the command handles. This is shown
94
94
  # in the usage section of the command’s help banner.
95
- # Each Array<String,Symbol> tuple in the array represents an
96
- # argument using the form [name, type] where:
97
- # - name is a String containing the argument
98
- # - type is either :optional or :required
95
+ # Each Argument in the array represents an argument by its name
96
+ # (or list of alternatives) and whether it's required or optional
99
97
  #
100
- # @todo Remove deprecation
101
- #
102
- attr_accessor :arguments
103
98
  def arguments
104
99
  @arguments ||= []
105
100
  end
106
101
 
107
- # @param [Array<Array<String,Symbol>>] arguments
108
- # An array containing arguments, each described by a tuple of
109
- # the form [name, type], where:
110
- # - name is a String containing the argument
111
- # - type is either :optional or :required
102
+ # @param [Array<Argument>] arguments
103
+ # An array listing the command arguments.
104
+ # Each Argument object describe the argument by its name
105
+ # (or list of alternatives) and whether it's required or optional
106
+ #
107
+ # @todo Remove deprecation
112
108
  #
113
- # rubocop:disable MethodLength
114
109
  def arguments=(arguments)
115
110
  if arguments.is_a?(Array)
116
- @arguments = arguments
117
- else
118
- warn '[!] The specification of arguments as a string has been' \
119
- " deprecated #{self}: `#{arguments}`".ansi.yellow
120
- @arguments = arguments.split(' ').map do |argument|
121
- if argument.start_with?('[')
122
- [argument.sub(/\[(.*)\]/, '\1'), :optional]
123
- else
124
- [argument, :required]
125
- end
111
+ if arguments.empty? || arguments[0].is_a?(Argument)
112
+ @arguments = arguments
113
+ else
114
+ self.arguments_array = arguments
126
115
  end
116
+ else
117
+ self.arguments_string = arguments
127
118
  end
128
119
  end
129
- # rubocop:enable MethodLength
130
120
 
131
121
  # @return [Boolean] The default value for {Command#ansi_output}. This
132
122
  # defaults to `true` if `STDOUT` is connected to a TTY and
@@ -326,6 +316,11 @@ module CLAide
326
316
  # @return [void]
327
317
  #
328
318
  def self.report_error(exception)
319
+ plugins = PluginsHelper.plugins_involved_in_exception(exception)
320
+ unless plugins.empty?
321
+ puts '[!] The exception involves the following plugins:' \
322
+ "\n - #{plugins.join("\n - ")}\n".ansi.yellow
323
+ end
329
324
  raise exception
330
325
  end
331
326
 
@@ -361,6 +356,19 @@ module CLAide
361
356
  banner_class.new(self).formatted_banner
362
357
  end
363
358
 
359
+ # @visibility private
360
+ #
361
+ # Print banner and exit
362
+ #
363
+ # @note Calling this method exits the current process.
364
+ #
365
+ # @return [void]
366
+ #
367
+ def self.banner!
368
+ puts banner
369
+ exit 0
370
+ end
371
+
364
372
  #-------------------------------------------------------------------------#
365
373
 
366
374
  # Set to `true` if the user specifies the `--verbose` option.
@@ -431,7 +439,7 @@ module CLAide
431
439
  # @return [void]
432
440
  #
433
441
  def validate!
434
- help! if @argv.flag?('help')
442
+ banner! if @argv.flag?('help')
435
443
  unless @argv.empty?
436
444
  help! ValidationHelper.argument_suggestion(@argv.remainder, self.class)
437
445
  end
@@ -450,6 +458,21 @@ module CLAide
450
458
 
451
459
  protected
452
460
 
461
+ # Returns the class of the invoked command
462
+ #
463
+ # @return [Command]
464
+ #
465
+ def invoked_command_class
466
+ if invoked_as_default?
467
+ self.class.superclass
468
+ else
469
+ self.class
470
+ end
471
+ end
472
+
473
+ # @param [String] error_message
474
+ # A custom optional error message
475
+ #
453
476
  # @raise [Help]
454
477
  #
455
478
  # Signals CLAide that a help banner for this command should be shown,
@@ -458,14 +481,54 @@ module CLAide
458
481
  # @return [void]
459
482
  #
460
483
  def help!(error_message = nil)
461
- if invoked_as_default?
462
- command = self.class.superclass
463
- else
464
- command = self.class
465
- end
466
- command.help!(error_message)
484
+ invoked_command_class.help!(error_message)
485
+ end
486
+
487
+ # Print banner and exit
488
+ #
489
+ # @note Calling this method exits the current process.
490
+ #
491
+ # @return [void]
492
+ #
493
+ def banner!
494
+ invoked_command_class.banner!
467
495
  end
468
496
 
469
497
  #-------------------------------------------------------------------------#
498
+
499
+ # Handle deprecated form of self.arguments as an
500
+ # Array<Array<(String, Symbol)>> like in:
501
+ #
502
+ # self.arguments = [ ['NAME', :required], ['QUERY', :optional] ]
503
+ #
504
+ # @todo Remove deprecated format support
505
+ #
506
+ def self.arguments_array=(arguments)
507
+ warn '[!] The signature of CLAide#arguments has changed. ' \
508
+ "Use CLAide::Argument (#{self}: `#{arguments}`)".ansi.yellow
509
+ @arguments = arguments.map do |(name_str, type)|
510
+ names = name_str.split('|')
511
+ required = (type == :required)
512
+ Argument.new(names, required)
513
+ end
514
+ end
515
+
516
+ # Handle deprecated form of self.arguments as a String, like in:
517
+ #
518
+ # self.arguments = 'NAME [QUERY]'
519
+ #
520
+ # @todo Remove deprecated format support
521
+ #
522
+ def self.arguments_string=(arguments)
523
+ warn '[!] The specification of arguments as a string has been' \
524
+ " deprecated #{self}: `#{arguments}`".ansi.yellow
525
+ @arguments = arguments.split(' ').map do |argument|
526
+ if argument.start_with?('[')
527
+ Argument.new(argument.sub(/\[(.*)\]/, '\1').split('|'), false)
528
+ else
529
+ Argument.new(argument.split('|'), true)
530
+ end
531
+ end
532
+ end
470
533
  end
471
534
  end
data/lib/claide/helper.rb CHANGED
@@ -33,9 +33,10 @@ module CLAide
33
33
  def self.format_markdown(string, indent = 0, max_width = 80)
34
34
  paragraphs = Helper.strip_heredoc(string).split("\n\n")
35
35
  paragraphs = paragraphs.map do |paragraph|
36
- unless paragraph.start_with?(' ' * 4)
37
- full_line = paragraph.gsub("\n", ' ')
38
- paragraph = wrap_with_indent(full_line, indent, max_width)
36
+ if paragraph.start_with?(' ' * 4)
37
+ paragraph.gsub!(/\n/, "\n#{' ' * indent}")
38
+ else
39
+ paragraph = wrap_with_indent(paragraph, indent, max_width)
39
40
  end
40
41
  paragraph.insert(0, ' ' * indent).rstrip
41
42
  end
@@ -62,9 +63,10 @@ module CLAide
62
63
  width = [terminal_width, max_width].min
63
64
  end
64
65
 
66
+ full_line = string.gsub("\n", ' ')
65
67
  available_width = width - indent
66
68
  space = ' ' * indent
67
- word_wrap(string, available_width).split("\n").join("\n#{space}")
69
+ word_wrap(full_line, available_width).split("\n").join("\n#{space}")
68
70
  end
69
71
 
70
72
  # @return [String] Lifted straight from ActionView. Thanks guys!
data/lib/claide.rb CHANGED
@@ -8,9 +8,10 @@ module CLAide
8
8
  #
9
9
  # CLAide’s version, following [semver](http://semver.org).
10
10
  #
11
- VERSION = '0.6.1'
11
+ VERSION = '0.7.0'
12
12
 
13
13
  require 'claide/ansi'
14
+ require 'claide/argument'
14
15
  require 'claide/argv'
15
16
  require 'claide/command'
16
17
  require 'claide/help'
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.6.1
4
+ version: 0.7.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: 2014-05-20 00:00:00.000000000 Z
12
+ date: 2014-09-11 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description:
15
15
  email:
@@ -19,28 +19,29 @@ executables: []
19
19
  extensions: []
20
20
  extra_rdoc_files: []
21
21
  files:
22
- - LICENSE
23
- - README.markdown
24
- - lib/claide.rb
25
- - lib/claide/ansi.rb
26
22
  - lib/claide/ansi/cursor.rb
27
23
  - lib/claide/ansi/graphics.rb
28
24
  - lib/claide/ansi/string_escaper.rb
29
- - lib/claide/argv.rb
25
+ - lib/claide/ansi.rb
26
+ - lib/claide/argument.rb
30
27
  - lib/claide/argv/parser.rb
31
- - lib/claide/command.rb
32
- - lib/claide/command/banner.rb
28
+ - lib/claide/argv.rb
33
29
  - lib/claide/command/banner/prettifier.rb
30
+ - lib/claide/command/banner.rb
34
31
  - lib/claide/command/options.rb
35
32
  - lib/claide/command/parser.rb
36
33
  - lib/claide/command/plugins_helper.rb
37
- - lib/claide/command/shell_completion_helper.rb
38
34
  - lib/claide/command/shell_completion_helper/zsh_completion_generator.rb
35
+ - lib/claide/command/shell_completion_helper.rb
39
36
  - lib/claide/command/validation_helper.rb
37
+ - lib/claide/command.rb
40
38
  - lib/claide/help.rb
41
39
  - lib/claide/helper.rb
42
40
  - lib/claide/informative_error.rb
43
41
  - lib/claide/mixins.rb
42
+ - lib/claide.rb
43
+ - README.markdown
44
+ - LICENSE
44
45
  homepage: https://github.com/CocoaPods/CLAide
45
46
  licenses:
46
47
  - MIT
@@ -51,17 +52,17 @@ require_paths:
51
52
  - lib
52
53
  required_ruby_version: !ruby/object:Gem::Requirement
53
54
  requirements:
54
- - - ">="
55
+ - - '>='
55
56
  - !ruby/object:Gem::Version
56
57
  version: '0'
57
58
  required_rubygems_version: !ruby/object:Gem::Requirement
58
59
  requirements:
59
- - - ">="
60
+ - - '>='
60
61
  - !ruby/object:Gem::Version
61
62
  version: '0'
62
63
  requirements: []
63
64
  rubyforge_project:
64
- rubygems_version: 2.2.2
65
+ rubygems_version: 2.0.14
65
66
  signing_key:
66
67
  specification_version: 3
67
68
  summary: A small command-line interface framework.