command_mapper 0.1.2 → 0.2.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/.document +3 -0
- data/.github/workflows/ruby.yml +2 -1
- data/ChangeLog.md +15 -0
- data/Gemfile +2 -0
- data/LICENSE.txt +1 -1
- data/README.md +26 -5
- data/lib/command_mapper/arg.rb +1 -0
- data/lib/command_mapper/command.rb +148 -29
- data/lib/command_mapper/option.rb +42 -13
- data/lib/command_mapper/types/hex.rb +10 -2
- data/lib/command_mapper/types/map.rb +2 -0
- data/lib/command_mapper/types/num.rb +22 -1
- data/lib/command_mapper/version.rb +1 -1
- data/spec/commnad_spec.rb +314 -74
- data/spec/option_spec.rb +252 -1
- data/spec/types/hex_spec.rb +59 -1
- data/spec/types/num_spec.rb +93 -3
- metadata +3 -2
data/spec/option_spec.rb
CHANGED
@@ -41,6 +41,14 @@ describe CommandMapper::Option do
|
|
41
41
|
end
|
42
42
|
end
|
43
43
|
|
44
|
+
context "when value_in_flag: true is given" do
|
45
|
+
subject { described_class.new(flag, value_in_flag: true) }
|
46
|
+
|
47
|
+
it "#value_in_flag? must return true" do
|
48
|
+
expect(subject.value_in_flag?).to be(true)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
44
52
|
context "when given the repeats: true keyword argument" do
|
45
53
|
subject { described_class.new(flag, repeats: true) }
|
46
54
|
|
@@ -177,6 +185,97 @@ describe CommandMapper::Option do
|
|
177
185
|
end
|
178
186
|
end
|
179
187
|
|
188
|
+
describe "#accepts_value?" do
|
189
|
+
context "when initialized with the value: keyword argument" do
|
190
|
+
context "and when value: is true" do
|
191
|
+
subject { described_class.new(flag, value: true) }
|
192
|
+
|
193
|
+
it "must return true" do
|
194
|
+
expect(subject.accepts_value?).to be(true)
|
195
|
+
end
|
196
|
+
end
|
197
|
+
|
198
|
+
context "and when value: is a Hash" do
|
199
|
+
let(:value_required) { true }
|
200
|
+
let(:value_type) { Types::KeyValue.new }
|
201
|
+
let(:value_kwargs) do
|
202
|
+
{
|
203
|
+
required: value_required,
|
204
|
+
type: value_type
|
205
|
+
}
|
206
|
+
end
|
207
|
+
|
208
|
+
subject { described_class.new(flag, value: value_kwargs) }
|
209
|
+
|
210
|
+
it "must return true" do
|
211
|
+
expect(subject.accepts_value?).to be(true)
|
212
|
+
end
|
213
|
+
end
|
214
|
+
end
|
215
|
+
|
216
|
+
context "when not initialied with the value: keyword argument" do
|
217
|
+
subject { described_class.new(flag) }
|
218
|
+
|
219
|
+
it "must return false" do
|
220
|
+
expect(subject.accepts_value?).to be(false)
|
221
|
+
end
|
222
|
+
end
|
223
|
+
end
|
224
|
+
|
225
|
+
describe "#equals?" do
|
226
|
+
context "when initialized with equals: true" do
|
227
|
+
subject { described_class.new(flag, value: true, equals: true) }
|
228
|
+
|
229
|
+
it "must return true" do
|
230
|
+
expect(subject.equals?).to be(true)
|
231
|
+
end
|
232
|
+
end
|
233
|
+
|
234
|
+
context "when not initialized with equals: true" do
|
235
|
+
subject { described_class.new(flag, value: true) }
|
236
|
+
|
237
|
+
it "must return nil" do
|
238
|
+
expect(subject.equals?).to be(nil)
|
239
|
+
end
|
240
|
+
end
|
241
|
+
end
|
242
|
+
|
243
|
+
describe "#repeats?" do
|
244
|
+
context "when initialized with repeats: true" do
|
245
|
+
subject { described_class.new(flag, value: true, repeats: true) }
|
246
|
+
|
247
|
+
it "must return true" do
|
248
|
+
expect(subject.repeats?).to be(true)
|
249
|
+
end
|
250
|
+
end
|
251
|
+
|
252
|
+
context "when not initialized with repeats: true" do
|
253
|
+
subject { described_class.new(flag, value: true) }
|
254
|
+
|
255
|
+
it "must return false" do
|
256
|
+
expect(subject.repeats?).to be(false)
|
257
|
+
end
|
258
|
+
end
|
259
|
+
end
|
260
|
+
|
261
|
+
describe "#value_in_flag?" do
|
262
|
+
context "when initialized with value_in_flag: true" do
|
263
|
+
subject { described_class.new(flag, value: true, value_in_flag: true) }
|
264
|
+
|
265
|
+
it "must return true" do
|
266
|
+
expect(subject.value_in_flag?).to be(true)
|
267
|
+
end
|
268
|
+
end
|
269
|
+
|
270
|
+
context "when not initialized with value_in_flag: true" do
|
271
|
+
subject { described_class.new(flag, value: true) }
|
272
|
+
|
273
|
+
it "must return nil" do
|
274
|
+
expect(subject.value_in_flag?).to be(nil)
|
275
|
+
end
|
276
|
+
end
|
277
|
+
end
|
278
|
+
|
180
279
|
let(:flag) { "--opt" }
|
181
280
|
let(:name) { "opt" }
|
182
281
|
|
@@ -199,11 +298,17 @@ describe CommandMapper::Option do
|
|
199
298
|
}
|
200
299
|
end
|
201
300
|
|
301
|
+
let(:equals) { nil }
|
302
|
+
let(:value_in_flag) { nil }
|
303
|
+
|
202
304
|
subject do
|
203
305
|
if accepts_value
|
204
306
|
described_class.new(flag, name: name,
|
205
307
|
value: value_kwargs,
|
206
|
-
repeats: repeats
|
308
|
+
repeats: repeats,
|
309
|
+
# formatting options
|
310
|
+
equals: equals,
|
311
|
+
value_in_flag: value_in_flag)
|
207
312
|
else
|
208
313
|
described_class.new(flag, name: name, repeats: repeats)
|
209
314
|
end
|
@@ -516,6 +621,34 @@ describe CommandMapper::Option do
|
|
516
621
|
)
|
517
622
|
end
|
518
623
|
|
624
|
+
context "and #equals? is true" do
|
625
|
+
let(:equals) { true }
|
626
|
+
|
627
|
+
it "must return an argv of option flag=value Strings" do
|
628
|
+
expect(subject.argv(values)).to eq(
|
629
|
+
[
|
630
|
+
"#{flag}=#{values[0]}",
|
631
|
+
"#{flag}=#{values[1]}",
|
632
|
+
"#{flag}=#{values[2]}"
|
633
|
+
]
|
634
|
+
)
|
635
|
+
end
|
636
|
+
end
|
637
|
+
|
638
|
+
context "and #value_in_flag? is true" do
|
639
|
+
let(:value_in_flag) { true }
|
640
|
+
|
641
|
+
it "must return an argv of option flag + value Strings" do
|
642
|
+
expect(subject.argv(values)).to eq(
|
643
|
+
[
|
644
|
+
"#{flag}#{values[0]}",
|
645
|
+
"#{flag}#{values[1]}",
|
646
|
+
"#{flag}#{values[2]}"
|
647
|
+
]
|
648
|
+
)
|
649
|
+
end
|
650
|
+
end
|
651
|
+
|
519
652
|
context "but one of the Array's elements is invalid" do
|
520
653
|
let(:value) { ["foo", " ", "baz"] }
|
521
654
|
|
@@ -578,6 +711,32 @@ describe CommandMapper::Option do
|
|
578
711
|
)
|
579
712
|
end
|
580
713
|
|
714
|
+
context "and #equals? is true" do
|
715
|
+
let(:equals) { true }
|
716
|
+
|
717
|
+
it "must return an argv of option flag=value Strings" do
|
718
|
+
expect(subject.argv(values)).to eq(
|
719
|
+
[
|
720
|
+
"#{flag}=#{subject.value.format(values[0])}",
|
721
|
+
"#{flag}=#{subject.value.format(values[1])}"
|
722
|
+
]
|
723
|
+
)
|
724
|
+
end
|
725
|
+
end
|
726
|
+
|
727
|
+
context "and #value_in_flag? is true" do
|
728
|
+
let(:value_in_flag) { true }
|
729
|
+
|
730
|
+
it "must return an argv of option flag + value Strings" do
|
731
|
+
expect(subject.argv(values)).to eq(
|
732
|
+
[
|
733
|
+
"#{flag}#{subject.value.format(values[0])}",
|
734
|
+
"#{flag}#{subject.value.format(values[1])}"
|
735
|
+
]
|
736
|
+
)
|
737
|
+
end
|
738
|
+
end
|
739
|
+
|
581
740
|
context "but one of the Hashes is empty" do
|
582
741
|
let(:values) do
|
583
742
|
[{"foo" => 1}, {}]
|
@@ -621,6 +780,22 @@ describe CommandMapper::Option do
|
|
621
780
|
expect(subject.argv(value)).to eq([flag, value])
|
622
781
|
end
|
623
782
|
|
783
|
+
context "and #equals? is true" do
|
784
|
+
let(:equals) { true }
|
785
|
+
|
786
|
+
it "must return an argv containing an option flag=value String" do
|
787
|
+
expect(subject.argv(value)).to eq(["#{flag}=#{value}"])
|
788
|
+
end
|
789
|
+
end
|
790
|
+
|
791
|
+
context "and #value_in_flag? is true" do
|
792
|
+
let(:value_in_flag) { true }
|
793
|
+
|
794
|
+
it "must return an argv containing an option flag + value String" do
|
795
|
+
expect(subject.argv(value)).to eq(["#{flag}#{value}"])
|
796
|
+
end
|
797
|
+
end
|
798
|
+
|
624
799
|
context "but it's invalid" do
|
625
800
|
let(:value) { " " }
|
626
801
|
|
@@ -656,6 +831,26 @@ describe CommandMapper::Option do
|
|
656
831
|
)
|
657
832
|
end
|
658
833
|
|
834
|
+
context "and #equals? is true" do
|
835
|
+
let(:equals) { true }
|
836
|
+
|
837
|
+
it "must return an argv containing an option flag=value String" do
|
838
|
+
expect(subject.argv(value)).to eq(
|
839
|
+
["#{flag}=#{subject.value.format(value)}"]
|
840
|
+
)
|
841
|
+
end
|
842
|
+
end
|
843
|
+
|
844
|
+
context "and #value_in_flag? is true" do
|
845
|
+
let(:value_in_flag) { true }
|
846
|
+
|
847
|
+
it "must return an argv of option flag + value Strings" do
|
848
|
+
expect(subject.argv(value)).to eq(
|
849
|
+
["#{flag}#{subject.value.format(value)}"]
|
850
|
+
)
|
851
|
+
end
|
852
|
+
end
|
853
|
+
|
659
854
|
context "but it's empty" do
|
660
855
|
let(:value) { {} }
|
661
856
|
|
@@ -704,6 +899,22 @@ describe CommandMapper::Option do
|
|
704
899
|
expect(subject.argv(value)).to eq([flag, value])
|
705
900
|
end
|
706
901
|
|
902
|
+
context "and #equals? is true" do
|
903
|
+
let(:equals) { true }
|
904
|
+
|
905
|
+
it "must return an argv containing an option flag=value String" do
|
906
|
+
expect(subject.argv(value)).to eq(["#{flag}=#{value}"])
|
907
|
+
end
|
908
|
+
end
|
909
|
+
|
910
|
+
context "and #value_in_flag? is true" do
|
911
|
+
let(:value_in_flag) { true }
|
912
|
+
|
913
|
+
it "must return an argv containing an option flag + value String" do
|
914
|
+
expect(subject.argv(value)).to eq(["#{flag}#{value}"])
|
915
|
+
end
|
916
|
+
end
|
917
|
+
|
707
918
|
context "but it's invalid" do
|
708
919
|
let(:value) { " " }
|
709
920
|
|
@@ -743,6 +954,26 @@ describe CommandMapper::Option do
|
|
743
954
|
)
|
744
955
|
end
|
745
956
|
|
957
|
+
context "and #equals? is true" do
|
958
|
+
let(:equals) { true }
|
959
|
+
|
960
|
+
it "must return an argv containing an option flag=value String" do
|
961
|
+
expect(subject.argv(value)).to eq(
|
962
|
+
["#{flag}=#{subject.value.format(value)}"]
|
963
|
+
)
|
964
|
+
end
|
965
|
+
end
|
966
|
+
|
967
|
+
context "and #value_in_flag? is true" do
|
968
|
+
let(:value_in_flag) { true }
|
969
|
+
|
970
|
+
it "must return an argv containing an option flag + value String" do
|
971
|
+
expect(subject.argv(value)).to eq(
|
972
|
+
["#{flag}#{subject.value.format(value)}"]
|
973
|
+
)
|
974
|
+
end
|
975
|
+
end
|
976
|
+
|
746
977
|
context "but one of the Array's elements is nil" do
|
747
978
|
let(:value) { ["foo", nil, "baz"] }
|
748
979
|
|
@@ -795,6 +1026,26 @@ describe CommandMapper::Option do
|
|
795
1026
|
)
|
796
1027
|
end
|
797
1028
|
|
1029
|
+
context "and #equals? is true" do
|
1030
|
+
let(:equals) { true }
|
1031
|
+
|
1032
|
+
it "must return an argv containing an option flag=value String" do
|
1033
|
+
expect(subject.argv(value)).to eq(
|
1034
|
+
["#{flag}=#{subject.value.format(value)}"]
|
1035
|
+
)
|
1036
|
+
end
|
1037
|
+
end
|
1038
|
+
|
1039
|
+
context "and #value_in_flag? is true" do
|
1040
|
+
let(:value_in_flag) { true }
|
1041
|
+
|
1042
|
+
it "must return an argv of option flag + value Strings" do
|
1043
|
+
expect(subject.argv(value)).to eq(
|
1044
|
+
["#{flag}#{subject.value.format(value)}"]
|
1045
|
+
)
|
1046
|
+
end
|
1047
|
+
end
|
1048
|
+
|
798
1049
|
context "but it's empty" do
|
799
1050
|
let(:value) { {} }
|
800
1051
|
|
data/spec/types/hex_spec.rb
CHANGED
@@ -14,6 +14,16 @@ describe CommandMapper::Types::Hex do
|
|
14
14
|
expect(subject.leading_zero?).to be(true)
|
15
15
|
end
|
16
16
|
end
|
17
|
+
|
18
|
+
context "when initialized with range: ..." do
|
19
|
+
let(:range) { 1..10 }
|
20
|
+
|
21
|
+
subject { described_class.new(range: range) }
|
22
|
+
|
23
|
+
it "must set #range" do
|
24
|
+
expect(subject.range).to eq(range)
|
25
|
+
end
|
26
|
+
end
|
17
27
|
end
|
18
28
|
|
19
29
|
describe "#leading_zero?" do
|
@@ -69,12 +79,60 @@ describe CommandMapper::Types::Hex do
|
|
69
79
|
expect(subject.validate(value)).to be(true)
|
70
80
|
end
|
71
81
|
|
82
|
+
context "when initialized with range: ..." do
|
83
|
+
let(:range) { 2..16 }
|
84
|
+
|
85
|
+
subject { described_class.new(range: range) }
|
86
|
+
|
87
|
+
context "and the value is within the range of values" do
|
88
|
+
let(:value) { 'a' }
|
89
|
+
|
90
|
+
it "must return true" do
|
91
|
+
expect(subject.validate(value)).to be(true)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
context "but the value is not within the range of values" do
|
96
|
+
let(:value) { '0' }
|
97
|
+
|
98
|
+
it "must return [false, \"unacceptable value (...)\"]" do
|
99
|
+
expect(subject.validate(value)).to eq(
|
100
|
+
[false, "unacceptable value (#{value.inspect})"]
|
101
|
+
)
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
72
106
|
context "and the String begins with a '0x'" do
|
73
107
|
let(:value) { "0xabcdef" }
|
74
108
|
|
75
109
|
it "must return true" do
|
76
110
|
expect(subject.validate(value)).to be(true)
|
77
111
|
end
|
112
|
+
|
113
|
+
context "when initialized with range: ..." do
|
114
|
+
let(:range) { 2..16 }
|
115
|
+
|
116
|
+
subject { described_class.new(range: range) }
|
117
|
+
|
118
|
+
context "and the value is within the range of values" do
|
119
|
+
let(:value) { '0x4' }
|
120
|
+
|
121
|
+
it "must return true" do
|
122
|
+
expect(subject.validate(value)).to be(true)
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
context "but the value is not within the range of values" do
|
127
|
+
let(:value) { '0x0' }
|
128
|
+
|
129
|
+
it "must return [false, \"unacceptable value (...)\"]" do
|
130
|
+
expect(subject.validate(value)).to eq(
|
131
|
+
[false, "unacceptable value (#{value.inspect})"]
|
132
|
+
)
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
78
136
|
end
|
79
137
|
|
80
138
|
context "and the String contains a newline" do
|
@@ -88,7 +146,7 @@ describe CommandMapper::Types::Hex do
|
|
88
146
|
end
|
89
147
|
end
|
90
148
|
|
91
|
-
context "but the String
|
149
|
+
context "but the String contains other characters" do
|
92
150
|
let(:value) { "foo" }
|
93
151
|
|
94
152
|
it "must return [false, \"not in hex format (...)\"]" do
|
data/spec/types/num_spec.rb
CHANGED
@@ -2,6 +2,24 @@ require 'spec_helper'
|
|
2
2
|
require 'command_mapper/types/num'
|
3
3
|
|
4
4
|
describe CommandMapper::Types::Num do
|
5
|
+
describe "#initialize" do
|
6
|
+
context "when initialized with no keyword arguments" do
|
7
|
+
it "must set #range to nil" do
|
8
|
+
expect(subject.range).to be(nil)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
context "when initialized with range: ..." do
|
13
|
+
let(:range) { 1..10 }
|
14
|
+
|
15
|
+
subject { described_class.new(range: range) }
|
16
|
+
|
17
|
+
it "must set #range" do
|
18
|
+
expect(subject.range).to eq(range)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
5
23
|
describe "#validate" do
|
6
24
|
context "when given an Integer" do
|
7
25
|
let(:value) { 1 }
|
@@ -9,6 +27,30 @@ describe CommandMapper::Types::Num do
|
|
9
27
|
it "must return true" do
|
10
28
|
expect(subject.validate(value)).to be(true)
|
11
29
|
end
|
30
|
+
|
31
|
+
context "when initialized with range: ..." do
|
32
|
+
let(:range) { 2..10 }
|
33
|
+
|
34
|
+
subject { described_class.new(range: range) }
|
35
|
+
|
36
|
+
context "and the value is within the range of values" do
|
37
|
+
let(:value) { 4 }
|
38
|
+
|
39
|
+
it "must return true" do
|
40
|
+
expect(subject.validate(value)).to be(true)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
context "but the value is not within the range of values" do
|
45
|
+
let(:value) { 0 }
|
46
|
+
|
47
|
+
it "must return [false, \"unacceptable value (...)\"]" do
|
48
|
+
expect(subject.validate(value)).to eq(
|
49
|
+
[false, "unacceptable value (#{value.inspect})"]
|
50
|
+
)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
12
54
|
end
|
13
55
|
|
14
56
|
context "when given a String" do
|
@@ -19,7 +61,31 @@ describe CommandMapper::Types::Num do
|
|
19
61
|
expect(subject.validate(value)).to be(true)
|
20
62
|
end
|
21
63
|
|
22
|
-
context "
|
64
|
+
context "when initialized with range: ..." do
|
65
|
+
let(:range) { 2..10 }
|
66
|
+
|
67
|
+
subject { described_class.new(range: range) }
|
68
|
+
|
69
|
+
context "and the value is within the range of values" do
|
70
|
+
let(:value) { '4' }
|
71
|
+
|
72
|
+
it "must return true" do
|
73
|
+
expect(subject.validate(value)).to be(true)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
context "but the value is not within the range of values" do
|
78
|
+
let(:value) { '0' }
|
79
|
+
|
80
|
+
it "must return [false, \"unacceptable value (...)\"]" do
|
81
|
+
expect(subject.validate(value)).to eq(
|
82
|
+
[false, "unacceptable value (#{value.inspect})"]
|
83
|
+
)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
context "but the String contains a newline" do
|
23
89
|
let(:value) { "01234\n56789" }
|
24
90
|
|
25
91
|
it "must return [false, \"contains non-numeric characters (...)\"]" do
|
@@ -30,7 +96,7 @@ describe CommandMapper::Types::Num do
|
|
30
96
|
end
|
31
97
|
end
|
32
98
|
|
33
|
-
context "
|
99
|
+
context "but it contains non-digits" do
|
34
100
|
let(:value) { "12abc34" }
|
35
101
|
|
36
102
|
it "must return [false, \"contains non-numeric characters (...)\"]" do
|
@@ -42,7 +108,7 @@ describe CommandMapper::Types::Num do
|
|
42
108
|
end
|
43
109
|
|
44
110
|
context "when given another type of Object" do
|
45
|
-
context "
|
111
|
+
context "and it defines a #to_i method" do
|
46
112
|
let(:value) { 1.0 }
|
47
113
|
|
48
114
|
it "must return true" do
|
@@ -50,6 +116,30 @@ describe CommandMapper::Types::Num do
|
|
50
116
|
end
|
51
117
|
end
|
52
118
|
|
119
|
+
context "when initialized with range: ..." do
|
120
|
+
let(:range) { 2..10 }
|
121
|
+
|
122
|
+
subject { described_class.new(range: range) }
|
123
|
+
|
124
|
+
context "and the value is within the range of values" do
|
125
|
+
let(:value) { 4.0 }
|
126
|
+
|
127
|
+
it "must return true" do
|
128
|
+
expect(subject.validate(value)).to be(true)
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
context "but the value is not within the range of values" do
|
133
|
+
let(:value) { 0.0 }
|
134
|
+
|
135
|
+
it "must return [false, \"unacceptable value (...)\"]" do
|
136
|
+
expect(subject.validate(value)).to eq(
|
137
|
+
[false, "unacceptable value (#{value.inspect})"]
|
138
|
+
)
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
53
143
|
context "but it does not define a #to_i method" do
|
54
144
|
let(:value) { Object.new }
|
55
145
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: command_mapper
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Postmodern
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-04-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -34,6 +34,7 @@ extra_rdoc_files:
|
|
34
34
|
- LICENSE.txt
|
35
35
|
- README.md
|
36
36
|
files:
|
37
|
+
- ".document"
|
37
38
|
- ".github/workflows/ruby.yml"
|
38
39
|
- ".gitignore"
|
39
40
|
- ".rspec"
|