commander 4.4.6 → 4.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (41) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +26 -6
  3. data/.rubocop_todo.yml +4 -4
  4. data/.travis.yml +7 -8
  5. data/Gemfile +2 -0
  6. data/History.rdoc +25 -0
  7. data/README.md +6 -6
  8. data/Rakefile +3 -1
  9. data/bin/commander +2 -1
  10. data/commander.gemspec +13 -10
  11. data/lib/commander.rb +2 -0
  12. data/lib/commander/blank.rb +2 -0
  13. data/lib/commander/command.rb +10 -5
  14. data/lib/commander/configure.rb +2 -0
  15. data/lib/commander/core_ext.rb +2 -0
  16. data/lib/commander/core_ext/array.rb +3 -1
  17. data/lib/commander/core_ext/object.rb +2 -0
  18. data/lib/commander/delegates.rb +3 -1
  19. data/lib/commander/help_formatters.rb +3 -1
  20. data/lib/commander/help_formatters/base.rb +2 -0
  21. data/lib/commander/help_formatters/terminal.rb +7 -1
  22. data/lib/commander/help_formatters/terminal/command_help.erb +6 -6
  23. data/lib/commander/help_formatters/terminal/help.erb +7 -7
  24. data/lib/commander/help_formatters/terminal_compact.rb +7 -1
  25. data/lib/commander/import.rb +2 -0
  26. data/lib/commander/methods.rb +4 -2
  27. data/lib/commander/platform.rb +2 -0
  28. data/lib/commander/runner.rb +44 -36
  29. data/lib/commander/user_interaction.rb +27 -21
  30. data/lib/commander/version.rb +3 -1
  31. data/spec/command_spec.rb +29 -0
  32. data/spec/configure_spec.rb +2 -0
  33. data/spec/core_ext/array_spec.rb +3 -1
  34. data/spec/core_ext/object_spec.rb +2 -0
  35. data/spec/help_formatters/terminal_compact_spec.rb +2 -0
  36. data/spec/help_formatters/terminal_spec.rb +2 -0
  37. data/spec/methods_spec.rb +5 -3
  38. data/spec/runner_spec.rb +123 -8
  39. data/spec/spec_helper.rb +15 -4
  40. data/spec/ui_spec.rb +4 -2
  41. metadata +34 -30
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
  require 'commander/configure'
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe Array do
@@ -12,7 +14,7 @@ describe Array do
12
14
 
13
15
  it 'should match %w behavior with multiple backslashes' do
14
16
  str = 'just a\\ test'
15
- expect(Array.parse(str)).to eq(eval("%w(#{str})"))
17
+ expect(Array.parse(str)).to eq(['just', 'a test'])
16
18
  end
17
19
  end
18
20
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe Object do
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe Commander::HelpFormatter::TerminalCompact do
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe Commander::HelpFormatter::Terminal do
data/spec/methods_spec.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
  require 'commander/methods'
3
5
 
@@ -16,12 +18,12 @@ describe Commander::Methods do
16
18
 
17
19
  before do
18
20
  allow(terminal).to receive(:ask)
19
- $_old_terminal = $terminal
20
- $terminal = terminal
21
+ @old_highline = HighLine.default_instance
22
+ HighLine.default_instance = terminal
21
23
  end
22
24
 
23
25
  after do
24
- $terminal = $_old_terminal
26
+ HighLine.default_instance = @old_highline
25
27
  end
26
28
 
27
29
  subject do
data/spec/runner_spec.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe Commander do
@@ -100,6 +102,17 @@ describe Commander do
100
102
  expect(quiet).to be true
101
103
  end
102
104
 
105
+ it 'should be inherited by commands when provided before the command name' do
106
+ option = nil
107
+ new_command_runner '--global-option', 'option-value', 'command_name' do
108
+ global_option('--global-option=GLOBAL', 'A global option')
109
+ command :command_name do |c|
110
+ c.when_called { |_, options| option = options.global_option }
111
+ end
112
+ end.run!
113
+ expect(option).to eq('option-value')
114
+ end
115
+
103
116
  it 'should be inherited by commands even when a block is present' do
104
117
  quiet = nil
105
118
  new_command_runner 'foo', '--quiet' do
@@ -132,6 +145,57 @@ describe Commander do
132
145
  end.run!
133
146
  expect(quiet).to be false
134
147
  end
148
+
149
+ it 'should allow command arguments before the global option' do
150
+ config = nil
151
+ args = nil
152
+ new_command_runner 'foo', '--config', 'config-value', 'arg1', 'arg2' do
153
+ global_option('-c', '--config CONFIG', String)
154
+ command :foo do |c|
155
+ c.when_called do |arguments, options|
156
+ options.default(config: 'default')
157
+ args = arguments
158
+ config = options.config
159
+ end
160
+ end
161
+ end.run!
162
+ expect(config).to eq('config-value')
163
+ expect(args).to eq(%w(arg1 arg2))
164
+ end
165
+
166
+ it 'should allow command arguments after the global option' do
167
+ config = nil
168
+ args = nil
169
+ new_command_runner 'foo', 'arg1', 'arg2', '--config', 'config-value' do
170
+ global_option('-c', '--config CONFIG', String)
171
+ command :foo do |c|
172
+ c.when_called do |arguments, options|
173
+ options.default(config: 'default')
174
+ args = arguments
175
+ config = options.config
176
+ end
177
+ end
178
+ end.run!
179
+ expect(config).to eq('config-value')
180
+ expect(args).to eq(%w(arg1 arg2))
181
+ end
182
+
183
+ it 'allows global options in the form option=value' do
184
+ config = nil
185
+ args = nil
186
+ new_command_runner 'test', 'arg1', '--config=config-value', 'arg2' do
187
+ global_option('-c', '--config CONFIG', String)
188
+ command :test do |c|
189
+ c.when_called do |arguments, options|
190
+ options.default(config: 'default')
191
+ args = arguments
192
+ config = options.config
193
+ end
194
+ end
195
+ end.run!
196
+ expect(config).to eq('config-value')
197
+ expect(args).to eq(%w[arg1 arg2])
198
+ end
135
199
  end
136
200
 
137
201
  describe '#parse_global_options' do
@@ -326,6 +390,20 @@ describe Commander do
326
390
  command_runner.remove_global_options options, args
327
391
  expect(args).to eq(%w(--versionCode something))
328
392
  end
393
+
394
+ it 'should remove specified switches value provided via equals' do
395
+ options = [{ switches: ['--global GLOBAL'] }]
396
+ args = ['--command', '--global=option-value', 'arg']
397
+ command_runner.remove_global_options options, args
398
+ expect(args).to eq(['--command', 'arg'])
399
+ end
400
+
401
+ it 'should not remove extra values after switches' do
402
+ options = [{ switches: ['--global GLOBAL'] }]
403
+ args = ['--global', '--command', 'arg']
404
+ command_runner.remove_global_options options, args
405
+ expect(args).to eq(['--command', 'arg'])
406
+ end
329
407
  end
330
408
 
331
409
  describe '--trace' do
@@ -334,7 +412,7 @@ describe Commander do
334
412
  new_command_runner 'foo' do
335
413
  command(:foo) { |c| c.when_called { fail 'cookies!' } }
336
414
  end.run!
337
- end.to raise_error(SystemExit, /error: cookies!. Use --trace/)
415
+ end.to raise_error(TestSystemExit, /error: cookies!. Use --trace/)
338
416
  end
339
417
 
340
418
  it 'should display callstack when using this switch' do
@@ -363,7 +441,7 @@ describe Commander do
363
441
  new_command_runner 'help', '--trace' do
364
442
  never_trace!
365
443
  end.run!
366
- end.to raise_error(SystemExit, /invalid option: --trace/)
444
+ end.to raise_error(TestSystemExit, /invalid option: --trace/)
367
445
  end
368
446
 
369
447
  it 'should not prompt to use --trace switch on errors' do
@@ -373,7 +451,7 @@ describe Commander do
373
451
  never_trace!
374
452
  command(:foo) { |c| c.when_called { fail 'cookies!' } }
375
453
  end.run!
376
- rescue SystemExit => e
454
+ rescue TestSystemExit => e
377
455
  msg = e.message
378
456
  end
379
457
  expect(msg).to match(/error: cookies!/)
@@ -408,6 +486,22 @@ describe Commander do
408
486
  expect(run('test', '--help')).to eq("Implement help for test here\n")
409
487
  end
410
488
 
489
+ it 'can be used after the command and command arguments' do
490
+ expect(run('test', 'command-arg', '--help')).to eq("Implement help for test here\n")
491
+ end
492
+
493
+ it 'can be used before a single-word command with command arguments' do
494
+ expect(run('help', 'test', 'command-arg')).to eq("Implement help for test here\n")
495
+ end
496
+
497
+ it 'can be used before a multi-word command with command arguments' do
498
+ expect(
499
+ run('help', 'module', 'install', 'command-arg') do
500
+ command('module install') { |c| c.when_called { say 'whee!' } }
501
+ end
502
+ ).to eq("Implement help for module install here\n")
503
+ end
504
+
411
505
  describe 'help_paging program information' do
412
506
  it 'enables paging when enabled' do
413
507
  run('--help') { program :help_paging, true }
@@ -430,7 +524,7 @@ describe Commander do
430
524
  it 'should output an invalid option message' do
431
525
  expect do
432
526
  run('test', '--invalid-option')
433
- end.to raise_error(SystemExit, /invalid option: --invalid-option/)
527
+ end.to raise_error(TestSystemExit, /invalid option: --invalid-option/)
434
528
  end
435
529
  end
436
530
 
@@ -438,7 +532,7 @@ describe Commander do
438
532
  it 'should output an invalid command message' do
439
533
  expect do
440
534
  run('foo')
441
- end.to raise_error(SystemExit, /invalid command. Use --help for more information/)
535
+ end.to raise_error(TestSystemExit, /invalid command. Use --help for more information/)
442
536
  end
443
537
  end
444
538
 
@@ -446,7 +540,7 @@ describe Commander do
446
540
  it 'should output an invalid command message' do
447
541
  expect do
448
542
  run('help', 'does_not_exist')
449
- end.to raise_error(SystemExit, /invalid command. Use --help for more information/)
543
+ end.to raise_error(TestSystemExit, /invalid command. Use --help for more information/)
450
544
  end
451
545
  end
452
546
 
@@ -454,7 +548,7 @@ describe Commander do
454
548
  it 'should output an invalid command message' do
455
549
  expect do
456
550
  run('--help', 'does_not_exist')
457
- end.to raise_error(SystemExit, /invalid command. Use --help for more information/)
551
+ end.to raise_error(TestSystemExit, /invalid command. Use --help for more information/)
458
552
  end
459
553
  end
460
554
 
@@ -462,7 +556,7 @@ describe Commander do
462
556
  it 'should output an invalid option message' do
463
557
  expect do
464
558
  run('--help', 'test', '--invalid-option')
465
- end.to raise_error(SystemExit, /invalid option: --invalid-option/)
559
+ end.to raise_error(TestSystemExit, /invalid option: --invalid-option/)
466
560
  end
467
561
  end
468
562
 
@@ -495,6 +589,13 @@ describe Commander do
495
589
  expect(command_runner.command_name_from_args).to eq('test')
496
590
  end
497
591
 
592
+ it 'should locate command when provided after a global argument with value' do
593
+ new_command_runner '--global-option', 'option-value', 'test' do
594
+ global_option('--global-option=GLOBAL', 'A global option')
595
+ end
596
+ expect(command_runner.command_name_from_args).to eq('test')
597
+ end
598
+
498
599
  it 'should support multi-word commands' do
