memor 0.0.3 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,8 @@
1
+ # A sample Guardfile
2
+ # More info at https://github.com/guard/guard#readme
3
+
4
+ guard 'rspec', :version => 2 do
5
+ watch(%r{^spec/.+_spec\.rb$})
6
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
7
+ watch('spec/spec_helper.rb') { 'spec' }
8
+ end
data/README.md CHANGED
@@ -1,8 +1,8 @@
1
1
  # Memor
2
2
 
3
3
  ## USAGE
4
- This lib has one utility method called **memor** which takes *__callee__* as
5
- first argument and all the host methods other arguments, see the following example:
4
+ This lib has one utility method called **memor** which takes *binding* as an
5
+ argument, see the following example:
6
6
 
7
7
  ``` ruby
8
8
  require 'memor'
@@ -11,19 +11,19 @@ first argument and all the host methods other arguments, see the following examp
11
11
  include Memor
12
12
 
13
13
  def slow_method1
14
- memor(__callee__) do
14
+ memor binding do
15
15
  # slow stuff
16
16
  end
17
17
  end
18
18
 
19
19
  def slow_method2(a, b)
20
- memor(__callee__, a, b) do
20
+ memor binding do
21
21
  # slow stuff
22
22
  end
23
23
  end
24
24
 
25
25
  def slow_method3(a, *args)
26
- memor(__callee__, a, args) do
26
+ memor binding do
27
27
  # slow stuff
28
28
  end
29
29
  end
@@ -1,4 +1,4 @@
1
- require "memor/version"
1
+ require 'memor/version'
2
2
 
3
3
  module Memor
4
4
 
@@ -7,38 +7,81 @@ module Memor
7
7
  # class Foo
8
8
  # include Memor
9
9
  #
10
- # def slow(a, b)
11
- # memor(__callee__, a, b) do
10
+ # def foo(a, b)
11
+ # memor binding do
12
+ # # slow stuff
13
+ # end
14
+ # end
15
+ #
16
+ # def bar(a, b)
17
+ # memor binding do
12
18
  # # slow stuff
13
19
  # end
14
20
  # end
15
21
  # end
16
22
  #
17
- def memor(callee, *args)
23
+ def memor(context_binding)
24
+ callee = context_binding.eval '__callee__'
25
+
18
26
  memor_name = "@_memor_#{callee}".gsub('?', '_question_mark')
19
27
  .gsub('!', '_bang')
20
28
 
21
- if args.nil? # methods without arguments
22
- unless instance_variable_defined? memor_name
23
- instance_variable_set memor_name, yield
24
- end
29
+ memor_method = method(callee)
25
30
 
26
- return instance_variable_get memor_name
31
+ if memor_method.arity == 0 # no argument
32
+ _memor_with_no_arg(memor_name) { yield }
27
33
 
28
34
  else
29
- unless instance_variable_defined? memor_name
30
- instance_variable_set memor_name, {}
31
- end
35
+ # FIXME args may be insufficient
36
+ args = _memor_args(memor_method, context_binding)
37
+
38
+ _memor_with_args(memor_name, args) { yield }
39
+ end
40
+ end
41
+
32
42
 
33
- memor = instance_variable_get memor_name
34
- key = [* args] # use the args array as the cache key
43
+ def _memor_args(memor_method, context_binding)
44
+ arg_names = _memor_arg_names(memor_method)
35
45
 
36
- unless memor.has_key?(key)
37
- memor[key] = yield
46
+ arg_names.map do |arg_name|
47
+ context_binding.eval arg_name.to_s
48
+ end
49
+ end
50
+ private :_memor_args
51
+
52
+ def _memor_arg_names(memor_method)
53
+ # parameters is like [[:req, :a], [:req, :b], [:rest, :c], [:block, :d]]
54
+ value_parameters = memor_method.parameters.map do |pp|
55
+ if pp[0] == :req or pp[0] == :rest
56
+ pp[1]
38
57
  end
58
+ end.compact
59
+ end
60
+ private :_memor_arg_names
39
61
 
40
- memor[key]
62
+ def _memor_with_no_arg(memor_name)
63
+ unless instance_variable_defined? memor_name
64
+ instance_variable_set memor_name, yield
41
65
  end
66
+
67
+ instance_variable_get memor_name
68
+ end
69
+ private :_memor_with_no_arg
70
+
71
+ def _memor_with_args(memor_name, args)
72
+ unless instance_variable_defined? memor_name
73
+ instance_variable_set memor_name, {}
74
+ end
75
+
76
+ memor = instance_variable_get memor_name
77
+ key = [* args] # use the args array as the cache key
78
+
79
+ unless memor.has_key?(key)
80
+ memor[key] = yield
81
+ end
82
+
83
+ memor[key]
42
84
  end
85
+ private :_memor_with_args
43
86
 
44
87
  end
@@ -1,3 +1,3 @@
1
1
  module Memor
2
- VERSION = '0.0.3'
2
+ VERSION = '0.1.0'
3
3
  end
@@ -22,4 +22,6 @@ Gem::Specification.new do |s|
22
22
  # specify any dependencies here; for example:
23
23
  # s.add_runtime_dependency 'rest-client'
24
24
  s.add_development_dependency 'rspec'
25
+ s.add_development_dependency 'guard-rspec'
26
+ s.add_development_dependency 'ruby-debug19'
25
27
  end
@@ -1,3 +1,4 @@
1
+ require 'spec_helper'
1
2
  require 'memor'
2
3
 
3
4
  describe Memor do
@@ -11,31 +12,37 @@ describe Memor do
11
12
  end
12
13
 
13
14
  def no_arg
14
- memor __callee__ do
15
+ memor binding do
15
16
  slow_method
16
17
  end
17
18
  end
18
19
 
19
20
  def with_args1(a, b)
20
- memor __callee__, a, b do
21
+ memor binding do
21
22
  slow_method
22
23
  end
23
24
  end
24
25
 
25
26
  def with_args2(*args)
26
- memor __callee__, args do
27
+ memor binding do
28
+ slow_method
29
+ end
30
+ end
31
+
32
+ def with_args3(a, *args)
33
+ memor binding do
27
34
  slow_method
28
35
  end
29
36
  end
30
37
 
31
38
  def query?
32
- memor __callee__ do
39
+ memor binding do
33
40
  slow_method
34
41
  end
35
42
  end
36
43
 
37
44
  def bang!
38
- memor __callee__ do
45
+ memor binding do
39
46
  slow_method
40
47
  end
41
48
  end
@@ -59,15 +66,28 @@ describe Memor do
59
66
  it 'fix arguments' do
60
67
  foo.with_args1(1, 2).should == 'slow'
61
68
  foo.with_args1(1, 2).should == 'slow'
69
+ foo.with_args1(2, 2).should == 'slow'
70
+ foo.with_args1(2, 2).should == 'slow'
62
71
 
63
- foo.slows.should == 1
72
+ foo.slows.should == 2
64
73
  end
65
74
 
66
75
  it 'splat arguments' do
67
76
  foo.with_args2('bar').should == 'slow'
68
77
  foo.with_args2('bar').should == 'slow'
78
+ foo.with_args2('foo').should == 'slow'
79
+ foo.with_args2('foo').should == 'slow'
69
80
 
70
- foo.slows.should == 1
81
+ foo.slows.should == 2
82
+ end
83
+
84
+ it 'normal arguments and splat arguments' do
85
+ foo.with_args3('bar', 4).should == 'slow'
86
+ foo.with_args3('bar', 4).should == 'slow'
87
+ foo.with_args3('bar', 5).should == 'slow'
88
+ foo.with_args3('bar', 5).should == 'slow'
89
+
90
+ foo.slows.should == 2
71
91
  end
72
92
 
73
93
  it '! in method name' do
@@ -83,4 +103,11 @@ describe Memor do
83
103
 
84
104
  foo.slows.should == 1
85
105
  end
106
+
107
+ it '#_memor_parameters' do
108
+ foo.send(:_memor_arg_names, foo.method(:no_arg)).should == []
109
+ foo.send(:_memor_arg_names, foo.method(:with_args1)).should == [:a, :b]
110
+ foo.send(:_memor_arg_names, foo.method(:with_args2)).should == [:args]
111
+ foo.send(:_memor_arg_names, foo.method(:with_args3)).should == [:a, :args]
112
+ end
86
113
  end
@@ -0,0 +1,13 @@
1
+ RSpec.configure do |config|
2
+ # ## Mock Framework
3
+ #
4
+ # If you prefer to use mocha, flexmock or RR, uncomment the appropriate line:
5
+ #
6
+ # config.mock_with :mocha
7
+ # config.mock_with :flexmock
8
+ # config.mock_with :rr
9
+
10
+ config.filter_run focus: true
11
+ config.run_all_when_everything_filtered = true
12
+ config.treat_symbols_as_metadata_keys_with_true_values = true
13
+ 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.0.3
4
+ version: 0.1.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-02-20 00:00:00.000000000Z
12
+ date: 2012-02-23 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
16
- requirement: &4814260 !ruby/object:Gem::Requirement
16
+ requirement: &10183170 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,7 +21,29 @@ dependencies:
21
21
  version: '0'
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *4814260
24
+ version_requirements: *10183170
25
+ - !ruby/object:Gem::Dependency
26
+ name: guard-rspec
27
+ requirement: &10182960 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :development
34
+ prerelease: false
35
+ version_requirements: *10182960
36
+ - !ruby/object:Gem::Dependency
37
+ name: ruby-debug19
38
+ requirement: &10182750 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ type: :development
45
+ prerelease: false
46
+ version_requirements: *10182750
25
47
  description: memoize function without alias method chain
26
48
  email:
27
49
  - Aaron2Ti@gmail.com
@@ -32,13 +54,15 @@ files:
32
54
  - .gitignore
33
55
  - .travis.yml
34
56
  - Gemfile
57
+ - Guardfile
35
58
  - MIT-LICENSE
36
59
  - README.md
37
60
  - Rakefile
38
61
  - lib/memor.rb
39
62
  - lib/memor/version.rb
40
63
  - memor.gemspec
41
- - spec/memor_spec.rb
64
+ - spec/lib/memor_spec.rb
65
+ - spec/spec_helper.rb
42
66
  homepage: https://rubygems.org/gems/memor
43
67
  licenses: []
44
68
  post_install_message:
@@ -64,5 +88,6 @@ signing_key:
64
88
  specification_version: 3
65
89
  summary: simple memoize function without alias method chain
66
90
  test_files:
67
- - spec/memor_spec.rb
91
+ - spec/lib/memor_spec.rb
92
+ - spec/spec_helper.rb
68
93
  has_rdoc: