command_kit 0.1.0.rc1 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (79) hide show
  1. checksums.yaml +4 -4
  2. data/ChangeLog.md +1 -1
  3. data/README.md +7 -4
  4. data/gemspec.yml +1 -1
  5. data/lib/command_kit.rb +1 -0
  6. data/lib/command_kit/arguments.rb +16 -1
  7. data/lib/command_kit/arguments/argument.rb +2 -0
  8. data/lib/command_kit/arguments/argument_value.rb +2 -0
  9. data/lib/command_kit/colors.rb +32 -0
  10. data/lib/command_kit/command.rb +5 -0
  11. data/lib/command_kit/command_name.rb +9 -0
  12. data/lib/command_kit/commands.rb +30 -0
  13. data/lib/command_kit/commands/auto_load.rb +16 -0
  14. data/lib/command_kit/commands/auto_require.rb +16 -0
  15. data/lib/command_kit/commands/command.rb +3 -0
  16. data/lib/command_kit/commands/help.rb +2 -0
  17. data/lib/command_kit/commands/parent_command.rb +7 -0
  18. data/lib/command_kit/commands/subcommand.rb +12 -0
  19. data/lib/command_kit/description.rb +12 -1
  20. data/lib/command_kit/env.rb +4 -0
  21. data/lib/command_kit/env/home.rb +9 -0
  22. data/lib/command_kit/env/path.rb +15 -0
  23. data/lib/command_kit/examples.rb +12 -1
  24. data/lib/command_kit/exception_handler.rb +4 -0
  25. data/lib/command_kit/help.rb +7 -1
  26. data/lib/command_kit/help/man.rb +13 -0
  27. data/lib/command_kit/inflector.rb +2 -0
  28. data/lib/command_kit/interactive.rb +62 -1
  29. data/lib/command_kit/main.rb +11 -0
  30. data/lib/command_kit/options.rb +12 -0
  31. data/lib/command_kit/options/option.rb +2 -0
  32. data/lib/command_kit/options/option_value.rb +2 -0
  33. data/lib/command_kit/options/parser.rb +29 -0
  34. data/lib/command_kit/options/quiet.rb +3 -0
  35. data/lib/command_kit/options/verbose.rb +5 -0
  36. data/lib/command_kit/options/version.rb +6 -0
  37. data/lib/command_kit/os.rb +6 -0
  38. data/lib/command_kit/pager.rb +27 -0
  39. data/lib/command_kit/printing.rb +23 -0
  40. data/lib/command_kit/printing/indent.rb +23 -0
  41. data/lib/command_kit/program_name.rb +7 -0
  42. data/lib/command_kit/stdio.rb +24 -0
  43. data/lib/command_kit/terminal.rb +12 -0
  44. data/lib/command_kit/usage.rb +14 -0
  45. data/lib/command_kit/version.rb +1 -1
  46. data/lib/command_kit/xdg.rb +13 -0
  47. data/spec/arguments/argument_spec.rb +1 -1
  48. data/spec/arguments_spec.rb +3 -27
  49. data/spec/colors_spec.rb +21 -13
  50. data/spec/command_name_spec.rb +1 -1
  51. data/spec/command_spec.rb +4 -1
  52. data/spec/commands/auto_load/subcommand_spec.rb +1 -1
  53. data/spec/commands/auto_load_spec.rb +1 -1
  54. data/spec/commands/auto_require_spec.rb +2 -2
  55. data/spec/commands/help_spec.rb +1 -1
  56. data/spec/commands/parent_command_spec.rb +1 -1
  57. data/spec/commands/subcommand_spec.rb +1 -1
  58. data/spec/commands_spec.rb +1 -1
  59. data/spec/description_spec.rb +1 -25
  60. data/spec/env/home_spec.rb +1 -1
  61. data/spec/env/path_spec.rb +1 -1
  62. data/spec/examples_spec.rb +1 -25
  63. data/spec/help/man_spec.rb +1 -1
  64. data/spec/help_spec.rb +0 -25
  65. data/spec/inflector_spec.rb +1 -1
  66. data/spec/main_spec.rb +7 -7
  67. data/spec/options/option_spec.rb +3 -3
  68. data/spec/options/option_value_spec.rb +1 -1
  69. data/spec/options_spec.rb +1 -1
  70. data/spec/os_spec.rb +1 -1
  71. data/spec/pager_spec.rb +1 -1
  72. data/spec/printing/indent_spec.rb +1 -1
  73. data/spec/printing_spec.rb +10 -2
  74. data/spec/program_name_spec.rb +1 -1
  75. data/spec/spec_helper.rb +0 -3
  76. data/spec/terminal_spec.rb +1 -1
  77. data/spec/usage_spec.rb +1 -1
  78. data/spec/xdg_spec.rb +1 -1
  79. metadata +3 -3
