safe_clone 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,7 @@
1
1
  ---
2
- !binary "U0hBMQ==":
3
- metadata.gz: !binary |-
4
- ZjYyZTMxZmFkMzBkOGYzYjA4OTAxMmI4Mjc0NTgzODE1ODZkYzdiOQ==
5
- data.tar.gz: !binary |-
6
- NTE2OTc1ZjViZmM2YzhiMDcwNzRlZjcyMTlhYjllZjRhODgxMjE4ZQ==
2
+ SHA1:
3
+ metadata.gz: c270e1501f513581f54e24e995dac45a3674108b
4
+ data.tar.gz: a0e903a567fb2cea836e8a9813dfed29a6004b34
7
5
  SHA512:
8
- metadata.gz: !binary |-
9
- MzJhZjE5MzBjYzliNDlmM2JjOTUwZDIxMGJiYzE1NWZhMzZhYjA4MDgwNmQx
10
- ZjgzYzYwODcxMGE3OWM4OTdmMjE4NGJmZDFhNmRhZGJhYzRmYmYyYzA5ZWUz
11
- Yjk1ZjliMTYyZDA3NGIzYjBkMDA4MTZlOGYwZGMzODA2NjBlOTg=
12
- data.tar.gz: !binary |-
13
- NDczYjU3MWMwNjA0MmQ3Njk3Y2U2MjA1MjYzN2E3NjYyYjRlYmI5ZTIwZmE3
14
- MTk2N2MxZjg1NGEwYWYyZmY2YjIyNGJlOWQyMDJiMmM0MjBiMTc2ZTU1NTFi
15
- MTAwM2ZhMzA3ODNhNjIxMGM1NTliNDYxZTZmYmNhMDUwYjRlZmI=
6
+ metadata.gz: 57187deeb43c0dcc62f6cc503a596445e834aae18d3d378ac15a927e1f88a2cb58282d91a472597327c78eb81b744b3d4b29b728a354ac849d01d794c2e527e6
7
+ data.tar.gz: 61af8a6ea50fb4bbe924ca3e0e45a54a6802c2eae32b36cc666db9389d450777769414ef0f7b3728e9f67ac36aad305c89d5a636ab2c573f5c962fe806ea2b5b
data/README.md CHANGED
@@ -1,10 +1,10 @@
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 ant exception
5
- when sent to un-clonable objects like 42 or true. These simply return
6
- themselves and this is correct because those types of objects do not NEED
7
- to be cloned. Instead of blowing up in a hissy fit, the code just works!
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!
8
8
 
9
9
  ## Installation
10
10
 
@@ -30,8 +30,80 @@ then, in those places where regular clone was problematic, use:
30
30
 
31
31
  instead of
32
32
 
33
- foo = my_object.clone
33
+ begin
34
+ foo = my_object.clone
35
+ rescue TypeError
36
+ foo = my_object
37
+ end
34
38
 
