transmogrifier 0.0.1

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.
@@ -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