@@ -12,6 +12,9 @@ module CommandKit
12
12
  # end
13
13
  #
14
14
  module Main
15
+ #
16
+ # @api private
17
+ #
15
18
  module ModuleMethods
16
19
  #
17
20
  # Extends {ClassMethods} or {ModuleMethods}, depending on whether {Main}
@@ -43,6 +46,8 @@ module CommandKit
43
46
  # @param [Array<String>] argv
44
47
  # The Array of command-line arguments.
45
48
  #
49
+ # @api public
50
+ #
46
51
  def start(argv=ARGV, **kwargs)
47
52
  begin
48
53
  exit main(argv, **kwargs)
@@ -68,6 +73,8 @@ module CommandKit
68
73
  # @return [Integer]
69
74
  # The exit status of the command.
70
75
  #
76
+ # @api public
77
+ #
71
78
  def main(argv=[], **kwargs)
72
79
  new(**kwargs).main(argv)
73
80
  end
@@ -84,6 +91,8 @@ module CommandKit
84
91
  #
85
92
  # @note `argv` is splatted into {#run}.
86
93
  #
94
+ # @api public
95
+ #
87
96
  def main(argv=[])
88
97
  run(*argv)
89
98
  return 0
@@ -99,6 +108,8 @@ module CommandKit
99
108
  #
100
109
  # @abstract
101
110
  #
111
+ # @api public
112
+ #
102
113
  def run(*args)
103
114
  end
104
115
  end
@@ -38,6 +38,9 @@ module CommandKit
38
38
  module Options
39
39
  include Parser
40
40
 
41
+ #
42
+ # @api private
43
+ #
41
44
  module ModuleMethods
42
45
  #
43
46
  # Extends {ClassMethods} or {ModuleMethods}, depending on whether
@@ -68,6 +71,8 @@ module CommandKit
68
71
  #
69
72
  # @return [Hash{Symbol => Option}]
70
73
  #
74
+ # @api semipublic
75
+ #
71
76
  def options
72
77
  @options ||= if superclass.kind_of?(ClassMethods)
73
78
  superclass.options.dup
@@ -172,6 +177,8 @@ module CommandKit
172
177
  # # ...
173
178
  # end
174
179
  #
180
+ # @api public
181
+ #
175
182
  def option(name,**kwargs,&block)
176
183
  options[name] = Option.new(name,**kwargs,&block)
177
184
  end
@@ -180,6 +187,9 @@ module CommandKit
180
187
  # Hash of parsed option values.
181
188
  #
182
189
  # @return [Hash{Symbol => Object}]
190
+ #
191
+ # @api semipublic
192
+ #
183
193
  attr_reader :options
184
194
 
185
195
  #
@@ -193,6 +203,8 @@ module CommandKit
193
203
  # The {#option_parser} will populate {#options} and also call any
194
204
  # {ClassMethods#option option} blocks with the parsed option values.
195
205
  #
206
+ # @api public
207
+ #
196
208
  def initialize(options: {}, **kwargs)
197
209
  @options = options
198
210
 
@@ -11,6 +11,8 @@ module CommandKit
11
11
  #
