optparse-plus 3.0.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.
Files changed (69) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +17 -0
  3. data/.ruby-gemset +1 -0
  4. data/.ruby-version +1 -0
  5. data/.travis.yml +7 -0
  6. data/CHANGES.md +66 -0
  7. data/Gemfile +5 -0
  8. data/LICENSE.txt +201 -0
  9. data/README.rdoc +173 -0
  10. data/Rakefile +94 -0
  11. data/bin/optparse_plus +130 -0
  12. data/fix.rb +29 -0
  13. data/lib/optparse-plus.rb +1 -0
  14. data/lib/optparse_plus.rb +15 -0
  15. data/lib/optparse_plus/argv_parser.rb +50 -0
  16. data/lib/optparse_plus/cli.rb +116 -0
  17. data/lib/optparse_plus/cli_logger.rb +133 -0
  18. data/lib/optparse_plus/cli_logging.rb +138 -0
  19. data/lib/optparse_plus/cucumber.rb +119 -0
  20. data/lib/optparse_plus/error.rb +32 -0
  21. data/lib/optparse_plus/execution_strategy/base.rb +34 -0
  22. data/lib/optparse_plus/execution_strategy/jvm.rb +37 -0
  23. data/lib/optparse_plus/execution_strategy/mri.rb +16 -0
  24. data/lib/optparse_plus/execution_strategy/open_3.rb +16 -0
  25. data/lib/optparse_plus/execution_strategy/open_4.rb +22 -0
  26. data/lib/optparse_plus/execution_strategy/rbx_open_4.rb +12 -0
  27. data/lib/optparse_plus/exit_now.rb +40 -0
  28. data/lib/optparse_plus/main.rb +603 -0
  29. data/lib/optparse_plus/process_status.rb +45 -0
  30. data/lib/optparse_plus/sh.rb +223 -0
  31. data/lib/optparse_plus/test/base_integration_test.rb +31 -0
  32. data/lib/optparse_plus/test/integration_test_assertions.rb +65 -0
  33. data/lib/optparse_plus/version.rb +3 -0
  34. data/optparse_plus.gemspec +28 -0
  35. data/templates/full/.gitignore.erb +4 -0
  36. data/templates/full/README.rdoc.erb +24 -0
  37. data/templates/full/Rakefile.erb +71 -0
  38. data/templates/full/_license_head.txt.erb +2 -0
  39. data/templates/full/apache_LICENSE.txt.erb +203 -0
  40. data/templates/full/bin/executable.erb +45 -0
  41. data/templates/full/custom_LICENSE.txt.erb +0 -0
  42. data/templates/full/gplv2_LICENSE.txt.erb +14 -0
  43. data/templates/full/gplv3_LICENSE.txt.erb +14 -0
  44. data/templates/full/mit_LICENSE.txt.erb +7 -0
  45. data/templates/rspec/spec/something_spec.rb.erb +5 -0
  46. data/templates/test_unit/test/integration/test_cli.rb.erb +11 -0
  47. data/templates/test_unit/test/unit/test_something.rb.erb +7 -0
  48. data/test/integration/base_integration_test.rb +60 -0
  49. data/test/integration/test_bootstrap.rb +150 -0
  50. data/test/integration/test_cli.rb +21 -0
  51. data/test/integration/test_license.rb +56 -0
  52. data/test/integration/test_readme.rb +53 -0
  53. data/test/integration/test_rspec.rb +28 -0
  54. data/test/integration/test_version.rb +21 -0
  55. data/test/unit/base_test.rb +19 -0
  56. data/test/unit/command_for_tests.sh +7 -0
  57. data/test/unit/execution_strategy/test_base.rb +24 -0
  58. data/test/unit/execution_strategy/test_jvm.rb +77 -0
  59. data/test/unit/execution_strategy/test_mri.rb +32 -0
  60. data/test/unit/execution_strategy/test_open_3.rb +70 -0
  61. data/test/unit/execution_strategy/test_open_4.rb +86 -0
  62. data/test/unit/execution_strategy/test_rbx_open_4.rb +25 -0
  63. data/test/unit/test/test_integration_test_assertions.rb +211 -0
  64. data/test/unit/test_cli_logger.rb +219 -0
  65. data/test/unit/test_cli_logging.rb +243 -0
  66. data/test/unit/test_exit_now.rb +37 -0
  67. data/test/unit/test_main.rb +840 -0
  68. data/test/unit/test_sh.rb +404 -0
  69. metadata +260 -0
