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:
|
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
|