12
12
  # Represents a defined option.
13
13
  #
14
+ # @api private
15
+ #
14
16
  class Option
15
17
 
16
18
  # The option's name.
@@ -14,6 +14,8 @@ module CommandKit
14
14
  #
15
15
  # Represents an additional argument associated with an option flag.
16
16
  #
17
+ # @api private
18
+ #
17
19
  class OptionValue < Arguments::ArgumentValue
18
20
 
19
21
  # Maps OptionParser types to USAGE strings.
@@ -33,6 +33,9 @@ module CommandKit
33
33
  include Main
34
34
  include Printing
35
35
 
36
+ #
37
+ # @api private
38
+ #
36
39
  module ModuleMethods
37
40
  #
38
41
  # Sets {CommandKit::Usage::ClassMethods#usage .usage} or extends
@@ -58,6 +61,8 @@ module CommandKit
58
61
  # The option parser.
59
62
  #
60
63
  # @return [OptionParser]
64
+ #
65
+ # @api semipublic
61
66
  attr_reader :option_parser
62
67
 
63
68
  #
@@ -65,6 +70,8 @@ module CommandKit
65
70
  #
66
71
  # @return [OptionParser]
67
72
  #
73
+ # @api public
74
+ #
68
75
  def initialize(**kwargs)
69
76
  super(**kwargs)
70
77
 
@@ -91,6 +98,8 @@ module CommandKit
91
98
  # @return [Integer]
92
99
  # The exit status code.
93
100
  #
101
+ # @api public
102
+ #
94
103
  def main(argv=[])
95
104
  super(parse_options(argv))
96
105
  rescue SystemExit => system_exit
@@ -106,6 +115,8 @@ module CommandKit
106
115
  # @return [Array<String>]
107
116
  # The remaining non-option arguments.
108
117
  #
118
+ # @api semipublic
119
+ #
109
120
  def parse_options(argv)
110
121
  begin
111
122
  option_parser.parse(argv)
@@ -132,6 +143,8 @@ module CommandKit
132
143
  # @param [OptionParser::ParseError] error
133
144
  # The error from `OptionParser`.
134
145
  #
146
+ # @api semipublic
147
+ #
135
148
  def on_parse_error(error)
136
149
  print_error("#{command_name}: #{error.message}")
137
150
  print_error("Try '#{command_name} --help' for more information.")
@@ -145,6 +158,8 @@ module CommandKit
145
158
  #
146
159
  # @see on_parse_error
147
160
  #
161
+ # @api semipublic
162
+ #
148
163
  def on_invalid_option(error)
149
164
  on_parse_error(error)
150
165
  end
@@ -157,6 +172,8 @@ module CommandKit
157
172
  #
158
173
  # @see on_parse_error
159
174
  #
175
+ # @api semipublic
176
+ #
160
177
  def on_ambiguous_option(error)
161
178
  on_parse_error(error)
162
179
  end
@@ -169,6 +186,8 @@ module CommandKit
169
186
  #
170
187
  # @see on_parse_error
171
188
  #
189
+ # @api semipublic
190
+ #
172
191
  def on_invalid_argument(error)
173
192
  on_parse_error(error)
174
193
  end
@@ -181,6 +200,8 @@ module CommandKit
181
200
  #
182
201
  # @see on_parse_error
183
202
  #
203
+ # @api semipublic
204
+ #
184
205
  def on_missing_argument(error)
185
206
  on_parse_error(error)
186
207
  end
@@ -193,6 +214,8 @@ module CommandKit
193
214
  #
194
215
  # @see on_parse_error
195
216
  #
217
+ # @api semipublic
218
+ #
196
219
  def on_needless_argument(error)
197
220
  on_parse_error(error)
198
221
  end
@@ -205,6 +228,8 @@ module CommandKit
205
228
  #
206
229
  # @see on_parse_error
207
230
  #
231
+ # @api semipublic
232
+ #
208
233
  def on_ambiguous_argument(error)
