safe_clone 0.0.4 → 0.0.5

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: 6c47b359f673a690029ee7dc0388eb6bf1875d09
4
- data.tar.gz: 34af503afe09f42a3278709c1a5c4f5f801dc06f
3
+ metadata.gz: 337deb97efeb6f36888f928f0ceb4a6aff7e1807
4
+ data.tar.gz: 85c5a520fcaaf4936282eb40227c46c38990b1ab
5
5
  SHA512:
6
- metadata.gz: df8e974b0fa65e8da617f672616d816958c1253922e9c2e1a340b3de232de42156962cb4b249885dcd0b7b421106b51fef2fd3b6e37cf2cd31cbc576412cee2d
7
- data.tar.gz: c46c03f29d95f418a2e19bbd609600e7c691e3a3b5cc587a02c2c6d326a8d11d2d0f94f8f63c12c0099b608a0339687d88b8d60277396231c1cab5bb8ed7bc0f
6
+ metadata.gz: bfdfc38c09b4881333910b339fdface8878c357926c4e586a3f010bf0ac3b19619fd126254ac1aeec194ee297d91a688f8ff8b19452995ce29e3bc43baf09cc4
7
+ data.tar.gz: 94bc68f5b3f362cce6dc1050f5871ee18c5a33282691f31df09c177ed068e30818ed7a3911e22daa727d2ca21d89d2f1da044a3cd5acc5c28ec7dbd8b76e78d5
data/README.md CHANGED
@@ -1,10 +1,45 @@
1
1
  # SafeClone
2
2
 
3
- This tiny gem implements a version of clone called safe\_clone. Unlike the
4
- standard clone method, the safe\_clone method does not throw an exception
5
- when sent to un-clonable value objects like 42 or true. These values simply
6
- return themselves. This is correct because those types of objects do not _need_
7
- to be cloned. Instead of having a fit, the code just works!
3
+ This tiny gem implements a version of clone called safe\_clone. In Ruby, if an
4
+ attempt is made to clone an immutable data item like a number, an error occurs.
5
+ The justification for this uncharacteristic strictness is not at all clear, but
6
+ it does mean that the clone operation must be applied with great care.
7
+
8
+ Unlike the standard clone method, the safe\_clone method does not throw an
9
+ exception when sent to un-clonable value objects like 42 or true. These values
10
+ simply return themselves. This is correct because those types of objects do
11
+ not _need_ to be cloned. Instead of having a fit, the code just works!
12
+
13
+ On a note about performance, this gem does not just rescue the exceptions
14
+ normally generated by clone, it prevents them from occurring and wasting time
15
+ in the first place.
16
+
17
+ Finally, this gem does not monkey patch the behavior of the clone method.
18
+ Modifying such a crucial method was considered too risky. Instead, the
19
+ safe_clone method is introduced. This is done to reduce the possibility of
20
+ breaking existing code that often occurs when monkey patching goes too far.
21
+
22
+ ## Family Overview
23
+
24
+ This gem is a member of a family of four gems that all provide data copying
25
+ services in a safe, easy to use format. The following outlines the available
26
+ gems and how to chose from among them.
27
+
28
+ Depth / Action | Need to copy all. | Need to copy data only.
29
+ ---------------|------------------------------|------------
30
+ Need a shallow copy | require 'safe\_clone' | require 'safe\_dup'
31
+ Need a full copy | require 'full\_clone' | require 'full\_dup'
32
+
33
+ <br>**Notes**
34
+ * Since none of these gems override the default clone and dup
35
+ methods, the default behaviors remain available. Further, if multiple,
36
+ differing requirements exists, more than one family member gem may be
37
+ employed in the same project without fear of conflict.
38
+ * If multiple family gems are employed, they will each need to be installed and
39
+ required into the application. See below for details.
40
+ * Meta-data attributes include the frozen status and singleton methods. However
41
+ the tainted status is always copied.
42
+
8
43
 
9
44
  ## Installation
10
45
 
@@ -20,6 +55,11 @@ Or install it yourself as:
20
55
 
21
56
  $ gem install safe_clone
22
57
 