499
600
  new_command_runner '--help', '--arbitrary', 'some', 'long', 'command', 'foo'
500
601
  command('some long command') {}
@@ -643,4 +744,18 @@ describe Commander do
643
744
  end.run!
644
745
  end
645
746
  end
747
+
748
+ describe 'with double dash' do
749
+ it 'should interpret the remainder as arguments' do
750
+ new_command_runner 'foo', '--', '-x' do
751
+ command('foo') do |c|
752
+ c.option '-x', 'Switch'
753
+ c.when_called do |args, options|
754
+ expect(args).to eq(%w(-x))
755
+ expect(options.x).to be_nil
756
+ end
757
+ end
758
+ end.run!
759
+ end
760
+ end
646
761
  end
data/spec/spec_helper.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rubygems'
2
4
  require 'stringio'
3
5
  require 'simplecov'
@@ -6,7 +8,7 @@ SimpleCov.start do
6
8
  end
7
9
 
8
10
  # Unshift so that local files load instead of something in gems
9
- $LOAD_PATH.unshift File.dirname(__FILE__) + '/../lib'
11
+ $LOAD_PATH.unshift "#{File.dirname(__FILE__)}/../lib"
10
12
 
11
13
  # This basically replicates the behavior of `require 'commander/import'`
12
14
  # but without adding an `at_exit` hook, which interferes with exit code
@@ -14,11 +16,20 @@ require 'commander'
14
16
  require 'commander/methods'
15
17
 
16
18
  # Mock terminal IO streams so we can spec against them
17
-
18
19
  def mock_terminal
19
20
  @input = StringIO.new
20
21
  @output = StringIO.new
21
- $terminal = HighLine.new @input, @output
22
+ HighLine.default_instance = HighLine.new(@input, @output)
23
+ end
24
+
25
+ # Stub Kernel.abort
26
+ TestSystemExit = Class.new(RuntimeError)
27
+ module Commander
28
+ class Runner
29
+ def abort(message)
30
+ fail TestSystemExit, message
31
+ end
32
+ end
22
33
  end
23
34
 
24
35
  # Create test command for usage within several specs
@@ -40,7 +51,7 @@ end
40
51
  # Create a new command runner
41
52
 
42
53
  def new_command_runner(*args, &block)
43
- Commander::Runner.instance_variable_set :"@singleton", Commander::Runner.new(args)
54
+ Commander::Runner.instance_variable_set :@instance, Commander::Runner.new(args)
44
55
  program :name, 'test'
45
56
  program :version, '1.2.3'
46
57
  program :description, 'something'
data/spec/ui_spec.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe Commander::UI do
@@ -5,7 +7,7 @@ describe Commander::UI do
5
7
 
6
8
  describe '.replace_tokens' do
7
9
  it 'should replace tokens within a string, with hash values' do
8
- result = Commander::UI.replace_tokens 'Welcome :name, enjoy your :object'.freeze, name: 'TJ', object: 'cookie'
10
+ result = Commander::UI.replace_tokens 'Welcome :name, enjoy your :object', name: 'TJ', object: 'cookie'
9
11
  expect(result).to eq('Welcome TJ, enjoy your cookie')
10
12
  end
11
13
  end
@@ -15,7 +17,7 @@ describe Commander::UI do
15
17
  exception = false
16
18
  begin
17
19
  progress([]) {}
18
- rescue
20
+ rescue StandardError
19
21
  exception = true
20
22
  end
21
23
  expect(exception).not_to be true
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: commander
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.4.6
4
+ version: 4.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - TJ Holowaychuk
8
8
  - Gabriel Gilder
9
- autorequire:
9
+ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2018-08-01 00:00:00.000000000 Z
12
+ date: 2021-04-09 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: highline
@@ -17,14 +17,28 @@ dependencies:
17
17
  requirements:
18
18
  - - "~>"
19
19
  - !ruby/object:Gem::Version
