shapeshifter 0.0.1 → 0.0.2
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/README.md +87 -2
- data/lib/shapeshifter.rb +0 -1
- data/lib/shapeshifter/shifter.rb +2 -0
- data/lib/shapeshifter/version.rb +1 -1
- data/shapeshifter.gemspec +1 -1
- data/spec/shapeshifter/shifter_spec.rb +18 -6
- metadata +2 -3
- data/lib/shapeshifter/null_shifter.rb +0 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 14c8515972508e77d7733808003b3868fbcac5cc
|
4
|
+
data.tar.gz: 333baf056a7df6e54604f7687458e30da4e3af93
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: eedf79536b7d0a84901371b05d8a0ea17540e6e9ebfe2c650ef5f55f23f5d142111a9a26c10eca1779eec650cb059def453b6b39a6aaa834acd5929fe560fe2d
|
7
|
+
data.tar.gz: 1bc7a8d13c0b36e43f459f18b2b133ec1c24c8a9f69eeecb067e113796f47752686af7976bc4fb00643027c167184d73dccb00139750dc945c96cf17e2ac8cde
|
data/README.md
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
# Shapeshifter
|
2
2
|
|
3
|
-
|
3
|
+
Shapeshifter is a simple pattern for transforming data from
|
4
|
+
one format to another.
|
4
5
|
|
5
6
|
## Installation
|
6
7
|
|
@@ -20,7 +21,91 @@ Or install it yourself as:
|
|
20
21
|
|
21
22
|
## Usage
|
22
23
|
|
23
|
-
|
24
|
+
#A Simple Shifter
|
25
|
+
|
26
|
+
```ruby
|
27
|
+
class SimpleShifter < Shapeshifter::Shifter
|
28
|
+
def shift(target_object)
|
29
|
+
# Transform target_object using source_object
|
30
|
+
targeting_object # Return the transformed target
|
31
|
+
end
|
32
|
+
|
33
|
+
def revert(target_object)
|
34
|
+
# Transform target_object using source_object
|
35
|
+
targeting_object # Return the transformed target
|
36
|
+
end
|
37
|
+
end
|
38
|
+
```
|
39
|
+
|
40
|
+
A shifter consists of two methods: `shift` and `revert`. Both
|
41
|
+
follow the same pattern in that the shifter is instantiated with
|
42
|
+
a source object and each method receives a target object to manipulate
|
43
|
+
using the data of the source.
|
44
|
+
|
45
|
+
#Chaining
|
46
|
+
|
47
|
+
The shifter by itself is not particularly interesting, but where it
|
48
|
+
gets fun is that they can be chained together to break complex
|
49
|
+
data manipulations down into simple small chunks.
|
50
|
+
|
51
|
+
|
52
|
+
```ruby
|
53
|
+
shift_chain = SimpleShifter
|
54
|
+
.chain(SimpleShifter2)
|
55
|
+
.chain(SimpleShifter3)
|
56
|
+
```
|
57
|
+
|
58
|
+
This shift chain can then be easily reused for both shifting 'forward'
|
59
|
+
and reverting 'backwards'.
|
60
|
+
|
61
|
+
```ruby
|
62
|
+
shift_chain.shift(source_object, target_object)
|
63
|
+
shift_chain.revert(source_object, target_object)
|
64
|
+
```
|
65
|
+
|
66
|
+
When running a forward shift the shifters will be run in
|
67
|
+
sequence `SimpleShifter -> SimpleShifter2 -> SimpleShifter3` each
|
68
|
+
being instantiated with the source object (then available as
|
69
|
+
an `attr_reader` within the instance) and then being sent the
|
70
|
+
`shift` message with the target object as an argument. The target object
|
71
|
+
will therefore change as it passes through the chain allowing you
|
72
|
+
to have shifters that operate differently based on its contents.
|
73
|
+
|
74
|
+
Revert operates in the same fashion except it runs through the
|
75
|
+
chain in reverse, starting at `SimpleShifter3` and finishing at
|
76
|
+
`SimpleShifter` calling the revert method on each instance as
|
77
|
+
it traverses the chain.
|
78
|
+
|
79
|
+
#Nesting
|
80
|
+
|
81
|
+
One of the nice side effects is that you can nest shifters calls
|
82
|
+
within other shifters, e.g.
|
83
|
+
|
84
|
+
```ruby
|
85
|
+
class ComplexShifter < Shapeshifter::Shifter
|
86
|
+
def shift(target_object)
|
87
|
+
sub_object = source_object.sub_object
|
88
|
+
partial_target = internal_chain.shift(sub_object, {})
|
89
|
+
target_object.merge(partial_target: partial_target)
|
90
|
+
end
|
91
|
+
|
92
|
+
def revert(target_object)
|
93
|
+
#...
|
94
|
+
internal_chain.revert(sub_object, {})
|
95
|
+
#...
|
96
|
+
target_object
|
97
|
+
end
|
98
|
+
|
99
|
+
def internal_chain
|
100
|
+
SimpleShifter
|
101
|
+
.chain(SimpleShifter2)
|
102
|
+
.chain(SimpleShifter3)
|
103
|
+
end
|
104
|
+
end
|
105
|
+
```
|
106
|
+
|
107
|
+
This allows you to build quite complex data manipulations in small
|
108
|
+
easily testable chunks.
|
24
109
|
|
25
110
|
## Contributing
|
26
111
|
|
data/lib/shapeshifter.rb
CHANGED
data/lib/shapeshifter/shifter.rb
CHANGED
@@ -20,6 +20,7 @@ module Shapeshifter
|
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
23
|
+
# :nocov:
|
23
24
|
def shift(_)
|
24
25
|
raise NoMethodError.new('Should be overridden')
|
25
26
|
end
|
@@ -27,5 +28,6 @@ module Shapeshifter
|
|
27
28
|
def revert(_)
|
28
29
|
raise NoMethodError.new('Should be overridden')
|
29
30
|
end
|
31
|
+
# :nocov:
|
30
32
|
end
|
31
33
|
end
|
data/lib/shapeshifter/version.rb
CHANGED
data/shapeshifter.gemspec
CHANGED
@@ -10,7 +10,7 @@ Gem::Specification.new do |spec|
|
|
10
10
|
spec.email = ["max@driftrock.com"]
|
11
11
|
spec.summary = %q{Shapeshifter allows you to transform data types}
|
12
12
|
spec.description = %q{}
|
13
|
-
spec.homepage = ""
|
13
|
+
spec.homepage = "https://github.com/Driftrock/shapeshifter"
|
14
14
|
spec.license = "MIT"
|
15
15
|
|
16
16
|
spec.files = `git ls-files -z`.split("\x0")
|
@@ -28,6 +28,24 @@ module Shapeshifter
|
|
28
28
|
end
|
29
29
|
end
|
30
30
|
|
31
|
+
context 'when a reversion is made' do
|
32
|
+
before do
|
33
|
+
test_shifter = double(TestShifter)
|
34
|
+
allow(TestShifter).to receive(:new).and_return(test_shifter)
|
35
|
+
allow(test_shifter).to receive(:revert) do |target|
|
36
|
+
target[:a] = Array(target[:a]).concat(target[:b])
|
37
|
+
target
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
it 'should change the passed target' do
|
42
|
+
target = { a: 1, b: [2, 3] }
|
43
|
+
expect do
|
44
|
+
TestShifter.revert({}, target)
|
45
|
+
end.to change { target }.to eq ({ a: [1, 2, 3], b: [2, 3] })
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
31
49
|
context 'when a shift is made' do
|
32
50
|
before do
|
33
51
|
test_shifter = double(TestShifter)
|
@@ -45,11 +63,5 @@ module Shapeshifter
|
|
45
63
|
end.to change { target }.to eq ({ a: [1, 2, 3], b: [2, 3] })
|
46
64
|
end
|
47
65
|
end
|
48
|
-
#
|
49
|
-
#class TestShifter < Shifter
|
50
|
-
# def shift(old_object, new_object)
|
51
|
-
# new_oib
|
52
|
-
# end
|
53
|
-
#end
|
54
66
|
end
|
55
67
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: shapeshifter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Max
|
@@ -94,7 +94,6 @@ files:
|
|
94
94
|
- README.md
|
95
95
|
- Rakefile
|
96
96
|
- lib/shapeshifter.rb
|
97
|
-
- lib/shapeshifter/null_shifter.rb
|
98
97
|
- lib/shapeshifter/shift_chain.rb
|
99
98
|
- lib/shapeshifter/shifter.rb
|
100
99
|
- lib/shapeshifter/version.rb
|
@@ -103,7 +102,7 @@ files:
|
|
103
102
|
- spec/fixtures/test_shifter2.rb
|
104
103
|
- spec/shapeshifter/shifter_spec.rb
|
105
104
|
- spec/spec_helper.rb
|
106
|
-
homepage:
|
105
|
+
homepage: https://github.com/Driftrock/shapeshifter
|
107
106
|
licenses:
|
108
107
|
- MIT
|
109
108
|
metadata: {}
|