tins 1.3.1 → 1.3.2
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/VERSION +1 -1
- data/lib/tins/memoize.rb +35 -17
- data/lib/tins/version.rb +1 -1
- data/tests/memoize_test.rb +57 -0
- data/tins.gemspec +3 -3
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a50aca615e8441d3218a594675339c5f9f959ac3
|
4
|
+
data.tar.gz: 7cd19f7ba00d883fa186d9fe579d9bcce1143de2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c6b1b385904afff0782b6cd98f48d75f898a34cc0535291427f1c5e6eedca01f8caf2e474eee39505162a4fb8c10ce901d67aaafa92725e600e92bbed626dd2e
|
7
|
+
data.tar.gz: 18420ef7cb78ed2aa3a2901a44702fd68472e3fa6c0db0cbb42c8a6a396c21b51f157dd7cd73aaeae158f6df0f7c7ce67617036f757fb6ea2fd9adbe0e7be4b6
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.3.
|
1
|
+
1.3.2
|
data/lib/tins/memoize.rb
CHANGED
@@ -13,6 +13,20 @@ module Tins
|
|
13
13
|
__memoize_cache__.clear
|
14
14
|
self
|
15
15
|
end
|
16
|
+
|
17
|
+
def memoize_apply_visibility(id)
|
18
|
+
visibility = instance_eval do
|
19
|
+
case
|
20
|
+
when private_method_defined?(id)
|
21
|
+
:private
|
22
|
+
when protected_method_defined?(id)
|
23
|
+
:protected
|
24
|
+
end
|
25
|
+
end
|
26
|
+
yield
|
27
|
+
ensure
|
28
|
+
visibility and __send__(visibility, id)
|
29
|
+
end
|
16
30
|
end
|
17
31
|
|
18
32
|
class ::Module
|
@@ -25,17 +39,19 @@ module Tins
|
|
25
39
|
include CacheMethods
|
26
40
|
method_ids.each do |method_id|
|
27
41
|
method_id = method_id.to_s.to_sym
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
42
|
+
memoize_apply_visibility method_id do
|
43
|
+
orig_method = instance_method(method_id)
|
44
|
+
__send__(:define_method, method_id) do |*args|
|
45
|
+
mc = __memoize_cache__
|
46
|
+
if mc.key?(method_id) and result = mc[method_id][args]
|
47
|
+
result
|
48
|
+
else
|
49
|
+
(mc[method_id] ||= {})[args] = result = orig_method.bind(self).call(*args)
|
50
|
+
$DEBUG and warn "#{self.class} cached method #{method_id}(#{args.inspect unless args.empty?}) = #{result.inspect} [#{__id__}]"
|
51
|
+
opts[:freeze] and result.freeze
|
52
|
+
end
|
32
53
|
result
|
33
|
-
else
|
34
|
-
(mc[method_id] ||= {})[args] = result = orig_method.bind(self).call(*args)
|
35
|
-
$DEBUG and warn "#{self.class} cached method #{method_id}(#{args.inspect unless args.empty?}) = #{result.inspect} [#{__id__}]"
|
36
|
-
opts[:freeze] and result.freeze
|
37
54
|
end
|
38
|
-
result
|
39
55
|
end
|
40
56
|
end
|
41
57
|
method_ids.size == 1 ? method_ids.first : method_ids
|
@@ -52,16 +68,18 @@ module Tins
|
|
52
68
|
mc = __memoize_cache__
|
53
69
|
function_ids.each do |function_id|
|
54
70
|
function_id = function_id.to_s.to_sym
|
55
|
-
|
56
|
-
|
57
|
-
|
71
|
+
memoize_apply_visibility function_id do
|
72
|
+
orig_function = instance_method(function_id)
|
73
|
+
__send__(:define_method, function_id) do |*args|
|
74
|
+
if mc.key?(function_id) and result = mc[function_id][args]
|
75
|
+
result
|
76
|
+
else
|
77
|
+
(mc[function_id] ||= {})[args] = result = orig_function.bind(self).call(*args)
|
78
|
+
opts[:freeze] and result.freeze
|
79
|
+
$DEBUG and warn "#{self.class} cached function #{function_id}(#{args.inspect unless args.empty?}) = #{result.inspect}"
|
80
|
+
end
|
58
81
|
result
|
59
|
-
else
|
60
|
-
(mc[function_id] ||= {})[args] = result = orig_function.bind(self).call(*args)
|
61
|
-
opts[:freeze] and result.freeze
|
62
|
-
$DEBUG and warn "#{self.class} cached function #{function_id}(#{args.inspect unless args.empty?}) = #{result.inspect}"
|
63
82
|
end
|
64
|
-
result
|
65
83
|
end
|
66
84
|
end
|
67
85
|
function_ids.size == 1 ? function_ids.first : function_ids
|
data/lib/tins/version.rb
CHANGED
data/tests/memoize_test.rb
CHANGED
@@ -10,11 +10,26 @@ module Tins
|
|
10
10
|
end
|
11
11
|
memoize_method :foo
|
12
12
|
|
13
|
+
def footsie(*a)
|
14
|
+
@@footsie ||= 0
|
15
|
+
@@footsie += 1
|
16
|
+
end
|
17
|
+
protected :footsie
|
18
|
+
memoize_method :footsie
|
19
|
+
|
13
20
|
def bar(*a)
|
14
21
|
@@bar ||= 0
|
15
22
|
@@bar += 1
|
16
23
|
end
|
17
24
|
memoize_function :bar
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def baz(*a)
|
29
|
+
@@baz ||= 0
|
30
|
+
@@baz += 1
|
31
|
+
end
|
32
|
+
memoize_function :baz
|
18
33
|
end
|
19
34
|
|
20
35
|
def test_method_cache
|
@@ -40,6 +55,31 @@ module Tins
|
|
40
55
|
assert_equal false, fb2.__memoize_cache__.empty?
|
41
56
|
end
|
42
57
|
|
58
|
+
def test_method_cache_protected
|
59
|
+
fb1 = FooBar.new
|
60
|
+
fb2 = FooBar.new
|
61
|
+
assert_raises(NoMethodError) { fb1.footsie(1, 2) }
|
62
|
+
assert_raises(NoMethodError) { fb2.footsie(1, 2) }
|
63
|
+
assert_equal true, fb1.__memoize_cache__.empty?
|
64
|
+
assert_equal true, fb2.__memoize_cache__.empty?
|
65
|
+
assert_equal 1, fb1.__send__(:footsie, 1, 2)
|
66
|
+
assert_equal 2, fb2.__send__(:footsie, 1, 2)
|
67
|
+
assert_equal 3, fb1.__send__(:footsie, 1, 2, 3)
|
68
|
+
assert_equal 4, fb2.__send__(:footsie, 1, 2, 3)
|
69
|
+
assert_equal 1, fb1.__send__(:footsie, 1, 2)
|
70
|
+
assert_equal 2, fb2.__send__(:footsie, 1, 2)
|
71
|
+
fb1.memoize_cache_clear
|
72
|
+
fb2.memoize_cache_clear
|
73
|
+
assert_equal true, fb1.__memoize_cache__.empty?
|
74
|
+
assert_equal true, fb2.__memoize_cache__.empty?
|
75
|
+
assert_equal 5, fb1.__send__(:footsie, 1, 2)
|
76
|
+
assert_equal 6, fb2.__send__(:footsie, 1, 2)
|
77
|
+
assert_equal 5, fb1.__send__(:footsie, 1, 2)
|
78
|
+
assert_equal 6, fb2.__send__(:footsie, 1, 2)
|
79
|
+
assert_equal false, fb1.__memoize_cache__.empty?
|
80
|
+
assert_equal false, fb2.__memoize_cache__.empty?
|
81
|
+
end
|
82
|
+
|
43
83
|
def test_function_cache
|
44
84
|
fb1 = FooBar.new
|
45
85
|
fb2 = FooBar.new
|
@@ -54,5 +94,22 @@ module Tins
|
|
54
94
|
assert_equal 3, fb2.bar(1, 2)
|
55
95
|
assert_equal false, FooBar.__memoize_cache__.empty?
|
56
96
|
end
|
97
|
+
|
98
|
+
def test_function_cache_private
|
99
|
+
fb1 = FooBar.new
|
100
|
+
fb2 = FooBar.new
|
101
|
+
assert_raises(NoMethodError) { fb1.baz(1, 2) }
|
102
|
+
assert_raises(NoMethodError) { fb2.baz(1, 2) }
|
103
|
+
assert_equal 1, fb1.__send__(:baz, 1, 2)
|
104
|
+
assert_equal 1, fb2.__send__(:baz, 1, 2)
|
105
|
+
assert_equal 2, fb1.__send__(:baz, 1, 2, 3)
|
106
|
+
assert_equal 2, fb2.__send__(:baz, 1, 2, 3)
|
107
|
+
assert_equal 1, fb1.__send__(:baz, 1, 2)
|
108
|
+
assert_equal 1, fb2.__send__(:baz, 1, 2)
|
109
|
+
FooBar.memoize_cache_clear
|
110
|
+
assert_equal 3, fb1.__send__(:baz, 1, 2)
|
111
|
+
assert_equal 3, fb2.__send__(:baz, 1, 2)
|
112
|
+
assert_equal false, FooBar.__memoize_cache__.empty?
|
113
|
+
end
|
57
114
|
end
|
58
115
|
end
|
data/tins.gemspec
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
|
-
# stub: tins 1.3.
|
2
|
+
# stub: tins 1.3.2 ruby lib
|
3
3
|
|
4
4
|
Gem::Specification.new do |s|
|
5
5
|
s.name = "tins"
|
6
|
-
s.version = "1.3.
|
6
|
+
s.version = "1.3.2"
|
7
7
|
|
8
8
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
9
9
|
s.require_paths = ["lib"]
|
10
10
|
s.authors = ["Florian Frank"]
|
11
|
-
s.date = "2014-08-
|
11
|
+
s.date = "2014-08-19"
|
12
12
|
s.description = "All the stuff that isn't good/big enough for a real library."
|
13
13
|
s.email = "flori@ping.de"
|
14
14
|
s.extra_rdoc_files = ["README.md", "lib/dslkit.rb", "lib/dslkit/polite.rb", "lib/dslkit/rude.rb", "lib/spruz.rb", "lib/tins.rb", "lib/tins/alias.rb", "lib/tins/annotate.rb", "lib/tins/ask_and_send.rb", "lib/tins/attempt.rb", "lib/tins/bijection.rb", "lib/tins/case_predicate.rb", "lib/tins/concern.rb", "lib/tins/count_by.rb", "lib/tins/date_dummy.rb", "lib/tins/date_time_dummy.rb", "lib/tins/deep_const_get.rb", "lib/tins/deep_dup.rb", "lib/tins/dslkit.rb", "lib/tins/extract_last_argument_options.rb", "lib/tins/file_binary.rb", "lib/tins/find.rb", "lib/tins/generator.rb", "lib/tins/go.rb", "lib/tins/hash_symbolize_keys_recursive.rb", "lib/tins/hash_union.rb", "lib/tins/if_predicate.rb", "lib/tins/limited.rb", "lib/tins/lines_file.rb", "lib/tins/memoize.rb", "lib/tins/method_description.rb", "lib/tins/minimize.rb", "lib/tins/module_group.rb", "lib/tins/named_set.rb", "lib/tins/null.rb", "lib/tins/once.rb", "lib/tins/p.rb", "lib/tins/partial_application.rb", "lib/tins/proc_compose.rb", "lib/tins/proc_prelude.rb", "lib/tins/range_plus.rb", "lib/tins/require_maybe.rb", "lib/tins/responding.rb", "lib/tins/rotate.rb", "lib/tins/secure_write.rb", "lib/tins/sexy_singleton.rb", "lib/tins/shuffle.rb", "lib/tins/string_byte_order_mark.rb", "lib/tins/string_camelize.rb", "lib/tins/string_underscore.rb", "lib/tins/string_version.rb", "lib/tins/subhash.rb", "lib/tins/terminal.rb", "lib/tins/thread_local.rb", "lib/tins/time_dummy.rb", "lib/tins/to.rb", "lib/tins/to_proc.rb", "lib/tins/token.rb", "lib/tins/uniq_by.rb", "lib/tins/version.rb", "lib/tins/write.rb", "lib/tins/xt.rb", "lib/tins/xt/annotate.rb", "lib/tins/xt/ask_and_send.rb", "lib/tins/xt/attempt.rb", "lib/tins/xt/blank.rb", "lib/tins/xt/case_predicate.rb", "lib/tins/xt/concern.rb", "lib/tins/xt/count_by.rb", "lib/tins/xt/date_dummy.rb", "lib/tins/xt/date_time_dummy.rb", "lib/tins/xt/deep_const_get.rb", "lib/tins/xt/deep_dup.rb", "lib/tins/xt/dslkit.rb", "lib/tins/xt/extract_last_argument_options.rb", "lib/tins/xt/file_binary.rb", "lib/tins/xt/full.rb", "lib/tins/xt/hash_symbolize_keys_recursive.rb", "lib/tins/xt/hash_union.rb", "lib/tins/xt/if_predicate.rb", "lib/tins/xt/irb.rb", "lib/tins/xt/method_description.rb", "lib/tins/xt/named.rb", "lib/tins/xt/null.rb", "lib/tins/xt/p.rb", "lib/tins/xt/partial_application.rb", "lib/tins/xt/proc_compose.rb", "lib/tins/xt/proc_prelude.rb", "lib/tins/xt/range_plus.rb", "lib/tins/xt/require_maybe.rb", "lib/tins/xt/responding.rb", "lib/tins/xt/rotate.rb", "lib/tins/xt/secure_write.rb", "lib/tins/xt/sexy_singleton.rb", "lib/tins/xt/shuffle.rb", "lib/tins/xt/string.rb", "lib/tins/xt/string_byte_order_mark.rb", "lib/tins/xt/string_camelize.rb", "lib/tins/xt/string_underscore.rb", "lib/tins/xt/string_version.rb", "lib/tins/xt/subhash.rb", "lib/tins/xt/symbol_to_proc.rb", "lib/tins/xt/time_dummy.rb", "lib/tins/xt/time_freezer.rb", "lib/tins/xt/to.rb", "lib/tins/xt/uniq_by.rb", "lib/tins/xt/write.rb"]
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tins
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.3.
|
4
|
+
version: 1.3.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Florian Frank
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-08-
|
11
|
+
date: 2014-08-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: gem_hadar
|