memor 0.2.1 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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: