simple_scripting 0.12.1 → 0.13.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 +4 -4
- data/lib/simple_scripting/argv.rb +2 -1
- data/lib/simple_scripting/version.rb +1 -1
- data/simple_scripting.gemspec +1 -1
- data/spec/simple_scripting/argv_spec.rb +63 -58
- data/spec/simple_scripting/configuration_spec.rb +4 -8
- data/spec/simple_scripting/tab_completion_spec.rb +0 -12
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0a31e06185c711924565be44455735e02e55b31a98fc6782a101214cf9d37266
|
4
|
+
data.tar.gz: 2fa2139a689a85e1703604a3da2be186ac8596b9b17c0bc2af4c8c8244c8ad4d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bbf4a7477108d85b62922592eedbc550f0896ca75265385c219c052636d0c45628cd93ca59603649f9ee9227cf00fdf2526732918efb0ab7d55fe62d4b158196
|
7
|
+
data.tar.gz: b754caa9b812a0d7a5882d5bc2c67b0e72a276da9385a2be70d423838f00da711a182fb1f9b67c4072176c73a9d4020acb3b2070fba54f83615edd830cc5aa5c
|
@@ -243,7 +243,8 @@ module SimpleScripting
|
|
243
243
|
end
|
244
244
|
|
245
245
|
parser_opts.on(*param_definition) do |value|
|
246
|
-
|
246
|
+
raise "Unexpected (nil; likely programmatic error) value for param definition #{param_definition}" if value.nil?
|
247
|
+
result[key] = value
|
247
248
|
end
|
248
249
|
end
|
249
250
|
|
data/simple_scripting.gemspec
CHANGED
@@ -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 = "
|
13
|
+
s.date = "2022-07-21"
|
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."
|
@@ -3,15 +3,12 @@ require_relative '../../lib/simple_scripting/argv.rb'
|
|
3
3
|
require 'stringio'
|
4
4
|
|
5
5
|
module SimpleScripting
|
6
|
-
|
7
6
|
describe Argv do
|
8
|
-
|
9
7
|
let(:output_buffer) do
|
10
8
|
StringIO.new
|
11
9
|
end
|
12
10
|
|
13
11
|
describe 'Basic functionality' do
|
14
|
-
|
15
12
|
let(:decoder_params) {[
|
16
13
|
['-a' ],
|
17
14
|
['-b', '"-b" description'],
|
@@ -26,7 +23,6 @@ module SimpleScripting
|
|
26
23
|
]}
|
27
24
|
|
28
25
|
context 'help' do
|
29
|
-
|
30
26
|
it 'should print help automatically by default' do
|
31
27
|
decoder_params.last[:arguments] = ['-h']
|
32
28
|
|
@@ -73,11 +69,10 @@ module SimpleScripting
|
|
73
69
|
raise_errors: true,
|
74
70
|
)
|
75
71
|
|
76
|
-
|
77
|
-
|
78
|
-
|
72
|
+
expect {
|
73
|
+
described_class.decode(*decoder_params)
|
74
|
+
}.to raise_error(Argv::ArgumentError, "Missing mandatory argument(s)")
|
79
75
|
end
|
80
|
-
|
81
76
|
end # context 'help'
|
82
77
|
|
83
78
|
it "should implement basic switches, with conversion, and arguments (all set)" do
|
@@ -111,8 +106,49 @@ module SimpleScripting
|
|
111
106
|
expect(actual_result).to eql(expected_result)
|
112
107
|
end
|
113
108
|
|
114
|
-
context "
|
109
|
+
context "booleans" do
|
110
|
+
VALID_BOOLS = {
|
111
|
+
'false' => false,
|
112
|
+
'true' => true,
|
113
|
+
}
|
115
114
|
|
115
|
+
INVALID_BOOLS = %w[falx FALSE TRUE]
|
116
|
+
|
117
|
+
VALID_BOOLS.each do |user_value, decoded_value|
|
118
|
+
it "should decode a #{decoded_value} value" do
|
119
|
+
decoder_params = [
|
120
|
+
["-b", "--mybool VAL", TrueClass],
|
121
|
+
output: output_buffer,
|
122
|
+
arguments: ['--mybool', 'false']
|
123
|
+
]
|
124
|
+
|
125
|
+
actual_result = described_class.decode(*decoder_params)
|
126
|
+
|
127
|
+
expected_result = {
|
128
|
+
mybool: false
|
129
|
+
}
|
130
|
+
|
131
|
+
expect(actual_result).to eql(expected_result)
|
132
|
+
end
|
133
|
+
end # context "booleans"
|
134
|
+
|
135
|
+
INVALID_BOOLS.each do |value|
|
136
|
+
it "should raise an error on invalid bool #{value.inspect}" do
|
137
|
+
decoder_params = [
|
138
|
+
["-b", "--mybool VAL", TrueClass],
|
139
|
+
output: output_buffer,
|
140
|
+
arguments: ['--mybool', value],
|
141
|
+
raise_errors: true,
|
142
|
+
]
|
143
|
+
|
144
|
+
expect {
|
145
|
+
described_class.decode(*decoder_params)
|
146
|
+
}.to raise_error(OptionParser::InvalidArgument)
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
context "multiple optional arguments" do
|
116
152
|
let(:decoder_params) {[
|
117
153
|
'[optional1]',
|
118
154
|
'[optional2]',
|
@@ -143,11 +179,9 @@ module SimpleScripting
|
|
143
179
|
|
144
180
|
expect(actual_result).to eql(expected_result)
|
145
181
|
end
|
146
|
-
|
147
182
|
end
|
148
183
|
|
149
184
|
context "error handling" do
|
150
|
-
|
151
185
|
# All the other UTs use error raising, for convenience.
|
152
186
|
it "should print the error, with a previx, by default, instead of raising an error" do
|
153
187
|
decoder_params.last[:arguments] = []
|
@@ -167,9 +201,9 @@ module SimpleScripting
|
|
167
201
|
raise_errors: true,
|
168
202
|
)
|
169
203
|
|
170
|
-
|
171
|
-
|
172
|
-
|
204
|
+
expect {
|
205
|
+
described_class.decode(*decoder_params)
|
206
|
+
}.to raise_error(Argv::ArgumentError, "Missing mandatory argument(s)")
|
173
207
|
end
|
174
208
|
|
175
209
|
it "should raise an error when there are too many arguments" do
|
@@ -178,21 +212,16 @@ module SimpleScripting
|
|
178
212
|
raise_errors: true,
|
179
213
|
)
|
180
214
|
|
181
|
-
|
182
|
-
|
183
|
-
|
215
|
+
expect {
|
216
|
+
described_class.decode(*decoder_params)
|
217
|
+
}.to raise_error(Argv::ArgumentError, "Too many arguments")
|
184
218
|
end
|
185
|
-
|
186
219
|
end # context "error handling"
|
187
|
-
|
188
220
|
end # describe 'Basic functionality'
|
189
221
|
|
190
222
|
describe 'Varargs' do
|
191
|
-
|
192
223
|
describe '(mandatory)' do
|
193
|
-
|
194
224
|
context 'as only parameter' do
|
195
|
-
|
196
225
|
let(:decoder_params) {[
|
197
226
|
'*varargs',
|
198
227
|
output: output_buffer,
|
@@ -208,11 +237,9 @@ module SimpleScripting
|
|
208
237
|
|
209
238
|
expect(actual_result).to eql(expected_result)
|
210
239
|
end
|
211
|
-
|
212
240
|
end
|
213
241
|
|
214
242
|
context 'followed by varargs' do
|
215
|
-
|
216
243
|
let(:decoder_params) {[
|
217
244
|
'mandatory',
|
218
245
|
'*varargs',
|
@@ -230,11 +257,9 @@ module SimpleScripting
|
|
230
257
|
|
231
258
|
expect(actual_result).to eql(expected_result)
|
232
259
|
end
|
233
|
-
|
234
260
|
end
|
235
261
|
|
236
262
|
context "error handling" do
|
237
|
-
|
238
263
|
let(:decoder_params) {[
|
239
264
|
'*varargs',
|
240
265
|
output: output_buffer,
|
@@ -244,17 +269,14 @@ module SimpleScripting
|
|
244
269
|
it "should raise an error when they are not specified" do
|
245
270
|
decoder_params.last[:raise_errors] = true
|
246
271
|
|
247
|
-
|
248
|
-
|
249
|
-
|
272
|
+
expect {
|
273
|
+
described_class.decode(*decoder_params)
|
274
|
+
}.to raise_error(Argv::ArgumentError, "Missing mandatory argument(s)")
|
250
275
|
end
|
251
|
-
|
252
276
|
end # context "error handling"
|
253
|
-
|
254
277
|
end # describe '(mandatory)'
|
255
278
|
|
256
279
|
describe '(optional)' do
|
257
|
-
|
258
280
|
let(:decoder_params) {[
|
259
281
|
'[*varargs]',
|
260
282
|
output: output_buffer,
|
@@ -283,15 +305,11 @@ module SimpleScripting
|
|
283
305
|
|
284
306
|
expect(actual_result).to eql(expected_result)
|
285
307
|
end
|
286
|
-
|
287
308
|
end # describe '(optional)'
|
288
|
-
|
289
309
|
end # describe 'Varargs'
|
290
310
|
|
291
311
|
describe 'Commands' do
|
292
|
-
|
293
312
|
describe 'regular case' do
|
294
|
-
|
295
313
|
let(:decoder_params) {{
|
296
314
|
'command1' => [
|
297
315
|
'arg1',
|
@@ -314,16 +332,15 @@ module SimpleScripting
|
|
314
332
|
end
|
315
333
|
|
316
334
|
context "error handling" do
|
317
|
-
|
318
335
|
it "should raise an error on invalid command" do
|
319
336
|
decoder_params.merge!(
|
320
337
|
arguments: ['pizza'],
|
321
338
|
raise_errors: true,
|
322
339
|
)
|
323
340
|
|
324
|
-
|
325
|
-
|
326
|
-
|
341
|
+
expect {
|
342
|
+
described_class.decode(decoder_params)
|
343
|
+
}.to raise_error(an_instance_of(Argv::InvalidCommand).and having_attributes(
|
327
344
|
message: "Invalid command: pizza",
|
328
345
|
valid_commands: ["command1", "command2"],
|
329
346
|
))
|
@@ -335,18 +352,16 @@ module SimpleScripting
|
|
335
352
|
raise_errors: true,
|
336
353
|
)
|
337
354
|
|
338
|
-
|
339
|
-
|
340
|
-
|
355
|
+
expect {
|
356
|
+
described_class.decode(decoder_params)
|
357
|
+
}.to raise_error(an_instance_of(Argv::InvalidCommand).and having_attributes(
|
341
358
|
message: "Missing command!",
|
342
359
|
valid_commands: ["command1", "command2"],
|
343
360
|
))
|
344
361
|
end
|
345
|
-
|
346
362
|
end # context "error handling"
|
347
363
|
|
348
364
|
context "help" do
|
349
|
-
|
350
365
|
it 'should implement the commands help' do
|
351
366
|
decoder_params[:arguments] = ['-h']
|
352
367
|
|
@@ -377,7 +392,6 @@ module SimpleScripting
|
|
377
392
|
end
|
378
393
|
|
379
394
|
context 'auto_help: false' do
|
380
|
-
|
381
395
|
it 'should not interpret the --help argument, and not print the help' do
|
382
396
|
decoder_params.merge!(
|
383
397
|
arguments: ['-h'],
|
@@ -407,15 +421,11 @@ module SimpleScripting
|
|
407
421
|
|
408
422
|
expect(actual_result).to eql(expected_result)
|
409
423
|
end
|
410
|
-
|
411
424
|
end # context 'auto_help: false'
|
412
|
-
|
413
425
|
end # context 'help'
|
414
|
-
|
415
426
|
end # describe 'regular case'
|
416
427
|
|
417
428
|
describe 'Nested commands' do
|
418
|
-
|
419
429
|
let(:decoder_params) {{
|
420
430
|
'command1' => {
|
421
431
|
'nested1a' => [
|
@@ -481,13 +491,11 @@ module SimpleScripting
|
|
481
491
|
expect(output_buffer.string).to eql(expected_output)
|
482
492
|
end
|
483
493
|
end # describe 'Nested commands'
|
484
|
-
|
485
494
|
end # describe 'Commands'
|
486
495
|
|
487
496
|
# Special case.
|
488
497
|
#
|
489
498
|
describe 'No definitions given' do
|
490
|
-
|
491
499
|
let(:decoder_params) {{
|
492
500
|
output: output_buffer,
|
493
501
|
}}
|
@@ -496,13 +504,10 @@ module SimpleScripting
|
|
496
504
|
decoder_params[:arguments] = ['pizza']
|
497
505
|
decoder_params[:raise_errors] = true
|
498
506
|
|
499
|
-
|
500
|
-
|
501
|
-
|
507
|
+
expect {
|
508
|
+
described_class.decode(decoder_params)
|
509
|
+
}.to raise_error(Argv::ArgumentError, "Too many arguments")
|
502
510
|
end
|
503
|
-
|
504
511
|
end # describe 'No definitions given'
|
505
|
-
|
506
512
|
end # describe Argv
|
507
|
-
|
508
513
|
end # module SimpleScripting
|
@@ -4,7 +4,6 @@ require 'tempfile'
|
|
4
4
|
require 'tmpdir'
|
5
5
|
|
6
6
|
module SimpleScripting::ConfigurationSpecHelper
|
7
|
-
|
8
7
|
def with_tempfile(config_content)
|
9
8
|
tempfile = Tempfile.new('ss_config_test')
|
10
9
|
tempfile.write(config_content)
|
@@ -14,11 +13,9 @@ module SimpleScripting::ConfigurationSpecHelper
|
|
14
13
|
ensure
|
15
14
|
tempfile.unlink
|
16
15
|
end
|
17
|
-
|
18
16
|
end
|
19
17
|
|
20
18
|
describe SimpleScripting::Configuration do
|
21
|
-
|
22
19
|
include SimpleScripting::ConfigurationSpecHelper
|
23
20
|
|
24
21
|
let(:configuration_text) {"
|
@@ -56,9 +53,9 @@ g2_key=bang
|
|
56
53
|
|
57
54
|
it "should raise an error when required keys are missing" do
|
58
55
|
with_tempfile(configuration_text) do |config_file|
|
59
|
-
|
60
|
-
|
61
|
-
|
56
|
+
expect {
|
57
|
+
described_class.load(config_file: config_file, required: %w(abspath_key missing_key group1))
|
58
|
+
}.to raise_error(RuntimeError, "Missing required configuration key(s): missing_key, group1")
|
62
59
|
end
|
63
60
|
end
|
64
61
|
|
@@ -73,5 +70,4 @@ g2_key=bang
|
|
73
70
|
File.delete(temp_config_file)
|
74
71
|
end
|
75
72
|
end
|
76
|
-
|
77
|
-
end
|
73
|
+
end # describe SimpleScripting::Configuration
|
@@ -3,7 +3,6 @@
|
|
3
3
|
require_relative '../../lib/simple_scripting/tab_completion.rb'
|
4
4
|
|
5
5
|
describe SimpleScripting::TabCompletion do
|
6
|
-
|
7
6
|
include TabCompletionCustomRSpecMatchers
|
8
7
|
|
9
8
|
let(:output_buffer) {
|
@@ -45,9 +44,7 @@ describe SimpleScripting::TabCompletion do
|
|
45
44
|
subject { described_class.new(switches_definition, output: output_buffer) }
|
46
45
|
|
47
46
|
context "with a correct configuration" do
|
48
|
-
|
49
47
|
context "standard cases" do
|
50
|
-
|
51
48
|
# Note that the conversion of mandatory to optional argument is defined by most of the cases.
|
52
49
|
#
|
53
50
|
STANDARD_CASES = {
|
@@ -79,11 +76,9 @@ describe SimpleScripting::TabCompletion do
|
|
79
76
|
expect(symbolic_commandline_options).to complete_with(expected_entries)
|
80
77
|
end
|
81
78
|
end
|
82
|
-
|
83
79
|
end # context "standard cases"
|
84
80
|
|
85
81
|
context "suffix management" do
|
86
|
-
|
87
82
|
SUFFIX_CASES = {
|
88
83
|
"arg1<tab>v" => %w(arg1v1 arg1v2), # the execution target of the test suite doesn't
|
89
84
|
"arg1<tab>x" => %w(), # ignore the suffix; programmer-defined
|
@@ -97,11 +92,9 @@ describe SimpleScripting::TabCompletion do
|
|
97
92
|
expect(symbolic_commandline_options).to complete_with(expected_entries)
|
98
93
|
end
|
99
94
|
end
|
100
|
-
|
101
95
|
end # context "suffix management"
|
102
96
|
|
103
97
|
context "escaped cases" do
|
104
|
-
|
105
98
|
ESCAPED_CASES = {
|
106
99
|
"\ <tab>" => [" _argv1spc"],
|
107
100
|
'\-<tab>' => %w(), # this is the result of typing `command "\-<tab>`
|
@@ -111,7 +104,6 @@ describe SimpleScripting::TabCompletion do
|
|
111
104
|
ESCAPED_CASES.each do |symbolic_commandline_options, _|
|
112
105
|
it "should output the entries for #{symbolic_commandline_options.inspect}"
|
113
106
|
end
|
114
|
-
|
115
107
|
end # context "escaped cases"
|
116
108
|
|
117
109
|
it "should support multiple values for an option"
|
@@ -119,11 +111,9 @@ describe SimpleScripting::TabCompletion do
|
|
119
111
|
it "should keep parsing also when --help is passed" do
|
120
112
|
expect("--help a<tab>").to complete_with(%w(arg1v1 arg1v2))
|
121
113
|
end
|
122
|
-
|
123
114
|
end # context "with a correct configuration"
|
124
115
|
|
125
116
|
context "with an incorrect configuration" do
|
126
|
-
|
127
117
|
INCORRECT_CASES = [
|
128
118
|
"a b <tab>", # too many args
|
129
119
|
"-O<tab>", # no values for this option
|
@@ -134,7 +124,5 @@ describe SimpleScripting::TabCompletion do
|
|
134
124
|
expect(symbolic_commandline_options).to not_complete
|
135
125
|
end
|
136
126
|
end
|
137
|
-
|
138
127
|
end # context "with an incorrect configuration"
|
139
|
-
|
140
128
|
end # describe SimpleScripting::TabCompletion
|
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.
|
4
|
+
version: 0.13.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Saverio Miroddi
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-07-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: parseconfig
|
@@ -99,7 +99,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
99
99
|
- !ruby/object:Gem::Version
|
100
100
|
version: '0'
|
101
101
|
requirements: []
|
102
|
-
rubygems_version: 3.
|
102
|
+
rubygems_version: 3.1.6
|
103
103
|
signing_key:
|
104
104
|
specification_version: 4
|
105
105
|
summary: Library for simplifying some typical scripting functionalities.
|