simple_scripting 0.10.1 → 0.10.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c4b1be8a601a79595da23945788e7c16ff9491c527929c6d8ab718b23f032e7f
4
- data.tar.gz: 92fe06a625a0ff3661f5c4d9034a6f16aa8846ba88f8327bd9d848bd49bc40e8
3
+ metadata.gz: d451df42fd6ecf5e2de7ec01680151cecaf8f7438fe38beecc20c8a096669c3c
4
+ data.tar.gz: e295f1ff9885ce49834785c2c134aee3a85c5d26840a0234ab613d5041f7e4b9
5
5
  SHA512:
6
- metadata.gz: e1c88943a0a2adbd3887374dc01e5f1b4be1edf14530cc7bd0408da1c8a35f3e5a1e3bf49dd72fc6fa9b077284e569c304ead13f16f77890eeacbcd6d7f579df
7
- data.tar.gz: c351644417ea83f5c50b7bd011631df9b0b852a8a4bf553889464237da33437fe5a035d7ec687a8a668b68649f3fd2b260ffc578e41b9c3b7cb5391afe43867a
6
+ metadata.gz: 51e691d5371ae18047cda52434f84e3e87bee48f1aa3b6db9022287e066be389f32bc3a9e3a9249289755c9b206ee634550562e4231474ce99fb8087a588fa94
7
+ data.tar.gz: 063a6e93572108e28a9228d8f06c121599dfc19dcbf031c2262fe4e18e22cfbbf1782acf60c1c8e2d2273aae05399b8264fce0bb094a2e04c98a12da0b137677
data/.travis.yml CHANGED
@@ -4,3 +4,4 @@ rvm:
4
4
  - 2.3
5
5
  - 2.4
6
6
  - 2.5
7
+ - 2.6
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- simple_scripting (0.10.0)
4
+ simple_scripting (0.10.1)
5
5
  parseconfig (~> 1.0)
6
6
 
7
7
  GEM
@@ -37,7 +37,14 @@ module SimpleScripting
37
37
 
38
38
  extend self
39
39
 
40
- def decode(*params_definition, arguments: ARGV, long_help: nil, auto_help: true, output: $stdout)
40
+ def decode(*definition_and_options)
41
+ params_definition, options = decode_definition_and_options(definition_and_options)
42
+
43
+ arguments = options.fetch(:arguments, ARGV)
44
+ long_help = options[:long_help]
45
+ auto_help = options.fetch(:auto_help, true)
46
+ output = options.fetch(:output, $stdout)
47
+
41
48
  # WATCH OUT! @long_help can also be set in :decode_command!. See issue #17.
42
49
  #
43
50
  @long_help = long_help
@@ -59,6 +66,31 @@ module SimpleScripting
59
66
 
60
67
  private
61
68
 
69
+ # This is trivial to define with named arguments, however, Ruby 2.6 removed the support for
70
+ # mixing strings and symbols as argument keys, so we're forced to perform manual decoding.
71
+ # The complexity of this code supports the rationale for the removal of the functionality.
72
+ #
73
+ def decode_definition_and_options(definition_and_options)
74
+ # Only a hash (commands)
75
+ if definition_and_options.size == 1 && definition_and_options.first.is_a?(Hash)
76
+ options = definition_and_options.first.each_with_object({}) do |(key, value), current_options|
77
+ current_options[key] = definition_and_options.first.delete(key) if key.is_a?(Symbol)
78
+ end
79
+
80
+ # If there is an empty hash left, we remove it, so it's not considered commands.
81
+ #
82
+ definition_and_options = [] if definition_and_options.first.empty?
83
+ # Options passed
84
+ elsif definition_and_options.last.is_a?(Hash)
85
+ options = definition_and_options.pop
86
+ # No options passed
87
+ else
88
+ options = {}
89
+ end
90
+
91
+ [definition_and_options, options]
92
+ end
93
+
62
94
  # MAIN CASES ###########################################
63
95
 
64
96
  # Input params_definition for a non-nested case:
@@ -118,10 +150,10 @@ module SimpleScripting
118
150
  end
119
151
  end
120
152
 
