transmogrifier 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,25 @@
1
+ require "transmogrifier"
2
+
3
+ describe Transmogrifier::Selector do
4
+ describe "#keys" do
5
+ it "returns empty array for a blank string" do
6
+ described_class.from_string("").keys.should == []
7
+ end
8
+
9
+ it "splits string separated by dots" do
10
+ described_class.from_string("foo.bar").keys.should == ["foo", "bar"]
11
+ end
12
+
13
+ it "allows filtering by attribute" do
14
+ described_class.from_string("[attr1=val1,attr2=val2]").keys.should == [[["attr1", "val1"],["attr2", "val2"]]]
15
+ end
16
+
17
+ it "allows empty array" do
18
+ described_class.from_string("[]").keys.should == [[]]
19
+ end
20
+
21
+ it "combines hash and array filtering" do
22
+ described_class.from_string("foo.[attr=val]").keys.should == ["foo", [["attr", "val"]]]
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,225 @@
1
+ require "transmogrifier"
2
+
3
+ describe Transmogrifier::Engine do
4
+ subject(:engine) { described_class.from_rules_array(rules) }
5
+
6
+ describe "#run" do
7
+ context "when there are multiple rules" do
8
+ let(:rules) do
9
+ [
10
+ {
11
+ "type" => "append",
12
+ "selector" => "top",
13
+ "object" => {"some" => "attributes"}
14
+ },
15
+
16
+ {
17
+ "type" => "move",
18
+ "selector" => "top",
19
+ "from" => "key1",
20
+ "to" => "key2",
21
+ },
22
+
23
+ {
24
+ "type" => "delete",
25
+ "selector" => "top",
26
+ "name" => "key3"
27
+ }
28
+ ]
29
+ end
30
+
31
+ it "runs them all" do
32
+ input_hash = {
33
+ "top" => {
34
+ "key1" => "value1",
35
+ "key3" => "value2"
36
+ }
37
+ }
38
+
39
+ expect(engine.run(input_hash)).to eq({
40
+ "top" => {
41
+ "some" => "attributes",
42
+ "key2" => "value1",
43
+ }
44
+ })
45
+ end
46
+ end
47
+
48
+ context "when there is a single rule" do
49
+ describe "appending keys" do
50
+ let(:input_hash) do
51
+ { "key" => "value", "array" => [] }
52
+ end
53
+
54
+ context "when the selector finds a HashNode" do
55
+ let(:rules) { [ {"type" => "append", "selector" => "", "object" => {"new_key" => "new_value"}} ] }
56
+
57
+ it "appends to the hash" do
58
+ expect(engine.run(input_hash)).to eq({
59
+ "key" => "value",
60
+ "array" => [],
61
+ "new_key" => "new_value",
62
+ })
63
+ end
64
+ end
65
+
66
+ context "when the selector finds an ArrayNode" do
67
+ let(:rules) { [ {"type" => "append", "selector" => "array", "object" => {"new_key" => "new_value"}} ] }
68
+
69
+ it "appends to the array" do
70
+ expect(engine.run(input_hash)).to eq({
71
+ "key" => "value",
72
+ "array" => [{"new_key" => "new_value"}],
73
+ })
74
+ end
75
+ end
76
+ end
77
+
78
+ describe "deleting keys" do
79
+ let(:input_hash) do
80
+ {
81
+ "key" => "value",
82
+ "array" => [{"inside" => "value"}],
83
+ "nested" => {
84
+ "key" => "value"
85
+ },
86
+ }
87
+ end
88
+
89
+ context "when the selector finds a HashNode" do
90
+ let(:rules) { [ {"type" => "delete", "selector" => "", "name" => "nested"} ] }
91
+
92
+ it "deletes the hash from the parent" do
93
+ expect(engine.run(input_hash)).to eq({
94
+ "key" => "value",
95
+ "array" => [{"inside" => "value"}],
96
+ })
97
+ end
98
+ end
99
+
100
+ context "when the selector finds an ArrayNode" do
101
+ let(:rules) { [ {"type" => "delete", "selector" => "array", "name" => "[inside=value]"} ] }
102
+
103
+ it "deletes the array from the parent" do
104
+ expect(engine.run(input_hash)).to eq({
105
+ "key" => "value",
106
+ "array" => [],
107
+ "nested" => {
108
+ "key" => "value"
109
+ },
110
+ })
111
+ end
112
+ end
113
+ end
114
+
115
+ describe "moving keys" do
116
+ let(:input_hash) do
117
+ {
118
+ "key" => "value",
119
+ "array" => [{"inside" => "value"}],
120
+ "nested" => {
121
+ "key" => "value",
122
+ },
123
+ }
124
+ end
125
+
126
+ context "when the selector finds a HashNode" do
127
+ context "when the target key exists" do
128
+ let(:rules) { [ {"type" => "move", "selector" => "", "from" => "array.[inside=value]", "to" => "nested"}]}
129
+
130
+ it "moves the hash to the to selector" do
131
+ expect(engine.run(input_hash)).to eq({
132
+ "key" => "value",
133
+ "array" => [],
134
+ "nested" => {
135
+ "key" => "value",
136
+ "inside" => "value",
137
+ },
138
+ })
139
+ end
140
+ end
141
+
142
+ context "when the target key doesn't exist" do
143
+ let(:rules) { [ {"type" => "move", "selector" => "", "from" => "array.[inside=value]", "to" => "nested.nested_again"} ] }
144
+
145
+ it "moves the hash to a new child" do
146
+ expect(engine.run(input_hash)).to eq({
147
+ "key" => "value",
148
+ "array" => [],
149
+ "nested" => {
150
+ "key" => "value",
151
+ "nested_again" => {
152
+ "inside" => "value",
153
+ }
154
+ },
155
+ })
156
+ end
157
+ end
158
+
159
+ context "when the from selector has a wildcard" do
160
+ let(:input_hash) do
161
+ {
162
+ "list_of_things" => [
163
+ {
164
+ "name" => "object1",
165
+ "property" => "property1",
166
+ "nested" => {}
167
+ },
168
+ {
169
+ "name" => "object2",
170
+ "property" => "property2",
171
+ "nested" => {}
172
+ },
173
+ ]
174
+ }
175
+ end
176
+ let(:rules) { [ {"type" => "move", "selector" => "list_of_things.[]", "from" => "property", "to" => "nested.property"} ] }
177
+
178
+ it "moves the matched hash to the correct place" do
179
+ expect(engine.run(input_hash)).to eq({
180
+ "list_of_things" => [
181
+ {
182
+ "name" => "object1",
183
+ "nested" => { "property" => "property1" }
184
+ },
185
+ {
186
+ "name" => "object2",
187
+ "nested" => { "property" => "property2" }
188
+ },
189
+ ]
190
+ })
191
+ end
192
+ end
193
+ end
194
+
195
+ context "when the selector finds an ArrayNode" do
196
+ let(:rules) { [ {"type" => "move", "selector" => "", "from" => "array", "to" => "nested.array"} ] }
197
+
198
+ it "moves the array to the to selector" do
199
+ expect(engine.run(input_hash)).to eq({
200
+ "key" => "value",
201
+ "nested" => {
202
+ "key" => "value",
203
+ "array" => [{"inside" => "value"}],
204
+ },
205
+ })
206
+ end
207
+ end
208
+
209
+ context "using move as a rename" do
210
+ let(:rules) { [ {"type" => "move", "selector" => "", "from" => "array", "to" => "new_array"} ] }
211
+
212
+ it "renames the node" do
213
+ expect(engine.run(input_hash)).to eq({
214
+ "key" => "value",
215
+ "new_array" => [{"inside" => "value"}],
216
+ "nested" => {
217
+ "key" => "value",
218
+ },
219
+ })
220
+ end
221
+ end
222
+ end
223
+ end
224
+ end
225
+ end
@@ -0,0 +1,37 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = "transmogrifier"
5
+ s.version = "0.0.1"
6
+
7
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
+ s.authors = ["John Foley"]
9
+ s.date = "2013-11-06"
10
+ s.description = "A tool for manipulating schemas"
11
+ s.email = ["john@hisfoleyness.com"]
12
+ s.files = [".gitignore", "Gemfile", "LICENSE.txt", "README.md", "Rakefile", "lib/transmogrifier.rb", "lib/transmogrifier/engine.rb", "lib/transmogrifier/nodes.rb", "lib/transmogrifier/nodes/array_node.rb", "lib/transmogrifier/nodes/hash_node.rb", "lib/transmogrifier/nodes/node.rb", "lib/transmogrifier/nodes/value_node.rb", "lib/transmogrifier/rules.rb", "lib/transmogrifier/rules/append.rb", "lib/transmogrifier/rules/delete.rb", "lib/transmogrifier/rules/move.rb", "lib/transmogrifier/selector.rb", "lib/transmogrifier/version.rb", "spec/engine_spec.rb", "spec/nodes/array_node_spec.rb", "spec/nodes/hash_node_spec.rb", "spec/nodes/node_spec.rb", "spec/nodes/value_node_spec.rb", "spec/rules/append_spec.rb", "spec/rules/delete_spec.rb", "spec/rules/move_spec.rb", "spec/selector_spec.rb", "spec/transmogrifier_spec.rb", "transmogrifier.gemspec"]
13
+ s.homepage = "http://github.com/jfoley/transmogrifier"
14
+ s.licenses = ["MIT"]
15
+ s.require_paths = ["lib"]
16
+ s.rubygems_version = "2.0.7"
17
+ s.summary = "A tool for manipulating schemas"
18
+ s.test_files = ["spec/engine_spec.rb", "spec/nodes/array_node_spec.rb", "spec/nodes/hash_node_spec.rb", "spec/nodes/node_spec.rb", "spec/nodes/value_node_spec.rb", "spec/rules/append_spec.rb", "spec/rules/delete_spec.rb", "spec/rules/move_spec.rb", "spec/selector_spec.rb", "spec/transmogrifier_spec.rb"]
19
+
20
+ if s.respond_to? :specification_version then
21
+ s.specification_version = 4
22
+
23
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
24
+ s.add_development_dependency(%q<bundler>, ["~> 1.3"])
25
+ s.add_development_dependency(%q<rake>, [">= 0"])
26
+ s.add_development_dependency(%q<rspec>, [">= 0"])
27
+ else
28
+ s.add_dependency(%q<bundler>, ["~> 1.3"])
29
+ s.add_dependency(%q<rake>, [">= 0"])
30
+ s.add_dependency(%q<rspec>, [">= 0"])
31
+ end
32
+ else
33
+ s.add_dependency(%q<bundler>, ["~> 1.3"])
34
+ s.add_dependency(%q<rake>, [">= 0"])
35
+ s.add_dependency(%q<rspec>, [">= 0"])
36
+ end
37
+ end
metadata ADDED
@@ -0,0 +1,125 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: transmogrifier
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - John Foley
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-11-06 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: '1.3'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '1.3'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ! '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ! '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ! '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ description: A tool for manipulating schemas
56
+ email:
57
+ - john@hisfoleyness.com
58
+ executables: []
59
+ extensions: []
60
+ extra_rdoc_files: []
61
+ files:
62
+ - .gitignore
63
+ - Gemfile
64
+ - LICENSE.txt
65
+ - README.md
66
+ - Rakefile
67
+ - lib/transmogrifier.rb
68
+ - lib/transmogrifier/engine.rb
69
+ - lib/transmogrifier/nodes.rb
70
+ - lib/transmogrifier/nodes/array_node.rb
71
+ - lib/transmogrifier/nodes/hash_node.rb
72
+ - lib/transmogrifier/nodes/node.rb
73
+ - lib/transmogrifier/nodes/value_node.rb
74
+ - lib/transmogrifier/rules.rb
75
+ - lib/transmogrifier/rules/append.rb
76
+ - lib/transmogrifier/rules/delete.rb
77
+ - lib/transmogrifier/rules/move.rb
78
+ - lib/transmogrifier/selector.rb
79
+ - lib/transmogrifier/version.rb
80
+ - spec/engine_spec.rb
81
+ - spec/nodes/array_node_spec.rb
82
+ - spec/nodes/hash_node_spec.rb
83
+ - spec/nodes/node_spec.rb
84
+ - spec/nodes/value_node_spec.rb
85
+ - spec/rules/append_spec.rb
86
+ - spec/rules/delete_spec.rb
87
+ - spec/rules/move_spec.rb
88
+ - spec/selector_spec.rb
89
+ - spec/transmogrifier_spec.rb
90
+ - transmogrifier.gemspec
91
+ homepage: http://github.com/jfoley/transmogrifier
92
+ licenses:
93
+ - MIT
94
+ metadata: {}
95
+ post_install_message:
96
+ rdoc_options: []
97
+ require_paths:
98
+ - lib
99
+ required_ruby_version: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ! '>='
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ required_rubygems_version: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - ! '>='
107
+ - !ruby/object:Gem::Version
108
+ version: '0'
109
+ requirements: []
110
+ rubyforge_project:
111
+ rubygems_version: 2.0.7
112
+ signing_key:
113
+ specification_version: 4
114
+ summary: A tool for manipulating schemas
115
+ test_files:
116
+ - spec/engine_spec.rb
117
+ - spec/nodes/array_node_spec.rb
118
+ - spec/nodes/hash_node_spec.rb
119
+ - spec/nodes/node_spec.rb
120
+ - spec/nodes/value_node_spec.rb
121
+ - spec/rules/append_spec.rb
122
+ - spec/rules/delete_spec.rb
123
+ - spec/rules/move_spec.rb
124
+ - spec/selector_spec.rb
125
+ - spec/transmogrifier_spec.rb