gemsupport 0.3.0 → 0.4.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
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c24d6ef09f2dc76b3fb687e33347f27dfca03945
|
4
|
+
data.tar.gz: 836dd615888a0d478149ec49c3ce61aa1c6ccc7c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
data/lib/gemsupport/core_ext.rb
CHANGED
data/lib/gemsupport/version.rb
CHANGED
@@ -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.
|
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-
|
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
|