20
- version: 1.7.2
20
+ version: 2.0.0
21
21
  type: :runtime
22
22
  prerelease: false
23
23
  version_requirements: !ruby/object:Gem::Requirement
24
24
  requirements:
25
25
  - - "~>"
26
26
  - !ruby/object:Gem::Version
27
- version: 1.7.2
27
+ version: 2.0.0
28
+ - !ruby/object:Gem::Dependency
29
+ name: rake
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - ">="
33
+ - !ruby/object:Gem::Version
34
+ version: '0'
35
+ type: :development
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
28
42
  - !ruby/object:Gem::Dependency
29
43
  name: rspec
30
44
  requirement: !ruby/object:Gem::Requirement
@@ -40,19 +54,19 @@ dependencies:
40
54
  - !ruby/object:Gem::Version
41
55
  version: '3.2'
42
56
  - !ruby/object:Gem::Dependency
43
- name: rake
57
+ name: rubocop
44
58
  requirement: !ruby/object:Gem::Requirement
45
59
  requirements:
46
- - - ">="
60
+ - - "~>"
47
61
  - !ruby/object:Gem::Version
48
- version: '0'
62
+ version: 1.12.1
49
63
  type: :development
50
64
  prerelease: false
51
65
  version_requirements: !ruby/object:Gem::Requirement
52
66
  requirements:
53
- - - ">="
67
+ - - "~>"
54
68
  - !ruby/object:Gem::Version
55
- version: '0'
69
+ version: 1.12.1
56
70
  - !ruby/object:Gem::Dependency
57
71
  name: simplecov
58
72
  requirement: !ruby/object:Gem::Requirement
@@ -67,20 +81,6 @@ dependencies:
67
81
  - - ">="
68
82
  - !ruby/object:Gem::Version
69
83
  version: '0'
70
- - !ruby/object:Gem::Dependency
71
- name: rubocop
72
- requirement: !ruby/object:Gem::Requirement
73
- requirements:
74
- - - "~>"
75
- - !ruby/object:Gem::Version
76
- version: 0.49.1
77
- type: :development
78
- prerelease: false
79
- version_requirements: !ruby/object:Gem::Requirement
80
- requirements:
81
- - - "~>"
82
- - !ruby/object:Gem::Version
83
- version: 0.49.1
84
84
  description: The complete solution for Ruby command-line executables. Commander bridges
85
85
  the gap between other terminal related libraries you know and love (OptionParser,
86
86
  HighLine), while providing many new features, and an elegant API.
@@ -140,8 +140,13 @@ files:
140
140
  homepage: https://github.com/commander-rb/commander
141
141
  licenses:
142
142
  - MIT
143
- metadata: {}
144
- post_install_message:
143
+ metadata:
144
+ bug_tracker_uri: https://github.com/commander-rb/commander/issues
145
+ changelog_uri: https://github.com/commander-rb/commander/blob/master/History.rdoc
146
+ documentation_uri: https://www.rubydoc.info/gems/commander/4.6.0
147
+ homepage_uri: https://github.com/commander-rb/commander
148
+ source_code_uri: https://github.com/commander-rb/commander/tree/v4.6.0
149
+ post_install_message:
145
150
  rdoc_options: []
146
151
  require_paths:
147
152
  - lib
@@ -149,16 +154,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
149
154
  requirements:
150
155
  - - ">="
151
156
  - !ruby/object:Gem::Version
152
- version: '0'
157
+ version: '2.4'
153
158
  required_rubygems_version: !ruby/object:Gem::Requirement
154
159
  requirements:
155
160
  - - ">="
156
161
  - !ruby/object:Gem::Version
157
162
  version: '0'
158
163
  requirements: []
159
- rubyforge_project:
160
- rubygems_version: 2.7.4
161
- signing_key:
164
+ rubygems_version: 3.2.15
165
+ signing_key:
162
166
  specification_version: 4
163
167
  summary: The complete solution for Ruby command-line executables
164
168
  test_files: