commander 4.3.8 → 4.4.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 64fa723701dbdd02b99e8522367448ba136d498d
4
- data.tar.gz: 078d26f2f3610bc4a1bcd44f50d350dc836f2276
3
+ metadata.gz: 0e9fa3f3fbb6475cdf02ae043991c17ec9058107
4
+ data.tar.gz: 39f8b6530783b95688fa20d4b6ac4b7bb43ec0ab
5
5
  SHA512:
6
- metadata.gz: 76874e8b7f1f227cde4bcd7601f1b97c2fd131c1a4119b40cd79742341957c540fa7c554632f74bd857bf37adc2947b3c1ad0febaac2da891cf0cbe02cdfe77c
7
- data.tar.gz: c4351aadda2c05e041e32d3adc950705d6cbb00123cc4cfeb7c4ff080d30ffe6325e2327036efb5ed89488e621001ea3236dcb0174f54fb3d708760dea45eec6
6
+ metadata.gz: 612b57dc06491d404d072a6e8eec9da8c1727e65fe23afa48c36c183e7ff706de9cb1c4bc3f5adfef67d03ee2be9ac8dab0f9eb6328dbfe758479c9ead834a0f
7
+ data.tar.gz: 2141c0258fd8b2818c7f3eacf02809a32dcc68326822920bb8756215ab777bb46d10b58848d959eeb8b95da864d150331e79d15f61ab938b4fef946b6b9d008e
@@ -20,7 +20,7 @@ Metrics/AbcSize:
20
20
  # Offense count: 1
21
21
  # Configuration parameters: CountComments.
22
22
  Metrics/ClassLength:
23
- Max: 230
23
+ Enabled: false
24
24
 
25
25
  # Offense count: 4
26
26
  Metrics/CyclomaticComplexity:
@@ -1,3 +1,9 @@
1
+ === 4.4.0 / 2016-02-19
2
+
3
+ * Add modular style template initialization. (@lebogan)
4
+ * Allow option names that start with a global option name.
5
+ * Fix handling of negatable global flags. (@mfurtak)
6
+
1
7
  === 4.3.8 / 2016-02-09
2
8
 
3
9
  * Fix regression for deprecation warnings.
data/README.md CHANGED
@@ -37,6 +37,10 @@ To generate a quick template for a commander app, run:
37
37
 
38
38
  $ commander init yourfile.rb
39
39
 
40
+ To generate a quick modular style template for a commander app, run:
41
+
42
+ $ commander init --modular yourfile.rb
43
+
40
44
  ## Example
41
45
 
42
46
  For more option examples view the `Commander::Command#option` method. Also
@@ -8,30 +8,78 @@ program :version, Commander::VERSION
8
8
  program :description, 'Commander utility program.'
9
9
 
10
10
  command :init do |c|
11
- c.syntax = 'commander init <file>'
11
+ c.syntax = 'commander init [option] <file>'
12
12
  c.summary = 'Initialize a commander template'
13
13
  c.description = 'Initialize an empty <file> with a commander template,
14
14
  allowing very quick creation of commander executables.'
15
- c.example 'Create a new file with a commander template.', 'commander init bin/my_executable'
16
- c.action do |args, _options|
15
+ c.example 'Create a new classic style template file.', 'commander init bin/my_executable'
16
+ c.example 'Create a new modular style template file.', 'commander init --modular bin/my_executable'
17
+ c.option '-m', '--modular', 'Initialize a modular style template'
18
+ c.action do |args, options|
17
19
  file = args.shift || abort('file argument required.')
18
20
  name = ask 'Machine name of program: '
19
21
  description = ask 'Describe your program: '
20
22
  commands = ask_for_array 'List the commands you wish to create: '
21
23
  begin