209
234
  on_parse_error(error)
210
235
  end
@@ -212,6 +237,8 @@ module CommandKit
212
237
  #
213
238
  # Prints the `--help` output.
214
239
  #
240
+ # @api semipublic
241
+ #
215
242
  def help_options
216
243
  puts option_parser
217
244
  end
@@ -219,6 +246,8 @@ module CommandKit
219
246
  #
220
247
  # @see #help_options
221
248
  #
249
+ # @api public
250
+ #
222
251
  def help
223
252
  help_options
224
253
  end
@@ -18,6 +18,9 @@ module CommandKit
18
18
  module Quiet
19
19
  include Options
20
20
 
21
+ #
22
+ # @api private
23
+ #
21
24
  module ModuleMethods
22
25
  #
23
26
  # Defines a `-q, --quiet` option.
@@ -18,6 +18,9 @@ module CommandKit
18
18
  module Verbose
19
19
  include Options
20
20
 
21
+ #
22
+ # @api private
23
+ #
21
24
  module ModuleMethods
22
25
  #
23
26
  # Defines a `-v, --verbose` option or extends {ModuleMethods}, depending
@@ -47,6 +50,8 @@ module CommandKit
47
50
  #
48
51
  # @return [Boolean]
49
52
  #
53
+ # @api public
54
+ #
50
55
  def verbose?
51
56
  @verbose
52
57
  end
@@ -35,6 +35,8 @@ module CommandKit
35
35
  # @return [String, nil]
36
36
  # The classes version string.
37
37
  #
38
+ # @api public
39
+ #
38
40
  def version(new_version=nil)
39
41
  if new_version
40
42
  @version = new_version
@@ -47,6 +49,8 @@ module CommandKit
47
49
  #
48
50
  # @see ClassMethods#version
49
51
  #
52
+ # @api public
53
+ #
50
54
  def version
51
55
  self.class.version
52
56
  end
@@ -54,6 +58,8 @@ module CommandKit
54
58
  #
55
59
  # Prints the version.
56
60
  #
61
+ # @api public
62
+ #
57
63
  def print_version
58
64
  puts "#{command_name} #{version}"
59
65
  end
@@ -22,6 +22,8 @@ module CommandKit
22
22
  #
23
23
  # @return [Boolean]
24
24
  #
25
+ # @api public
26
+ #
25
27
  def linux?
26
28
  RUBY_PLATFORM.include?('linux')
27
29
  end
@@ -31,6 +33,8 @@ module CommandKit
31
33
  #
32
34
  # @return [Boolean]
33
35
  #
36
+ # @api public
37
+ #
34
38
  def macos?
35
39
  RUBY_PLATFORM.include?('darwin')
36
40
  end
@@ -40,6 +44,8 @@ module CommandKit
40
44
  #
41
45
  # @return [Boolean]
42
46
  #
47
+ # @api public
48
+ #
43
49
  def windows?
44
50
  Gem.win_platform?
45
51
  end
@@ -53,6 +53,8 @@ module CommandKit
53
53
  # Respects the `PAGER` env variable, or attemps to find `less` or
54
54
  # `more` by searching the `PATH` env variable.
55
55
  #
56
+ # @api public
57
+ #
56
58
  def initialize(**kwargs)
57
59
  super(**kwargs)
58
60
 
@@ -74,6 +76,23 @@ module CommandKit
74
76
  # @yieldparam [IO]
75
77
  # The IO pipe to the pager.
76
78
  #
79
+ # @example
80
+ # pager do |io|
81
+ # io.puts "Hello world"
82
+ # # ...
83
+ # end
84
+ #
85
+ # @example Piping a command into the pager:
86
+ # IO.peopn(["ping", ip]) do |ping|
87
+ # pager do |io|
88
+ # ping.each_line do |line|
89
+ # io.write line
90
+ # end
91
+ # end
92
+ # end
93
+ #
94
+ # @api public
95
+ #
77
96
  def pager
78
97
  if !stdout.tty? || @pager.nil?
