gemsupport 0.3.0 → 0.4.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
2
  SHA1:
3
- metadata.gz: b3df4c71cd4f48bf0665a2a0c307d4b595e0e756
4
- data.tar.gz: 867518858d56bef29f40fb3e420f1b32d771ac2a
3
+ metadata.gz: c24d6ef09f2dc76b3fb687e33347f27dfca03945
4
+ data.tar.gz: 836dd615888a0d478149ec49c3ce61aa1c6ccc7c
5
5
  SHA512:
6
- metadata.gz: 29ac3ab4616a0be74e0be945cd58d01146e5f53e5301d213a0158f1f8694fc2513bebb49888ad1cecdd7c100f33d9a88ce49a43ef7937b612096a1b4b8438422
7
- data.tar.gz: d5972738e8e21d41b92929d849a7ccdcc778176d940031334a98bfd6d49d65f3fb0eb884de4f665e0e504e777a75e8143e81074137cdfb09cf63a8a7716a0a33
6
+ metadata.gz: bd2be0ff5fba8629ab50577672551c44dcf26bf659ac9d0b3e7b653afeb55784dc3eae02cf1c0db3b54bb7408ce965917f992a7f0f9e1ed89e5536e8fcb6f1eb
7
+ data.tar.gz: 6eb6cdb0d7937a05fe0165bc1d5fb7e0037434ebf64e35184ded51e9bdda2bbcdf945b52d86d130dabacaf1c6ecea20134159fad959d79b25624255b542cc0b8
@@ -0,0 +1,13 @@
1
+ Object.class_eval do
2
+ def deep_clone(is_root: true)
3
+ clone.tap do |deep_cloning_obj|
4
+ deep_cloning_obj.instance_variables.each do |var|
5
+ val = deep_cloning_obj.instance_variable_get(var)
6
+ deep_cloning_obj.instance_variable_set(var, val.deep_clone(is_root: false))
7
+ end
8
+ end
9
+ rescue TypeError
10
+ return self unless is_root
11
+ raise
12
+ end
13
+ end
@@ -2,3 +2,4 @@ require 'gemsupport/core_ext/blank'
2
2
  require 'gemsupport/core_ext/string'
3
3
  require 'gemsupport/core_ext/hash_keys'
4
4
  require 'gemsupport/core_ext/hash'
5
+ require 'gemsupport/core_ext/object_deep_clone'
@@ -1,3 +1,3 @@
1
1
  module Gemsupport
2
- VERSION = '0.3.0'
2
+ VERSION = '0.4.0'
3
3
  end
@@ -0,0 +1,82 @@
1
+ require 'spec_helper'
2
+
3
+ describe Object do
4
+ describe '#deep_clone' do
5
+ context 'when deep clone action is impossible' do
6
+ it 'raises an error' do
7
+ expect { 5.deep_clone }.to raise_error(TypeError, "can't clone Fixnum")
8
+ end
9
+ end
10
+
11
+ context 'modifications on deep cloned object' do
12
+ context 'when it is basic objects like hash or array' do
13
+ let(:input) do
14
+ {
15
+ key: 'trololo',
16
+ ary: [
17
+ { k1: 12, k2: '23' },
18
+ { k1: 45, k2: '56' }
19
+ ]
20
+ }
21
+ end
22
+ let!(:deep_cloned) { input.deep_clone }
23
+ let(:modify_clone) do
24
+ lambda do
25
+ deep_cloned[:another_key] = 'yolo'
26
+ deep_cloned[:ary].last[:k2] = 65
27
+ deep_cloned[:ary] << 'inserted value'
28
+ end
29
+ end
30
+
31
+ it 'does not change the original' do
32
+ expect { modify_clone.call }.to_not change { input }
33
+ end
34
+
35
+ it 'changes the cloned object' do
36
+ expect { modify_clone.call }.to change { deep_cloned }
37
+ .from(input).to(key: 'trololo',
38
+ another_key: 'yolo',
39
+ ary: [{ k1: 12, k2: '23' },
40
+ { k1: 45, k2: 65 },
41
+ 'inserted value'])
42
+ end
43
+ end
44
+
45
+ context 'when it is a custom object' do
46
+ let(:dummy_class) do
47
+ Object.new.tap do |instance|
48
+ class << instance
49
+ attr_accessor :var1, :var2
50
+
51
+ def concat_vars
52
+ "#{@var1} - #{@var2}"
53
+ end
54
+ end
55
+ end
56
+ end
57
+ let(:input) do
58
+ dummy_class.tap do |dc|
59
+ dc.var1 = %w(ab cd)
60
+ dc.var2 = { k1: 'trololo', k2: 'yolo' }
61
+ end
62
+ end
63
+ let!(:deep_cloned) { input.deep_clone }
64
+ let(:modify_clone) do
65
+ lambda do
66
+ deep_cloned.var1 << 'inserted value'
67
+ deep_cloned.var2 = 'yolo'
68
+ end
69
+ end
70
+
71
+ it 'does not change the original' do
72
+ expect { modify_clone.call }.to_not change { input }
73
+ end
74
+
75
+ it 'changes the cloned object' do
76
+ expect { modify_clone.call }.to change(deep_cloned, :concat_vars)
77
+ .from(input.concat_vars).to('["ab", "cd", "inserted value"] - yolo')
78
+ end
79
+ end
80
+ end
81
+ end
82
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gemsupport
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - mdouchement
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-01-09 00:00:00.000000000 Z
11
+ date: 2015-01-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -115,6 +115,7 @@ files:
115
115
  - lib/gemsupport/core_ext/blank.rb
116
116
  - lib/gemsupport/core_ext/hash.rb
117
117
  - lib/gemsupport/core_ext/hash_keys.rb
118
+ - lib/gemsupport/core_ext/object_deep_clone.rb
118
119
  - lib/gemsupport/core_ext/string.rb
119
120
  - lib/gemsupport/error.rb
120
121
  - lib/gemsupport/version.rb
@@ -122,6 +123,7 @@ files:
122
123
  - spec/gemsupport/core_ext/blank_spec.rb
123
124
  - spec/gemsupport/core_ext/hash_keys_spec.rb
124
125
  - spec/gemsupport/core_ext/hash_spec.rb
126
+ - spec/gemsupport/core_ext/object_deep_clone_spec.rb
125
127
  - spec/gemsupport/core_ext/string_spec.rb
126
128
  - spec/gemsupport/error_spec.rb
127
129
  - spec/spec_helper.rb