commander-openflighthpc 2.0.1 → 2.2.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 (42) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +45 -138
  3. data/commander-openflighthpc.gemspec +2 -1
  4. data/lib/commander.rb +3 -4
  5. data/lib/commander/cli.rb +15 -76
  6. data/lib/commander/command.rb +81 -176
  7. data/lib/commander/error_handler.rb +62 -0
  8. data/lib/commander/help_formatters.rb +0 -4
  9. data/lib/commander/help_formatters/terminal.rb +0 -5
  10. data/lib/commander/help_formatters/terminal/command_help.erb +14 -6
  11. data/lib/commander/help_formatters/terminal/help.erb +12 -4
  12. data/lib/commander/runner.rb +92 -130
  13. data/lib/commander/version.rb +1 -1
  14. metadata +21 -46
  15. data/bin/commander +0 -104
  16. data/lib/commander/blank.rb +0 -7
  17. data/lib/commander/core_ext.rb +0 -2
  18. data/lib/commander/core_ext/array.rb +0 -24
  19. data/lib/commander/core_ext/object.rb +0 -8
  20. data/lib/commander/help_formatters/terminal/subcommand_help.erb +0 -23
  21. data/lib/commander/help_formatters/terminal_compact.rb +0 -11
  22. data/lib/commander/help_formatters/terminal_compact/command_help.erb +0 -26
  23. data/lib/commander/help_formatters/terminal_compact/help.erb +0 -29
  24. data/lib/commander/help_formatters/terminal_compact/subcommand_help.erb +0 -15
  25. data/lib/commander/import.rb +0 -5
  26. data/lib/commander/patches/decimal-integer.rb +0 -17
  27. data/lib/commander/patches/help_formatter_binding.rb +0 -15
  28. data/lib/commander/patches/implicit-short-tags.rb +0 -75
  29. data/lib/commander/patches/priority_sort.rb +0 -21
  30. data/lib/commander/patches/validate_inputs.rb +0 -79
  31. data/lib/commander/platform.rb +0 -7
  32. data/spec/command_spec.rb +0 -157
  33. data/spec/configure_spec.rb +0 -37
  34. data/spec/core_ext/array_spec.rb +0 -18
  35. data/spec/core_ext/object_spec.rb +0 -19
  36. data/spec/help_formatters/terminal_compact_spec.rb +0 -69
  37. data/spec/help_formatters/terminal_spec.rb +0 -67
  38. data/spec/methods_spec.rb +0 -61
  39. data/spec/patches/validate_inputs_spec.rb +0 -84
  40. data/spec/runner_spec.rb +0 -672
  41. data/spec/spec_helper.rb +0 -79
  42. data/spec/ui_spec.rb +0 -30
@@ -1,61 +0,0 @@
1
- require 'spec_helper'
2
- require 'commander/methods'
3
-
4
- describe Commander::Methods do
5
- it 'includes Commander::UI' do
6
- expect(subject.ancestors).to include(Commander::UI)
7
- end
8
-
9
- describe 'AskForClass' do
10
- it 'includes Commander::UI::AskForClass' do
11
- expect(subject.ancestors).to include(Commander::UI::AskForClass)
12
- end
13
-
14
- describe 'defining methods' do
15
- let(:terminal) { double }
16
-
17
- before do
18
- allow(terminal).to receive(:ask)
19
- $_old_terminal = $terminal
20
- $terminal = terminal
21
- end
22
-
23
- after do
24
- $terminal = $_old_terminal
25
- end
26
-
27
- subject do
28
- Class.new do
29
- include Commander::UI::AskForClass
30
- end.new
31
- end
32
-
33
- it 'defines common "ask_for_*" methods' do
34
- expect(subject.respond_to?(:ask_for_float)).to be_truthy
35
- end
36
-
37
- it 'responds to "ask_for_*" methods for classes that implement #parse' do
38
- expect(subject.respond_to?(:ask_for_datetime)).to be_truthy
39
- end
40
-
41
- it 'fails "ask_for_*" method invocations without a prompt' do
42
- expect do
43
- subject.ask_for_datetime
44
- end.to raise_error(ArgumentError)
45
- end
46
-
47
- it 'implements "ask_for_*"' do
48
- expect(terminal).to receive(:ask)
49
- subject.ask_for_datetime('hi')
50
- end
51
- end
52
- end
53
-
54
- it 'includes Commander::Delegates' do
55
- expect(subject.ancestors).to include(Commander::Delegates)
56
- end
57
-
58
- it 'does not change the Object ancestors' do
59
- expect(Object.ancestors).not_to include(Commander::UI)
60
- end
61
- end
@@ -1,84 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'commander/patches/validate_inputs'
4
-
5
- # These specs inspired by those in Commander gem in `spec/runner_spec.rb`.
6
-
7
- RSpec.describe Commander::Patches::ValidateInputs do
8
- include Commander::Delegates
9
-
10
- def mock_patch_terminal
11
- @input = StringIO.new
12
- @output = StringIO.new
13
- $terminal = HighLine.new @input, @output
14
- end
15
-
16
- def create_test_patch_command
17
- command :test do |c|
18
- c.syntax = 'metal test ARG1 ARG2 [OPTIONAL_ARG3]'
19
- c.description = 'test description'
20
- c.example 'description', 'command'
21
- c.option '-o', '--some-option', 'Some option that does things'
22
- c.when_called do |args, _options|
23
- format('test %<foo>s', foo: args.join(' '))
24
- end
25
- end
26
- @command = command :test
27
- end
28
-
29
- def create_multi_word_test_command
30
- command :'test do' do |c|
31
- c.syntax = 'metal test do ARG1 ARG2'
32
- c.when_called do |args, _options|
33
- format('test do %<foo>s', foo: args.join(' '))
34
- end
35
- end
36
- @command = command :'test do'
37
- end
38
-
39
- before do
40
- $stderr = StringIO.new
41
- mock_patch_terminal
42
- create_test_patch_command
43
- end
44
-
45
- describe '#call' do
46
- describe 'validating passed arguments against syntax' do
47
- it 'raises if too many arguments given' do
48
- expect do
49
- command(:test).call(['one', 'two', 'three', 'four'])
50
- end.to raise_error(Commander::Patches::CommandUsageError)
51
- end
52
-
53
- it 'raises if too few arguments given' do
54
- expect do
55
- command(:test).call(['one'])
56
- end.to raise_error(Commander::Patches::CommandUsageError)
57
- end
58
-
59
- it 'proceeds as normal if valid number of arguments given' do
60
- expect(
61
- command(:test).call(['one', 'two', 'three'])
62
- ).to eql('test one two three')
63
- end
64
-
65
- describe 'when multi-word command' do
66
- before do
67
- create_multi_word_test_command
68
- end
69
-
70
- it 'raises if too few arguments given' do
71
- expect do
72
- command(:'test do').call
73
- end.to raise_error(Commander::Patches::CommandUsageError)
74
- end
75
-
76
- it 'proceeds as normal if valid number of arguments given' do
77
- expect(
78
- command(:'test do').call(['one', 'two'])
79
- ).to eql('test do one two')
80
- end
81
- end
82
- end
83
- end
84
- end
@@ -1,672 +0,0 @@
1
- require 'spec_helper'
2
-
3
- class InheritedRuntimeError < RuntimeError; end
4
-
5
- describe Commander do
6
- include Commander::Methods
7
-
8
- before :each do
9
- $stderr = StringIO.new
10
- mock_terminal
11
- create_test_command
12
- end
13
-
14
- describe '#program' do
15
- it 'should set / get program information' do
16
- program :name, 'test'
17
- expect(program(:name)).to eq('test')
18
- end
19
-
20
- it 'should allow arbitrary blocks of global help documentation' do
21
- program :help, 'Copyright', 'TJ Holowaychuk'
22
- expect(program(:help)['Copyright']).to eq('TJ Holowaychuk')
23
- end
24
-
25
- it 'should raise an error when required info has not been set' do
26
- new_command_runner '--help'
27
- program :version, ''
28
- expect { run! }.to raise_error(Commander::Runner::CommandError)
29
- end
30
-
31
- it 'should allow aliases of help formatters' do
32
- program :help_formatter, :compact
33
- expect(program(:help_formatter)).to eq(Commander::HelpFormatter::TerminalCompact)
34
- end
35
- end
36
-
37
- describe '#command' do
38
- it 'should return a command instance when only the name is passed' do
39
- expect(command(:test)).to be_instance_of(Commander::Command)
40
- end
41
-
42
- it 'should return nil when the command does not exist' do
43
- expect(command(:im_not_real)).to be_nil
44
- end
45
- end
46
-
47
- describe '#separate_switches_from_description' do
48
- it 'should seperate switches and description returning both' do
49
- switches, description = *Commander::Runner.separate_switches_from_description('-h', '--help', 'display help')
50
- expect(switches).to eq(['-h', '--help'])
51
- expect(description).to eq('display help')
52
- end
53
- end
54
-
55
- describe '#switch_to_sym' do
56
- it 'should return a symbol based on the switch name' do
57
- expect(Commander::Runner.switch_to_sym('--trace')).to eq(:trace)
58
- expect(Commander::Runner.switch_to_sym('--foo-bar')).to eq(:foo_bar)
59
- expect(Commander::Runner.switch_to_sym('--[no-]feature"')).to eq(:feature)
60
- expect(Commander::Runner.switch_to_sym('--[no-]feature ARG')).to eq(:feature)
61
- expect(Commander::Runner.switch_to_sym('--file [ARG]')).to eq(:file)
62
- expect(Commander::Runner.switch_to_sym('--colors colors')).to eq(:colors)
63
- end
64
- end
65
-
66
- describe '#alias_command' do
67
- it 'should alias a command' do
68
- alias_command :foo, :test
69
- expect(command(:foo)).to eq(command(:test))
70
- end
71
-
72
- it 'should pass arguments passed to the alias when called' do
73
- gem_name = ''
74
- new_command_runner 'install', 'gem', 'commander' do
75
- command :install do |c|
76
- c.option '--gem-name NAME', 'Install a gem'
77
- c.when_called { |_, options| gem_name = options.gem_name }
78
- end
79
- alias_command :'install gem', :install, '--gem-name'
80
- end.run!
81
- expect(gem_name).to eq('commander')
82
- end
83
- end
84
-
85
- describe '#global_option' do
86
- it 'should be invoked when used in the args list' do
87
- file = ''
88
- new_command_runner 'test', '--config', 'foo' do
89
- global_option('--config FILE') { |f| file = f }
90
- end.run!
91
- expect(file).to eq('foo')
92
- end
93
-
94
- it 'should be inherited by commands' do
95
- quiet = nil
96
- new_command_runner 'foo', '--quiet' do
97
- global_option('--quiet', 'Suppress output')
98
- command :foo do |c|
99
- c.when_called { |_, options| quiet = options.quiet }
100
- end
101
- end.run!
102
- expect(quiet).to be true
103
- end
104
-
105
- it 'should be inherited by commands even when a block is present' do
106
- quiet = nil
107
- new_command_runner 'foo', '--quiet' do
108
- global_option('--quiet', 'Suppress output') {}
109
- command :foo do |c|
110
- c.when_called { |_, options| quiet = options.quiet }
111
- end
112
- end.run!
113
- expect(quiet).to be true
114
- end
115
-
116
- it 'should be inherited by commands when the positive form of a [no-] option' do
117
- quiet = nil
118
- new_command_runner 'foo', '--quiet' do
119
- global_option('--[no-]quiet', 'Suppress output') {}
120
- command :foo do |c|
121
- c.when_called { |_, options| quiet = options.quiet }
122
- end
123
- end.run!
124
- expect(quiet).to be true
125
- end
126
-
127
- it 'should be inherited by commands when the negative form of a [no-] option' do
128
- quiet = nil
129
- new_command_runner 'foo', '--no-quiet' do
130
- global_option('--[no-]quiet', 'Suppress output') {}
131
- command :foo do |c|
132
- c.when_called { |_, options| quiet = options.quiet }
133
- end
134
- end.run!
135
- expect(quiet).to be false
136
- end
137
- end
138
-
139
- describe '#parse_global_options' do
140
- it 'should parse global options before command' do
141
- global_option = nil
142
- new_command_runner('--testing-global', 'foo') do
143
- global_option('--testing-global') { global_option = 'MAGIC' }
144
-
145
- command :foo do |c|
146
- c.when_called {}
147
- end
148
- end.run!
149
- expect(global_option).to eq('MAGIC')
150
- end
151
-
152
- it 'should parse global options after command' do
153
- global_option = nil
154
- new_command_runner('foo', '--testing-global') do
155
- global_option('--testing-global') { global_option = 'MAGIC' }
156
-
157
- command :foo do |c|
158
- c.when_called {}
159
- end
160
- end.run!
161
- expect(global_option).to eq('MAGIC')
162
- end
163
-
164
- it 'should parse global options placed before command options' do
165
- global_option = nil
166
- new_command_runner('foo', '--testing-global', '--testing-command') do
167
- global_option('--testing-global') { global_option = 'MAGIC' }
168
-
169
- command :foo do |c|
170
- c.option('--testing-command') {}
171
- c.when_called {}
172
- end
173
- end.run!
174
-
175
- expect(global_option).to eq('MAGIC')
176
- end
177
-
178
- it 'should parse global options placed after command options' do
179
- global_option = nil
180
- new_command_runner('foo', '--testing-command', '--testing-global') do
181
- global_option('--testing-global') { global_option = 'MAGIC' }
182
-
183
- command :foo do |c|
184
- c.option('--testing-command') {}
185
- c.when_called {}
186
- end
187
- end.run!
188
-
189
- expect(global_option).to eq('MAGIC')
190
- end
191
-
192
- it 'should parse global options surrounded by command options' do
193
- global_option = nil
194
- new_command_runner('foo', '--testing-command', '--testing-global', '--other-command') do
195
- global_option('--testing-global') { global_option = 'MAGIC' }
196
-
197
- command :foo do |c|
198
- c.option('--testing-command') {}
199
- c.option('--other-command') {}
200
- c.when_called {}
201
- end
202
- end.run!
203
-
204
- expect(global_option).to eq('MAGIC')
205
- end
206
-
207
- it 'should not parse command options' do
208
- global_option = nil
209
- command_option = nil
210
- new_command_runner('foo', '--testing-command', '--testing-global') do
211
- global_option('--testing-global') { global_option = 'MAGIC' }
212
-
213
- command :foo do |c|
214
- c.option('--testing-command') { command_option = 'NO!' }
215
- c.when_called {}
216
- end
217
- end.parse_global_options
218
-
219
- expect(command_option).to be_nil
220
- expect(global_option).to eq('MAGIC')
221
- end
222
-
223
- it 'should not affect command arguments with values' do
224
- global_option = nil
225
- command_option = nil
226
- new_command_runner('foo', '--testing-command', 'bar', '--testing-global') do
227
- global_option('--testing-global') { global_option = 'MAGIC' }
228
-
229
- command :foo do |c|
230
- c.option('--testing-command VALUE') { |v| command_option = v }
231
- c.when_called {}
232
- end
233
- end.run!
234
-
235
- expect(command_option).to eq('bar')
236
- expect(global_option).to eq('MAGIC')
237
- end
238
-
239
- it 'should not affect global arguments with values' do
240
- global_option = nil
241
- new_command_runner('foo', '--testing-command', '--testing-global', 'bar') do
242
- global_option('--testing-global VALUE') { |v| global_option = v }
243
-
244
- command :foo do |c|
245
- c.option('--testing-command') {}
246
- c.when_called {}
247
- end
248
- end.run!
249
-
250
- expect(global_option).to eq('bar')
251
- end
252
-
253
- it 'should allow global arguments with values before command arguments (github issue #8)' do
254
- global_option = nil
255
- command_option = nil
256
- new_command_runner('foo', '--config', 'path', 'bar') do
257
- global_option('--config VALUE') { |v| global_option = v }
258
-
259
- command :foo do |c|
260
- c.option('bar') { command_option = 'bar' }
261
- c.when_called {}
262
- end
263
- end.run!
264
-
265
- expect(global_option).to eq('path')
266
- expect(command_option).to eq('bar')
267
- end
268
- end
269
-
270
- describe '#remove_global_options' do
271
- it 'should remove only specified switches' do
272
- options, args = [], []
273
- options << { switches: ['-t', '--trace'] }
274
- options << { switches: ['--help'] }
275
- options << { switches: ['--paths PATHS'] }
276
- args << '-t'
277
- args << '--help'
278
- args << '--command'
279
- args << '--command-with-arg' << 'rawr'
280
- args << '--paths' << '"lib/**/*.js","spec/**/*.js"'
281
- command_runner.remove_global_options options, args
282
- expect(args).to eq(['--command', '--command-with-arg', 'rawr'])
283
- end
284
-
285
- it 'should not swallow an argument unless it expects an argument' do
286
- options, args = [], []
287
- options << { switches: ['-n', '--no-arg'] }
288
- options << { switches: ['-y', '--yes ARG'] }
289
- options << { switches: ['-a', '--alternative=ARG'] }
290
- args << '-n' << 'alpha'
291
- args << '--yes' << 'deleted'
292
- args << '-a' << 'deleted'
293
- args << 'beta'
294
- command_runner.remove_global_options options, args
295
- expect(args).to eq(%w(alpha beta))
296
- end
297
-
298
- it 'should remove a switch that is the positive form of the [no-] option' do
299
- options, args = [], []
300
- options << { switches: ['-g', '--[no-]good'] }
301
- options << { switches: ['-y', '--yes ARG'] }
302
- options << { switches: ['-a', '--alternative=ARG'] }
303
- args << '--good' << 'alpha'
304
- args << '--yes' << 'deleted'
305
- args << '-a' << 'deleted'
306
- args << 'beta'
307
- command_runner.remove_global_options options, args
308
- expect(args).to eq(%w(alpha beta))
309
- end
310
-
311
- it 'should remove a switch that is the negative form of the [no-] option' do
312
- options, args = [], []
313
- options << { switches: ['-g', '--[no-]good'] }
314
- options << { switches: ['-y', '--yes ARG'] }
315
- options << { switches: ['-a', '--alternative=ARG'] }
316
- args << '--no-good' << 'alpha'
317
- args << '--yes' << 'deleted'
318
- args << '-a' << 'deleted'
319
- args << 'beta'
320
- command_runner.remove_global_options options, args
321
- expect(args).to eq(%w(alpha beta))
322
- end
323
-
324
- it 'should not remove options that start with a global option name' do
325
- options, args = [], []
326
- options << { switches: ['-v', '--version'] }
327
- args << '--versionCode' << 'something'
328
- command_runner.remove_global_options options, args
329
- expect(args).to eq(%w(--versionCode something))
330
- end
331
- end
332
-
333
- describe '--trace' do
334
- it 'should display pretty errors by default' do
335
- expect do
336
- new_command_runner 'foo' do
337
- command(:foo) { |c| c.when_called { fail 'cookies!' } }
338
- end.run!
339
- end.to raise_error(SystemExit, /error: cookies!. Use --trace/)
340
- end
341
-
342
- it 'should display callstack when using this switch' do
343
- expect do
344
- new_command_runner 'foo', '--trace' do
345
- command(:foo) { |c| c.when_called { fail 'cookies!' } }
346
- end.run!
347
- end.to raise_error(RuntimeError)
348
- end
349
- end
350
-
351
- describe '#always_trace!' do
352
- it 'should enable tracing globally, regardless of whether --trace was passed or not' do
353
- expect do
354
- new_command_runner 'foo' do
355
- always_trace!
356
- command(:foo) { |c| c.when_called { fail 'cookies!' } }
357
- end.run!
358
- end.to raise_error(RuntimeError)
359
- end
360
- end
361
-
362
- describe '#never_trace!' do
363
- it 'should disable tracing globally, regardless of whether --trace was passed or not' do
364
- expect do
365
- new_command_runner 'help', '--trace' do
366
- never_trace!
367
- end.run!
368
- end.to raise_error(SystemExit, /invalid option: --trace/)
369
- end
370
-
371
- it 'should not prompt to use --trace switch on errors' do
372
- msg = nil
373
- begin
374
- new_command_runner 'foo' do
375
- never_trace!
376
- command(:foo) { |c| c.when_called { fail 'cookies!' } }
377
- end.run!
378
- rescue SystemExit => e
379
- msg = e.message
380
- end
381
- expect(msg).to match(/error: cookies!/)
382
- expect(msg).not_to match(/--trace/)
383
- end
384
- end
385
-
386
- describe '#silent_trace!' do
387
- it 'should allow the --trace option' do
388
- expect do
389
- new_command_runner 'help', '--trace' do
390
- silent_trace!
391
- end.run!
392
- end.not_to raise_error
393
- end
394
-
395
- it 'should not prompt to use --trace switch on errors' do
396
- msg = nil
397
- begin
398
- new_command_runner 'foo' do
399
- silent_trace!
400
- command(:foo) { |c| c.when_called { fail 'cookies!' } }
401
- end.run!
402
- rescue SystemExit => e
403
- msg = e.message
404
- end
405
- expect(msg).to match(/error: cookies!/)
406
- expect(msg).not_to match(/--trace/)
407
- end
408
- end
409
-
410
- context 'conflict between #always_trace! and #never_trace!' do
411
- it 'respects the last used command' do
412
- expect do
413
- new_command_runner 'foo' do
414
- never_trace!
415
- always_trace!
416
- command(:foo) { |c| c.when_called { fail 'cookies!' } }
417
- end.run!
418
- end.to raise_error(RuntimeError)
419
- end
420
- end
421
-
422
- describe '--version' do
423
- it 'should output program version' do
424
- expect(run('--version')).to eq("test 1.2.3\n")
425
- end
426
- end
427
-
428
- describe '--help' do
429
- it 'should not output an invalid command message' do
430
- expect(run('--help')).not_to eq("invalid command. Use --help for more information\n")
431
- end
432
-
433
- it 'can be used before or after the command and options' do
434
- expect(run('test', '--help')).to eq("Implement help for test here\n")
435
- end
436
-
437
- describe 'help_paging program information' do
438
- it 'enables paging when enabled' do
439
- run('--help') { program :help_paging, true }
440
- expect(Commander::UI).to have_received(:enable_paging)
441
- end
442
-
443
- it 'is enabled by default' do
444
- run('--help')
445
- expect(Commander::UI).to have_received(:enable_paging)
446
- end
447
-
448
- it 'does not enable paging when disabled' do
449
- run('--help') { program :help_paging, false }
450
- expect(Commander::UI).not_to have_received(:enable_paging)
451
- end
452
- end
453
- end
454
-
455
- describe 'with invalid options' do
456
- it 'should output an invalid option message' do
457
- expect do
458
- run('test', '--invalid-option')
459
- end.to raise_error(SystemExit, /invalid option: --invalid-option/)
460
- end
461
- end
462
-
463
- describe 'with invalid command passed' do
464
- it 'should output an invalid command message' do
465
- expect do
466
- run('foo')
467
- end.to raise_error(SystemExit, /invalid command. Use --help for more information/)
468
- end
469
- end
470
-
471
- describe 'with invalid command passed to help' do
472
- it 'should output an invalid command message' do
473
- expect do
474
- run('help', 'does_not_exist')
475
- end.to raise_error(SystemExit, /invalid command. Use --help for more information/)
476
- end
477
- end
478
-
479
- describe 'with invalid command passed to --help' do
480
- it 'should output an invalid command message' do
481
- expect do
482
- run('--help', 'does_not_exist')
483
- end.to raise_error(SystemExit, /invalid command. Use --help for more information/)
484
- end
485
- end
486
-
487
- describe 'with invalid option passed to --help' do
488
- it 'should output an invalid option message' do
489
- expect do
490
- run('--help', 'test', '--invalid-option')
491
- end.to raise_error(SystemExit, /invalid option: --invalid-option/)
492
- end
493
- end
494
-
495
- describe '#valid_command_names_from' do
496
- it 'should return array of valid command names' do
497
- new_command_runner do
498
- command('foo bar') {}
499
- command('foo bar foo') {}
500
- expect(command_runner.valid_command_names_from('foo', 'bar', 'foo').sort).to eq(['foo bar', 'foo bar foo'])
501
- end
502
- end
503
-
504
- it 'should return empty array when no possible command names exist' do
505
- new_command_runner do
506
- expect(command_runner.valid_command_names_from('fake', 'command', 'name')).to eq([])
507
- end
508
- end
509
-
510
- it 'should match exact commands only' do
511
- new_command_runner do
512
- command('foo') {}
513
- expect(command_runner.valid_command_names_from('foobar')).to eq([])
514
- end
515
- end
516
- end
517
-
518
- describe '#command_name_from_args' do
519
- it 'should locate command within arbitrary arguments passed' do
520
- new_command_runner '--help', '--arbitrary', 'test'
521
- expect(command_runner.command_name_from_args).to eq('test')
522
- end
523
-
524
- it 'should support multi-word commands' do
525
- new_command_runner '--help', '--arbitrary', 'some', 'long', 'command', 'foo'
526
- command('some long command') {}
527
- expect(command_runner.command_name_from_args).to eq('some long command')
528
- end
529
-
530
- it 'should match the longest possible command' do
531
- new_command_runner '--help', '--arbitrary', 'foo', 'bar', 'foo'
532
- command('foo bar') {}
533
- command('foo bar foo') {}
534
- expect(command_runner.command_name_from_args).to eq('foo bar foo')
535
- end
536
-
537
- it 'should use the left-most command name when multiple are present' do
538
- new_command_runner 'help', 'test'
539
- expect(command_runner.command_name_from_args).to eq('help')
540
- end
541
- end
542
-
543
- describe '#active_command' do
544
- it 'should resolve the active command' do
545
- new_command_runner '--help', 'test'
546
- expect(command_runner.active_command).to be_instance_of(Commander::Command)
547
- end
548
-
549
- it 'should resolve active command when invalid options are passed' do
550
- new_command_runner '--help', 'test', '--arbitrary'
551
- expect(command_runner.active_command).to be_instance_of(Commander::Command)
552
- end
553
-
554
- it 'should return nil when the command is not found' do
555
- new_command_runner 'foo'
556
- expect(command_runner.active_command).to be_nil
557
- end
558
- end
559
-
560
- describe '#default_command' do
561
- it 'should allow you to default any command when one is not explicitly passed' do
562
- new_command_runner '--trace' do
563
- default_command :test
564
- expect(command(:test)).to receive(:run).once
565
- expect(command_runner.active_command).to eq(command(:test))
566
- end.run!
567
- end
568
-
569
- it 'should not prevent other commands from being called' do
570
- new_command_runner 'foo', 'bar', '--trace' do
571
- default_command :test
572
- command(:'foo bar') {}
573
- expect(command(:'foo bar')).to receive(:run).once
574
- expect(command_runner.active_command).to eq(command(:'foo bar'))
575
- end.run!
576
- end
577
-
578
- it 'should not prevent longer commands to use the same words as the default' do
579
- new_command_runner 'foo', 'bar', 'something'
580
- default_command :'foo bar'
581
- command(:'foo bar') {}
582
- command(:'foo bar something') {}
583
- expect(command_runner.active_command).to eq(command(:'foo bar something'))
584
- end
585
-
586
- it 'should allow defaulting of command aliases' do
587
- new_command_runner '--trace' do
588
- default_command :foobar
589
- alias_command :foobar, :test
590
- expect(command(:test)).to receive(:run).once
591
- end.run!
592
- end
593
- end
594
-
595
- describe 'should function correctly' do
596
- it 'when options are passed before the command name' do
597
- new_command_runner '--verbose', 'test', 'foo', 'bar' do
598
- @command.when_called do |args, options|
599
- expect(args).to eq(%w(foo bar))
600
- expect(options.verbose).to be true
601
- end
602
- end.run!
603
- end
604
-
605
- it 'when options are passed after the command name' do
606
- new_command_runner 'test', '--verbose', 'foo', 'bar' do
607
- @command.when_called do |args, options|
608
- expect(args).to eq(%w(foo bar))
609
- expect(options.verbose).to be true
610
- end
611
- end.run!
612
- end
613
-
614
- it 'when an argument passed is the same name as the command' do
615
- new_command_runner 'test', '--verbose', 'foo', 'test', 'bar' do
616
- @command.when_called do |args, options|
617
- expect(args).to eq(%w(foo test bar))
618
- expect(options.verbose).to be true
619
- end
620
- end.run!
621
- end
622
-
623
- it 'when using multi-word commands' do
624
- new_command_runner '--verbose', 'my', 'command', 'something', 'foo', 'bar' do
625
- command('my command') { |c| c.option('--verbose') }
626
- expect(command_runner.command_name_from_args).to eq('my command')
627
- expect(command_runner.args_without_command_name).to eq(['--verbose', 'something', 'foo', 'bar'])
628
- end.run!
629
- end
630
-
631
- it 'when using multi-word commands with parts of the command name as arguments' do
632
- new_command_runner '--verbose', 'my', 'command', 'something', 'my', 'command' do
633
- command('my command') { |c| c.option('--verbose') }
634
- expect(command_runner.command_name_from_args).to eq('my command')
635
- expect(command_runner.args_without_command_name).to eq(['--verbose', 'something', 'my', 'command'])
636
- end.run!
637
- end
638
-
639
- it 'when using multi-word commands with other commands using the same words' do
640
- new_command_runner '--verbose', 'my', 'command', 'something', 'my', 'command' do
641
- command('my command') {}
642
- command('my command something') { |c| c.option('--verbose') }
643
- expect(command_runner.command_name_from_args).to eq('my command something')
644
- expect(command_runner.args_without_command_name).to eq(['--verbose', 'my', 'command'])
645
- end.run!
646
- end
647
- end
648
-
649
- describe 'options with optional arguments' do
650
- it 'should return the argument when it is specified' do
651
- new_command_runner 'foo', '--optional', 'arg1' do
652
- command('foo') do |c|
653
- c.option('--optional [argument]')
654
- c.when_called do |_, options|
655
- expect(options.optional).to eq('arg1')
656
- end
657
- end
658
- end.run!
659
- end
660
-
661
- it 'should return true when no argument is specified for the option' do
662
- new_command_runner 'foo', '--optional' do
663
- command('foo') do |c|
664
- c.option('--optional [argument]')
665
- c.when_called do |_, options|
666
- expect(options.optional).to be true
667
- end
668
- end
669
- end.run!
670
- end
671
- end
672
- end