two-way-mapper 0.2.0 → 0.3.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7b43b700b85546bce3d9c79425c5d82a20e4e63b24df74219296328c83c5f069
4
- data.tar.gz: 5582e71aa4fc752c5fcc60709e65a7a58a72c119b529de1973845f768c804075
3
+ metadata.gz: 27c5a5f04384aebefba51e9ec085042cdf6d1ca40ff7d82aafba522b3b8eb457
4
+ data.tar.gz: 52d3d15700603d35a82e12f53c64765c71053644238bbe02cb44e9666934b6f6
5
5
  SHA512:
6
- metadata.gz: 9f72fb8bfa5c89f4e810c955552d9fd4eed5d2a4d7bd67cc27f5bed42fe33d50c34447f2bf9f7ab16445385733cc3a5e5e0fa71a722ff621f2ab2e591c691945
7
- data.tar.gz: ae220a4dea0fe3e3c836897822ac77d839a12d368bdd80f2f82aa2851fdebf25b057877aa55d6ab1632011f3de5ad7c4f0610e8407c66419103ba2bd2ccee271
6
+ metadata.gz: 7d1319a99792280e03ea43e6b8ecb294cb6da12d443e4b7f4a1211d4ef44515589de48307244330044baa666c4691f4816b7466ac56401ced959321afb263685
7
+ data.tar.gz: 4e99bb150c889eb4eafcb966ba7f3756cee4d64e63f2ec0b0040f19f2d830e75d1f433234018ca11a7506bb7b35a5962a74cf491b5a0166b3783bf60793f25b1
data/README.md CHANGED
@@ -38,6 +38,20 @@ TwoWayMapper.register :customer do |mapping|
38
38
  end
39
39
  ```
40
40
 
41
+ For simple rules use
42
+
43
+ ```ruby
44
+ TwoWayMapper.register :customer do |mapping|
45
+ mapping.left :object # set left plugin to object
46
+ mapping.right :hash, stringify_keys: true # set right plugin to hash
47
+
48
+ mapping.rules(
49
+ 'first_name' => 'FirstName',
50
+ 'last_name' => 'LastName'
51
+ )
52
+ end
53
+ ```
54
+
41
55
  Mapping can be defined explicitly without registration
42
56
 
43
57
  ```ruby
@@ -47,7 +61,7 @@ mapping.right :hash, stringify_keys: true
47
61
  # ...
48
62
  ```
49
63
 
50
- Once mapping is defined we can convert one object to another and vice versa
64
+ Once the mapping is defined it can be used to convert one object to another and vice versa
51
65
 
52
66
  ```ruby
53
67
  Customer = Struct.new :first_name, :last_name, :gender
@@ -4,10 +4,10 @@ module TwoWayMapper
4
4
  class Mapping
5
5
  DIRECTIONS = [:left, :right].freeze
6
6
 
7
- attr_reader :rules, :left_class, :left_options, :right_class, :right_options
7
+ attr_reader :rules_list, :left_class, :left_options, :right_class, :right_options
8
8
 
9
9
  def initialize
10
- @rules = []
10
+ @rules_list = []
11
11
  end
12
12
 
13
13
  [DIRECTIONS, DIRECTIONS.reverse].each do |from, to|
@@ -18,7 +18,7 @@ module TwoWayMapper
18
18
  end
19
19
 
20
20
  def #{from}_selectors(mappable: false)
21
- rules.flat_map do |rule|
21
+ rules_list.flat_map do |rule|
22
22
  if mappable && rule.from_#{from}_to_#{to}_only?
23
23
  []
24
24
  else
@@ -28,15 +28,15 @@ module TwoWayMapper
28
28
  end
29
29
 
30
30
  def from_#{from}_to_#{to}(left_obj, right_obj)
