command_mapper 0.1.0.pre1
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 +7 -0
- data/.github/workflows/ruby.yml +27 -0
- data/.gitignore +10 -0
- data/.rspec +1 -0
- data/.yardopts +1 -0
- data/ChangeLog.md +25 -0
- data/Gemfile +15 -0
- data/LICENSE.txt +20 -0
- data/README.md +369 -0
- data/Rakefile +12 -0
- data/commnad_mapper.gemspec +61 -0
- data/gemspec.yml +23 -0
- data/lib/command_mapper/arg.rb +75 -0
- data/lib/command_mapper/argument.rb +142 -0
- data/lib/command_mapper/command.rb +606 -0
- data/lib/command_mapper/exceptions.rb +19 -0
- data/lib/command_mapper/option.rb +282 -0
- data/lib/command_mapper/option_value.rb +21 -0
- data/lib/command_mapper/sudo.rb +73 -0
- data/lib/command_mapper/types/enum.rb +35 -0
- data/lib/command_mapper/types/hex.rb +82 -0
- data/lib/command_mapper/types/input_dir.rb +35 -0
- data/lib/command_mapper/types/input_file.rb +35 -0
- data/lib/command_mapper/types/input_path.rb +29 -0
- data/lib/command_mapper/types/key_value.rb +131 -0
- data/lib/command_mapper/types/key_value_list.rb +45 -0
- data/lib/command_mapper/types/list.rb +90 -0
- data/lib/command_mapper/types/map.rb +64 -0
- data/lib/command_mapper/types/num.rb +50 -0
- data/lib/command_mapper/types/str.rb +85 -0
- data/lib/command_mapper/types/type.rb +102 -0
- data/lib/command_mapper/types.rb +6 -0
- data/lib/command_mapper/version.rb +4 -0
- data/lib/command_mapper.rb +2 -0
- data/spec/arg_spec.rb +137 -0
- data/spec/argument_spec.rb +513 -0
- data/spec/commnad_spec.rb +1175 -0
- data/spec/exceptions_spec.rb +14 -0
- data/spec/option_spec.rb +882 -0
- data/spec/option_value_spec.rb +17 -0
- data/spec/spec_helper.rb +6 -0
- data/spec/sudo_spec.rb +24 -0
- data/spec/types/enum_spec.rb +31 -0
- data/spec/types/hex_spec.rb +158 -0
- data/spec/types/input_dir_spec.rb +30 -0
- data/spec/types/input_file_spec.rb +34 -0
- data/spec/types/input_path_spec.rb +32 -0
- data/spec/types/key_value_list_spec.rb +100 -0
- data/spec/types/key_value_spec.rb +272 -0
- data/spec/types/list_spec.rb +143 -0
- data/spec/types/map_spec.rb +62 -0
- data/spec/types/num_spec.rb +90 -0
- data/spec/types/str_spec.rb +232 -0
- data/spec/types/type_spec.rb +59 -0
- metadata +118 -0
@@ -0,0 +1,232 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'command_mapper/types/str'
|
3
|
+
|
4
|
+
describe CommandMapper::Types::Str do
|
5
|
+
describe "#initialize" do
|
6
|
+
it "must default allow_empty: to false" do
|
7
|
+
expect(subject.allow_empty?).to be(false)
|
8
|
+
end
|
9
|
+
|
10
|
+
it "must default allow_blank: to false" do
|
11
|
+
expect(subject.allow_blank?).to be(false)
|
12
|
+
end
|
13
|
+
|
14
|
+
context "when given allow_empty: true" do
|
15
|
+
subject { described_class.new(allow_empty: true) }
|
16
|
+
|
17
|
+
it "must set allow_empty: to true" do
|
18
|
+
expect(subject.allow_empty?).to be(true)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
context "when given allow_empty: false" do
|
23
|
+
subject { described_class.new(allow_empty: false) }
|
24
|
+
|
25
|
+
it "must set allow_empty: to false" do
|
26
|
+
expect(subject.allow_empty?).to be(false)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
context "when given allow_blank: true" do
|
31
|
+
subject { described_class.new(allow_blank: true) }
|
32
|
+
|
33
|
+
it "must set allow_blank: to true" do
|
34
|
+
expect(subject.allow_blank?).to be(true)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
context "when given allow_blank: false" do
|
39
|
+
subject { described_class.new(allow_blank: false) }
|
40
|
+
|
41
|
+
it "must set allow_blank: to false" do
|
42
|
+
expect(subject.allow_blank?).to be(false)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
describe "#allow_empty?" do
|
48
|
+
it "must be false by default" do
|
49
|
+
expect(subject.allow_empty?).to be(false)
|
50
|
+
end
|
51
|
+
|
52
|
+
context "when initialized with allow_empty: true" do
|
53
|
+
subject { described_class.new(allow_empty: true) }
|
54
|
+
|
55
|
+
it "must be true" do
|
56
|
+
expect(subject.allow_empty?).to be(true)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
context "when initialized with allow_empty: true" do
|
61
|
+
subject { described_class.new(allow_empty: false) }
|
62
|
+
|
63
|
+
it "must be false" do
|
64
|
+
expect(subject.allow_empty?).to be(false)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
describe "#allow_blank?" do
|
70
|
+
it "must be false by default" do
|
71
|
+
expect(subject.allow_blank?).to be(false)
|
72
|
+
end
|
73
|
+
|
74
|
+
context "when initialized with allow_blank: true" do
|
75
|
+
subject { described_class.new(allow_blank: true) }
|
76
|
+
|
77
|
+
it "must be true" do
|
78
|
+
expect(subject.allow_blank?).to be(true)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
context "when initialized with allow_blank: true" do
|
83
|
+
subject { described_class.new(allow_blank: false) }
|
84
|
+
|
85
|
+
it "must be false" do
|
86
|
+
expect(subject.allow_blank?).to be(false)
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
describe "#validate" do
|
92
|
+
context "when given nil" do
|
93
|
+
let(:value) { nil }
|
94
|
+
|
95
|
+
it "must return [false, \"cannot be nil\"]" do
|
96
|
+
expect(subject.validate(value)).to eq(
|
97
|
+
[false, "cannot be nil"]
|
98
|
+
)
|
99
|
+
end
|
100
|
+
|
101
|
+
context "but #allow_empty? is true" do
|
102
|
+
subject { described_class.new(allow_empty: true) }
|
103
|
+
|
104
|
+
it "must return true" do
|
105
|
+
expect(subject.validate(value)).to be(true)
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
context "when a String is given" do
|
111
|
+
let(:value) { "foo" }
|
112
|
+
|
113
|
+
it "must return true" do
|
114
|
+
expect(subject.validate(value)).to be(true)
|
115
|
+
end
|
116
|
+
|
117
|
+
context "and it's empty" do
|
118
|
+
let(:value) { "" }
|
119
|
+
|
120
|
+
it "must return [false, \"does not allow an empty value\"]" do
|
121
|
+
expect(subject.validate(value)).to eq([false, "does not allow an empty value"])
|
122
|
+
end
|
123
|
+
|
124
|
+
context "but #allow_empty? is true" do
|
125
|
+
subject { described_class.new(allow_empty: true) }
|
126
|
+
|
127
|
+
it "must return true" do
|
128
|
+
expect(subject.validate(value)).to be(true)
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
context "and it's blank" do
|
134
|
+
let(:value) { " \t\n\r\v " }
|
135
|
+
|
136
|
+
it "must return [false, \"does not allow a blank value (...)\"]" do
|
137
|
+
expect(subject.validate(value)).to eq([false, "does not allow a blank value (#{value.inspect})"])
|
138
|
+
end
|
139
|
+
|
140
|
+
context "but #allow_blank? is true" do
|
141
|
+
subject { described_class.new(allow_blank: true) }
|
142
|
+
|
143
|
+
it "must return true" do
|
144
|
+
expect(subject.validate(value)).to be(true)
|
145
|
+
end
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
context "when a Symbol is given" do
|
151
|
+
let(:value) { :foo }
|
152
|
+
|
153
|
+
it "must return true" do
|
154
|
+
expect(subject.validate(value)).to be(true)
|
155
|
+
end
|
156
|
+
|
157
|
+
context "and it's empty" do
|
158
|
+
let(:value) { :"" }
|
159
|
+
|
160
|
+
it "must return [false, \"does not allow an empty value\"]" do
|
161
|
+
expect(subject.validate(value)).to eq([false, "does not allow an empty value"])
|
162
|
+
end
|
163
|
+
|
164
|
+
context "but #allow_empty? is true" do
|
165
|
+
subject { described_class.new(allow_empty: true) }
|
166
|
+
|
167
|
+
it "must return true" do
|
168
|
+
expect(subject.validate(value)).to be(true)
|
169
|
+
end
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
context "and it's blank" do
|
174
|
+
let(:value) { :" \t\n\r\v " }
|
175
|
+
|
176
|
+
it "must return [false, \"does not allow a blank value (...)\"]" do
|
177
|
+
expect(subject.validate(value)).to eq([false, "does not allow a blank value (#{value.inspect})"])
|
178
|
+
end
|
179
|
+
|
180
|
+
context "but #allow_blank? is true" do
|
181
|
+
subject { described_class.new(allow_blank: true) }
|
182
|
+
|
183
|
+
it "must return true" do
|
184
|
+
expect(subject.validate(value)).to be(true)
|
185
|
+
end
|
186
|
+
end
|
187
|
+
end
|
188
|
+
end
|
189
|
+
|
190
|
+
context "when an Enumerable object is given" do
|
191
|
+
let(:value) { %w[foo bar] }
|
192
|
+
|
193
|
+
it "must return [false, \"cannot convert an Enumerable object into a String (...)\"]" do
|
194
|
+
expect(subject.validate(value)).to eq(
|
195
|
+
[false, "cannot convert a #{value.class} into a String (#{value.inspect})"]
|
196
|
+
)
|
197
|
+
end
|
198
|
+
end
|
199
|
+
|
200
|
+
context "when another kind of Object is given" do
|
201
|
+
module TestStr
|
202
|
+
class CustomObject
|
203
|
+
def to_s
|
204
|
+
"foo"
|
205
|
+
end
|
206
|
+
end
|
207
|
+
end
|
208
|
+
|
209
|
+
let(:value) { TestStr::CustomObject.new }
|
210
|
+
|
211
|
+
it "must return true" do
|
212
|
+
expect(subject.validate(value)).to be(true)
|
213
|
+
end
|
214
|
+
|
215
|
+
context "but the object does not define a #to_s method" do
|
216
|
+
module TestStr
|
217
|
+
class ObjectWithoutToS
|
218
|
+
undef to_s
|
219
|
+
end
|
220
|
+
end
|
221
|
+
|
222
|
+
let(:value) { TestStr::ObjectWithoutToS.new }
|
223
|
+
|
224
|
+
it "must return [false, \"dpes not define a #to_s method (...)\"]" do
|
225
|
+
expect(subject.validate(value)).to eq(
|
226
|
+
[false, "does not define a #to_s method (#{value.inspect})"]
|
227
|
+
)
|
228
|
+
end
|
229
|
+
end
|
230
|
+
end
|
231
|
+
end
|
232
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'command_mapper/types/type'
|
3
|
+
|
4
|
+
describe CommandMapper::Types::Type do
|
5
|
+
describe "#validate" do
|
6
|
+
it "must return true by default" do
|
7
|
+
expect(subject.validate(Object.new)).to be(true)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
describe "#format" do
|
12
|
+
it "must convert the given value into a String" do
|
13
|
+
expect(subject.format(1)).to eq("1")
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
describe "CommandMapper::Types::Type()" do
|
19
|
+
context "when given a CommandMapper::Types::Type" do
|
20
|
+
let(:value) { CommandMapper::Types::Type.new }
|
21
|
+
|
22
|
+
subject { CommandMapper::Types::Type(value) }
|
23
|
+
|
24
|
+
it "must return the CommandMapper::Types::Type object" do
|
25
|
+
expect(subject).to be(value)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
context "when given a Hash" do
|
30
|
+
let(:value) { {allow_empty: true} }
|
31
|
+
|
32
|
+
subject { CommandMapper::Types::Type(value) }
|
33
|
+
|
34
|
+
it "must initialize a new CommandMapper::Types::Str" do
|
35
|
+
expect(subject).to be_kind_of(CommandMapper::Types::Str)
|
36
|
+
expect(subject.allow_empty?).to be(true)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
context "when given nil" do
|
41
|
+
let(:value) { nil }
|
42
|
+
|
43
|
+
subject { CommandMapper::Types::Type(value) }
|
44
|
+
|
45
|
+
it "must return nil" do
|
46
|
+
expect(subject).to be(nil)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
context "when given another kind of Object" do
|
51
|
+
let(:value) { Object.new }
|
52
|
+
|
53
|
+
it do
|
54
|
+
expect {
|
55
|
+
CommandMapper::Types::Type(value)
|
56
|
+
}.to raise_error(ArgumentError,"value must be a CommandMapper::Types::Type, Hash, or nil: #{value.inspect}")
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
metadata
ADDED
@@ -0,0 +1,118 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: command_mapper
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0.pre1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Postmodern
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2021-11-22 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '2.0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '2.0'
|
27
|
+
description: Command Mapper maps a command's arguments to Class attributes to allow
|
28
|
+
safely and securely executing commands.
|
29
|
+
email: postmodern.mod3@gmail.com
|
30
|
+
executables: []
|
31
|
+
extensions: []
|
32
|
+
extra_rdoc_files:
|
33
|
+
- ChangeLog.md
|
34
|
+
- LICENSE.txt
|
35
|
+
- README.md
|
36
|
+
files:
|
37
|
+
- ".github/workflows/ruby.yml"
|
38
|
+
- ".gitignore"
|
39
|
+
- ".rspec"
|
40
|
+
- ".yardopts"
|
41
|
+
- ChangeLog.md
|
42
|
+
- Gemfile
|
43
|
+
- LICENSE.txt
|
44
|
+
- README.md
|
45
|
+
- Rakefile
|
46
|
+
- commnad_mapper.gemspec
|
47
|
+
- gemspec.yml
|
48
|
+
- lib/command_mapper.rb
|
49
|
+
- lib/command_mapper/arg.rb
|
50
|
+
- lib/command_mapper/argument.rb
|
51
|
+
- lib/command_mapper/command.rb
|
52
|
+
- lib/command_mapper/exceptions.rb
|
53
|
+
- lib/command_mapper/option.rb
|
54
|
+
- lib/command_mapper/option_value.rb
|
55
|
+
- lib/command_mapper/sudo.rb
|
56
|
+
- lib/command_mapper/types.rb
|
57
|
+
- lib/command_mapper/types/enum.rb
|
58
|
+
- lib/command_mapper/types/hex.rb
|
59
|
+
- lib/command_mapper/types/input_dir.rb
|
60
|
+
- lib/command_mapper/types/input_file.rb
|
61
|
+
- lib/command_mapper/types/input_path.rb
|
62
|
+
- lib/command_mapper/types/key_value.rb
|
63
|
+
- lib/command_mapper/types/key_value_list.rb
|
64
|
+
- lib/command_mapper/types/list.rb
|
65
|
+
- lib/command_mapper/types/map.rb
|
66
|
+
- lib/command_mapper/types/num.rb
|
67
|
+
- lib/command_mapper/types/str.rb
|
68
|
+
- lib/command_mapper/types/type.rb
|
69
|
+
- lib/command_mapper/version.rb
|
70
|
+
- spec/arg_spec.rb
|
71
|
+
- spec/argument_spec.rb
|
72
|
+
- spec/commnad_spec.rb
|
73
|
+
- spec/exceptions_spec.rb
|
74
|
+
- spec/option_spec.rb
|
75
|
+
- spec/option_value_spec.rb
|
76
|
+
- spec/spec_helper.rb
|
77
|
+
- spec/sudo_spec.rb
|
78
|
+
- spec/types/enum_spec.rb
|
79
|
+
- spec/types/hex_spec.rb
|
80
|
+
- spec/types/input_dir_spec.rb
|
81
|
+
- spec/types/input_file_spec.rb
|
82
|
+
- spec/types/input_path_spec.rb
|
83
|
+
- spec/types/key_value_list_spec.rb
|
84
|
+
- spec/types/key_value_spec.rb
|
85
|
+
- spec/types/list_spec.rb
|
86
|
+
- spec/types/map_spec.rb
|
87
|
+
- spec/types/num_spec.rb
|
88
|
+
- spec/types/str_spec.rb
|
89
|
+
- spec/types/type_spec.rb
|
90
|
+
homepage: https://github.com/postmodern/command_mapper.rb#readme
|
91
|
+
licenses:
|
92
|
+
- MIT
|
93
|
+
metadata:
|
94
|
+
documentation_uri: https://rubydoc.info/gems/command_mapper
|
95
|
+
source_code_uri: https://github.com/postmodern/command_mapper.rb
|
96
|
+
bug_tracker_uri: https://github.com/postmodern/command_mapper.rb/issues
|
97
|
+
changelog_uri: https://github.com/postmodern/command_mapper.rb/blob/master/ChangeLog.md
|
98
|
+
rubygems_mfa_required: 'true'
|
99
|
+
post_install_message:
|
100
|
+
rdoc_options: []
|
101
|
+
require_paths:
|
102
|
+
- lib
|
103
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
104
|
+
requirements:
|
105
|
+
- - ">="
|
106
|
+
- !ruby/object:Gem::Version
|
107
|
+
version: 2.0.0
|
108
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
109
|
+
requirements:
|
110
|
+
- - ">="
|
111
|
+
- !ruby/object:Gem::Version
|
112
|
+
version: '0'
|
113
|
+
requirements: []
|
114
|
+
rubygems_version: 3.2.22
|
115
|
+
signing_key:
|
116
|
+
specification_version: 4
|
117
|
+
summary: Safe and secure execution of commands.
|
118
|
+
test_files: []
|