39
+ Further, when benchmarked under
40
+
41
+ ruby 1.9.3p484 (2013-11-22) [i386-mingw32]
42
+
43
+ the following results are observed:
44
+
45
+ C:\Sites\safe_clone>ruby bench\bench.rb
46
+ Warming up --------------------------------------
47
+ Clone with standard clone method
48
+ 6.424k i/100ms
49
+ Clone with the safe clone method
50
+ 97.476k i/100ms
51
+ Calculating -------------------------------------
52
+ Clone with standard clone method
53
+ 72.460k (± 8.5%) i/s - 366.168k
54
+ Clone with the safe clone method
55
+ 4.690M (±33.3%) i/s - 20.957M
56
+
57
+ Comparison:
58
+ Clone with the safe clone method: 4690305.8 i/s
59
+ Clone with standard clone method: 72460.2 i/s - 64.73x slower
60
+
61
+ With:
62
+
63
+ ruby 2.1.6p336 (2015-04-13 revision 50298) [i386-mingw32]
64
+
65
+ the following results are observed:
66
+
67
+ C:\Sites\safe_clone>ruby bench\bench.rb
68
+ Warming up --------------------------------------
69
+ Clone with standard clone method
70
+ 20.607k i/100ms
71
+ Clone with the safe clone method
72
+ 107.236k i/100ms
73
+ Calculating -------------------------------------
74
+ Clone with standard clone method
75
+ 298.041k (±11.1%) i/s - 1.484M
76
+ Clone with the safe clone method
77
+ 4.934M (±34.5%) i/s - 22.091M
78
+
79
+ Comparison:
80
+ Clone with the safe clone method: 4933871.9 i/s
81
+ Clone with standard clone method: 298041.4 i/s - 16.55x slower
82
+
83
+ And with:
84
+
85
+ ruby 2.2.3p173 (2015-08-18 revision 51636) [i386-cygwin]
86
+
87
+ we get:
88
+
89
+ $ ruby bench/bench.rb
90
+ Warming up --------------------------------------
91
+ Clone with standard clone method
92
+ 15.876k i/100ms
93
+ Clone with the safe clone method
94
+ 70.638k i/100ms
95
+ Calculating -------------------------------------
96
+ Clone with standard clone method
97
+ 219.593k (±10.7%) i/s - 1.095M
98
+ Clone with the safe clone method
99
+ 4.525M (± 0.9%) i/s - 22.675M
100
+
101
+ Comparison:
102
+ Clone with the safe clone method: 4524862.8 i/s
103
+ Clone with standard clone method: 219593.0 i/s - 20.61x slower
104
+
105
+
106
+ Overall: Shorter code _and_ faster. Winner, winner, chicken dinner!
35
107
 
36
108
  ## Contributing
37
109
 
data/bench/bench.rb ADDED
@@ -0,0 +1,22 @@
1
+ require "benchmark/ips"
2
+ require 'safe_clone'
3
+
4
+ def use_clone
5
+ x = 42
6
+ y = begin
7
+ x.clone
8
+ rescue
9
+ x
10
+ end
11
+ end
12
+
13
+ def use_safe_clone
14
+ x = 42
15
+ y = x.safe_clone
16
+ end
17
+
18
+ Benchmark.ips do |x|
19
+ x.report("Clone with standard clone method") { use_clone }
20
+ x.report("Clone with the safe clone method") { use_safe_clone }
21
+ x.compare!
22
+ end
@@ -1,3 +1,3 @@
1
1
  module SafeClone
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
data/lib/safe_clone.rb CHANGED
@@ -1,38 +1,19 @@
1
1
  require "safe_clone/version"
2
2
 
3
- module SafeClone
4
- def safe_clone
5
- self
6
- end
7
- end
8
-
9
3
  class Object
10
- def safe_clone
11
- self.clone
12
- end
13
- end
14
-
15
- class Numeric
16
- include SafeClone
17
- end
18
-
19
- class NilClass
20
- include SafeClone
4
+ #By default, reference types use the clone method.
5
+ def safe_clone; self.clone; end
21
6
  end
22
7
 
23
- class TrueClass
24
- include SafeClone
25
- end
26
-
27
- class FalseClass
28
- include SafeClone
29
- end
30
-
31
- class Symbol
32
- include SafeClone
33
- end
34
-
35
- class Regexp
36
- include SafeClone
8
+ #For value types, just return self!
9
+ module SafeClone
10
+ def safe_clone; self; end
37
11
  end
38
12
 
13
+ #Update the Ruby value types.
14
+ class Numeric; include SafeClone; end
15
+ class NilClass; include SafeClone; end
16
+ class TrueClass; include SafeClone; end
17
+ class FalseClass; include SafeClone; end
18
+ class Symbol; include SafeClone; end
19
+ class Regexp; include SafeClone; end
data/safe_clone.gemspec CHANGED
@@ -14,12 +14,13 @@ 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
 
20
+ spec.add_development_dependency 'minitest_visible', ">= 0.0.2"
21
+
21
22
  spec.add_development_dependency "bundler", "~> 1.3"
22
23
  spec.add_development_dependency "rake"
23
- spec.add_development_dependency 'minitest', "~> 4.7.5"
24
+ spec.add_development_dependency 'minitest', "~> 5"
24
25
 
25
26
  end
@@ -1,23 +1,15 @@
1
1
  # coding: utf-8
2
2
 
3
3
  require_relative '../lib/safe_clone'
4
+ gem 'minitest'
4
5
  require 'minitest/autorun'
