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