79
98
  # fallback to stdout if the process does not have a terminal or we could
@@ -105,6 +124,14 @@ module CommandKit
105
124
  # @param [Array<String>, #to_s] data
106
125
  # The data to print.
107
126
  #
127
+ # @example
128
+ # print_or_page(data)
129
+ #
130
+ # @example Print or pages the contents of a file:
131
+ # print_or_page(File.read(file))
132
+ #
133
+ # @api public
134
+ #
108
135
  def print_or_page(data)
109
136
  line_count = case data
110
137
  when Array then data.length
@@ -9,12 +9,24 @@ module CommandKit
9
9
  module Printing
10
10
  include Stdio
11
11
 
12
+ # Platform independency new-line constant
13
+ #
14
+ # @return [String]
15
+ #
16
+ # @api public
17
+ EOL = $/
18
+
12
19
  #
13
20
  # Prints the error message to {Stdio#stderr stderr}.
14
21
  #
15
22
  # @param [String] message
16
23
  # The error message.
17
24
  #
25
+ # @example
26
+ # print_error "Error: invalid input"
27
+ #
28
+ # @api public
29
+ #
18
30
  def print_error(message)
19
31
  stderr.puts message
20
32
  end
@@ -25,6 +37,17 @@ module CommandKit
25
37
  # @param [Exception] error
26
38
  # The error to print.
27
39
  #
40
+ # @example
41
+ # begin
42
+ # # ...
43
+ # rescue => error
44
+ # print_error "Error encountered"
45
+ # print_exception(error)
46
+ # exit(1)
47
+ # end
48
+ #
49
+ # @api public
50
+ #
28
51
  def print_exception(error)
29
52
  print_error error.full_message(highlight: stderr.tty?)
30
53
  end
@@ -42,6 +42,27 @@ module CommandKit
42
42
  # @return [Integer]
43
43
  # If no block is given, the indententation level will be returned.
44
44
  #
45
+ # @example
46
+ # puts "values:"
47
+ # indent do
48
+ # values.each do |key,value|
49
+ # puts "#{key}: #{value}"
50
+ # end
51
+ # end
52
+ #
53
+ # @example
54
+ # puts "Code:"
55
+ # puts
56
+ # puts "```"
57
+ # indent(4) do
58
+ # code.each_line do |line|
59
+ # puts line
60
+ # end
61
+ # end
62
+ # puts "```"
63
+ #
64
+ # @api public
65
+ #
45
66
  def indent(n=2)
46
67
  if block_given?
47
68
  begin
@@ -63,6 +84,8 @@ module CommandKit
63
84
  # @param [Array<String>] lines
64
85
  # The lines to indent and print.
65
86
  #
87
+ # @api public
88
+ #
66
89
  def puts(*lines)
67
90
  if (@indent > 0 && !lines.empty?)
68
91
  padding = " " * @indent
@@ -3,6 +3,9 @@ module CommandKit
3
3
  # Retrieves the current program name (`$PROGRAM_NAME`).
4
4
  #
5
5
  module ProgramName
6
+ #
7
+ # @api private
8
+ #
6
9
  module ModuleMethods
7
10
  #
8
11
  # Extends {ClassMethods} or {ModuleMethods}, depending on whether
@@ -42,6 +45,8 @@ module CommandKit
42
45
  # The `$PROGRAM_NAME` or `nil` if the `$PROGRAM_NAME` is `-e`, `irb`,
43
46
  # or `rspec`.
44
47
  #
48
+ # @api semipublic
49
+ #
45
50
  def program_name
46
51
  $PROGRAM_NAME unless IGNORED_PROGRAM_NAMES.include?($PROGRAM_NAME)
47
52
  end
@@ -50,6 +55,8 @@ module CommandKit
50
55
  #
51
56
  # @see ClassMethods#program_name
52
57
  #
58
+ # @api public
59
+ #
53
60
  def program_name
54
61
  self.class.program_name
55
62
  end