6
+ require 'minitest_visible'
5
7
 
6
8
  #Test the monkey patches applied to the Object class.
7
- class SafeCloneTester < MiniTest::Unit::TestCase
9
+ class SafeCloneTester < Minitest::Test
8
10
 
9
- #Special initialize to track rake progress.
10
- def initialize(*all)
11
- $do_this_only_one_time = "" unless defined? $do_this_only_one_time
12
-
13
- if $do_this_only_one_time != __FILE__
14
- puts
15
- puts "Running test file: #{File.split(__FILE__)[1]}"
16
- $do_this_only_one_time = __FILE__
17
- end
18
-
19
- super(*all)
20
- end
11
+ #Track mini-test progress.
12
+ MinitestVisible.track self, __FILE__
21
13
 
22
14
  def test_for_safe_value_cloning
23
15
  assert_equal((6).safe_clone, 6)
metadata CHANGED
@@ -1,57 +1,71 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: safe_clone
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter Camilleri
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-11-04 00:00:00.000000000 Z
11
+ date: 2016-02-16 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: minitest_visible
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 0.0.2
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 0.0.2
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: bundler
15
29
  requirement: !ruby/object:Gem::Requirement
16
30
  requirements:
17
- - - ~>
31
+ - - "~>"
18
32
  - !ruby/object:Gem::Version
19
33
  version: '1.3'
20
34
  type: :development
21
35
  prerelease: false
22
36
  version_requirements: !ruby/object:Gem::Requirement
23
37
  requirements:
24
- - - ~>
38
+ - - "~>"
25
39
  - !ruby/object:Gem::Version
26
40
  version: '1.3'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: rake
29
43
  requirement: !ruby/object:Gem::Requirement
30
44
  requirements:
31
- - - ! '>='
45
+ - - ">="
32
46
  - !ruby/object:Gem::Version
33
47
  version: '0'
34
48
  type: :development
35
49
  prerelease: false
36
50
  version_requirements: !ruby/object:Gem::Requirement
37
51
  requirements:
38
- - - ! '>='
52
+ - - ">="
39
53
  - !ruby/object:Gem::Version
40
54
  version: '0'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: minitest
43
57
  requirement: !ruby/object:Gem::Requirement
44
58
  requirements:
45
- - - ~>
59
+ - - "~>"
46
60
  - !ruby/object:Gem::Version
47
- version: 4.7.5
61
+ version: '5'
48
62
  type: :development
49
63
  prerelease: false
50
64
  version_requirements: !ruby/object:Gem::Requirement
51
65
  requirements:
52
- - - ~>
66
+ - - "~>"
53
67
  - !ruby/object:Gem::Version
54
- version: 4.7.5
68
+ version: '5'
55
69
  description: A safer version of the clone method that avoids unnecessary exceptions.
56
70
  email:
57
71
  - peter.c.camilleri@gmail.com
@@ -59,11 +73,12 @@ executables: []
59
73
  extensions: []
60
74
  extra_rdoc_files: []
61
75
  files:
62
- - .gitignore
76
+ - ".gitignore"
63
77
  - Gemfile
64
78
  - LICENSE.txt
65
79
  - README.md
66
80
  - Rakefile
81
+ - bench/bench.rb
67
82
  - lib/safe_clone.rb
68
83
  - lib/safe_clone/version.rb
69
84
  - safe_clone.gemspec
@@ -78,17 +93,17 @@ require_paths:
78
93
  - lib
79
94
  required_ruby_version: !ruby/object:Gem::Requirement
80
95
  requirements:
81
- - - ! '>='
96
+ - - ">="
82
97
  - !ruby/object:Gem::Version
83
98
  version: '0'
84
99
  required_rubygems_version: !ruby/object:Gem::Requirement
85
100
  requirements:
86
- - - ! '>='
101
+ - - ">="
87
102
  - !ruby/object:Gem::Version
88
103
  version: '0'
89
104
  requirements: []
90
105
  rubyforge_project:
91
- rubygems_version: 2.1.4
106
+ rubygems_version: 2.2.2
92
107
  signing_key:
93
108
  specification_version: 4
94
109
  summary: A safer version of the clone method.