forget-me-not 0.2.0 → 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.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- ZDgxZjQ2MjE0MmM1ODk2ZWMzODVlM2ExMmQyZjg5YmQ1NzUwNWRlZQ==
4
+ NjQwMzE4NWI3Nzc0Zjc4ZWZjNWE3YmI0NjlkOGQxY2QxNDA0OGE4Mg==
5
5
  data.tar.gz: !binary |-
6
- MzNkM2Y0OWIyNTE4Yzk4NWZlNDI2Nzc1YjI4MzhhZjUwYjMyMTZjMQ==
6
+ NmI3MmViNjhiZDYxNjg1MGExNjliYmM0MGU2ZDY5NjZkYWE0ODYyZg==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- YzI2OTAyOWZhZjU5ZmQxODNjYzE0OWFjZDAzNmQ4NWU5YmU4YWY2YjBmMDhj
10
- YTFiMmEyZjNkNWRiM2IyNWZiYmY2MTVkN2IwOTkzNGM4OWM2N2UzMTE1OGJl
11
- MjViZWE2NGZhZmQzNjMxZjA0MDA2YWE0YzA1ZTUxN2FlNDdlNDE=
9
+ YTI0MDg1Yzc2M2U5YWU4OWM4OTA3NWY5NmQzMTEzYThiOWNlNjU0ZGRiZDY2
10
+ Y2ExODM0MjUxZmQwZmZkMWY1ZDc4NjQ1MjU0Y2ZkNjVhYWFhZWJiZjU2OWNj
11
+ MmRkZTE0YjQ1NWMzYWQwMDZhN2FiZjBlY2JmYjhmNzdkMjJjMWM=
12
12
  data.tar.gz: !binary |-
13
- Yzc5NTExM2YzNjI1MjdlYzZkNmUwYzg1MzZjNWIzMGU3Nzg3MWM2NzY4MDdi
14
- ZTViODhjYzg2YWQxNDE4MjdhOGYzMDZiOGI0MWU2YTY4ZmZjZjNkZTdlOTVh
15
- ODZlYmI0ZDVmYjMwZGJhOTdmMTQ4ZTc5ZGQ0MzYzOTYyNmEzZjg=
13
+ NzU3ZDRhNDhiMGJhNjAyNDk1YjY4ZTIxYjRhNzEzZGI1NzIxODg2ZWMwMDRm
14
+ Yzc0NDA3NDgwZjcwOTZlZDZlOTBmZTY0MzQzNTdmMDhlYTA1MDMzZDdmYzU5
15
+ ODY2NzFlYWYxODQxNzg4MjQ0ODU4MTY5YmNlOGY1YmM5MDNiZjk=
data/CHANGELOG.md CHANGED
@@ -1,2 +1,3 @@
1
+ ## 0.3.0.0 - Detect attempts to pass a block to cached or memoized methods and raise an error.
1
2
  ## 0.2.0.0 - Still pre release, but made a new method for memoizing methods with args.
2
3
  ## 0.1.0.0 - Pre Release
data/README.md CHANGED
@@ -93,6 +93,9 @@ method if the method being memoized has arity > 0.
93
93
 
94
94
  Memoization is a powerful tool, but like all powerful tools, needs to be used with knowledge and respect.
95
95
 
96
+ #### Blocks
97
+ You may not pass a block to a memoized method. Attempting to do so results in an error being raised.
98
+
96
99
  #### Storage
97
100
  By default, the memoization code stores results in a simple Hash based cache. If you have other requirements, perhaps
98
101
  a thread-safe storage, then set the ForgetMeNot::Memoization.storage_builder property to a proc that will create a new
@@ -111,7 +114,8 @@ The basics are unsurprising:
111
114
  cache :some_method
112
115
  end
113
116
 
114
- Like memoization, arguments are fully supported and will result in distinct storage to the cache.
117
+ Like memoization, arguments are fully supported and will result in distinct storage to the cache. Unlike memoization,
118
+ you do not need to call a with_args variant of the cache method.
115
119
 
116
120
  To control warming the cache, implement the cache_warm method
117
121
 
@@ -156,6 +160,9 @@ key members.
156
160
  Of course, every argument variation and every included instance property amplifies the potential amount of cache
157
161
  memory that is consumed.
158
162
 
163
+ #### Blocks
164
+ You may not pass a block to a cached method. Attempting to do so results in an error being raised.
165
+
159
166
  #### Storage
160
167
  By default, the cache will attempt to use the Rails cache. If that isn't found, but ActiveSupport is available, a new
161
168
  instance of MemoryStore will be used. Failing that, cache will raise an error.
@@ -32,7 +32,9 @@ module ForgetMeNot
32
32
  instance_key = get_instance_key_proc(options[:include]) if options.has_key?(:include)
33
33
 
34
34
  undef_method(method_name)
35
- define_method(method_name) do |*args|
35
+ define_method(method_name) do |*args, &block|
36
+ raise 'Cannot pass blocks to cached methods' if block
37
+
36
38
  cache_key = [
37
39
  key_prefix,
38
40
  (instance_key && instance_key.call(self)),
@@ -33,7 +33,9 @@ module ForgetMeNot
33
33
  key_prefix = "/memoized_method_result/#{self.name}"
34
34
 
35
35
  undef_method(method_name)
36
- define_method(method_name) do |*args|
36
+ define_method(method_name) do |*args, &block|
37
+ raise 'Cannot pass blocks to memoized methods' if block
38
+
37
39
  memoize_key = [
38
40
  key_prefix,
39
41
  method_name,
@@ -1,3 +1,3 @@
1
1
  module ForgetMeNot
2
- VERSION = '0.2.0'
2
+ VERSION = '0.3.0'
3
3
  end
@@ -30,6 +30,12 @@ module ForgetMeNot
30
30
  "method5({#{hash_arg.map { |k, v| "#{k}/#{v}" }.join '|' }})"
31
31
  end
32
32
 
33
+ def self.cache_warm(*args)
34
+ item = new
35
+ item.method1
36
+ item.method2(args.first)
37
+ end
38
+
33
39
  cache_results :method1, :method2, :method3, :method4, :method5
34
40
  end
35
41
 
@@ -93,6 +99,22 @@ module ForgetMeNot
93
99
 
94
100
  expect(TestClass.count(:method1)).to eq 2
95
101
  end
102
+
103
+ it 'should raise an error if called with a block on initial caching' do
104
+ foo = TestClass.new
105
+ expect do
106
+ foo.method1 {'a block'}
107
+ end.to raise_error 'Cannot pass blocks to cached methods'
108
+ end
109
+
110
+ it 'should raise an error if called with a block after initial caching' do
111
+ foo = TestClass.new
112
+ foo.method1
113
+ expect do
114
+ foo.method1 {'a block'}
115
+ end.to raise_error 'Cannot pass blocks to cached methods'
116
+ end
117
+
96
118
  end
97
119
 
98
120
  describe 'cache arity-1 calls' do
@@ -193,6 +215,31 @@ module ForgetMeNot
193
215
  expect(Cacheable.cachers_and_descendants & expected).to eq expected
194
216
  end
195
217
 
218
+ it 'Cache Warming should call warmed methods' do
219
+ Cacheable.warm('foo')
220
+
221
+ expect(TestClass.count(:method1)).to eq 1
222
+ expect(TestClass.count(:method2)).to eq 1
223
+ expect(TestClass.count(:method3)).to eq 0
224
+ expect(TestClass.count(:method4)).to eq 0
225
+ expect(TestClass.count(:method5)).to eq 0
226
+ end
227
+
228
+ it 'Cache Warming should call warm methods again' do
229
+ TestClass.new.method1
230
+ TestClass.new.method2('foo')
231
+
232
+ expect(TestClass.count(:method1)).to eq 1
233
+ expect(TestClass.count(:method2)).to eq 1
234
+
235
+ Cacheable.warm('foo')
236
+
237
+ expect(TestClass.count(:method1)).to eq 2
238
+ expect(TestClass.count(:method2)).to eq 2
239
+ expect(TestClass.count(:method3)).to eq 0
240
+ expect(TestClass.count(:method4)).to eq 0
241
+ expect(TestClass.count(:method5)).to eq 0
242
+ end
196
243
  end
197
244
  end
198
245
  end
@@ -59,6 +59,20 @@ module ForgetMeNot
59
59
  expect(MemoizeTestClass.count(:method1)).to eq 2
60
60
  end
61
61
 
62
+ it 'should raise an error if called with a block on initial memoization' do
63
+ foo = MemoizeTestClass.new
64
+ expect do
65
+ foo.method1 {'a block'}
66
+ end.to raise_error 'Cannot pass blocks to memoized methods'
67
+ end
68
+
69
+ it 'should raise an error if called with a block after initial memoization' do
70
+ foo = MemoizeTestClass.new
71
+ foo.method1
72
+ expect do
73
+ foo.method1 {'a block'}
74
+ end.to raise_error 'Cannot pass blocks to memoized methods'
75
+ end
62
76
  end
63
77
 
64
78
  describe 'memoize arity > 0 calls' do
data/spec/spec_helper.rb CHANGED
@@ -1,13 +1,17 @@
1
- require 'rubygems'
2
1
  require 'bundler/setup'
3
- require 'rspec'
2
+ require 'simplecov'
4
3
 
5
- require 'active_support/all'
6
- require 'timecop'
4
+ if ENV['TRAVIS']
5
+ require 'coveralls'
6
+ SimpleCov.formatter = Coveralls::SimpleCov::Formatter
7
+ end
7
8
 
8
- require 'coveralls'
9
- Coveralls.wear!
9
+ SimpleCov.start do
10
+ add_filter '/spec/'
11
+ end
10
12
 
13
+ require 'active_support/all'
14
+ require 'timecop'
11
15
  require 'forget-me-not'
12
16
 
13
17
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: forget-me-not
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Koan Health
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-11-19 00:00:00.000000000 Z
11
+ date: 2013-12-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -80,6 +80,20 @@ dependencies:
80
80
  - - ! '>='
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: simplecov
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ! '>='
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ! '>='
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
83
97
  description: Caching and Memoization Mixins
84
98
  email:
85
99
  - development@koanhealth.com