claide 0.6.1 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
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.