htransform 0.8.0 → 0.9.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.
- data/.travis.yml +5 -0
- data/README.md +13 -1
- data/lib/htransform.rb +17 -1
- data/lib/htransform/version.rb +1 -1
- data/spec/htransform_spec.rb +93 -0
- metadata +3 -2
data/.travis.yml
ADDED
data/README.md
CHANGED
@@ -1,9 +1,11 @@
|
|
1
1
|
HTransform
|
2
2
|
======
|
3
3
|
|
4
|
+
[](https://travis-ci.org/joshkrueger/htransform)
|
5
|
+
|
4
6
|
HTransform provides a simple DSL to transform a supplied hash with an arbitrary structure to another hash with an even more arbitrary structure.
|
5
7
|
|
6
|
-
***Note:*** *HTransform does not simply modify the hash you have passed in. It actually creates a new hash from scratch. It only copies or does transformations on the fields you specify in the transform block
|
8
|
+
***Note:*** *HTransform does not simply modify the hash you have passed in. It actually creates a new hash from scratch. It only copies or does transformations on the fields you specify in the transform block, unless you use the `passthrough_remaining` option (see below)*
|
7
9
|
|
8
10
|
Support
|
9
11
|
=======
|
@@ -130,6 +132,16 @@ Want to combine multiple inputs when one or more are an array?
|
|
130
132
|
|
131
133
|
input [ [ "foo", "bar" ], "baz" ] => "combined nested hash"
|
132
134
|
|
135
|
+
Want to simply pass some parts of your original hash through? Simply specify the keys you want passed through:
|
136
|
+
|
137
|
+
passthrough :this_one, :that_one
|
138
|
+
|
139
|
+
Want to pass every part of your original hash that was not transformed through? **HTransform CAN DO THAT TOO!** Simply add the following at the _end_ of your `transform` block:
|
140
|
+
|
141
|
+
passthrough_remaining
|
142
|
+
|
143
|
+
***Note:*** *You MUST specify it only at the end of your `transform` block, as Tranny needs to know all the keys that were transformed before it!*
|
144
|
+
|
133
145
|
Shorthand Limitations
|
134
146
|
==============
|
135
147
|
|
data/lib/htransform.rb
CHANGED
@@ -24,6 +24,7 @@ class HTransform
|
|
24
24
|
@output_hash = Hash.new { |h,k| h[k] = Hash.new(&h.default_proc) }
|
25
25
|
@input_nest = []
|
26
26
|
@output_nest = []
|
27
|
+
@inputs = Set.new
|
27
28
|
end
|
28
29
|
|
29
30
|
def convert(input)
|
@@ -43,6 +44,14 @@ class HTransform
|
|
43
44
|
|
44
45
|
private
|
45
46
|
|
47
|
+
def record(*keys)
|
48
|
+
keys.each{ |key| @inputs << key }
|
49
|
+
end
|
50
|
+
|
51
|
+
def recorded?(key)
|
52
|
+
@inputs.include? key
|
53
|
+
end
|
54
|
+
|
46
55
|
def set_val(dst, val)
|
47
56
|
|
48
57
|
dst = (@output_nest + [dst]).flatten unless @output_nest.empty?
|
@@ -118,6 +127,12 @@ class HTransform
|
|
118
127
|
end
|
119
128
|
end
|
120
129
|
|
130
|
+
def passthrough_remaining
|
131
|
+
@input_hash.each_key do |key|
|
132
|
+
passthrough(key) unless recorded?(key)
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
121
136
|
def input_multiple(options)
|
122
137
|
from, to, via, default = parse_options(options)
|
123
138
|
via = lambda { |x| x.join(" ") } if via.nil?
|
@@ -139,7 +154,7 @@ class HTransform
|
|
139
154
|
end
|
140
155
|
end
|
141
156
|
|
142
|
-
|
157
|
+
record(*from)
|
143
158
|
set_val(to, new_value)
|
144
159
|
end
|
145
160
|
|
@@ -166,6 +181,7 @@ class HTransform
|
|
166
181
|
get_val(from)
|
167
182
|
end
|
168
183
|
|
184
|
+
record(*from)
|
169
185
|
set_val(to, new_value)
|
170
186
|
end
|
171
187
|
|
data/lib/htransform/version.rb
CHANGED
data/spec/htransform_spec.rb
CHANGED
@@ -367,6 +367,99 @@ describe HTransform do
|
|
367
367
|
|
368
368
|
end
|
369
369
|
|
370
|
+
context "passthrough_remaining" do
|
371
|
+
it "passes all keys that were not specified in an #input through" do
|
372
|
+
class TestHTransform < HTransform
|
373
|
+
transform do
|
374
|
+
input :bar => :bar_key
|
375
|
+
passthrough :foo
|
376
|
+
passthrough_remaining
|
377
|
+
end
|
378
|
+
end
|
379
|
+
|
380
|
+
input_hash = { :bar => 'one', :foo => 1, :lala => nil, :lolo => 1 }
|
381
|
+
desired_hash = { :bar_key => 'one', :foo => 1, :lala => nil, :lolo => 1 }
|
382
|
+
|
383
|
+
result = TestHTransform.convert(input_hash)
|
384
|
+
result.should == desired_hash
|
385
|
+
end
|
386
|
+
|
387
|
+
it "treats #input_multiple keys as distinct, and does not pass them through" do
|
388
|
+
class TestHTransform < HTransform
|
389
|
+
transform do
|
390
|
+
input_multiple [:bar, :key] => :bar_key
|
391
|
+
passthrough_remaining
|
392
|
+
end
|
393
|
+
end
|
394
|
+
|
395
|
+
input_hash = { :bar => 'one', :key => 'two', :lala => nil, :lolo => 1 }
|
396
|
+
desired_hash = { :bar_key => 'one two', :lala => nil, :lolo => 1 }
|
397
|
+
|
398
|
+
result = TestHTransform.convert(input_hash)
|
399
|
+
result.should == desired_hash
|
400
|
+
end
|
401
|
+
|
402
|
+
it "treats nested inputs as distinct, and does not pass them through" do
|
403
|
+
class TestHTransform < HTransform
|
404
|
+
transform do
|
405
|
+
input [:outer, :bar] => :sandbar
|
406
|
+
passthrough_remaining
|
407
|
+
end
|
408
|
+
end
|
409
|
+
|
410
|
+
input_hash = { :outer => { :bar => 1 }, :bar => :bie, :outer2 => { :bar2 => 2 } }
|
411
|
+
desired_hash = { :sandbar => 1, :outer2 => { :bar2 => 2 } }
|
412
|
+
|
413
|
+
result = TestHTransform.convert(input_hash)
|
414
|
+
result.should == desired_hash
|
415
|
+
end
|
416
|
+
|
417
|
+
it "passes through nested outputs if they were not used as inputs" do
|
418
|
+
class TestHTransform < HTransform
|
419
|
+
transform do
|
420
|
+
input :sandbar => [:outer, :bar]
|
421
|
+
passthrough_remaining
|
422
|
+
end
|
423
|
+
end
|
424
|
+
|
425
|
+
input_hash = { :sandbar => { :inner => 1 }, :bar => :bie, :outer2 => { :bar2 => 2 } }
|
426
|
+
desired_hash = { :outer => { :bar => { :inner => 1 } }, :bar => :bie, :outer2 => { :bar2 => 2 } }
|
427
|
+
|
428
|
+
result = TestHTransform.convert(input_hash)
|
429
|
+
result.should == desired_hash
|
430
|
+
end
|
431
|
+
|
432
|
+
it "Only not passthrough the inputs in a nested-nested situation" do
|
433
|
+
class TestHTransform < HTransform
|
434
|
+
transform do
|
435
|
+
input [:sand, :bar] => [:outer, :otter]
|
436
|
+
passthrough_remaining
|
437
|
+
end
|
438
|
+
end
|
439
|
+
|
440
|
+
input_hash = { :sand => { :bar => 1 }, :bar => :bie, :otter => 2 }
|
441
|
+
desired_hash = { :outer => { :otter => 1 }, :otter => 2 }
|
442
|
+
|
443
|
+
result = TestHTransform.convert(input_hash)
|
444
|
+
result.should == desired_hash
|
445
|
+
end
|
446
|
+
|
447
|
+
it "Treats array-keys as a single entity, and passes their individual components through" do
|
448
|
+
class TestHTransform < HTransform
|
449
|
+
transform do
|
450
|
+
input [[:sand, :bar], :baz] => :combo_bar
|
451
|
+
passthrough_remaining
|
452
|
+
end
|
453
|
+
end
|
454
|
+
|
455
|
+
input_hash = { [:sand, :bar] => { :baz => 1 }, :bar => :bie, :baz => :ket, :otter => 2 }
|
456
|
+
desired_hash = { :combo_bar => 1, :bar => :bie, :otter => 2 }
|
457
|
+
|
458
|
+
result = TestHTransform.convert(input_hash)
|
459
|
+
result.should == desired_hash
|
460
|
+
end
|
461
|
+
end
|
462
|
+
|
370
463
|
context "non-hashes" do
|
371
464
|
it "works with objects that respond to to_hash" do
|
372
465
|
class TestHTransform < HTransform
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: htransform
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.9.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-08-
|
12
|
+
date: 2014-08-21 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|
@@ -52,6 +52,7 @@ extensions: []
|
|
52
52
|
extra_rdoc_files: []
|
53
53
|
files:
|
54
54
|
- .gitignore
|
55
|
+
- .travis.yml
|
55
56
|
- Gemfile
|
56
57
|
- README.md
|
57
58
|
- Rakefile
|