two-way-mapper 0.0.1 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: bcbb9ddd6ab08af20ca40eec44b53bf3ac2109e9
4
- data.tar.gz: 914738db9bb087708fc3603c1297738137d6226e
2
+ SHA256:
3
+ metadata.gz: 57a42be67b0c722d8983ca53b2728722a7f6547609d7d8523963402e937f377e
4
+ data.tar.gz: c91f6f0b528679ef27f9a6d544ed3261c2c5a8815613e5c74757792fc9f75022
5
5
  SHA512:
6
- metadata.gz: 9aad37686d32b6c02c163addb8d1a99bcdbbb39c5e5e770de7978825c354051872e114f4468c415b61d1574e83f7ef633bdb008c92d4bdd269bafa841cca000c
7
- data.tar.gz: 24b29a8195033c489f9314620e5191c5be144c4d6b4bf15fb4280039ac686117569fabefa293d31081095beca0b7508324224006d1239328b7aa9ec8b77adc3e
6
+ metadata.gz: 6fa805f14750104f9e344d9d79de4a0a75c8ed8f14d447edad29d6ecedd26b05fa3fbbfdd71870c2832779edc76dfa1a2316a03f273717d5bc3e99f9c363e46a
7
+ data.tar.gz: e38c8c4a6028b516669afe6adfb4bd9cf02da30df15aa2d13c0d0df1f1f1b9788f8e48a498785b925e5850bb5db9efc9f2583d5f163a4f0bc4c94e648a6aa3ad
data/.travis.yml CHANGED
@@ -5,10 +5,10 @@ notifications:
5
5
  email: false
6
6
 
7
7
  rvm:
8
- - 1.9.3
9
- - 2.0.0
10
- - 2.1.1
11
- - 2.1.2
8
+ - 2.3
9
+ - 2.4
10
+ - 2.5
11
+ - 2.6
12
12
  - ruby-head
13
13
  - jruby
14
14
 
data/README.md CHANGED
@@ -38,6 +38,15 @@ TwoWayMapper.register :customer do |mapping|
38
38
  end
39
39
  ```
40
40
 
41
+ Mapping can be defined explicitly without registration
42
+
43
+ ```ruby
44
+ mapping = TwoWayMapper::Mapping.new
45
+ mapping.left :object
46
+ mapping.right :hash, stringify_keys: true
47
+ # ...
48
+ ```
49
+
41
50
  Once mapping is defined we can convert one object to another and vice versa
42
51
 
43
52
  ```ruby
@@ -46,7 +55,7 @@ Customer = Struct.new :first_name, :last_name, :gender
46
55
  customer = Customer.new
47
56
  api_response = { 'FirstName' => 'Evee', 'LastName' => 'Fjord', 'sex' => 'female' }
48
57
 
49
- TwoWayMapper[:customer].from_right_to_left customer, api_response
58
+ TwoWayMapper[:customer].from_right_to_left(customer, api_response)
50
59
  puts customer.first_name # => 'Evee'
51
60
  puts customer.last_name # => 'Fjord'
52
61
  puts customer.gender # => 'F'
@@ -58,17 +67,17 @@ another_customer.first_name = 'Step'
58
67
  another_customer.last_name = 'Bander'
59
68
  another_customer.gender = 'M'
60
69
 
61
- TwoWayMapper[:customer].from_left_to_right another_customer, request_data
70
+ TwoWayMapper[:customer].from_left_to_right(another_customer, request_data)
62
71
  puts request_data # => { 'FirstName' => 'Step', 'LastName' => 'Bander', sex: 'male' }
63
72
  ```
64
73
 
65
- On rails, you can put all mappings into `app/mappings` folder
74
+ In rails, mappings can be defined in `app/mappings` folder
66
75
 
67
76
  ### Available plugins
68
77
 
69
78
  * hash
70
79
  * object
71
- * active_record (same as object, but for keys like `user.email`, it will try to build `user` before updating `email` on write)
80
+ * active_record (same as `object`, but for keys like `user.email`, it builds `user` before updating `email` on write)
72
81
 
73
82
  ## Contributing
74
83
 
@@ -1 +1,3 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'two_way_mapper'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module TwoWayMapper
2
4
  class Map
3
5
  delegate :[], to: :@maps
@@ -8,7 +10,9 @@ module TwoWayMapper
8
10
 
9
11
  def register(name)
10
12
  mapping = TwoWayMapper::Mapping.new
13
+
11
14
  yield mapping if block_given?
15
+
12
16
  @maps[name.to_sym] = mapping
13
17
  end
14
18
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module TwoWayMapper
2
4
  class Mapping
3
5
  attr_reader :rules, :left_class, :left_options, :right_class, :right_options
@@ -9,14 +11,14 @@ module TwoWayMapper
9
11
  [:left, :right].each do |method|
10
12
  class_eval <<-CODE, __FILE__, __LINE__ + 1
11
13
  def #{method}(plugin, options = {})
12
- @#{method}_class = node_class plugin
14
+ @#{method}_class = node_class(plugin)
13
15
  @#{method}_options = options
14
16
  end
15
17
  CODE
16
18
  end
17
19
 
18
20
  def node_class(plugin)
19
- TwoWayMapper::Node.const_get plugin.to_s.camelize
21
+ TwoWayMapper::Node.const_get(plugin.to_s.camelize)
20
22
  rescue NameError
21
23
  raise NameError, 'Cannot find node'
22
24
  end
@@ -31,15 +33,16 @@ module TwoWayMapper
31
33
 
32
34
  if left_selector.is_a?(Hash)
33
35
  raise ArgumentError if left_selector.count < 2
36
+
34
37
  opt = left_selector
35
38
  left_selector = opt.keys.first
36
- left_opt.merge! opt.delete left_selector
39
+ left_opt.merge! opt.delete(left_selector)
37
40
  right_selector = opt.keys.first
38
- right_opt.merge! opt.delete right_selector
41
+ right_opt.merge!(opt.delete(right_selector))
39
42
  end
40
43
 
41
- left = left_class.new left_selector, left_options.merge(left_opt)
42
- right = right_class.new right_selector, right_options.merge(right_opt)
44
+ left = left_class.new(left_selector, left_options.merge(left_opt))
45
+ right = right_class.new(right_selector, right_options.merge(right_opt))
43
46
 
44
47
  @rules << Rule.new(left, right, opt)
45
48
  end
@@ -47,7 +50,7 @@ module TwoWayMapper
47
50
  { left: :right, right: :left }.each do |from, to|
48
51
  class_eval <<-CODE, __FILE__, __LINE__ + 1
49
52
  def from_#{from}_to_#{to}(left_obj, right_obj)
50
- rules.each { |r| r.from_#{from}_to_#{to} left_obj, right_obj }
53
+ rules.each { |r| r.from_#{from}_to_#{to}(left_obj, right_obj) }
51
54
  #{to}_obj
52
55
  end
53
56
  CODE
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module TwoWayMapper
2
4
  module Node
3
5
  class ActiveRecord < Object
@@ -6,7 +8,7 @@ module TwoWayMapper
6
8
  end
7
9
 
8
10
  def create_node(obj, key)
9
- obj.send "build_#{key}"
11
+ obj.send("build_#{key}")
10
12
  end
11
13
  end
12
14
  end
@@ -1,6 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module TwoWayMapper
2
4
  module Node
3
- class Abstract
5
+ class Base
4
6
  DIVIDER = '.'
5
7
 
6
8
  attr_accessor :selector, :options
@@ -14,47 +16,52 @@ module TwoWayMapper
14
16
  block = options[:stringify_keys] ? :to_s : :to_sym
15
17
  block = block.to_proc
16
18
  end
17
- selector.split(DIVIDER).map &block
19
+ selector.split(DIVIDER).map(&block)
18
20
  end
19
21
 
20
22
  def read(source)
21
- rewind_forward(source) { |obj, key| return nil }
23
+ rewind_forward(source) { |_obj, _key| return nil }
22
24
  end
23
25
 
24
- def write(obj, value)
26
+ def write(_obj, _value)
27
+ raise NotImplementedError
25
28
  end
26
29
 
27
30
  def writable?(current_value, new_value)
28
31
  !options[:write_if] ||
29
- !options[:write_if].respond_to?(:call) ||
30
- options[:write_if].call(current_value, new_value)
32
+ !options[:write_if].respond_to?(:call) ||
33
+ options[:write_if].call(current_value, new_value)
31
34
  end
32
35
 
33
36
  private
34
37
 
35
38
  def rewind_forward(obj, margin = 0)
36
39
  to = -(1 + margin.to_i.abs)
40
+
37
41
  keys[0..to].each do |key|
38
42
  unless rewind_to?(obj, key)
39
43
  if block_given?
40
- yield obj, key
44
+ yield(obj, key)
41
45
  else
42
- create_node obj, key
46
+ create_node(obj, key)
43
47
  end
44
48
  end
45
- obj = next_key obj, key
49
+ obj = next_key(obj, key)
46
50
  end
47
51
 
48
52
  obj
49
53
  end
50
54
 
51
- def rewind_to?(obj, key)
55
+ def rewind_to?(_obj, _key)
56
+ raise NotImplementedError
52
57
  end
53
58
 
54
- def create_node(obj, key)
59
+ def create_node(_obj, _key)
60
+ raise NotImplementedError
55
61
  end
56
62
 
57
- def next_key(obj, key)
63
+ def next_key(_obj, _key)
64
+ raise NotImplementedError
58
65
  end
59
66
  end
60
67
  end
@@ -1,10 +1,14 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module TwoWayMapper
2
4
  module Node
3
- class Hash < Abstract
5
+ class Hash < Base
4
6
  def write(source, value)
5
7
  rewinded = rewind_forward source, 1
6
8
 
7
- rewinded[keys.last] = value if writable? rewinded[keys.last], value
9
+ return unless writable?(rewinded[keys.last], value)
10
+
11
+ rewinded[keys.last] = value
8
12
  end
9
13
 
10
14
  private
@@ -1,23 +1,27 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module TwoWayMapper
2
4
  module Node
3
- class Object < Abstract
5
+ class Object < Base
4
6
  def write(source, value)
5
- rewinded = rewind_forward source, 1
7
+ rewinded = rewind_forward(source, 1)
8
+
9
+ return unless writable?(rewinded.send(keys.last), value)
6
10
 
7
- rewinded.send "#{keys.last}=", value if writable? rewinded.send(keys.last), value
11
+ rewinded.send("#{keys.last}=", value)
8
12
  end
9
13
 
10
14
  private
11
15
 
12
16
  def rewind_to?(obj, key)
13
- obj.respond_to? key
17
+ obj.respond_to?(key)
14
18
  end
15
19
 
16
20
  def create_node(obj, key)
17
21
  end
18
22
 
19
23
  def next_key(obj, key)
20
- obj.send key
24
+ obj.send(key)
21
25
  end
22
26
  end
23
27
  end
@@ -1,8 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module TwoWayMapper
2
4
  module Node
3
5
  extend ActiveSupport::Autoload
4
6
 
5
- autoload :Abstract, 'two_way_mapper/node/abstract'
7
+ autoload :Base, 'two_way_mapper/node/base'
6
8
  autoload :Hash, 'two_way_mapper/node/hash'
7
9
  autoload :Object, 'two_way_mapper/node/object'
8
10
  autoload :ActiveRecord, 'two_way_mapper/node/active_record'
@@ -1,10 +1,12 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rails'
2
4
 
3
5
  module TwoWayMapper
4
6
  class Railtie < Rails::Railtie
5
- initializer "two_way_mapper.set_load_path" do |app|
7
+ initializer 'two_way_mapper.set_load_path' do |app|
6
8
  path = Rails.root.join('app', 'mappings', '*.rb').to_s
7
- Dir[path].each{ |file| load file }
9
+ Dir[path].each { |file| load file }
8
10
  end
9
11
  end
10
12
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module TwoWayMapper
2
4
  class Rule
3
5
  attr_reader :left, :right
@@ -11,12 +13,12 @@ module TwoWayMapper
11
13
  { left: :right, right: :left }.each do |from, to|
12
14
  class_eval <<-CODE, __FILE__, __LINE__ + 1
13
15
  def from_#{from}_to_#{to}(left_obj, right_obj)
14
- value = #{from}.read #{from}_obj
15
- value = map_value value, #{(from == :left).inspect}
16
- if @options[:on_#{from}_to_#{to}].respond_to? :call
17
- value = @options[:on_#{from}_to_#{to}].call value
16
+ value = #{from}.read(#{from}_obj)
17
+ value = map_value(value, #{(from == :left).inspect})
18
+ if @options[:on_#{from}_to_#{to}].respond_to?(:call)
19
+ value = @options[:on_#{from}_to_#{to}].call(value)
18
20
  end
19
- #{to}.write #{to}_obj, value
21
+ #{to}.write(#{to}_obj, value)
20
22
 
21
23
  #{to}_obj
22
24
  end
@@ -1,11 +1,13 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module TwoWayMapper
2
4
  module Tools
3
5
  class << self
4
6
  def first_item_from_hash!(hash)
5
7
  raise ArgumentError unless hash.is_a?(Hash)
6
- raise ArgumentError unless first = hash.first
8
+ raise ArgumentError unless (first = hash.first)
7
9
 
8
- hash.delete first[0]
10
+ hash.delete(first[0])
9
11
  first
10
12
  end
11
13
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module TwoWayMapper
2
- VERSION = "0.0.1"
4
+ VERSION = '0.1.0'
3
5
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'active_support/dependencies/autoload'
2
4
  require 'active_support/core_ext/module/delegation'
3
5
  require 'active_support/inflector'
data/spec/map_spec.rb CHANGED
@@ -1,6 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  describe TwoWayMapper::Map do
2
4
  describe '#register' do
3
- let(:map) { TwoWayMapper::Map.new }
5
+ let(:map) { described_class.new }
4
6
 
5
7
  it 'should register new mapping' do
6
8
  map.register :import
data/spec/mapping_spec.rb CHANGED
@@ -1,8 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  describe TwoWayMapper::Mapping do
4
+ let(:mapping) { described_class.new }
5
+
2
6
  [:left, :right].each do |method|
3
7
  describe "##{method}" do
4
- let(:mapping) { TwoWayMapper::Mapping.new }
5
-
6
8
  it "should set #{method} with options" do
7
9
  mapping.send method, :object, opt1: ''
8
10
 
@@ -13,30 +15,30 @@ describe TwoWayMapper::Mapping do
13
15
  end
14
16
 
15
17
  describe '#rule' do
16
- let(:mapping) { TwoWayMapper::Mapping.new }
17
18
  before :each do
18
19
  mapping.left :object
19
20
  mapping.right :hash
20
21
  end
21
22
 
22
23
  context 'left and right validation' do
23
- let(:mapping_without_both) { TwoWayMapper::Mapping.new }
24
- let(:mapping_without_left) { TwoWayMapper::Mapping.new }
25
- let(:mapping_without_right) { TwoWayMapper::Mapping.new }
24
+ let(:mapping_without_both) { described_class.new }
25
+ let(:mapping_without_left) { described_class.new }
26
+ let(:mapping_without_right) { described_class.new }
27
+
26
28
  before :each do
27
29
  mapping_without_left.right :hash
28
30
  mapping_without_right.left :hash
29
31
  end
30
32
 
31
33
  it 'should raise error when no left or right nodes' do
32
- expect{mapping_without_left.rule 'key', 'key'}.to raise_error
33
- expect{mapping_without_right.rule 'key', 'key'}.to raise_error
34
- expect{mapping_without_both.rule 'key', 'key'}.to raise_error
34
+ expect { mapping_without_left.rule 'key', 'key' }.to raise_error StandardError
35
+ expect { mapping_without_right.rule 'key', 'key' }.to raise_error StandardError
36
+ expect { mapping_without_both.rule 'key', 'key' }.to raise_error StandardError
35
37
  end
36
38
  end
37
39
 
38
40
  it 'should add item to rules hash' do
39
- expect{mapping.rule 'key1', 'Key1'}.to change{mapping.rules.count}.from(0).to(1)
41
+ expect { mapping.rule 'key1', 'Key1' }.to change { mapping.rules.count }.from(0).to(1)
40
42
 
41
43
  rule = mapping.rules.first
42
44
  expect(rule).to be_instance_of TwoWayMapper::Rule
@@ -45,7 +47,7 @@ describe TwoWayMapper::Mapping do
45
47
  end
46
48
 
47
49
  it 'should allow to pass hash' do
48
- expect{mapping.rule 'key1' => { opt1: 'val' }}.to raise_error
50
+ expect { mapping.rule 'key1' => { opt1: 'val' } }.to raise_error StandardError
49
51
 
50
52
  mapping.rule 'key1' => { opt1: 'val' }, 'Key2' => {}
51
53
  rule = mapping.rules.first
@@ -71,11 +73,11 @@ describe TwoWayMapper::Mapping do
71
73
  end
72
74
 
73
75
  context 'convertion methods' do
74
- let(:mapping) { TwoWayMapper::Mapping.new }
75
76
  let(:rule1) { double from_left_to_right: nil, from_right_to_left: nil }
76
77
  let(:rule2) { double from_left_to_right: nil, from_right_to_left: nil }
77
- let(:left_obj) { double() }
78
- let(:right_obj) { double() }
78
+ let(:left_obj) { double }
79
+ let(:right_obj) { double }
80
+
79
81
  before :each do
80
82
  mapping.left :object
81
83
  mapping.right :hash
@@ -1,10 +1,13 @@
1
+ # frozen_string_literal: true
2
+
1
3
  describe TwoWayMapper::Node::ActiveRecord do
2
- let(:node) { TwoWayMapper::Node::ActiveRecord.new 'user.email' }
4
+ let(:node) { described_class.new 'user.email' }
3
5
 
4
6
  describe '#write' do
5
7
  it 'should try to build before write' do
6
8
  user = double(email: '')
7
- obj = double()
9
+ obj = double
10
+
8
11
  allow(obj).to receive :build_user do
9
12
  allow(obj).to receive(:user).and_return user
10
13
  end
@@ -18,6 +21,7 @@ describe TwoWayMapper::Node::ActiveRecord do
18
21
  it 'should try to build even if respond_to but obj itself is nil' do
19
22
  user = double(email: '')
20
23
  obj = double(user: nil)
24
+
21
25
  allow(obj).to receive :build_user do
22
26
  allow(obj).to receive(:user).and_return user
23
27
  end
@@ -1,19 +1,24 @@
1
- describe TwoWayMapper::Node::Abstract do
1
+ # frozen_string_literal: true
2
+
3
+ describe TwoWayMapper::Node::Base do
2
4
  describe '#keys' do
3
- subject { TwoWayMapper::Node::Abstract.new 'key1.key11.key111' }
5
+ subject { described_class.new('key1.key11.key111') }
4
6
 
5
- its(:keys) { should eql [:key1, :key11, :key111] }
7
+ its(:keys) { should eql %i[key1 key11 key111] }
6
8
  end
7
9
 
8
10
  describe 'writable?' do
9
11
  it 'should be truthy if write_if options not set' do
10
- node = TwoWayMapper::Node::Abstract.new 'key1.key11.key111'
12
+ node = described_class.new('key1.key11.key111')
11
13
 
12
14
  expect(node).to be_writable 'current', 'new'
13
15
  end
14
16
 
15
17
  it 'should be truthy if write_if option set' do
16
- node = TwoWayMapper::Node::Abstract.new 'key1.key11.key111', write_if: ->(c, n) { c == 'current' || n == 'new' }
18
+ node = described_class.new(
19
+ 'key1.key11.key111',
20
+ write_if: ->(c, n) { c == 'current' || n == 'new' }
21
+ )
17
22
 
18
23
  expect(node).to be_writable 'current', 'new1'
19
24
  expect(node).to be_writable 'current1', 'new'
@@ -1,6 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  describe TwoWayMapper::Node::Hash do
2
4
  context 'normal keys' do
3
- let(:node) { TwoWayMapper::Node::Hash.new 'key1.key11.key111' }
5
+ let(:node) { described_class.new('key1.key11.key111') }
4
6
 
5
7
  describe '#read' do
6
8
  it 'should return nil when path is not avaiable' do
@@ -25,7 +27,9 @@ describe TwoWayMapper::Node::Hash do
25
27
  end
26
28
 
27
29
  context 'string keys' do
28
- let(:node) { TwoWayMapper::Node::Hash.new 'key1.key11.key111', stringify_keys: true }
30
+ let(:node) do
31
+ described_class.new('key1.key11.key111', stringify_keys: true)
32
+ end
29
33
 
30
34
  describe '#read' do
31
35
  it 'should return nil when path is not avaiable' do
@@ -50,7 +54,7 @@ describe TwoWayMapper::Node::Hash do
50
54
  end
51
55
 
52
56
  context 'write_if option' do
53
- let(:node) { TwoWayMapper::Node::Hash.new 'key1.key11', write_if: ->(c, n) { c.empty? || n == 'value1' } }
57
+ let(:node) { described_class.new 'key1.key11', write_if: ->(c, n) { c.empty? || n == 'value1' } }
54
58
  let(:writable_obj1) { { key1: { key11: '' } } }
55
59
  let(:writable_obj2) { { key1: { key11: 'smth' } } }
56
60
  let(:not_writable_obj) { { key1: { key11: 'smth' } } }
@@ -1,5 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  describe TwoWayMapper::Node::Object do
2
- let(:node) { TwoWayMapper::Node::Object.new 'key1.key11.key111' }
4
+ let(:node) { described_class.new 'key1.key11.key111' }
3
5
 
4
6
  describe '#read' do
5
7
  it 'should return nil when path is not avaiable' do
@@ -25,7 +27,7 @@ describe TwoWayMapper::Node::Object do
25
27
  end
26
28
 
27
29
  context 'write_if option' do
28
- let(:node) { TwoWayMapper::Node::Object.new 'key', write_if: ->(c, n) { c.empty? || n == 'value1'} }
30
+ let(:node) { described_class.new 'key', write_if: ->(c, n) { c.empty? || n == 'value1'} }
29
31
  let(:writable_obj1) { OpenStruct.new key: '' }
30
32
  let(:writable_obj2) { OpenStruct.new key: 'smth' }
31
33
  let(:not_writable_obj) { OpenStruct.new key: 'smth' }
data/spec/rule_spec.rb CHANGED
@@ -1,12 +1,14 @@
1
+ # frozen_string_literal: true
2
+
1
3
  describe TwoWayMapper::Rule do
2
4
  context 'transformation methods' do
3
- let(:left_node) { TwoWayMapper::Node::Object.new 'key1' }
4
- let(:right_node) { TwoWayMapper::Node::Hash.new 'Kk.Key1' }
5
+ let(:left_node) { TwoWayMapper::Node::Object.new('key1') }
6
+ let(:right_node) { TwoWayMapper::Node::Hash.new('Kk.Key1') }
5
7
  let(:left_object) { OpenStruct.new }
6
8
  let(:map) { { 'value' => 'VALUE' } }
7
9
 
8
10
  context 'without options' do
9
- let(:rule) { TwoWayMapper::Rule.new left_node, right_node }
11
+ let(:rule) { described_class.new left_node, right_node }
10
12
 
11
13
  describe '#from_left_to_right' do
12
14
  it 'should read from left node and write to right node' do
@@ -30,7 +32,7 @@ describe TwoWayMapper::Rule do
30
32
  end
31
33
 
32
34
  context 'with map option' do
33
- let(:rule) { TwoWayMapper::Rule.new left_node, right_node, map: map, default: 'not found' }
35
+ let(:rule) { described_class.new left_node, right_node, map: map, default: 'not found' }
34
36
 
35
37
  describe '#from_left_to_right' do
36
38
  it 'should read from left node and write to right node' do
@@ -56,7 +58,7 @@ describe TwoWayMapper::Rule do
56
58
  context 'with default option' do
57
59
  describe '#from_left_to_right' do
58
60
  it 'should return default value if not found' do
59
- rule = TwoWayMapper::Rule.new left_node, right_node, map: map, default: 'not found'
61
+ rule = described_class.new left_node, right_node, map: map, default: 'not found'
60
62
 
61
63
  left_object.key1 = 'value1'
62
64
  right_object = {}
@@ -66,7 +68,14 @@ describe TwoWayMapper::Rule do
66
68
  end
67
69
 
68
70
  it 'should return use default_left if present and value not found' do
69
- rule = TwoWayMapper::Rule.new left_node, right_node, map: map, default: 'not found', default_left: 'not found on left', default_right: 'not found on right'
71
+ rule = described_class.new(
72
+ left_node,
73
+ right_node,
74
+ map: map,
75
+ default: 'not found',
76
+ default_left: 'not found on left',
77
+ default_right: 'not found on right'
78
+ )
70
79
 
71
80
  left_object.key1 = 'value1'
72
81
  right_object = {}
@@ -78,7 +87,7 @@ describe TwoWayMapper::Rule do
78
87
 
79
88
  describe '#from_right_to_left' do
80
89
  it 'should return default value if not found' do
81
- rule = TwoWayMapper::Rule.new left_node, right_node, map: map, default: 'not found'
90
+ rule = described_class.new left_node, right_node, map: map, default: 'not found'
82
91
 
83
92
  left_object.key1 = nil
84
93
  right_object = { Kk: { Key1: 'VALUE1' } }
@@ -88,7 +97,14 @@ describe TwoWayMapper::Rule do
88
97
  end
89
98
 
90
99
  it 'should return use default_right if present and value not found' do
91
- rule = TwoWayMapper::Rule.new left_node, right_node, map: map, default: 'not found', default_left: 'not found on left', default_right: 'not found on right'
100
+ rule = described_class.new(
101
+ left_node,
102
+ right_node,
103
+ map: map,
104
+ default: 'not found',
105
+ default_left: 'not found on left',
106
+ default_right: 'not found on right'
107
+ )
92
108
 
93
109
  left_object.key1 = nil
94
110
  right_object = { Kk: { Key1: 'VALUE1' } }
@@ -102,7 +118,11 @@ describe TwoWayMapper::Rule do
102
118
  describe 'with callback option' do
103
119
  describe 'on_left_to_right' do
104
120
  it 'should transform value if such options passed' do
105
- rule = TwoWayMapper::Rule.new left_node, right_node, on_left_to_right: ->(v) { v.upcase }
121
+ rule = described_class.new(
122
+ left_node,
123
+ right_node,
124
+ on_left_to_right: ->(v) { v.upcase }
125
+ )
106
126
 
107
127
  left_object.key1 = 'value1'
108
128
  right_object = {}
@@ -114,7 +134,11 @@ describe TwoWayMapper::Rule do
114
134
 
115
135
  describe 'on_right_to_left' do
116
136
  it 'should transform value if such options passed' do
117
- rule = TwoWayMapper::Rule.new left_node, right_node, on_right_to_left: ->(v) { v.downcase }
137
+ rule = described_class.new(
138
+ left_node,
139
+ right_node,
140
+ on_right_to_left: ->(v) { v.downcase }
141
+ )
118
142
 
119
143
  left_object.key1 = nil
120
144
  right_object = { Kk: { Key1: 'VALUE1' } }
data/spec/tools_spec.rb CHANGED
@@ -1,19 +1,19 @@
1
- describe TwoWayMapper::Tools do
2
- let(:tools) { TwoWayMapper::Tools }
1
+ # frozen_string_literal: true
3
2
 
3
+ describe TwoWayMapper::Tools do
4
4
  describe '.first_item_from_hash!' do
5
5
  it 'should raise error unless hash passed' do
6
- expect{tools.first_item_from_hash!}.to raise_error
7
- expect{tools.first_item_from_hash! ''}.to raise_error
8
- expect{tools.first_item_from_hash! 1}.to raise_error
6
+ expect { described_class.first_item_from_hash! }.to raise_error ArgumentError
7
+ expect { described_class.first_item_from_hash! '' }.to raise_error ArgumentError
8
+ expect { described_class.first_item_from_hash! 1 }.to raise_error ArgumentError
9
9
  end
10
10
 
11
11
  it 'should raise error if emplt hash passed' do
12
- expect{tools.first_item_from_hash! {}}.to raise_error
12
+ expect { described_class.first_item_from_hash! {} }.to raise_error ArgumentError
13
13
  end
14
14
 
15
15
  it 'should return first hash key and value' do
16
- k, v = tools.first_item_from_hash! a: 1
16
+ k, v = described_class.first_item_from_hash! a: 1
17
17
 
18
18
  expect(k).to eql :a
19
19
  expect(v).to eql 1
@@ -21,7 +21,7 @@ describe TwoWayMapper::Tools do
21
21
 
22
22
  it 'should delete first item' do
23
23
  hash = { a: 1, b: 2 }
24
- k, v = tools.first_item_from_hash! hash
24
+ _k, _v = described_class.first_item_from_hash!(hash)
25
25
 
26
26
  expect(hash).not_to include a: 1
27
27
  end
@@ -1,27 +1,28 @@
1
1
  # coding: utf-8
2
- lib = File.expand_path('../lib', __FILE__)
2
+
3
+ lib = File.expand_path('lib', __dir__)
3
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
5
  require 'two_way_mapper/version'
5
6
 
6
7
  Gem::Specification.new do |spec|
7
- spec.name = "two-way-mapper"
8
+ spec.name = 'two-way-mapper'
8
9
  spec.version = TwoWayMapper::VERSION
9
- spec.authors = ["Tima Maslyuchenko"]
10
- spec.email = ["insside@gmail.com"]
11
- spec.description = %q{Two way data mapping}
12
- spec.summary = %q{Two way data mapping}
13
- spec.homepage = ""
14
- spec.license = "MIT"
10
+ spec.authors = ['Tim Masliuchenko']
11
+ spec.email = ['insside@gmail.com']
12
+ spec.description = 'Two way data mapping'
13
+ spec.summary = 'Two way data mapping'
14
+ spec.homepage = 'https://github.com/timsly/two-way-mapper'
15
+ spec.license = 'MIT'
15
16
 
16
- spec.files = `git ls-files`.split($/)
17
+ spec.files = `git ls-files`.split($INPUT_RECORD_SEPARATOR)
17
18
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
19
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
- spec.require_paths = ["lib"]
20
+ spec.require_paths = ['lib']
20
21
 
21
- spec.add_dependency "activesupport"
22
+ spec.add_dependency 'activesupport'
22
23
 
23
- spec.add_development_dependency "bundler", "~> 1.3"
24
- spec.add_development_dependency "rspec", "~> 3.0"
25
- spec.add_development_dependency "rspec-its"
26
- spec.add_development_dependency "rake"
24
+ spec.add_development_dependency 'bundler'
25
+ spec.add_development_dependency 'rake'
26
+ spec.add_development_dependency 'rspec', '~> 3.0'
27
+ spec.add_development_dependency 'rspec-its'
27
28
  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.0.1
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
- - Tima Maslyuchenko
7
+ - Tim Masliuchenko
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-11-04 00:00:00.000000000 Z
11
+ date: 2019-12-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -28,46 +28,46 @@ dependencies:
28
28
  name: bundler
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: '1.3'
33
+ version: '0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - "~>"
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: '1.3'
40
+ version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: rspec
42
+ name: rake
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - "~>"
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: '3.0'
47
+ version: '0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - "~>"
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
- version: '3.0'
54
+ version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
- name: rspec-its
56
+ name: rspec
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - ">="
59
+ - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '0'
61
+ version: '3.0'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - ">="
66
+ - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: '0'
68
+ version: '3.0'
69
69
  - !ruby/object:Gem::Dependency
70
- name: rake
70
+ name: rspec-its
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - ">="
@@ -101,8 +101,8 @@ files:
101
101
  - lib/two_way_mapper/map.rb
102
102
  - lib/two_way_mapper/mapping.rb
103
103
  - lib/two_way_mapper/node.rb
104
- - lib/two_way_mapper/node/abstract.rb
105
104
  - lib/two_way_mapper/node/active_record.rb
105
+ - lib/two_way_mapper/node/base.rb
106
106
  - lib/two_way_mapper/node/hash.rb
107
107
  - lib/two_way_mapper/node/object.rb
108
108
  - lib/two_way_mapper/railtie.rb
@@ -111,15 +111,15 @@ files:
111
111
  - lib/two_way_mapper/version.rb
112
112
  - spec/map_spec.rb
113
113
  - spec/mapping_spec.rb
114
- - spec/node/abstract_spec.rb
115
114
  - spec/node/active_record_spec.rb
115
+ - spec/node/base_spec.rb
116
116
  - spec/node/hash_spec.rb
117
117
  - spec/node/object_spec.rb
118
118
  - spec/rule_spec.rb
119
119
  - spec/spec_helper.rb
120
120
  - spec/tools_spec.rb
121
121
  - two-way-mapper.gemspec
122
- homepage: ''
122
+ homepage: https://github.com/timsly/two-way-mapper
123
123
  licenses:
124
124
  - MIT
125
125
  metadata: {}
@@ -138,16 +138,15 @@ required_rubygems_version: !ruby/object:Gem::Requirement
138
138
  - !ruby/object:Gem::Version
139
139
  version: '0'
140
140
  requirements: []
141
- rubyforge_project:
142
- rubygems_version: 2.2.2
141
+ rubygems_version: 3.0.3
143
142
  signing_key:
144
143
  specification_version: 4
145
144
  summary: Two way data mapping
146
145
  test_files:
147
146
  - spec/map_spec.rb
148
147
  - spec/mapping_spec.rb
149
- - spec/node/abstract_spec.rb
150
148
  - spec/node/active_record_spec.rb
149
+ - spec/node/base_spec.rb
151
150
  - spec/node/hash_spec.rb
152
151
  - spec/node/object_spec.rb
153
152
  - spec/rule_spec.rb