31
- rules.each { |rule| rule.from_#{from}_to_#{to}(left_obj, right_obj) }
31
+ rules_list.each { |rule| rule.from_#{from}_to_#{to}(left_obj, right_obj) }
32
32
  #{to}_obj
33
33
  end
34
34
  CODE
35
35
  end
36
36
 
37
37
  def rule(left_selectors, right_selectors = {}, options = {})
38
- raise 'You need to set left before calling rule' unless left_class
39
- raise 'You need to set right before calling rule' unless right_class
38
+ raise 'left is not defined' unless left_class
39
+ raise 'right is not defined' unless right_class
40
40
 
41
41
  opt = options.dup
42
42
  left_opt = opt.delete(:left) || {}
@@ -52,14 +52,17 @@ module TwoWayMapper
52
52
  right_opt.merge!(opt.delete(right_selectors))
53
53
  end
54
54
 
55
- left_nodes = Array(left_selectors).map do |left_selector|
56
- left_class.new(left_selector, left_options.merge(left_opt))
57
- end
58
- right_nodes = Array(right_selectors).map do |right_selector|
59
- right_class.new(right_selector, right_options.merge(right_opt))
60
- end
55
+ @rules_list << Rule.new(
56
+ build_nodes(left_selectors, left_class, left_options.merge(left_opt)),
57
+ build_nodes(right_selectors, right_class, right_options.merge(right_opt)),
58
+ opt
59
+ )
60
+ end
61
61
 
62
- @rules << Rule.new(left_nodes, right_nodes, opt)
62
+ def rules(hash)
63
+ hash.each do |left_selector, right_selector|
64
+ rule(left_selector, right_selector)
65
+ end
63
66
  end
64
67
 
65
68
  private
@@ -69,5 +72,11 @@ module TwoWayMapper
69
72
  rescue NameError
70
73
  raise NameError, 'Cannot find node'
71
74
  end
75
+
76
+ def build_nodes(selectors, klass, opt)
77
+ Array(selectors).map do |selector|
78
+ klass.new(selector, opt)
79
+ end
80
+ end
72
81
  end
73
82
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module TwoWayMapper
4
- VERSION = '0.2.0'
4
+ VERSION = '0.3.0'
5
5
  end
@@ -83,9 +83,9 @@ describe TwoWayMapper::Mapping do
83
83
  end
84
84
 
85
85
  it 'should add item to rules hash' do
86
- expect { mapping.rule 'key1', 'Key1' }.to change { mapping.rules.count }.from(0).to(1)
86
+ expect { mapping.rule 'key1', 'Key1' }.to change { mapping.rules_list.count }.from(0).to(1)
87
87
 
88
- rule = mapping.rules.first
88
+ rule = mapping.rules_list.first
89
89
  expect(rule).to be_instance_of TwoWayMapper::Rule
90
90
  expect(rule.left_nodes.map(&:selector)).to eql ['key1']
91
91
  expect(rule.right_nodes.map(&:selector)).to eql ['Key1']
@@ -94,7 +94,7 @@ describe TwoWayMapper::Mapping do
94
94
  it 'should support multiple selectors' do
95
95
  mapping.rule ['key1', 'key2'], ['Key1', 'Key2']
96
96
 
97
- rule = mapping.rules.first
97
+ rule = mapping.rules_list.first
98
98
 
99
99
  expect(rule.left_nodes.size).to eql 2
100
100
  expect(rule.left_nodes[0].selector).to eql 'key1'
@@ -108,7 +108,7 @@ describe TwoWayMapper::Mapping do
108
108
  expect { mapping.rule 'key1' => { opt1: 'val' } }.to raise_error StandardError
109
109
 
110
110
  mapping.rule 'key1' => { opt1: 'val' }, 'Key2' => {}
111
- rule = mapping.rules.first
111
+ rule = mapping.rules_list.first
112
112
 
113
113
  expect(rule.left_nodes.map(&:selector)).to eql ['key1']
114
114
  expect(rule.right_nodes.map(&:selector)).to eql ['Key2']
@@ -116,7 +116,7 @@ describe TwoWayMapper::Mapping do
116
116
 
117
117
  it 'should allow to pass left abd right options ' do
118
118
  mapping.rule 'key1', 'Key2', left: { opt1: 'val' }, right: { opt2: 'val' }
119
- rule = mapping.rules.first
119
+ rule = mapping.rules_list.first
120
120
 
121
121
  expect(rule.left_nodes.first.options).to include opt1: 'val'
122
122
  expect(rule.right_nodes.first.options).to include opt2: 'val'
@@ -139,7 +139,7 @@ describe TwoWayMapper::Mapping do
139
139
  before :each do
140
140
  mapping.left :object
141
141
  mapping.right :hash
142
- allow(mapping).to receive(:rules).and_return [rule1, rule2]
142
+ allow(mapping).to receive(:rules_list).and_return [rule1, rule2]
143
143
  end
144
144
 
145
145
  [described_class::DIRECTIONS, described_class::DIRECTIONS.reverse].each do |from, to|
@@ -155,4 +155,30 @@ describe TwoWayMapper::Mapping do
155
155
  end
156
156
  end
157
157
  end
158
+
159
+ describe '#rules' do
160
+ let(:hash) do
161
+ {
162
+ key1: :Key1,
163
+ key2: :Key2
164
+ }
165
+ end
166
+
167
+ before :each do
168
+ mapping.left :object
169
+ mapping.right :hash
170
+ end
171
+
172
+ it 'should allow to define multiple rules' do
173
+ expect { mapping.rules(hash) }.to change { mapping.rules_list.count }.from(0).to(2)
174
+
175
+ hash.each_with_index do |(left, right), index|
176
+ rule = mapping.rules_list[index]
177
+
178
+ expect(rule).to be_instance_of TwoWayMapper::Rule
179
+ expect(rule.left_nodes.map(&:selector)).to eql [left]
180
+ expect(rule.right_nodes.map(&:selector)).to eql [right]
181
+ end
182
+ end
183
+ end
158
184
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: two-way-mapper
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tim Masliuchenko
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-01-03 00:00:00.000000000 Z
11
+ date: 2020-07-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -123,7 +123,7 @@ homepage: https://github.com/timsly/two-way-mapper
123
123
  licenses:
124
124
  - MIT
125
125
  metadata: {}
126
- post_install_message:
126
+ post_install_message:
127
127
  rdoc_options: []
128
128
  require_paths:
129
129
  - lib
@@ -139,7 +139,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
139
139
  version: '0'
140
140
  requirements: []
141
141
  rubygems_version: 3.0.3
142
- signing_key:
142
+ signing_key:
143
143
  specification_version: 4
144
144
  summary: Two way data mapping
145
145
  test_files: