memoist2 0.1.2 → 0.2.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.
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