58
+ The safe_dup gem is at: ( https://rubygems.org/gems/safe_dup )
59
+ <br>The safe_clone gem is at: ( https://rubygems.org/gems/safe_clone )
60
+ <br>The full_dup gem is at: ( https://rubygems.org/gems/full_dup )
61
+ <br>The full_clone gem is at: ( https://rubygems.org/gems/full_clone )
62
+
23
63
  ## Usage
24
64
 
25
65
  require 'safe_clone'
@@ -36,6 +76,15 @@ instead of
36
76
  foo = my_object
37
77
  end
38
78
 
79
+ It is actually pretty easy to determine where safe\_clone needs to be used. It's
80
+ those places where the clone method is generating unwanted exceptions.
81
+
82
+ ## Demo
83
+
84
+ A test bed for experimenting with the safe_clone gem is available as a rake task:
85
+
86
+ $ rake console
87
+
39
88
  ## Performance
40
89
  A reasonable question to raise is "How does safe clone compare with just
41
90
  catching the exception and handling it?" The benchmark sets a a realistic
@@ -71,12 +120,7 @@ Benchmark.ips do |x|
71
120
  end
72
121
  ```
73
122
 
74
- Ruby Version:
75
-
76
- ruby 1.9.3p484 (2013-11-22) [i386-mingw32]
77
-
78
- Results:
79
-
123
+ #### Results: ruby 1.9.3p484 (2013-11-22) [i386-mingw32]
80
124
  C:\Sites\safe_clone>ruby bench\bench.rb
81
125
  Warming up --------------------------------------
82
126
  Clone with standard clone method
@@ -93,12 +137,7 @@ Results:
93
137
  Clone with the safe clone method: 534740.1 i/s
94
138
  Clone with standard clone method: 12956.6 i/s - 41.27x slower
95
139
 
96
- Ruby Version:
97
-
98
- ruby 2.1.6p336 (2015-04-13 revision 50298) [i386-mingw32]
99
-
100
- Results:
101
-
140
+ #### Results: ruby 2.1.6p336 (2015-04-13 revision 50298) [i386-mingw32]
102
141
  C:\Sites\safe_clone>ruby bench\bench.rb
103
142
  Warming up --------------------------------------
104
143
  Clone with standard clone method
@@ -115,12 +154,7 @@ Results:
115
154
  Clone with the safe clone method: 569236.4 i/s
116
155
  Clone with standard clone method: 54491.3 i/s - 10.45x slower
117
156
 
118
- Ruby Version:
119
-
120
- ruby 2.2.3p173 (2015-08-18 revision 51636) [i386-cygwin]
121
-
122
- Results:
123
-
157
+ #### Results: ruby 2.2.3p173 (2015-08-18 revision 51636) [i386-cygwin]
124
158
  Peter Camilleri@NCC1701G /cygdrive/c/sites/safe_clone
125
159
  $ ruby bench/bench.rb
126
160
  Warming up --------------------------------------
@@ -143,8 +177,16 @@ Overall: Shorter code _and_ faster. Winner, winner, chicken dinner!
143
177
 
144
178
  ## Contributing
145
179
 
146
- 1. Fork it
180
+ #### Plan A
181
+
182
+ 1. Fork it ( https://github.com/PeterCamilleri/safe_clone/fork )
147
183
  2. Create your feature branch (`git checkout -b my-new-feature`)
148
184
  3. Commit your changes (`git commit -am 'Add some feature'`)
149
185
  4. Push to the branch (`git push origin my-new-feature`)
150
- 5. Create new Pull Request
186
+ 5. Create a new Pull Request
187
+
188
+ #### Plan B
189
+
190
+ Go to the GitHub repository and raise an issue calling attention to some
191
+ aspect that could use some TLC or a suggestion or an idea.
192
+
data/irbt.rb ADDED
@@ -0,0 +1,20 @@
1
+ # coding: utf-8
2
+ # An IRB + safe_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 safe_clone loaded."
9
+
10
+ if ARGV[0] == 'local'
11
+ require_relative 'lib/safe_clone'
12
+ puts "safe_clone loaded locally: #{SafeClone::VERSION}"
13
+
14
+ ARGV.shift
15
+ else
16
+ require 'safe_clone'
17
+ puts "safe_clone loaded from gem: #{SafeClone::VERSION}"
18
+ end
19
+
20
+ IRB.start
@@ -1,3 +1,3 @@
1
1
  module SafeClone
2
- VERSION = "0.0.4"
2
+ VERSION = "0.0.5"
3
3
  end
data/lib/safe_clone.rb CHANGED
@@ -1,4 +1,4 @@
1
- require "safe_clone/version"
1
+ require_relative "safe_clone/version"
2
2
 
3
3
  class Object
4
4
  #By default, reference types use the clone method.
@@ -8,7 +8,12 @@ Rake::TestTask.new do |t|
8
8
  t.verbose = false
9
9
  end
10
10
 
11
- desc "What version of full_clone is this?"
11
+ desc "Fire up an IRB session with safe_clone preloaded."
12
+ task :console do
13
+ system "ruby irbt.rb local"
14
+ end
15
+
16
+ desc "What version of safe_clone is this?"
12
17
  task :vers do |t|
13
18
  puts
14
19
  puts "safe_clone version = #{SafeClone::VERSION}"
data/safe_clone.gemspec CHANGED
@@ -18,7 +18,7 @@ Gem::Specification.new do |spec|
18
18
  spec.require_paths = ["lib"]
19
19
 
20
20
  spec.add_development_dependency 'minitest_visible', ">= 0.1.0"
21
-
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', "~> 5"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: safe_clone
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
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-02-18 00:00:00.000000000 Z
11
+ date: 2016-05-20 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
@@ -77,10 +91,11 @@ files:
77
91
  - Gemfile
78
92
  - LICENSE.txt
79
93
  - README.md
80
- - Rakefile
81
94
  - bench/bench.rb
95
+ - irbt.rb
82
96
  - lib/safe_clone.rb
83
97
  - lib/safe_clone/version.rb
98
+ - rakefile.rb
84
99
  - safe_clone.gemspec
85
100
  - test/safe_clone_tests.rb
86
101
  homepage: http://teuthida-technologies.com/