121
- def decode_arguments!(params_definition, arguments, auto_help, commands_stack=[])
153
+ def decode_arguments!(params_definition, arg_values, auto_help, commands_stack=[])
122
154
  result = {}
123
155
  parser_opts_copy = nil # not available outside the block
124
- args = {} # { 'name' => mandatory? }
156
+ arg_definitions = {} # { 'name' => mandatory? }
125
157
 
126
158
  OptionParser.new do |parser_opts|
127
159
  params_definition.each do |param_definition|
@@ -129,7 +161,7 @@ module SimpleScripting
129
161
  when Array
130
162
  process_option_definition!(param_definition, parser_opts, result)
131
163
  when String
132
- process_argument_definition!(param_definition, args)
164
+ process_argument_definition!(param_definition, arg_definitions)
133
165
  else
134
166
  # This is an error in the params definition, so it doesn't follow the user error/help
135
167
  # workflow.
@@ -142,7 +174,7 @@ module SimpleScripting
142
174
  #
143
175
  parser_opts.on('-h', '--help', 'Help') do
144
176
  if auto_help
145
- throw :exit, ExitWithArgumentsHelpPrinting.new(commands_stack, args, parser_opts_copy)
177
+ throw :exit, ExitWithArgumentsHelpPrinting.new(commands_stack, arg_definitions, parser_opts_copy)
146
178
  else
147
179
  # Needs to be better handled. When help is required, generally, it trumps the
148
180
  # correctness of the rest of the options/arguments.
@@ -152,16 +184,19 @@ module SimpleScripting
152
184
  end
153
185
 
154
186
  parser_opts_copy = parser_opts
155
- end.parse!(arguments)
156
-
157
- first_arg_name = args.keys.first.to_s
187
+ end.parse!(arg_values)
158
188
 
159
- if first_arg_name.start_with?('*')
160
- process_varargs!(arguments, result, commands_stack, args, parser_opts_copy)
161
- else
162
- process_regular_argument!(arguments, result, commands_stack, args, parser_opts_copy)
189
+ arg_definitions.each do |arg_name, arg_is_mandatory|
190
+ if arg_name.to_s.start_with?('*')
191
+ arg_name = arg_name.to_s[1..-1].to_sym
192
+ process_varargs!(arg_values, result, commands_stack, arg_name, arg_is_mandatory)
193
+ else
194
+ process_regular_argument!(arg_values, result, commands_stack, arg_name, arg_is_mandatory)
195
+ end
163
196
  end
164
197
 
198
+ check_no_remaining_arguments(arg_values)
199
+
165
200
  result
166
201
  end
167
202
 
@@ -191,38 +226,25 @@ module SimpleScripting
191
226
  end
192
227
  end
193
228
 
194
- def process_varargs!(arguments, result, commands_stack, args, parser_opts_copy)
195
- first_arg_name = args.keys.first.to_s
229
+ def process_varargs!(arg_values, result, commands_stack, arg_name, arg_is_mandatory)
230
+ raise ArgumentError.new("Missing mandatory argument(s)") if arg_is_mandatory && arg_values.empty?
196
231
 
197
- # Mandatory argument
198
- if args.fetch(first_arg_name.to_sym)
199
- if arguments.empty?
200
- raise ArgumentError.new("Missing mandatory argument(s)")
201
- else
202
- name = args.keys.first[1..-1].to_sym
232
+ result[arg_name] = arg_values.dup
233
+ arg_values.clear
234
+ end
203
235
 
204
- result[name] = arguments
236
+ def process_regular_argument!(arg_values, result, commands_stack, arg_name, arg_is_mandatory)
237
+ if arg_values.empty?
238
+ if arg_is_mandatory
239
+ raise ArgumentError.new("Missing mandatory argument(s)")
205
240
  end
206
- # Optional
207
241
  else
208
- name = args.keys.first[1..-1].to_sym
209
-
210
- result[name] = arguments
242
+ result[arg_name] = arg_values.shift
211
243
  end
212
244
  end
213
245
 
214
- def process_regular_argument!(arguments, result, commands_stack, args, parser_opts_copy)
215
- min_args_size = args.count { |_, mandatory| mandatory }
216
-
217
- if arguments.size < min_args_size
218
- raise ArgumentError.new("Missing mandatory argument(s)")
219
- elsif arguments.size > args.size
220
- raise ArgumentError.new("Too many arguments")
221
- else
222
- arguments.zip(args) do |value, (name, _)|
223
- result[name] = value
224
- end
225
- end
246
+ def check_no_remaining_arguments(arg_values)
247
+ raise ArgumentError.new("Too many arguments") if !arg_values.empty?
226
248
  end
227
249
 
228
250
  # HELPERS ##############################################
@@ -1,5 +1,5 @@
1
1
  module SimpleScripting
2
2
 
3
- VERSION = "0.10.1"
3
+ VERSION = "0.10.2"
4
4
 
5
5
  end
@@ -10,7 +10,7 @@ Gem::Specification.new do |s|
10
10
  s.platform = Gem::Platform::RUBY
11
11
  s.required_ruby_version = '>= 2.3.0'
12
12
  s.authors = ["Saverio Miroddi"]
13
- s.date = "2018-12-03"
13
+ s.date = "2019-01-15"
14
14
  s.email = ["saverio.pub2@gmail.com"]
15
15
  s.homepage = "https://github.com/saveriomiroddi/simple_scripting"
16
16
  s.summary = "Library for simplifying some typical scripting functionalities."
@@ -169,28 +169,57 @@ describe SimpleScripting::Argv do
169
169
 
170
170
  describe '(mandatory)' do
171
171
 
172
- let(:decoder_params) {[
173
- '*varargs',
174
- output: output_buffer,
175
- ]}
172
+ context 'as only parameter' do
176
173
 
177
- it "should be decoded" do
178
- decoder_params.last[:arguments] = ['varval1', 'varval2']
174
+ let(:decoder_params) {[
175
+ '*varargs',
176
+ output: output_buffer,
177
+ arguments: ['varval1', 'varval2'],
178
+ ]}
179
179
 
180
- actual_result = described_class.decode(*decoder_params)
180
+ it "should be decoded" do
181
+ actual_result = described_class.decode(*decoder_params)
181
182
 
182
- expected_result = {
183
- varargs: ['varval1', 'varval2'],
184
- }
183
+ expected_result = {
184
+ varargs: ['varval1', 'varval2'],
185
+ }
186
+
187
+ expect(actual_result).to eql(expected_result)
188
+ end
189
+
190
+ end
191
+
192
+ context 'followed by varargs' do
193
+
194
+ let(:decoder_params) {[
195
+ 'mandatory',
196
+ '*varargs',
197
+ output: output_buffer,
198
+ arguments: ['mandval', 'varval1', 'varval2']
199
+ ]}
200
+
201
+ it "should be decoded" do
202
+ actual_result = described_class.decode(*decoder_params)
203
+
204
+ expected_result = {
205
+ mandatory: 'mandval',
206
+ varargs: ['varval1', 'varval2'],
207
+ }
208
+
209
+ expect(actual_result).to eql(expected_result)
210
+ end
185
211
 
186
- expect(actual_result).to eql(expected_result)
187
212
  end
188
213
 
189
214
  context "error handling" do
190
215
 
191
- it "should exit when they are not specified" do
192
- decoder_params.last[:arguments] = []
216
+ let(:decoder_params) {[
217
+ '*varargs',
218
+ output: output_buffer,
219
+ arguments: [],
220
+ ]}
193
221
 
222
+ it "should exit when they are not specified" do
194
223
  decoding = -> { described_class.decode(*decoder_params) }
195
224
 
196
225
  expect(decoding).to raise_error(SimpleScripting::Argv::ArgumentError, "Missing mandatory argument(s)")
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: simple_scripting
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.10.1
4
+ version: 0.10.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Saverio Miroddi
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-12-03 00:00:00.000000000 Z
11
+ date: 2019-01-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: parseconfig
@@ -101,7 +101,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
101
101
  version: '0'
102
102
  requirements: []
103
103
  rubyforge_project:
104
- rubygems_version: 2.7.8
104
+ rubygems_version: 2.7.6
105
105
  signing_key:
106
106
  specification_version: 4
107
107
  summary: Library for simplifying some typical scripting functionalities.