spruz 0.2.0 → 0.2.1

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.
data/Rakefile CHANGED
@@ -23,12 +23,13 @@ end
23
23
 
24
24
  desc "Testing library"
25
25
  task :test do
26
- ruby '-Ilib tests/test_spruz.rb'
26
+ ENV['RUBYOPT'] = "#{ENV['RUBYOPT']} -Ilib"
27
+ sh 'testrb tests/test_*.rb'
27
28
  end
28
29
 
29
30
  desc "Testing library with coverage"
30
31
  task :coverage do
31
- sh "rcov -Ilib -x 'tests/.*\.rb' tests/test_spruz.rb"
32
+ sh "rcov -Ilib -x 'tests/.*\.rb' tests/test_*.rb"
32
33
  end
33
34
 
34
35
  if defined? Gem
@@ -48,7 +49,7 @@ if defined? Gem
48
49
  s.has_rdoc = true
49
50
  s.extra_rdoc_files << 'README'
50
51
  s.rdoc_options << '--title' << 'Spruz' << '--main' << 'README'
51
- s.test_files << 'tests/test_spruz.rb'
52
+ s.test_files.concat Dir['tests/test_*.rb']
52
53
 
53
54
  s.author = "Florian Frank"
54
55
  s.email = "flori@ping.de"
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.0
1
+ 0.2.1
data/lib/spruz/memoize.rb CHANGED
@@ -22,19 +22,18 @@ module Spruz
22
22
  # object the method is called on.
23
23
  def memoize_method(*method_ids)
24
24
  method_ids.each do |method_id|
25
+ method_id = method_id.to_s.to_sym
25
26
  orig_method = instance_method(method_id)
26
27
  __send__(:define_method, method_id) do |*args|
27
28
  unless mc = ::Module.__memoize_cache__[__id__]
28
29
  mc = ::Module.__memoize_cache__[__id__] ||= {}
29
30
  ObjectSpace.define_finalizer(self, ::Module.__memoize_cache_delete__)
30
31
  end
31
- if mc.key?(args)
32
- result = mc[args]
32
+ if mc.key?(method_id) and result = mc[method_id][args]
33
+ result
33
34
  else
34
- result = mc[args] = orig_method.bind(self).call(*args)
35
- if $DEBUG
36
- warn "#{self.class} cached method #{method_id}(#{args.inspect unless args.empty?}) = #{result.inspect} [#{__id__}]"
37
- end
35
+ (mc[method_id] ||= {})[args] = result = orig_method.bind(self).call(*args)
36
+ $DEBUG and warn "#{self.class} cached method #{method_id}(#{args.inspect unless args.empty?}) = #{result.inspect} [#{__id__}]"
38
37
  end
39
38
  result
40
39
  end
@@ -52,20 +51,26 @@ module Spruz
52
51
  def memoize_function(*function_ids)
53
52
  mc = @__memoize_cache__ ||= {}
54
53
  function_ids.each do |method_id|
54
+ method_id = method_id.to_s.to_sym
55
55
  orig_method = instance_method(method_id)
56
56
  __send__(:define_method, method_id) do |*args|
57
- if mc.key?(args)
58
- result = mc[args]
57
+ if mc.key?(method_id) and result = mc[method_id][args]
58
+ result
59
59
  else
60
- result = mc[args] = orig_method.bind(self).call(*args)
61
- if $DEBUG
62
- warn "#{self.class} cached function #{method_id}(#{args.inspect unless args.empty?}) = #{result.inspect}"
63
- end
60
+ (mc[method_id] ||= {})[args] = result = orig_method.bind(self).call(*args)
61
+ $DEBUG and warn "#{self.class} cached function #{method_id}(#{args.inspect unless args.empty?}) = #{result.inspect}"
64
62
  end
65
63
  result
66
64
  end
67
65
  end
68
66
  end
67
+
68
+ # Clear cached values for all methods and functions.
69
+ def memoize_cache_clear
70
+ mc = @__memoize_cache__ and mc.clear
71
+ mc = ::Module.__memoize_cache__ and mc.clear
72
+ self
73
+ end
69
74
  end
70
75
  end
71
76
  end
data/lib/spruz/version.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  module Spruz
2
2
  # Spruz version
3
- VERSION = '0.2.0'
3
+ VERSION = '0.2.1'
4
4
  VERSION_ARRAY = VERSION.split(/\./).map { |x| x.to_i } # :nodoc:
5
5
  VERSION_MAJOR = VERSION_ARRAY[0] # :nodoc:
6
6
  VERSION_MINOR = VERSION_ARRAY[1] # :nodoc:
@@ -0,0 +1,52 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'test/unit'
4
+ require 'spruz/memoize'
5
+
6
+ module Spruz
7
+ class TestSpruzMemoize < Test::Unit::TestCase
8
+ class FooBar
9
+ def foo(*a)
10
+ @@foo ||= 0
11
+ @@foo += 1
12
+ end
13
+ memoize_method :foo
14
+
15
+ def bar(*a)
16
+ @@bar ||= 0
17
+ @@bar += 1
18
+ end
19
+ memoize_function :bar
20
+ end
21
+
22
+ def test_foo
23
+ fb1 = FooBar.new
24
+ fb2 = FooBar.new
25
+ assert_equal 1, fb1.foo(1, 2)
26
+ assert_equal 2, fb2.foo(1, 2)
27
+ assert_equal 3, fb1.foo(1, 2, 3)
28
+ assert_equal 4, fb2.foo(1, 2, 3)
29
+ assert_equal 1, fb1.foo(1, 2)
30
+ assert_equal 2, fb2.foo(1, 2)
31
+ FooBar.memoize_cache_clear
32
+ assert_equal 5, fb1.foo(1, 2)
33
+ assert_equal 6, fb2.foo(1, 2)
34
+ assert_equal 5, fb1.foo(1, 2)
35
+ assert_equal 6, fb2.foo(1, 2)
36
+ end
37
+
38
+ def test_bar
39
+ fb1 = FooBar.new
40
+ fb2 = FooBar.new
41
+ assert_equal 1, fb1.bar(1, 2)
42
+ assert_equal 1, fb2.bar(1, 2)
43
+ assert_equal 2, fb1.bar(1, 2, 3)
44
+ assert_equal 2, fb2.bar(1, 2, 3)
45
+ assert_equal 1, fb1.bar(1, 2)
46
+ assert_equal 1, fb2.bar(1, 2)
47
+ FooBar.memoize_cache_clear
48
+ assert_equal 3, fb1.bar(1, 2)
49
+ assert_equal 3, fb2.bar(1, 2)
50
+ end
51
+ end
52
+ end
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 2
8
- - 0
9
- version: 0.2.0
8
+ - 1
9
+ version: 0.2.1
10
10
  platform: ruby
11
11
  authors:
12
12
  - Florian Frank
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-10-27 00:00:00 +02:00
17
+ date: 2010-11-03 00:00:00 +01:00
18
18
  default_executable:
19
19
  dependencies: []
20
20
 
@@ -72,6 +72,7 @@ files:
72
72
  - lib/spruz/xt.rb
73
73
  - lib/spruz.rb
74
74
  - tests/test_spruz.rb
75
+ - tests/test_spruz_memoize.rb
75
76
  - install.rb
76
77
  - LICENSE
77
78
  has_rdoc: true
@@ -109,3 +110,4 @@ specification_version: 3
109
110
  summary: Useful stuff.
110
111
  test_files:
111
112
  - tests/test_spruz.rb
113
+ - tests/test_spruz_memoize.rb