memor 0.2.1 → 0.3.0

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.
@@ -2,3 +2,5 @@ language: ruby
2
2
  script: 'bundle exec rspec'
3
3
  rvm:
4
4
  - 1.9.2
5
+ - 1.9.3
6
+ - 2.0.0
data/Gemfile CHANGED
@@ -1,4 +1,4 @@
1
- source :rubygems
1
+ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in memor.gemspec
4
4
  gemspec
data/Guardfile CHANGED
@@ -1,7 +1,7 @@
1
1
  # A sample Guardfile
2
2
  # More info at https://github.com/guard/guard#readme
3
3
 
4
- guard 'rspec', :version => 2 do
4
+ guard 'rspec' do
5
5
  watch(%r{^spec/.+_spec\.rb$})
6
6
  watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
7
7
  watch('spec/spec_helper.rb') { 'spec' }
data/README.md CHANGED
@@ -10,6 +10,8 @@ This lib has one utility method called **memor** which takes *binding* as an
10
10
  class Foo
11
11
  include Memor
12
12
 
13
+ attr_accessor :age
14
+
13
15
  def slow_method1
14
16
  memor binding do
15
17
  # slow stuff
@@ -27,7 +29,22 @@ This lib has one utility method called **memor** which takes *binding* as an
27
29
  # slow stuff
28
30
  end
29
31
  end
32
+
33
+ def double_age
34
+ memor binding, :age do
35
+ age * 2
36
+ end
37
+ end
38
+
30
39
  end
40
+
41
+ foo = Foo.new
42
+
43
+ foo.age = 2
44
+ foo.double_age # 4
45
+
46
+ foo.age = 3
47
+ foo.double_age # 6
31
48
  ```
32
49
 
33
50
  Tested in ruby 1.9.2
@@ -1,6 +1,79 @@
1
1
  require 'memor/version'
2
2
 
3
3
  module Memor
4
+ class PrivateMemoizeInstance
5
+ def initialize(the_caller, the_context_binding, explicit_dependents)
6
+ @the_caller = the_caller
7
+ @the_context_binding = the_context_binding
8
+ @explicit_dependents = explicit_dependents
9
+ end
10
+
11
+ def callee
12
+ @the_context_binding.eval '__callee__'
13
+ end
14
+
15
+ def memor_name
16
+ "@____memor_#{callee}".gsub('?', '_question_mark')
17
+ .gsub('!', '_bang')
18
+ end
19
+
20
+ def memor_method
21
+ @the_caller.method callee
22
+ end
23
+
24
+ def memoize_wrap
25
+ if memoize_lookup_key.empty?
26
+ memoize_without_dependent { yield }
27
+
28
+ else
29
+ memoize_with_dependents { yield }
30
+ end
31
+ end
32
+
33
+ def memoize_lookup_key
34
+ args_values + explicit_dependents_values
35
+ end
36
+
37
+ def explicit_dependents_values
38
+ @explicit_dependents.map do |ed_name|
39
+ @the_context_binding.eval ed_name.to_s
40
+ end
41
+ end
42
+
43
+ def args_values
44
+ # parameters is like [[:req, :a], [:opt, :b], [:rest, :c], [:block, :d]]
45
+ value_parameters = memor_method.parameters.map do |pp|
46
+ if [:req, :rest, :opt].include? pp[0]
47
+ pp[1]
48
+ end
49
+ end.compact.map do |arg_name|
50
+ @the_context_binding.eval arg_name.to_s
51
+ end
52
+ end
53
+
54
+ def memoize_without_dependent
55
+ unless @the_caller.instance_variable_defined? memor_name
56
+ @the_caller.instance_variable_set memor_name, yield
57
+ end
58
+
59
+ @the_caller.instance_variable_get memor_name
60
+ end
61
+
62
+ def memoize_with_dependents
63
+ unless @the_caller.instance_variable_defined? memor_name
64
+ @the_caller.instance_variable_set memor_name, {}
65
+ end
66
+
67
+ buckets = @the_caller.instance_variable_get memor_name
68
+
69
+ unless buckets.has_key?(memoize_lookup_key)
70
+ buckets[memoize_lookup_key] = yield
71
+ end
72
+
73
+ buckets[memoize_lookup_key]
74
+ end
75
+
76
+ end
4
77
 
5
78
  private
6
79
 
@@ -22,64 +95,9 @@ private
22
95
  # end
23
96
  # end
24
97
  #
25
- def memor(context_binding)
26
- callee = context_binding.eval '__callee__'
27
-
28
- memor_name = "@_memor_#{callee}".gsub('?', '_question_mark')
29
- .gsub('!', '_bang')
30
-
31
- memor_method = method(callee)
32
-
33
- if memor_method.arity == 0 # no argument
34
- _memor_with_no_arg(memor_name) { yield }
35
-
36
- else
37
- # FIXME args may be insufficient
38
- args = _memor_args(memor_method, context_binding)
39
-
40
- _memor_with_args(memor_name, args) { yield }
41
- end
42
- end
43
-
44
- def _memor_args(memor_method, context_binding)
45
- arg_names = _memor_arg_names(memor_method)
46
-
47
- arg_names.map do |arg_name|
48
- context_binding.eval arg_name.to_s
49
- end
50
- end
51
-
52
- def _memor_arg_names(memor_method)
53
- # parameters is like [[:req, :a], [:opt, :b], [:rest, :c], [:block, :d]]
54
-
55
- value_parameters = memor_method.parameters.map do |pp|
56
- if [:req, :rest, :opt].include? pp[0]
57
- pp[1]
58
- end
59
- end.compact
60
- end
61
-
62
- def _memor_with_no_arg(memor_name)
63
- unless instance_variable_defined? memor_name
64
- instance_variable_set memor_name, yield
65
- end
66
-
67
- instance_variable_get memor_name
68
- end
69
-
70
- def _memor_with_args(memor_name, args)
71
- unless instance_variable_defined? memor_name
72
- instance_variable_set memor_name, {}
73
- end
74
-
75
- memor = instance_variable_get memor_name
76
- key = [* args] # use the args array as the cache key
77
-
78
- unless memor.has_key?(key)
79
- memor[key] = yield
80
- end
81
-
82
- memor[key]
98
+ def memor(context_binding, *explicit_dependents)
99
+ PrivateMemoizeInstance.new(self, context_binding, explicit_dependents)
100
+ .memoize_wrap { yield }
83
101
  end
84
102
 
85
103
  end
@@ -1,3 +1,3 @@
1
1
  module Memor
2
- VERSION = '0.2.1'
2
+ VERSION = '0.3.0'
3
3
  end
@@ -23,5 +23,5 @@ Gem::Specification.new do |s|
23
23
  # s.add_runtime_dependency 'rest-client'
24
24
  s.add_development_dependency 'rspec'
25
25
  s.add_development_dependency 'guard-rspec'
26
- s.add_development_dependency 'ruby-debug19'
26
+ s.add_development_dependency 'debugger'
27
27
  end
@@ -23,11 +23,20 @@ describe Memor do
23
23
  include Memor
24
24
 
25
25
  attr_reader :slows
26
+ attr_accessor :the_explicit_depend_value
26
27
 
27
28
  def initialize
28
29
  @slows = 0
29
30
  end
30
31
 
32
+ def explicit_depend_value
33
+ memor binding, :the_explicit_depend_value do
34
+ slow_method
35
+
36
+ the_explicit_depend_value
37
+ end
38
+ end
39
+
31
40
  def no_arg
32
41
  memor binding do
33
42
  slow_method
@@ -144,17 +153,24 @@ describe Memor do
144
153
  foo.slows.should == 1
145
154
  end
146
155
 
147
- it '#_memor_parameters' do
148
- foo.send(:_memor_arg_names, foo.method(:no_arg)).should == []
149
- foo.send(:_memor_arg_names, foo.method(:with_args1)).should == [:a, :b]
150
- foo.send(:_memor_arg_names, foo.method(:with_args2)).should == [:args]
151
- foo.send(:_memor_arg_names, foo.method(:with_args3)).should == [:a, :args]
152
- end
153
-
154
156
  it 'class methods' do
155
157
  Bar.bar
156
158
  Bar.bar.should == 'bar'
157
159
 
158
160
  Bar.slows.should == 1
159
161
  end
162
+
163
+ it 'explicit depend value' do
164
+ foo.explicit_depend_value.should == nil
165
+ foo.explicit_depend_value.should == nil
166
+
167
+ foo.slows.should == 1
168
+
169
+ foo.the_explicit_depend_value = 3
170
+
171
+ foo.explicit_depend_value.should == 3
172
+ foo.explicit_depend_value.should == 3
173
+
174
+ foo.slows.should == 2
175
+ end
160
176
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: memor
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.3.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-07-12 00:00:00.000000000Z
12
+ date: 2013-07-10 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
16
- requirement: &4607510 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,15 @@ dependencies:
21
21
  version: '0'
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *4607510
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
25
30
  - !ruby/object:Gem::Dependency
26
31
  name: guard-rspec
27
- requirement: &4607140 !ruby/object:Gem::Requirement
32
+ requirement: !ruby/object:Gem::Requirement
28
33
  none: false
29
34
  requirements:
30
35
  - - ! '>='
@@ -32,10 +37,15 @@ dependencies:
32
37
  version: '0'
33
38
  type: :development
34
39
  prerelease: false
35
- version_requirements: *4607140
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
36
46
  - !ruby/object:Gem::Dependency
37
- name: ruby-debug19
38
- requirement: &4606790 !ruby/object:Gem::Requirement
47
+ name: debugger
48
+ requirement: !ruby/object:Gem::Requirement
39
49
  none: false
40
50
  requirements:
41
51
  - - ! '>='
@@ -43,7 +53,12 @@ dependencies:
43
53
  version: '0'
44
54
  type: :development
45
55
  prerelease: false
46
- version_requirements: *4606790
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
47
62
  description: memoize function without alias method chain
48
63
  email:
49
64
  - Aaron2Ti@gmail.com
@@ -83,11 +98,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
83
98
  version: '0'
84
99
  requirements: []
85
100
  rubyforge_project: memor
86
- rubygems_version: 1.8.15
101
+ rubygems_version: 1.8.24
87
102
  signing_key:
88
103
  specification_version: 3
89
104
  summary: simple memoize function without alias method chain
90
105
  test_files:
91
106
  - spec/lib/memor_spec.rb
92
107
  - spec/spec_helper.rb
93
- has_rdoc: