full_clone 0.0.5 → 0.0.6
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 +4 -4
- data/README.md +67 -5
- data/full_clone.gemspec +1 -1
- data/irbt.rb +20 -0
- data/lib/full_clone/version.rb +1 -1
- data/lib/full_clone.rb +2 -0
- data/{Rakefile → rakefile.rb} +5 -1
- metadata +18 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e9209ed1e6cb951c55c56e47f7bf00868f6a651a
|
4
|
+
data.tar.gz: 1d56f766fe6dbf6ef71fd5599c9a78f7965acf42
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 65a6910868cfa6e8e8ddd56fee61e885e42fd3d5a8ea9d7a71b88d71e91f6072888c793193bd8aeaaa7208dc55b9f890b1bd185fed4825898d2634ff642174ff
|
7
|
+
data.tar.gz: b012aacf6dc4e175b93279cb67834d73c4447d7435e57f9f9881f4753d5fcfd8367b0f15b9bef30080668444acb713d40147a992269df6526cc616f7829feb42
|
data/README.md
CHANGED
@@ -6,6 +6,46 @@ cloned copy. The full_clone method digs deep and makes copies of these internal
|
|
6
6
|
variables, not just arrays and hashes. It also allows classes to specify an
|
7
7
|
exclusion list of variables that are not to be processed.
|
8
8
|
|
9
|
+
This comprehensive approach creates another issue to be resolved. In Ruby, if an
|
10
|
+
attempt is made to clone an immutable data item like a number, an error occurs.
|
11
|
+
The justification for this uncharacteristic strictness is not at all clear, but
|
12
|
+
it does mean that the clone operation must be applied with great care.
|
13
|
+
|
14
|
+
Unlike the standard clone method, the full\_clone method does not throw an
|
15
|
+
exception when it sees un-clonable value objects like 42 or true. These values
|
16
|
+
simply return themselves. This is correct because those types of objects do
|
17
|
+
not _need_ to be cloned. Instead of having a fit, the code just works!
|
18
|
+
|
19
|
+
Another issue that this gem deals with is that of data with looping reference
|
20
|
+
chains. To handle this, the code tracks object ID values and does not re-clone
|
21
|
+
data that has already been cloned. Thus even nasty edge cases are handled
|
22
|
+
without any special effort on the part of the application programmer.
|
23
|
+
|
24
|
+
## Family Overview
|
25
|
+
|
26
|
+
This gem is a member of a family of four gems that all provide data copying
|
27
|
+
services in a safe, easy to use format. The following outlines the available
|
28
|
+
gems and how to chose from among them.
|
29
|
+
|
30
|
+
Depth / Action | Need to copy all. | Need to copy data only.
|
31
|
+
---------------|------------------------------|------------
|
32
|
+
Need a shallow copy | require 'safe\_clone' | require 'safe\_dup'
|
33
|
+
Need a full copy | require 'full\_clone' | require 'full\_dup'
|
34
|
+
|
35
|
+
<br>**Notes**
|
36
|
+
* Since none of these gems override the default clone and dup
|
37
|
+
methods, the default behaviors remain available. Further, if multiple,
|
38
|
+
differing requirements exists, more than one family member gem may be
|
39
|
+
employed in the same project without fear of conflict.
|
40
|
+
* If multiple family gems are employed, they will each need to be installed and
|
41
|
+
required into the application. See below for details.
|
42
|
+
* Meta-data attributes include the frozen status and singleton methods. However
|
43
|
+
the tainted status is always copied.
|
44
|
+
|
45
|
+
|
46
|
+
|
47
|
+
## Installation
|
48
|
+
|
9
49
|
Add this line to your application's Gemfile:
|
10
50
|
|
11
51
|
gem 'full_clone'
|
@@ -18,6 +58,11 @@ Or install it yourself as:
|
|
18
58
|
|
19
59
|
$ gem install full_clone
|
20
60
|
|
61
|
+
The safe_dup gem is at: ( https://rubygems.org/gems/safe_dup )
|
62
|
+
<br>The safe_clone gem is at: ( https://rubygems.org/gems/safe_clone )
|
63
|
+
<br>The full_dup gem is at: ( https://rubygems.org/gems/full_dup )
|
64
|
+
<br>The full_clone gem is at: ( https://rubygems.org/gems/full_clone )
|
65
|
+
|
21
66
|
## Usage
|
22
67
|
|
23
68
|
require 'full_clone'
|
@@ -33,10 +78,20 @@ instead of
|
|
33
78
|
To exclude some instance variables from the deep cloning process, define a
|
34
79
|
full_clone_exclude method in the required class:
|
35
80
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
81
|
+
```ruby
|
82
|
+
def full_clone_exclude
|
83
|
+
[:@bad_var1, :@bad_var2, :@bad_var_etc]
|
84
|
+
end
|
85
|
+
```
|
86
|
+
This also can be applied to arrays and hashes. In this case, it is possible to
|
87
|
+
define a singleton method on the cloned data. Then the exclude method would
|
88
|
+
return an array of array indexes or hash keys to be omitted from the full clone
|
89
|
+
recursion. Here is an example that never clones the first two elements of the
|
90
|
+
array:
|
91
|
+
|
92
|
+
```ruby
|
93
|
+
my_array.define_singleton_method(:full_clone_exclude) { [0, 1] }
|
94
|
+
```
|
40
95
|
|
41
96
|
## Notes
|
42
97
|
|
@@ -49,8 +104,15 @@ broken!
|
|
49
104
|
|
50
105
|
## Contributing
|
51
106
|
|
52
|
-
|
107
|
+
#### Plan A
|
108
|
+
|
109
|
+
1. Fork it ( https://github.com/PeterCamilleri/full_clone/fork )
|
53
110
|
2. Create your feature branch (`git checkout -b my-new-feature`)
|
54
111
|
3. Commit your changes (`git commit -am 'Add some feature'`)
|
55
112
|
4. Push to the branch (`git push origin my-new-feature`)
|
56
113
|
5. Create new Pull Request
|
114
|
+
|
115
|
+
#### Plan B
|
116
|
+
|
117
|
+
Go to the GitHub repository and raise an issue calling attention to some
|
118
|
+
aspect that could use some TLC or a suggestion or an idea.
|
data/full_clone.gemspec
CHANGED
@@ -14,11 +14,11 @@ Gem::Specification.new do |spec|
|
|
14
14
|
spec.license = "MIT"
|
15
15
|
|
16
16
|
spec.files = `git ls-files`.split($/)
|
17
|
-
# spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
17
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
18
|
spec.require_paths = ["lib"]
|
20
19
|
|
21
20
|
spec.add_development_dependency 'minitest_visible', ">= 0.1.0"
|
21
|
+
spec.add_development_dependency 'mini_readline', ">= 0.4.8"
|
22
22
|
spec.add_development_dependency "bundler", "~> 1.3"
|
23
23
|
spec.add_development_dependency "rake"
|
24
24
|
spec.add_development_dependency 'minitest', "~> 4.7.5"
|
data/irbt.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
# An IRB + full_clone test bed
|
3
|
+
|
4
|
+
require 'irb'
|
5
|
+
$force_alias_read_line_module = true
|
6
|
+
require 'mini_readline'
|
7
|
+
|
8
|
+
puts "Starting an IRB console with full_clone loaded."
|
9
|
+
|
10
|
+
if ARGV[0] == 'local'
|
11
|
+
require_relative 'lib/full_clone'
|
12
|
+
puts "full_clone loaded locally: #{FullClone::VERSION}"
|
13
|
+
|
14
|
+
ARGV.shift
|
15
|
+
else
|
16
|
+
require 'full_clone'
|
17
|
+
puts "full_clone loaded from gem: #{FullClone::VERSION}"
|
18
|
+
end
|
19
|
+
|
20
|
+
IRB.start
|
data/lib/full_clone/version.rb
CHANGED
data/lib/full_clone.rb
CHANGED
data/{Rakefile → rakefile.rb}
RENAMED
@@ -12,9 +12,13 @@ Rake::TestTask.new do |t|
|
|
12
12
|
t.verbose = false
|
13
13
|
end
|
14
14
|
|
15
|
+
desc "Run an IRB Session with full_clone loaded."
|
16
|
+
task :console do
|
17
|
+
system "ruby irbt.rb local"
|
18
|
+
end
|
19
|
+
|
15
20
|
desc "What version of full_clone is this?"
|
16
21
|
task :vers do |t|
|
17
22
|
puts
|
18
23
|
puts "full_clone version = #{FullClone::VERSION}"
|
19
24
|
end
|
20
|
-
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: full_clone
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Peter Camilleri
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-05-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: minitest_visible
|
@@ -24,6 +24,20 @@ dependencies:
|
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: 0.1.0
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: mini_readline
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 0.4.8
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 0.4.8
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: bundler
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -78,14 +92,15 @@ files:
|
|
78
92
|
- Gemfile
|
79
93
|
- LICENSE.txt
|
80
94
|
- README.md
|
81
|
-
- Rakefile
|
82
95
|
- full_clone.gemspec
|
96
|
+
- irbt.rb
|
83
97
|
- lib/full_clone.rb
|
84
98
|
- lib/full_clone/array.rb
|
85
99
|
- lib/full_clone/hash.rb
|
86
100
|
- lib/full_clone/object.rb
|
87
101
|
- lib/full_clone/struct.rb
|
88
102
|
- lib/full_clone/version.rb
|
103
|
+
- rakefile.rb
|
89
104
|
- test/array_tests.rb
|
90
105
|
- test/deep_clone_tests.rb
|
91
106
|
- test/hash_tests.rb
|