ice_nine 0.10.0 → 0.11.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -15
- data/.travis.yml +8 -7
- data/Gemfile +10 -0
- data/Gemfile.devtools +5 -4
- data/README.md +4 -24
- data/benchmarks/speed.rb +4 -2
- data/config/flay.yml +2 -2
- data/config/flog.yml +1 -1
- data/config/reek.yml +9 -2
- data/config/rubocop.yml +0 -1
- data/ice_nine.gemspec +1 -0
- data/lib/ice_nine.rb +24 -9
- data/lib/ice_nine/core_ext/object.rb +17 -3
- data/lib/ice_nine/freezer.rb +43 -3
- data/lib/ice_nine/freezer/array.rb +6 -8
- data/lib/ice_nine/freezer/false_class.rb +2 -2
- data/lib/ice_nine/freezer/hash.rb +22 -9
- data/lib/ice_nine/freezer/hash/state.rb +3 -3
- data/lib/ice_nine/freezer/module.rb +2 -2
- data/lib/ice_nine/freezer/nil_class.rb +2 -2
- data/lib/ice_nine/freezer/no_freeze.rb +5 -6
- data/lib/ice_nine/freezer/numeric.rb +2 -2
- data/lib/ice_nine/freezer/object.rb +7 -8
- data/lib/ice_nine/freezer/range.rb +7 -8
- data/lib/ice_nine/freezer/rubinius.rb +2 -2
- data/lib/ice_nine/freezer/struct.rb +2 -2
- data/lib/ice_nine/freezer/symbol.rb +2 -2
- data/lib/ice_nine/freezer/true_class.rb +2 -2
- data/lib/ice_nine/support/recursion_guard.rb +48 -28
- data/lib/ice_nine/version.rb +3 -3
- data/spec/integration/ice_nine/class_methods/deep_freeze_bang_spec.rb +21 -0
- data/spec/integration/ice_nine/class_methods/deep_freeze_spec.rb +5 -254
- data/spec/shared/array_deep_freeze_shared_spec.rb +9 -0
- data/spec/shared/hash_deep_freeze_shared_spec.rb +23 -0
- data/spec/shared/ice_nine_deep_freeze_shared_spec.rb +263 -0
- data/spec/shared/no_freeze_deep_freeze_shared_spec.rb +19 -0
- data/spec/shared/object_deep_freeze_shared_spec.rb +19 -0
- data/spec/shared/range_deep_freeze_shared_spec.rb +13 -0
- data/spec/unit/ice_nine/class_methods/deep_freeze_bang_spec.rb +24 -0
- data/spec/unit/ice_nine/class_methods/deep_freeze_spec.rb +6 -19
- data/spec/unit/ice_nine/core_ext/object/deep_freeze_bang_spec.rb +24 -0
- data/spec/unit/ice_nine/core_ext/object/deep_freeze_spec.rb +3 -9
- data/spec/unit/ice_nine/freezer/array/class_methods/deep_freeze_spec.rb +0 -14
- data/spec/unit/ice_nine/freezer/false_class/class_methods/deep_freeze_spec.rb +1 -7
- data/spec/unit/ice_nine/freezer/hash/class_methods/deep_freeze_spec.rb +1 -29
- data/spec/unit/ice_nine/freezer/module/class_methods/deep_freeze_spec.rb +1 -7
- data/spec/unit/ice_nine/freezer/nil_class/class_methods/deep_freeze_spec.rb +1 -7
- data/spec/unit/ice_nine/freezer/no_freeze/class_methods/deep_freeze_spec.rb +3 -23
- data/spec/unit/ice_nine/freezer/numeric/class_methods/deep_freeze_spec.rb +3 -12
- data/spec/unit/ice_nine/freezer/object/class_methods/deep_freeze_spec.rb +0 -18
- data/spec/unit/ice_nine/freezer/range/class_methods/deep_freeze_spec.rb +0 -18
- data/spec/unit/ice_nine/freezer/struct/class_methods/deep_freeze_spec.rb +1 -11
- data/spec/unit/ice_nine/freezer/symbol/class_methods/deep_freeze_spec.rb +1 -7
- data/spec/unit/ice_nine/freezer/true_class/class_methods/deep_freeze_spec.rb +1 -7
- data/spec/unit/ice_nine/recursion_guard/frozen/guard_spec.rb +28 -0
- data/spec/unit/ice_nine/recursion_guard/object_set/guard_spec.rb +31 -0
- data/spec/unit/object/deep_freeze_spec.rb +3 -9
- metadata +54 -41
- data/spec/unit/ice_nine/recursion_guard/class_methods/guard_spec.rb +0 -33
checksums.yaml
CHANGED
@@ -1,15 +1,7 @@
|
|
1
|
-
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
metadata.gz: !binary |-
|
9
|
-
NGFlY2QxNDNmOWE2MDBjYmUyMzE5ZTU2NzE4ZmQxNDQ1OTMzNTFkZmFlNDJj
|
10
|
-
YjlkODVhNWI3MmFiYzBmZTA0ZTViZjg0YmJjZDNhMmZjZDk4NTA1MzQzYzdm
|
11
|
-
YWI3N2QzOTZkMGQwMDU5ODIxMmFlOWNjMzJmMzlkOGY3YzRlMzA=
|
12
|
-
data.tar.gz: !binary |-
|
13
|
-
YzQ5ZWY3NjQ4ZTJjNjYzZjMxZGI4Nzk3MGI1OGEzZmQ2NjQ5ZDExOTU0NDM1
|
14
|
-
OTRlNWY2ZDFiMTEzNDhkNTcwZmE4NTc4NTE2NWU1NGJjM2M2YTg4MDdjM2Q4
|
15
|
-
N2JiMjlmYzM2Mzk3YjQ3YTJkNzBkODdjM2JlNzMwNzNmNDc5ODU=
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 1f7071ad57746e7737cabbd2b77cb04f716d0338
|
4
|
+
data.tar.gz: f042013897a106e927f81857121b7ef2c2d118fd
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 4a8b26471b093168d8b769ee344b8b9e47c579d321f2f604438b79246899868089ededcec51238fa59727ae3bbc5c46d13fb7a3c5769ab2cc48815ade54a7d9c
|
7
|
+
data.tar.gz: 45623b5d9fa123b9901167b648121643dea9b055652a476c1af1be9ed4f8a47ab669c7f37e818f8da1717d5a6aa4bd436db7616a2427f5fbab92ee398f06b2d1
|
data/.travis.yml
CHANGED
@@ -1,20 +1,21 @@
|
|
1
1
|
language: ruby
|
2
|
+
cache: bundler
|
2
3
|
bundler_args: --without yard guard benchmarks
|
3
|
-
script: "bundle exec rake ci"
|
4
|
+
script: "bundle exec rake ci:metrics"
|
4
5
|
rvm:
|
5
6
|
- 1.9.3
|
6
7
|
- 2.0.0
|
7
8
|
- ruby-head
|
8
|
-
- rbx
|
9
|
+
- rbx
|
9
10
|
matrix:
|
10
11
|
include:
|
11
12
|
- rvm: jruby-19mode
|
12
|
-
env: JRUBY_OPTS="$JRUBY_OPTS --debug"
|
13
|
+
env: JRUBY_OPTS="$JRUBY_OPTS --debug" # for simplecov
|
14
|
+
- rvm: jruby-20mode
|
15
|
+
env: JRUBY_OPTS="$JRUBY_OPTS --debug" # for simplecov
|
13
16
|
- rvm: jruby-head
|
14
|
-
env: JRUBY_OPTS="$JRUBY_OPTS --debug"
|
15
|
-
|
16
|
-
- rvm: ruby-head # travis broken
|
17
|
-
- rvm: rbx-19mode # mutant fails
|
17
|
+
env: JRUBY_OPTS="$JRUBY_OPTS --debug" # for simplecov
|
18
|
+
fast_finish: true
|
18
19
|
notifications:
|
19
20
|
irc:
|
20
21
|
channels:
|
data/Gemfile
CHANGED
@@ -4,6 +4,16 @@ source 'https://rubygems.org'
|
|
4
4
|
|
5
5
|
gemspec
|
6
6
|
|
7
|
+
platform :rbx do
|
8
|
+
gem 'racc', '~> 1.4.10'
|
9
|
+
gem 'rubinius-coverage', '~> 2.0.3'
|
10
|
+
gem 'rubysl-bigdecimal', '~> 2.0.2'
|
11
|
+
gem 'rubysl-coverage', '~> 2.0.3'
|
12
|
+
gem 'rubysl-json', '~> 2.0.2'
|
13
|
+
gem 'rubysl-logger', '~> 2.0.0'
|
14
|
+
gem 'rubysl-singleton', '~> 2.0.0'
|
15
|
+
end
|
16
|
+
|
7
17
|
group :development, :test do
|
8
18
|
gem 'devtools', git: 'https://github.com/rom-rb/devtools.git'
|
9
19
|
end
|
data/Gemfile.devtools
CHANGED
@@ -30,16 +30,17 @@ group :guard do
|
|
30
30
|
end
|
31
31
|
|
32
32
|
group :metrics do
|
33
|
-
gem 'coveralls', '~> 0.
|
33
|
+
gem 'coveralls', '~> 0.7.0'
|
34
34
|
gem 'flay', '~> 2.4.0'
|
35
|
-
gem 'flog', '~> 4.
|
35
|
+
gem 'flog', '~> 4.2.0'
|
36
36
|
gem 'reek', '~> 1.3.2'
|
37
|
-
gem 'rubocop', '~> 0.
|
37
|
+
gem 'rubocop', '~> 0.14.1'
|
38
38
|
gem 'simplecov', '~> 0.7.1'
|
39
39
|
gem 'yardstick', '~> 0.9.7', git: 'https://github.com/dkubb/yardstick.git'
|
40
40
|
|
41
41
|
platforms :ruby_19, :ruby_20 do
|
42
|
-
gem 'mutant', git: 'https://github.com/mbj/mutant.git'
|
42
|
+
gem 'mutant', '~> 0.3.0.rc3', git: 'https://github.com/mbj/mutant.git'
|
43
|
+
gem 'unparser', '~> 0.1.3', git: 'https://github.com/mbj/unparser.git'
|
43
44
|
gem 'yard-spellcheck', '~> 0.1.5'
|
44
45
|
end
|
45
46
|
end
|
data/README.md
CHANGED
@@ -19,42 +19,22 @@ Examples
|
|
19
19
|
--------
|
20
20
|
|
21
21
|
```ruby
|
22
|
-
#
|
22
|
+
# Deep freezes most kinds of objects
|
23
23
|
hash = IceNine.deep_freeze('a' => '1')
|
24
24
|
array = IceNine.deep_freeze([ 'a', 'b', 'c' ])
|
25
25
|
range = IceNine.deep_freeze('a'..'z')
|
26
26
|
struct = IceNine.deep_freeze(Struct.new(:a, :b).new('a', 'b'))
|
27
27
|
object = IceNine.deep_freeze(Object.new)
|
28
|
-
user = IceNine.deep_freeze(
|
28
|
+
user = IceNine.deep_freeze(User.new(name: 'dkubb'))
|
29
29
|
|
30
30
|
# Add core extension for Object#deep_freeze (not required by default)
|
31
31
|
require 'ice_nine/core_ext/object'
|
32
32
|
|
33
33
|
object = Object.new
|
34
34
|
object.deep_freeze
|
35
|
-
```
|
36
|
-
|
37
|
-
Installation
|
38
|
-
------------
|
39
|
-
|
40
|
-
With Rubygems:
|
41
|
-
|
42
|
-
```bash
|
43
|
-
$ gem install ice_nine
|
44
|
-
$ irb -rubygems
|
45
|
-
>> require 'ice_nine'
|
46
|
-
=> true
|
47
|
-
```
|
48
|
-
|
49
|
-
With git and local working copy:
|
50
35
|
|
51
|
-
|
52
|
-
|
53
|
-
$ cd ice_nine
|
54
|
-
$ rake install
|
55
|
-
$ irb -rubygems
|
56
|
-
>> require 'ice_nine'
|
57
|
-
=> true
|
36
|
+
# Faster deep freeze that skips walking frozen objects
|
37
|
+
object = IceNine.deep_freeze!(Object.new)
|
58
38
|
```
|
59
39
|
|
60
40
|
Contributing
|
data/benchmarks/speed.rb
CHANGED
@@ -25,8 +25,10 @@ def self.nested(depth, width, array_length)
|
|
25
25
|
hash
|
26
26
|
end
|
27
27
|
|
28
|
-
hash = nested(3, 5,
|
28
|
+
hash = nested(3, 5, 500)
|
29
|
+
hash2 = nested(3, 5, 500)
|
29
30
|
|
30
31
|
RBench.run do
|
31
|
-
report(
|
32
|
+
report('deep_freeze') { IceNine.deep_freeze(hash) }
|
33
|
+
report('deep_freeze!') { IceNine.deep_freeze!(hash2) }
|
32
34
|
end
|
data/config/flay.yml
CHANGED
@@ -1,3 +1,3 @@
|
|
1
1
|
---
|
2
|
-
threshold:
|
3
|
-
total_score:
|
2
|
+
threshold: 8
|
3
|
+
total_score: 50.0
|
data/config/flog.yml
CHANGED
@@ -1,2 +1,2 @@
|
|
1
1
|
---
|
2
|
-
threshold:
|
2
|
+
threshold: 5.5
|
data/config/reek.yml
CHANGED
@@ -23,7 +23,8 @@ DuplicateMethodCall:
|
|
23
23
|
allow_calls: []
|
24
24
|
FeatureEnvy:
|
25
25
|
enabled: true
|
26
|
-
exclude:
|
26
|
+
exclude:
|
27
|
+
- IceNine::RecursionGuard::Frozen#guard
|
27
28
|
IrresponsibleModule:
|
28
29
|
enabled: true
|
29
30
|
exclude: []
|
@@ -61,9 +62,14 @@ TooManyMethods:
|
|
61
62
|
TooManyStatements:
|
62
63
|
enabled: true
|
63
64
|
exclude:
|
65
|
+
- IceNine::Freezer::Hash#self.freeze_key_value_pairs
|
66
|
+
- IceNine::Freezer::Hash#self.guarded_deep_freeze
|
64
67
|
- IceNine::Freezer::Hash#self.deep_freeze
|
68
|
+
- IceNine::Freezer::Object#self.guarded_deep_freeze
|
65
69
|
- IceNine::Freezer::Range#self.deep_freeze
|
70
|
+
- IceNine::Freezer::Range#self.guarded_deep_freeze
|
66
71
|
- IceNine::RecursionGuard#guard
|
72
|
+
- IceNine::RecursionGuard::ObjectSet#guard
|
67
73
|
- each
|
68
74
|
max_statements: 2
|
69
75
|
UncommunicativeMethodName:
|
@@ -102,5 +108,6 @@ UnusedParameters:
|
|
102
108
|
exclude: []
|
103
109
|
UtilityFunction:
|
104
110
|
enabled: true
|
105
|
-
exclude:
|
111
|
+
exclude:
|
112
|
+
- IceNine::RecursionGuard::Frozen#guard
|
106
113
|
max_helper_calls: 0
|
data/config/rubocop.yml
CHANGED
data/ice_nine.gemspec
CHANGED
@@ -10,6 +10,7 @@ Gem::Specification.new do |gem|
|
|
10
10
|
gem.description = 'Deep Freeze Ruby Objects'
|
11
11
|
gem.summary = gem.description
|
12
12
|
gem.homepage = 'https://github.com/dkubb/ice_nine'
|
13
|
+
gem.license = 'MIT'
|
13
14
|
|
14
15
|
gem.require_paths = %w[lib]
|
15
16
|
gem.files = `git ls-files`.split($/)
|
data/lib/ice_nine.rb
CHANGED
@@ -1,7 +1,5 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
|
-
require 'set'
|
4
|
-
|
5
3
|
require 'ice_nine/support/recursion_guard'
|
6
4
|
|
7
5
|
require 'ice_nine/freezer'
|
@@ -32,16 +30,33 @@ module IceNine
|
|
32
30
|
# object = IceNine.deep_freeze(object)
|
33
31
|
#
|
34
32
|
# @param [Object] object
|
35
|
-
# @param [RecursionGuard] recursion_guard
|
36
33
|
#
|
37
34
|
# @return [Object]
|
38
35
|
#
|
39
36
|
# @api public
|
40
|
-
def self.deep_freeze(object
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
37
|
+
def self.deep_freeze(object)
|
38
|
+
Freezer.deep_freeze(object)
|
39
|
+
end
|
40
|
+
|
41
|
+
# Deep Freeze an object
|
42
|
+
#
|
43
|
+
# This method uses a faster algorithm that will assume objects that are
|
44
|
+
# `frozen?` do not need to be frozen deeply. Use this method when `object`
|
45
|
+
# contains no shallowly frozen objects that need deep freezing.
|
46
|
+
#
|
47
|
+
# @example
|
48
|
+
# IceNine.deep_freeze!(['a', 'b']).map(&:frozen?) # [true, true]
|
49
|
+
#
|
50
|
+
# @example
|
51
|
+
# IceNine.deep_freeze!(['a', 'b'].freeze).map(&:frozen?) # [false, false]
|
52
|
+
#
|
53
|
+
# @param [Object] object
|
54
|
+
#
|
55
|
+
# @return [Object]
|
56
|
+
#
|
57
|
+
# @api public
|
58
|
+
def self.deep_freeze!(object)
|
59
|
+
Freezer.deep_freeze!(object)
|
45
60
|
end
|
46
61
|
|
47
|
-
end #
|
62
|
+
end # IceNine
|
@@ -20,9 +20,23 @@ module IceNine
|
|
20
20
|
IceNine.deep_freeze(self)
|
21
21
|
end
|
22
22
|
|
23
|
-
|
24
|
-
|
25
|
-
|
23
|
+
# Deep freeze an object
|
24
|
+
#
|
25
|
+
# @see IceNine.deep_freeze!
|
26
|
+
#
|
27
|
+
# @example
|
28
|
+
# object = object.deep_freeze!
|
29
|
+
#
|
30
|
+
# @return [self]
|
31
|
+
#
|
32
|
+
# @api public
|
33
|
+
def deep_freeze!
|
34
|
+
IceNine.deep_freeze!(self)
|
35
|
+
end
|
36
|
+
|
37
|
+
end # Object
|
38
|
+
end # CoreExt
|
39
|
+
end # IceNine
|
26
40
|
|
27
41
|
# Add Object#deep_freeze
|
28
42
|
Object.instance_eval { include IceNine::CoreExt::Object }
|
data/lib/ice_nine/freezer.rb
CHANGED
@@ -29,6 +29,32 @@ module IceNine
|
|
29
29
|
@freezer_cache[mod]
|
30
30
|
end
|
31
31
|
|
32
|
+
# Deep freeze an object with a particular Freezer
|
33
|
+
#
|
34
|
+
# @see IceNine.deep_freeze
|
35
|
+
#
|
36
|
+
# @param [Object] object
|
37
|
+
#
|
38
|
+
# @return [Object]
|
39
|
+
#
|
40
|
+
# @api public
|
41
|
+
def self.deep_freeze(object)
|
42
|
+
guarded_deep_freeze(object, RecursionGuard::ObjectSet.new)
|
43
|
+
end
|
44
|
+
|
45
|
+
# Deep freeze an object with a particular Freezer
|
46
|
+
#
|
47
|
+
# @see IceNine.deep_freeze!
|
48
|
+
#
|
49
|
+
# @param [Object] object
|
50
|
+
#
|
51
|
+
# @return [Object]
|
52
|
+
#
|
53
|
+
# @api public
|
54
|
+
def self.deep_freeze!(object)
|
55
|
+
guarded_deep_freeze(object, RecursionGuard::Frozen.new)
|
56
|
+
end
|
57
|
+
|
32
58
|
# Find a Freezer descendant by name
|
33
59
|
#
|
34
60
|
# @param [String] name
|
@@ -62,9 +88,23 @@ module IceNine
|
|
62
88
|
const_get(namespace) if const_defined?(namespace, nil)
|
63
89
|
end
|
64
90
|
|
91
|
+
# Deep freeze an object with a particular Freezer and RecursionGuard
|
92
|
+
#
|
93
|
+
# @param [Object] object
|
94
|
+
# @param [RecursionGuard] recursion_guard
|
95
|
+
#
|
96
|
+
# @return [Object]
|
97
|
+
#
|
98
|
+
# @api private
|
99
|
+
def self.guarded_deep_freeze(object, recursion_guard)
|
100
|
+
recursion_guard.guard(object) do
|
101
|
+
Freezer[object.class].guarded_deep_freeze(object, recursion_guard)
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
65
105
|
class << self
|
66
|
-
protected :const_lookup
|
106
|
+
protected :const_lookup, :guarded_deep_freeze
|
67
107
|
end
|
68
108
|
|
69
|
-
end #
|
70
|
-
end #
|
109
|
+
end # Freezer
|
110
|
+
end # IceNine
|
@@ -16,15 +16,13 @@ module IceNine
|
|
16
16
|
# @param [RecursionGuard] recursion_guard
|
17
17
|
#
|
18
18
|
# @return [Array]
|
19
|
-
|
20
|
-
|
21
|
-
def self.deep_freeze(array, recursion_guard = RecursionGuard.new)
|
19
|
+
def self.guarded_deep_freeze(array, recursion_guard)
|
20
|
+
super
|
22
21
|
array.each do |entry|
|
23
|
-
|
22
|
+
Freezer.guarded_deep_freeze(entry, recursion_guard)
|
24
23
|
end
|
25
|
-
super
|
26
24
|
end
|
27
25
|
|
28
|
-
end #
|
29
|
-
end #
|
30
|
-
end #
|
26
|
+
end # Array
|
27
|
+
end # Freezer
|
28
|
+
end # IceNine
|
@@ -17,17 +17,30 @@ module IceNine
|
|
17
17
|
# @param [RecursionGuard] recursion_guard
|
18
18
|
#
|
19
19
|
# @return [Hash]
|
20
|
+
def self.guarded_deep_freeze(hash, recursion_guard)
|
21
|
+
super
|
22
|
+
default = hash.default_proc || hash.default
|
23
|
+
Freezer.guarded_deep_freeze(default, recursion_guard)
|
24
|
+
freeze_key_value_pairs(hash, recursion_guard)
|
25
|
+
end
|
26
|
+
|
27
|
+
# Handle freezing the key/value pairs
|
20
28
|
#
|
21
|
-
# @
|
22
|
-
|
23
|
-
|
29
|
+
# @param [Hash] hash
|
30
|
+
# @param [RecursionGuard] recursion_guard
|
31
|
+
#
|
32
|
+
# @return [undefined]
|
33
|
+
#
|
34
|
+
# @api private
|
35
|
+
def self.freeze_key_value_pairs(hash, recursion_guard)
|
24
36
|
hash.each do |key, value|
|
25
|
-
|
26
|
-
|
37
|
+
Freezer.guarded_deep_freeze(key, recursion_guard)
|
38
|
+
Freezer.guarded_deep_freeze(value, recursion_guard)
|
27
39
|
end
|
28
|
-
super
|
29
40
|
end
|
30
41
|
|
31
|
-
|
32
|
-
|
33
|
-
end #
|
42
|
+
private_class_method :freeze_key_value_pairs
|
43
|
+
|
44
|
+
end # Hash
|
45
|
+
end # Freezer
|
46
|
+
end # IceNine
|