22
- File.open(file, 'w') do |f|
23
- f.write <<-"...".gsub!(/^ {10}/, '')
24
+ if options.modular
25
+ File.open(file, 'w') do |f|
26
+ f.write <<-"...".gsub!(/^ {10}/, '')
27
+ #!/usr/bin/env ruby
28
+
29
+ require 'rubygems'
30
+ require 'commander'
31
+
32
+ class MyApplication
33
+ include Commander::Methods
34
+ # include whatever modules you need
35
+
36
+ def run
37
+ program :name, '#{name}'
38
+ program :version, '0.0.1'
39
+ program :description, '#{description}'
40
+
41
+ ...
42
+ commands.each do |command|
43
+ f.write <<-"...".gsub!(/^ {12}/, '')
44
+ command :#{command} do |c|
45
+ c.syntax = '#{name} #{command} [options]'
46
+ c.summary = ''
47
+ c.description = ''
48
+ c.example 'description', 'command example'
49
+ c.option '--some-switch', 'Some switch that does something'
50
+ c.action do |args, options|
51
+ # Do something or c.when_called #{name.capitalize}::Commands::#{command.capitalize}
52
+ end
53
+ end
54
+
55
+ ...
56
+ end
57
+ f.write <<-"...".gsub!(/^ {12}/, '')
58
+ run!
59
+ end
60
+ end
61
+
62
+ MyApplication.new.run if $0 == __FILE__
63
+ ...
64
+ end
65
+
66
+ File.chmod(0755, file)
67
+ say "Initialized modular template in #{file}"
68
+ else
69
+ File.open(file, 'w') do |f|
70
+ f.write <<-"...".gsub!(/^ {10}/, '')
24
71
  #!/usr/bin/env ruby
25
72
 
26
73
  require 'rubygems'
27
74
  require 'commander/import'
28
75
 
76
+ program :name, '#{name}'
29
77
  program :version, '0.0.1'
30
78
  program :description, '#{description}'
31
79
 
32
- ...
33
- commands.each do |command|
34
- f.write <<-"...".gsub!(/^ {12}/, '')
80
+ ...
81
+ commands.each do |command|
82
+ f.write <<-"...".gsub!(/^ {12}/, '')
35
83
  command :#{command} do |c|
36
84
  c.syntax = '#{name} #{command} [options]'
37
85
  c.summary = ''
@@ -43,11 +91,12 @@ command :init do |c|
43
91
  end
44
92
  end
45
93
 
46
- ...
94
+ ...
95
+ end
47
96
  end
97
+ File.chmod 0755, file
98
+ say "Initialized template in #{file}"
48
99
  end
49
- File.chmod 0755, file
50
- say "Initialized template in #{file}"
51
100
  rescue => e
52
101
  abort e
53
102
  end
@@ -335,9 +335,11 @@ module Commander
335
335
  switches.map! { |s| s[0, s.index('=') || s.index(' ') || s.length] }
336
336
  end
337
337
 
338
+ switches = expand_optionally_negative_switches(switches)
339
+
338
340
  past_switch, arg_removed = false, false
339
341
  args.delete_if do |arg|
340
- if switches.any? { |s| arg[0, s.length] == s }
342
+ if switches.any? { |s| s[0, arg.length] == arg }
341
343
  arg_removed = !switch_has_arg
342
344
  past_switch = true
343
345
  elsif past_switch && !arg_removed && arg !~ /^-/
@@ -350,6 +352,20 @@ module Commander
350
352
  end
351
353
  end
352
354
 
355
+ # expand switches of the style '--[no-]blah' into both their
356
+ # '--blah' and '--no-blah' variants, so that they can be
357
+ # properly detected and removed
358
+ def expand_optionally_negative_switches(switches)
359
+ switches.reduce([]) do |memo, val|
360
+ if val =~ /\[no-\]/
361
+ memo << val.gsub(/\[no-\]/, '')
362
+ memo << val.gsub(/\[no-\]/, 'no-')
363
+ else
364
+ memo << val
365
+ end
366
+ end
367
+ end
368
+
353
369
  ##
354
370
  # Parse global command options.
355
371
 
@@ -1,3 +1,3 @@
1
1
  module Commander
2
- VERSION = '4.3.8'
2
+ VERSION = '4.4.0'
3
3
  end
@@ -110,6 +110,28 @@ describe Commander do
110
110
  end.run!
111
111
  expect(quiet).to be true
112
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
113
135
  end
114
136
 
115
137
  describe '#parse_global_options' do
@@ -270,6 +292,40 @@ describe Commander do
270
292
  command_runner.remove_global_options options, args
271
293
  expect(args).to eq(%w(alpha beta))
272
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
273
329
  end
274
330
 
275
331
  describe '--trace' do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: commander
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.3.8
4
+ version: 4.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - TJ Holowaychuk
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2016-02-09 00:00:00.000000000 Z
12
+ date: 2016-02-19 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: highline