memoist2 0.1.2 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 829d1ae3d37827ff9822e3435752208f5d96c376
4
- data.tar.gz: 399d3e864904a801173ac73416e9fac4f86dad09
3
+ metadata.gz: 7e42697bf2e5d3807d6075bf5498bf849b86353c
4
+ data.tar.gz: 80b78cee05bd57d58ccfd7afd5e46b4a6e4b79c3
5
5
  SHA512:
6
- metadata.gz: 437e09101708635c4861064ed156cd5d6a419468f4da942395deb7c90b0c19569dd04515c6ad635d6d41a1c620a72084175b4b277e0c1ca3517baf23e8614f50
7
- data.tar.gz: e84bae0e10a00897fe7afb5eabfa81b9d2d88294664896f0c7b5df1655fa0d514f5dbb9d2b5062dcb239e72fed40e48a23e6c1c4badc9574c9f53987a3da68ae
6
+ metadata.gz: 66d8dd9039e1f2ac5c724bbc01946cafda39c3d1d5201564f42a2cbe33f37e2ce087f1836b8ee130d408403862245f25bf68e614f1e50b25ce8fc424aa4c2786
7
+ data.tar.gz: 2ad308d69a84799e565257ec2e4dedcfac853fc2039346b22abcaa38045859c2aea3d8347435f0d2444d2dace75124e2db7f3112fad440664f6afb734d1f9eec
data/README.md CHANGED
@@ -1,6 +1,8 @@
1
1
  memoist2
2
2
  ========
3
3
 
4
+ [![Build Status](https://travis-ci.org/matthewrudy/memoist2.png?branch=master)](https://travis-ci.org/matthewrudy/memoist2)
5
+
4
6
  Simple Memoization for Ruby 2.0
5
7
 
6
8
  Example
@@ -9,7 +11,7 @@ Example
9
11
  Memoize an instance method
10
12
 
11
13
  class Foo
12
- extend Memoist2
14
+ include Memoist2
13
15
 
14
16
  def bar
15
17
  sleep 1 && 2**10
@@ -20,14 +22,12 @@ Memoize an instance method
20
22
  Memoize a class method
21
23
 
22
24
  class Foo
23
- class << self
24
- extend Memoist2
25
+ include Memoist2
25
26
 
26
- def bar
27
- # something expensive
28
- end
29
- memoize :bar
27
+ def self.bar
28
+ # something expensive
30
29
  end
30
+ memoize_class_method :bar
31
31
  end
32
32
 
33
33
  Licence
data/Rakefile CHANGED
@@ -15,7 +15,7 @@ spec = Gem::Specification.new do |s|
15
15
 
16
16
  # Basic details
17
17
  s.name = "memoist2"
18
- s.version = "0.1.2"
18
+ s.version = "0.2.0"
19
19
  s.summary = "Really simple memoization for ruby 2.0"
20
20
  s.author = "Matthew Rudy Jacobs"
21
21
  s.email = "MatthewRudyJacobs@gmail.com"
data/benchmark.rb CHANGED
@@ -20,7 +20,7 @@ require 'memoist2'
20
20
  TIMES = 10_000_000
21
21
 
22
22
  class MyClass
23
- extend Memoist2
23
+ include Memoist2
24
24
 
25
25
  def raw
26
26
  (2**10)**2 # something mildly difficult
data/lib/memoist2.rb CHANGED
@@ -4,19 +4,33 @@ module Memoist2
4
4
  "@_memoized_#{symbol.to_s.sub(/\?\Z/, '_query').sub(/!\Z/, '_bang')}".to_sym
5
5
  end
6
6
 
7
- def memoize(method_name)
8
- memoized_ivar = Memoist2.memoized_ivar_for(method_name)
9
- memoized_module = Module.new do
10
- module_eval <<-EVAL
11
- def #{method_name}
12
- if !defined?(#{memoized_ivar}) || #{memoized_ivar}.empty?
13
- #{memoized_ivar} = [super]
7
+ module ClassMethods
8
+
9
+ def memoize(method_name)
10
+ memoized_ivar = Memoist2.memoized_ivar_for(method_name)
11
+ memoized_module = Module.new do
12
+ module_eval <<-EVAL
13
+ def #{method_name}
14
+ unless #{memoized_ivar}
15
+ #{memoized_ivar} = [super]
16
+ end
17
+ #{memoized_ivar}[0]
14
18
  end
15
- #{memoized_ivar}[0]
16
- end
17
- EVAL
19
+ EVAL
20
+ end
21
+ prepend memoized_module
22
+ end
23
+
24
+ def memoize_class_method(method_name)
25
+ singleton_class.class_eval do
26
+ include Memoist2 unless ancestors.include?(Memoist2)
27
+ memoize method_name
28
+ end
18
29
  end
19
- prepend memoized_module
30
+
20
31
  end
21
32
 
33
+ def self.included(klass)
34
+ klass.extend(ClassMethods)
35
+ end
22
36
  end
data/memoist2.gemspec CHANGED
@@ -2,15 +2,16 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = "memoist2"
5
- s.version = "0.1.1"
5
+ s.version = "0.1.2"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["Matthew Rudy Jacobs"]
9
9
  s.date = "2013-07-19"
10
10
  s.email = "MatthewRudyJacobs@gmail.com"
11
11
  s.extra_rdoc_files = ["README.md"]
12
- s.files = [".gitignore", ".rspec", ".ruby-version", ".travis.yml", "Gemfile", "README.md", "Rakefile", "example/foo.rb", "lib/memoist2.rb", "memoist2.gemspec", "spec/memoist2_spec.rb", "spec/spec_helper.rb"]
12
+ s.files = [".gitignore", ".rspec", ".ruby-version", ".travis.yml", "Gemfile", "LICENCE", "README.md", "Rakefile", "benchmark.rb", "example/foo.rb", "lib/memoist2.rb", "memoist2.gemspec", "spec/memoist2_spec.rb", "spec/spec_helper.rb"]
13
13
  s.homepage = "https://github.com/matthewrudy/memoist2"
14
+ s.licenses = ["MIT"]
14
15
  s.rdoc_options = ["--main", "README.md"]
15
16
  s.require_paths = ["lib"]
16
17
  s.required_ruby_version = Gem::Requirement.new(">= 2.0.0")
@@ -2,67 +2,144 @@ require 'memoist2'
2
2
 
3
3
  describe Memoist2 do
4
4
 
5
- class Foo
6
- extend Memoist2
7
-
8
- def bar
9
- count!
5
+ # used as base class for examples
6
+ class Counter
7
+ def initialize
8
+ @counter = 0
10
9
  end
11
- memoize :bar
10
+ attr_reader :counter
12
11
 
13
- def question?
14
- count!
12
+ def count!
13
+ @counter += 1
15
14
  end
16
- memoize :question?
15
+ end
17
16
 
18
- def bang!
19
- count!
17
+ describe "nil values" do
18
+ subject do
19
+ Class.new(Counter) do
20
+ include Memoist2
21
+
22
+ def nilly
23
+ count!
24
+ nil
25
+ end
26
+ memoize :nilly
27
+ end.new
20
28
  end
21
- memoize :bang!
22
29
 
23
- private
24
-
25
- def count!
26
- @count ||= 0
27
- @count += 1
30
+ it "returns the expected value" do
31
+ 5.times do
32
+ subject.nilly.should == nil
33
+ end
28
34
  end
29
35
 
30
- class << self
31
- extend Memoist2
32
-
33
- def bar
34
- @bar_count ||= 0
35
- @bar_count += 1
36
- end
37
- memoize :bar
36
+ it "memoizes correctly" do
37
+ expect do
38
+ 5.times{ subject.nilly }
39
+ end.to change{ subject.counter }.by(1)
38
40
  end
39
41
  end
40
42
 
41
43
  describe "instance methods" do
42
- subject{ Foo.new }
44
+ subject do
45
+ Class.new(Counter) do
46
+ include Memoist2
47
+
48
+ def foo
49
+ count!
50
+ :bar
51
+ end
52
+ memoize :foo
53
+ end.new
54
+ end
55
+
56
+ it "returns the expected value" do
57
+ 5.times do
58
+ subject.foo.should == :bar
59
+ end
60
+ end
43
61
 
44
- it "can be memoized" do
45
- subject.bar.should == subject.bar
62
+ it "memoizes correctly" do
63
+ expect do
64
+ 5.times{ subject.foo }
65
+ end.to change{ subject.counter }.by(1)
46
66
  end
47
67
  end
48
68
 
49
69
  describe "class methods" do
50
- subject{ Foo }
70
+ describe "using metaclass" do
71
+ subject do
72
+ Class.new do
73
+ class << self
74
+ include Memoist2
75
+
76
+ def foo
77
+ @counter ||= 0
78
+ @counter += 1
79
+ end
80
+ memoize :foo
81
+ end
82
+ end
83
+ end
51
84
 
52
- it "can be memoized" do
53
- subject.bar.should == subject.bar
85
+ it "works" do
86
+ 5.times do
87
+ subject.foo.should == 1
88
+ end
89
+ end
90
+ end
91
+
92
+ describe "using memoize_class_method" do
93
+ subject do
94
+ Class.new do
95
+ include Memoist2
96
+
97
+ def self.foo
98
+ @counter ||= 0
99
+ @counter += 1
100
+ end
101
+ memoize_class_method :foo
102
+ end
103
+ end
104
+
105
+ it "works" do
106
+ 5.times do
107
+ subject.foo.should == 1
108
+ end
109
+ end
54
110
  end
55
111
  end
56
112
 
57
113
  describe "punctuated methods" do
58
- subject{ Foo.new }
114
+ subject do
115
+ Class.new do
116
+ include Memoist2
117
+
118
+ def question?
119
+ @question_calls ||= 0
120
+ @question_calls += 1
121
+ end
122
+ memoize :question?
123
+
124
+ def bang!
125
+ @bang_calls ||= 0
126
+ @bang_calls += 1
127
+ end
128
+ memoize :bang!
129
+
130
+ end.new
131
+ end
59
132
 
60
133
  it "can memoize question methods" do
61
- subject.question?.should == subject.question?
134
+ 5.times do
135
+ subject.question?.should == 1
136
+ end
62
137
  end
63
138
 
64
139
  it "can memoize bang methods" do
65
- subject.bang!.should == subject.bang!
140
+ 5.times do
141
+ subject.bang!.should == 1
142
+ end
66
143
  end
67
144
  end
68
145
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: memoist2
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matthew Rudy Jacobs