murano-cli-commander 4.4.10

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