@@ -0,0 +1,404 @@
1
+ require 'base_test'
2
+ require 'optparse_plus'
3
+
4
+ class TestSH < BaseTest
5
+ include OptparsePlus::SH
6
+ include OptparsePlus::CLILogging
7
+
8
+ class CapturingLogger
9
+ attr_reader :debugs, :infos, :warns, :errors, :fatals
10
+
11
+ def initialize
12
+ @debugs = []
13
+ @infos = []
14
+ @warns = []
15
+ @errors = []
16
+ @fatals = []
17
+ end
18
+
19
+ def debug(msg); @debugs << msg; end
20
+ def info(msg); @infos << msg; end
21
+ def warn(msg); @warns << msg; end
22
+ def error(msg)
23
+ # Try to figure out what's going on on Travis
24
+ STDERR.puts msg if RUBY_PLATFORM == 'java'
25
+ @errors << msg
26
+ end
27
+ def fatal(msg); @fatals << msg; end
28
+
29
+ end
30
+
31
+ [:sh,:sh!].each do |method|
32
+ test_that "#{method} runs a successful command and logs about it" do
33
+ Given {
34
+ use_capturing_logger
35
+ @command = test_command
36
+ }
37
+ When {
38
+ @exit_code = self.send(method,@command)
39
+ }
40
+ Then {
41
+ assert_successful_command_execution(@exit_code,@logger,@command,test_command_stdout)
42
+ }
43
+ end
44
+
45
+ test_that "#{method}, when the command succeeds and given a block of one argument, gives that block the stdout" do
46
+ Given {
47
+ use_capturing_logger
48
+ @command = test_command
49
+ @stdout_received = nil
50
+ }
51
+ When {
52
+ @exit_code = self.send(method,@command) do |stdout|
53
+ @stdout_received = stdout
54
+ end
55
+ }
56
+ Then {
57
+ @stdout_received.should be == test_command_stdout
58
+ assert_successful_command_execution(@exit_code,@logger,@command,test_command_stdout)
59
+ }
60
+ end
61
+
62
+ test_that "#{method}, when the command succeeds and given a block of zero arguments, calls the block" do
63
+ Given {
64
+ use_capturing_logger
65
+ @command = test_command
66
+ @block_called = false
67
+ }
68
+ When {
69
+ @exit_code = self.send(method,@command) do
70
+ @block_called = true
71
+ end
72
+ }
73
+ Then {
74
+ @block_called.should be == true
75
+ assert_successful_command_execution(@exit_code,@logger,@command,test_command_stdout)
76
+ }
77
+ end
78
+
79
+ test_that "#{method}, when the command succeeds and given a lambda of zero arguments, calls the lambda" do
80
+ Given {
81
+ use_capturing_logger
82
+ @command = test_command
83
+ @block_called = false
84
+ @lambda = lambda { @block_called = true }
85
+ }
86
+ When {
87
+ @exit_code = self.send(method,@command,&@lambda)
88
+ }
89
+ Then {
90
+ @block_called.should be == true
91
+ assert_successful_command_execution(@exit_code,@logger,@command,test_command_stdout)
92
+ }
93
+ end
94
+
95
+ test_that "#{method}, when the command succeeds and given a block of two arguments, calls the block with the stdout and stderr" do
96
+ Given {
97
+ use_capturing_logger
98
+ @command = test_command
99
+ @block_called = false
100
+ @stdout_received = nil
101
+ @stderr_received = nil
102
+ }
103
+ When {
104
+ @exit_code = self.send(method,@command) do |stdout,stderr|
105
+ @stdout_received = stdout
106
+ @stderr_received = stderr
107
+ end
108
+ }
109
+ Then {
110
+ @stdout_received.should be == test_command_stdout
111
+ @stderr_received.length.should be == 0
112
+ assert_successful_command_execution(@exit_code,@logger,@command,test_command_stdout)
113
+ }
114
+ end
115
+
116
+ test_that "#{method}, when the command succeeds and given a block of three arguments, calls the block with the stdout, stderr, and exit code" do
117
+ Given {
118
+ use_capturing_logger
119
+ @command = test_command
120
+ @block_called = false
121
+ @stdout_received = nil
122
+ @stderr_received = nil
123
+ @exitstatus_received = nil
124
+ }
125
+ When {
126
+ @exit_code = self.send(method,@command) do |stdout,stderr,exitstatus|
127
+ @stdout_received = stdout
128
+ @stderr_received = stderr
129
+ @exitstatus_received = exitstatus
130
+ end
131
+ }
132
+ Then {
133
+ @stdout_received.should be == test_command_stdout
134
+ @stderr_received.length.should be == 0
135
+ @exitstatus_received.should be == 0
136
+ assert_successful_command_execution(@exit_code,@logger,@command,test_command_stdout)
137
+ }
138
+ end
139
+ end
140
+
141
+ test_that "sh, when the command fails and given a block, doesn't call the block" do
142
+ Given {
143
+ use_capturing_logger
144
+ @command = test_command("foo")
145
+ @block_called = false
146
+ }
147
+ When {
148
+ @exit_code = sh @command do
149
+ @block_called = true
150
+ end
151
+ }
152
+ Then {
153
+ @exit_code.should be == 1
154
+ assert_logger_output_for_failure(@logger,@command,test_command_stdout,test_command_stderr)
155
+ }
156
+ end
157
+
158
+ test_that "sh, when the command fails with an unexpected status, and given a block, doesn't call the block" do
159
+ Given {
160
+ use_capturing_logger
161
+ @command = test_command("foo")
162
+ @block_called = false
163
+ }
164
+ When {
165
+ @exit_code = sh @command, :expected => [2] do
166
+ @block_called = true
167
+ end
168
+ }
169
+ Then {
170
+ @exit_code.should be == 1
171
+ assert_logger_output_for_failure(@logger,@command,test_command_stdout,test_command_stderr)
172
+ }
173
+ end
174
+
175
+ [1,[1],[1,2]].each do |expected|
176
+ [:sh,:sh!].each do |method|
177
+ test_that "#{method}, when the command fails with an expected error code (using syntax #{expected}/#{expected.class}), treats it as success" do
178
+ Given {
179
+ use_capturing_logger
180
+ @command = test_command("foo")
181
+ @block_called = false
182
+ @exitstatus_received = nil
183
+ }
184
+ When {
185
+ @exit_code = self.send(method,@command,:expected => expected) do |_,_,exitstatus|
186
+ @block_called = true
187
+ @exitstatus_received = exitstatus
188
+ end
189
+ }
190
+ Then {
191
+ @exit_code.should be == 1
192
+ @block_called.should be == true
193
+ @exitstatus_received.should be == 1
194
+ @logger.debugs[0].should be == "Executing '#{test_command}foo'"
195
+ @logger.debugs[1].should be == "stdout output of '#{test_command}foo': #{test_command_stdout}"
196
+ @logger.warns[0].should be == "stderr output of '#{test_command}foo': #{test_command_stderr}"
197
+ }
198
+ end
199
+ end
200
+ end
201
+
202
+ test_that "sh runs a command that will fail and logs about it" do
203
+ Given {
204
+ use_capturing_logger
205
+ @command = test_command("foo")
206
+ }
207
+ When {
208
+ @exit_code = sh @command
209
+ }
210
+ Then {
211
+ @exit_code.should be == 1
212
+ assert_logger_output_for_failure(@logger,@command,test_command_stdout,test_command_stderr)
213
+ }
214
+ end
215
+
216
+ test_that "sh runs a non-existent command that will fail and logs about it" do
217
+ Given {
218
+ use_capturing_logger
219
+ @command = "asdfasdfasdfas"
220
+ }
221
+ When {
222
+ @exit_code = sh @command
223
+ }
224
+ Then {
225
+ @exit_code.should be == 127 # consistent with what bash does
226
+ @logger.errors[0].should match(/^Error running '#{@command}': .+$/)
227
+ }
228
+ end
229
+
230
+ test_that "sh! runs a command that will fail and logs about it, but throws an exception" do
231
+ Given {
232
+ use_capturing_logger
233
+ @command = test_command("foo")
234
+ }
235
+ When {
236
+ @code = lambda { sh! @command }
237
+ }
238
+ Then {
239
+ exception = assert_raises(OptparsePlus::FailedCommandError,&@code)
240
+ exception.command.should be == @command
241
+ assert_logger_output_for_failure(@logger,@command,test_command_stdout,test_command_stderr)
242
+ }
243
+ end
244
+
245
+ test_that "sh! runs a command that will fail and includes an error message that appears in the exception" do
246
+ Given {
247
+ use_capturing_logger
248
+ @command = test_command("foo")
249
+ @custom_error_message = any_sentence
250
+ }
251
+ When {
252
+ @code = lambda { sh! @command, :on_fail => @custom_error_message }
253
+ }
254
+ Then {
255
+ exception = assert_raises(OptparsePlus::FailedCommandError,&@code)
256
+ exception.command.should be == @command
257
+ exception.message.should be == @custom_error_message
258
+ assert_logger_output_for_failure(@logger,@command,test_command_stdout,test_command_stderr)
259
+ }
260
+ end
261
+
262
+ class MyTestApp
263
+ include OptparsePlus::SH
264
+ def initialize(logger=nil)
265
+ set_sh_logger(logger) if logger
266
+ end
267
+ end
268
+
269
+ test_that "when we don't have CLILogging included, we can still provide our own logger" do
270
+ Given {
271
+ @logger = CapturingLogger.new
272
+ @test_app = MyTestApp.new(@logger)
273
+ @command = test_command
274
+ }
275
+ When {
276
+ @exit_code = @test_app.sh @command
277
+ }
278
+ Then {
279
+ assert_successful_command_execution(@exit_code,@logger,@command,test_command_stdout)
280
+ }
281
+ end
282
+
283
+ test_that "when we don't have CLILogging included and fail to provide a logger, an exception is thrown" do
284
+ Given {
285
+ @test_app = MyTestApp.new
286
+ @command = test_command
287
+ }
288
+ When {
289
+ @code = lambda { @test_app.sh @command }
290
+ }
291
+ Then {
292
+ assert_raises(StandardError,&@code)
293
+ }
294
+ end
295
+
296
+ class MyExecutionStrategy
297
+ include Clean::Test::Any
298
+ attr_reader :command
299
+
300
+ def initialize(exitcode)
301
+ @exitcode = exitcode
302
+ @command = nil
303
+ end
304
+
305
+ def run_command(command)
306
+ @command = command
307
+ if @exitcode.kind_of? Integer
308
+ [any_string,any_string,OpenStruct.new(:exitstatus => @exitcode)]
309
+ else
310
+ [any_string,any_string,@exitcode]
311
+ end
312
+ end
313
+
314
+ def exception_meaning_command_not_found
315
+ RuntimeError
316
+ end
317
+ end
318
+
319
+ class MyExecutionStrategyApp
320
+ include OptparsePlus::CLILogging
321
+ include OptparsePlus::SH
322
+
323
+ attr_reader :strategy
324
+
325
+ def initialize(exit_code)
326
+ @strategy = MyExecutionStrategy.new(exit_code)
327
+ set_execution_strategy(@strategy)
328
+ set_sh_logger(CapturingLogger.new)
329
+ end
330
+ end
331
+
332
+ test_that "when I provide a custom execution strategy, it gets used" do
333
+ Given {
334
+ @exit_code = any_int :min => 0, :max => 127
335
+ @app = MyExecutionStrategyApp.new(@exit_code)
336
+ @command = "ls"
337
+ }
338
+ When {
339
+ @results = @app.sh(@command)
340
+ }
341
+ Then {
342
+ @app.strategy.command.should be == @command
343
+ @results.should be == @exit_code
344
+ }
345
+ end
346
+
347
+ test_that "when the execution strategy returns a non-int, but truthy value, it gets coerced into a 0" do
348
+ Given {
349
+ @app = MyExecutionStrategyApp.new(true)
350
+ @command = "ls"
351
+ }
352
+ When {
353
+ @results = @app.sh(@command)
354
+ }
355
+ Then {
356
+ @app.strategy.command.should be == @command
357
+ @results.should be == 0
358
+ }
359
+ end
360
+
361
+ test_that "when the execution strategy returns a non-int, but falsey value, it gets coerced into a 1" do
362
+ Given {
363
+ @app = MyExecutionStrategyApp.new(false)
364
+ @command = "ls"
365
+ }
366
+ When {
367
+ @results = @app.sh(@command)
368
+ }
369
+ Then {
370
+ @app.strategy.command.should be == @command
371
+ @results.should be == 1
372
+ }
373
+ end
374
+
375
+ private
376
+
377
+ def assert_successful_command_execution(exit_code,logger,command,stdout)
378
+ exit_code.should be == 0
379
+ logger.debugs[0].should be == "Executing '#{command}'"
380
+ logger.debugs[1].should be == "stdout output of '#{command}': #{stdout}"
381
+ logger.warns.length.should be == 0
382
+ end
383
+
384
+ def assert_logger_output_for_failure(logger,command,stdout,stderr)
385
+ logger.debugs[0].should be == "Executing '#{command}'"
386
+ logger.infos[0].should be == "stdout output of '#{command}': #{stdout}"
387
+ logger.warns[0].should be == "stderr output of '#{command}': #{stderr}"
388
+ logger.warns[1].should be == "Error running '#{command}'"
389
+ end
390
+
391
+ def use_capturing_logger
392
+ @logger = CapturingLogger.new
393
+ change_logger(@logger)
394
+ end
395
+
396
+ # Runs the test command which exits with the length of ARGV/args
397
+ def test_command(args='')
398
+ File.join(File.expand_path(File.dirname(__FILE__)),'command_for_tests.sh') + ' ' + args
399
+ end
400
+
401
+ def test_command_stdout; "standard output"; end
402
+ def test_command_stderr; "standard error"; end
403
+
404
+ end
metadata ADDED
@@ -0,0 +1,260 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: optparse-plus
3
+ version: !ruby/object:Gem::Version
4
+ version: 3.0.0
5
+ platform: ruby
6
+ authors:
7
+ - davetron5000
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2020-06-10 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rdoc
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '6.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '6.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: sdoc
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: simplecov
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '0.5'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '0.5'
83
+ - !ruby/object:Gem::Dependency
84
+ name: clean_test
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: 1.0.1
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: 1.0.1
97
+ - !ruby/object:Gem::Dependency
98
+ name: mocha
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: rspec
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: i18n
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ description: OptparsePlus provides a lot of small but useful features for developing
140
+ a command-line app, including an opinionated bootstrapping process, some helpful
141
+ integration test support, and some classes to bridge logging and output into a simple,
142
+ unified, interface
143
+ email:
144
+ - davetron5000 at gmail.com
145
+ executables:
146
+ - optparse_plus
147
+ extensions: []
148
+ extra_rdoc_files: []
149
+ files:
150
+ - ".gitignore"
151
+ - ".ruby-gemset"
152
+ - ".ruby-version"
153
+ - ".travis.yml"
154
+ - CHANGES.md
155
+ - Gemfile
156
+ - LICENSE.txt
157
+ - README.rdoc
158
+ - Rakefile
159
+ - bin/optparse_plus
160
+ - fix.rb
161
+ - lib/optparse-plus.rb
162
+ - lib/optparse_plus.rb
163
+ - lib/optparse_plus/argv_parser.rb
164
+ - lib/optparse_plus/cli.rb
165
+ - lib/optparse_plus/cli_logger.rb
166
+ - lib/optparse_plus/cli_logging.rb
167
+ - lib/optparse_plus/cucumber.rb
168
+ - lib/optparse_plus/error.rb
169
+ - lib/optparse_plus/execution_strategy/base.rb
170
+ - lib/optparse_plus/execution_strategy/jvm.rb
171
+ - lib/optparse_plus/execution_strategy/mri.rb
172
+ - lib/optparse_plus/execution_strategy/open_3.rb
173
+ - lib/optparse_plus/execution_strategy/open_4.rb
174
+ - lib/optparse_plus/execution_strategy/rbx_open_4.rb
175
+ - lib/optparse_plus/exit_now.rb
176
+ - lib/optparse_plus/main.rb
177
+ - lib/optparse_plus/process_status.rb
178
+ - lib/optparse_plus/sh.rb
179
+ - lib/optparse_plus/test/base_integration_test.rb
180
+ - lib/optparse_plus/test/integration_test_assertions.rb
181
+ - lib/optparse_plus/version.rb
182
+ - optparse_plus.gemspec
183
+ - templates/full/.gitignore.erb
184
+ - templates/full/README.rdoc.erb
185
+ - templates/full/Rakefile.erb
186
+ - templates/full/_license_head.txt.erb
187
+ - templates/full/apache_LICENSE.txt.erb
188
+ - templates/full/bin/executable.erb
189
+ - templates/full/custom_LICENSE.txt.erb
190
+ - templates/full/gplv2_LICENSE.txt.erb
191
+ - templates/full/gplv3_LICENSE.txt.erb
192
+ - templates/full/mit_LICENSE.txt.erb
193
+ - templates/rspec/spec/something_spec.rb.erb
194
+ - templates/test_unit/test/integration/test_cli.rb.erb
195
+ - templates/test_unit/test/unit/test_something.rb.erb
196
+ - test/integration/base_integration_test.rb
197
+ - test/integration/test_bootstrap.rb
198
+ - test/integration/test_cli.rb
199
+ - test/integration/test_license.rb
200
+ - test/integration/test_readme.rb
201
+ - test/integration/test_rspec.rb
202
+ - test/integration/test_version.rb
203
+ - test/unit/base_test.rb
204
+ - test/unit/command_for_tests.sh
205
+ - test/unit/execution_strategy/test_base.rb
206
+ - test/unit/execution_strategy/test_jvm.rb
207
+ - test/unit/execution_strategy/test_mri.rb
208
+ - test/unit/execution_strategy/test_open_3.rb
209
+ - test/unit/execution_strategy/test_open_4.rb
210
+ - test/unit/execution_strategy/test_rbx_open_4.rb
211
+ - test/unit/test/test_integration_test_assertions.rb
212
+ - test/unit/test_cli_logger.rb
213
+ - test/unit/test_cli_logging.rb
214
+ - test/unit/test_exit_now.rb
215
+ - test/unit/test_main.rb
216
+ - test/unit/test_sh.rb
217
+ homepage: http://github.com/davetron5000/optparse-plus
218
+ licenses: []
219
+ metadata: {}
220
+ post_install_message:
221
+ rdoc_options: []
222
+ require_paths:
223
+ - lib
224
+ required_ruby_version: !ruby/object:Gem::Requirement
225
+ requirements:
226
+ - - ">="
227
+ - !ruby/object:Gem::Version
228
+ version: '0'
229
+ required_rubygems_version: !ruby/object:Gem::Requirement
230
+ requirements:
231
+ - - ">="
232
+ - !ruby/object:Gem::Version
233
+ version: '0'
234
+ requirements: []
235
+ rubygems_version: 3.1.2
236
+ signing_key:
237
+ specification_version: 4
238
+ summary: Wrapper around the Standard Library's Option Parser to make CLIs Easier
239
+ test_files:
240
+ - test/integration/base_integration_test.rb
241
+ - test/integration/test_bootstrap.rb
242
+ - test/integration/test_cli.rb
243
+ - test/integration/test_license.rb
244
+ - test/integration/test_readme.rb
245
+ - test/integration/test_rspec.rb
246
+ - test/integration/test_version.rb
247
+ - test/unit/base_test.rb
248
+ - test/unit/command_for_tests.sh
249
+ - test/unit/execution_strategy/test_base.rb
250
+ - test/unit/execution_strategy/test_jvm.rb
251
+ - test/unit/execution_strategy/test_mri.rb
252
+ - test/unit/execution_strategy/test_open_3.rb
253
+ - test/unit/execution_strategy/test_open_4.rb
254
+ - test/unit/execution_strategy/test_rbx_open_4.rb
255
+ - test/unit/test/test_integration_test_assertions.rb
256
+ - test/unit/test_cli_logger.rb
257
+ - test/unit/test_cli_logging.rb
258
+ - test/unit/test_exit_now.rb
259
+ - test/unit/test_main.rb
260
+ - test/unit/test_sh.rb