forget-me-not 0.3.2.2 → 0.3.2.3
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 +5 -13
- data/CHANGELOG.md +2 -1
- data/README.md +5 -1
- data/lib/forget-me-not.rb +1 -0
- data/lib/forget-me-not/cacheable.rb +19 -39
- data/lib/forget-me-not/logging.rb +24 -0
- data/lib/forget-me-not/memoizable.rb +16 -6
- data/lib/forget-me-not/version.rb +1 -1
- data/spec/cacheable_spec.rb +1 -1
- data/spec/memoizable_spec.rb +2 -0
- metadata +25 -24
checksums.yaml
CHANGED
@@ -1,15 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
5
|
-
data.tar.gz: !binary |-
|
6
|
-
OGZkMGZjMWExMWFjNDQyZjM5NjhjMzFiZmM4MzhiMDY3MjY0Njc1NQ==
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: e9d63f71859db7131922113b56e78be6ed7fa1fd
|
4
|
+
data.tar.gz: e092139b53b438533be342c47bb64a6bdc707f01
|
7
5
|
SHA512:
|
8
|
-
metadata.gz:
|
9
|
-
|
10
|
-
ZGU4YTI1ZjhiNTdiYzBmNDk2NDNkYzE4MzA0ZDFiOGQ5MWEwNTE3NzY4NDRi
|
11
|
-
YWEwYmVjMzhlZGJmMmFhNTJjOGQ4ODFhYjRlZDFmNDM1MmE2MjE=
|
12
|
-
data.tar.gz: !binary |-
|
13
|
-
ODFkMTlkZjZlZGZiYmExNzAyYWE5MGY3MDMwOWI5YWIxMjYxZWJkNTQ1YjA0
|
14
|
-
M2EyNzg3NDAzOGQ0OGY3ZWNmNzc1ODEzZTc2MTJiNTM4MzBkNDc0YTE5YTQy
|
15
|
-
MDZjNWY4ZjQ4N2E3Y2FmMjNhODcyYzc0YmYzZDUxZTk0MDM2YTc=
|
6
|
+
metadata.gz: 1474e10c8c3160243502f1578b95adf5b0850b1edf27852949de1f5c84b2d6dcdf9fc808ccc6e231b89f8b1dfee6768df011003db2977a0ca94abf80fbf6f4f6
|
7
|
+
data.tar.gz: 7671c7048583e1516c13f4d080f0444ba26e447b47fb7ed20cecba8dcd25e9097a6f41e98540eb831b576d9fd232f2442fa6d5cab20bd61dfb79634368453ca2
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
## 0.3.2.3 - Improve logging control
|
1
2
|
## 0.3.2.1 - Add the ability to log cache hits and misses
|
2
3
|
## 0.3.2.0 - Revise the method for computing keys in cacheable.
|
3
4
|
Need to use the digest for both the arguments and the instance properties.
|
@@ -7,4 +8,4 @@ Was using Ruby's hash(), but that varies by ruby runtime.
|
|
7
8
|
|
8
9
|
## 0.3.0.0 - Detect attempts to pass a block to cached or memoized methods and raise an error.
|
9
10
|
## 0.2.0.0 - Still pre release, but made a new method for memoizing methods with args.
|
10
|
-
## 0.1.0.0 - Pre Release
|
11
|
+
## 0.1.0.0 - Pre Release
|
data/README.md
CHANGED
@@ -178,6 +178,10 @@ instance of MemoryStore will be used. Failing that, cache will raise an error.
|
|
178
178
|
This is intended to provide a reasonably sane default, but really, set the ForgetMeNot::Cacheable.cache with something
|
179
179
|
shaped like an ActiveSupport::Cacheable::Store
|
180
180
|
|
181
|
+
## Troubleshooting
|
182
|
+
Both Memoizable and Cacheable have logging of their cache activity (cacheable more so). By default, this is disabled.
|
183
|
+
To enable logging, change the module property log_activity to true. Both the cache and memoizable specs do this.
|
184
|
+
|
181
185
|
## Origins
|
182
186
|
This is an extension of the ideas and approach found here:
|
183
187
|
https://github.com/sferik/twitter/blob/master/lib/twitter/memoizable.rb. You guys rock.
|
@@ -192,4 +196,4 @@ https://github.com/sferik/twitter/blob/master/lib/twitter/memoizable.rb. You gu
|
|
192
196
|
6. Create new Pull Request
|
193
197
|
|
194
198
|
## Copyright
|
195
|
-
(c) 2013 Koan Health. See LICENSE.txt for further details.
|
199
|
+
(c) 2013 Koan Health. See LICENSE.txt for further details.
|
data/lib/forget-me-not.rb
CHANGED
@@ -10,6 +10,9 @@ module ForgetMeNot
|
|
10
10
|
end
|
11
11
|
end
|
12
12
|
|
13
|
+
extend Logging
|
14
|
+
|
15
|
+
|
13
16
|
module ClassMethods
|
14
17
|
def cache_results(*methods)
|
15
18
|
options = methods.last.is_a?(Hash) ? methods.pop : {}
|
@@ -38,10 +41,10 @@ module ForgetMeNot
|
|
38
41
|
raise 'Cannot pass blocks to cached methods' if block
|
39
42
|
|
40
43
|
cache_key = [
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
44
|
+
key_prefix,
|
45
|
+
(instance_key && instance_key.call(self)),
|
46
|
+
method_name,
|
47
|
+
args.to_s,
|
45
48
|
].compact.join '/'
|
46
49
|
|
47
50
|
cache_key_hash = Digest::SHA1.hexdigest(cache_key)
|
@@ -52,7 +55,7 @@ module ForgetMeNot
|
|
52
55
|
method.bind(self).call(*args)
|
53
56
|
end
|
54
57
|
|
55
|
-
if Cacheable.
|
58
|
+
if Cacheable.log_activity
|
56
59
|
Cacheable.logger.info "Cache #{cache_hit ? 'hit' : 'miss'} for #{cache_key} (#{cache_key_hash})"
|
57
60
|
end
|
58
61
|
|
@@ -132,40 +135,17 @@ module ForgetMeNot
|
|
132
135
|
end
|
133
136
|
end
|
134
137
|
|
135
|
-
class << self
|
136
|
-
attr_accessor :log_cache_activity
|
137
|
-
|
138
|
-
def logger
|
139
|
-
return @logger if defined?(@logger)
|
140
|
-
@logger = rails_logger || default_logger
|
141
|
-
end
|
142
|
-
|
143
|
-
def logger=(logger)
|
144
|
-
@logger = logger
|
145
|
-
end
|
146
|
-
|
147
|
-
def rails_logger
|
148
|
-
defined?(Rails) && Rails.respond_to?(:logger) && Rails.logger
|
149
|
-
end
|
150
|
-
|
151
|
-
def default_logger
|
152
|
-
logger = Logger.new(STDOUT)
|
153
|
-
logger.level = Logger::INFO
|
154
|
-
logger
|
155
|
-
end
|
156
|
-
end
|
157
|
-
|
158
138
|
|
159
139
|
private
|
160
140
|
def self.default_cache
|
161
141
|
rails_cache ||
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
142
|
+
active_support_cache ||
|
143
|
+
raise(
|
144
|
+
<<-ERR_TEXT
|
145
|
+
When using Cacheable in a project that does not have a Rails or ActiveSupport Cache,
|
146
|
+
you must explicitly set the cache to an object shaped like ActiveSupport::Cache::Store
|
147
|
+
ERR_TEXT
|
148
|
+
)
|
169
149
|
end
|
170
150
|
|
171
151
|
def self.rails_cache
|
@@ -174,10 +154,10 @@ module ForgetMeNot
|
|
174
154
|
|
175
155
|
def self.active_support_cache
|
176
156
|
defined?(ActiveSupport) &&
|
177
|
-
|
178
|
-
|
179
|
-
|
157
|
+
defined?(ActiveSupport::Cache) &&
|
158
|
+
defined?(ActiveSupport::Cache::MemoryStore) &&
|
159
|
+
ActiveSupport::Cache::MemoryStore.new
|
180
160
|
end
|
181
161
|
|
182
162
|
end
|
183
|
-
end
|
163
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module ForgetMeNot
|
2
|
+
module Logging
|
3
|
+
attr_accessor :log_activity
|
4
|
+
|
5
|
+
def logger
|
6
|
+
return @logger if defined?(@logger)
|
7
|
+
@logger = rails_logger || default_logger
|
8
|
+
end
|
9
|
+
|
10
|
+
def logger=(logger)
|
11
|
+
@logger = logger
|
12
|
+
end
|
13
|
+
|
14
|
+
def rails_logger
|
15
|
+
defined?(Rails) && Rails.respond_to?(:logger) && Rails.logger
|
16
|
+
end
|
17
|
+
|
18
|
+
def default_logger
|
19
|
+
logger = Logger.new(STDOUT)
|
20
|
+
logger.level = Logger::INFO
|
21
|
+
logger
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -6,6 +6,8 @@ module ForgetMeNot
|
|
6
6
|
base.extend(ClassMethods)
|
7
7
|
end
|
8
8
|
end
|
9
|
+
extend Logging
|
10
|
+
|
9
11
|
|
10
12
|
module ClassMethods
|
11
13
|
def memoize(*methods)
|
@@ -22,7 +24,7 @@ module ForgetMeNot
|
|
22
24
|
private
|
23
25
|
def memoize_method(method_name, options)
|
24
26
|
method = instance_method(method_name)
|
25
|
-
raise 'Cannot memoize with arity > 0. Use memoize_with_args instead.' if method.arity > 0 && !
|
27
|
+
raise 'Cannot memoize with arity > 0. Use memoize_with_args instead.' if method.arity > 0 && !options[:allow_args]
|
26
28
|
visibility = method_visibility(method_name)
|
27
29
|
define_memoized_method(method, options)
|
28
30
|
send(visibility, method_name)
|
@@ -37,12 +39,14 @@ module ForgetMeNot
|
|
37
39
|
raise 'Cannot pass blocks to memoized methods' if block
|
38
40
|
|
39
41
|
memoize_key = [
|
40
|
-
|
41
|
-
|
42
|
-
|
42
|
+
key_prefix,
|
43
|
+
method_name,
|
44
|
+
args.hash
|
43
45
|
].compact.join '/'
|
44
46
|
|
45
|
-
|
47
|
+
if Memoizable.log_activity
|
48
|
+
Memoizable.logger.info("key: #{memoize_key}")
|
49
|
+
end
|
46
50
|
|
47
51
|
fetch_from_storage(memoize_key) do
|
48
52
|
method.bind(self).call(*args)
|
@@ -61,6 +65,10 @@ module ForgetMeNot
|
|
61
65
|
end
|
62
66
|
end
|
63
67
|
|
68
|
+
def log(message)
|
69
|
+
ForgetMeNot.logger.info "key: #{memoize_key}" if ForgetMeNot.logger
|
70
|
+
end
|
71
|
+
|
64
72
|
def fetch_from_storage(key, &block)
|
65
73
|
storage.fetch(key, &block)
|
66
74
|
end
|
@@ -71,7 +79,7 @@ module ForgetMeNot
|
|
71
79
|
|
72
80
|
class << self
|
73
81
|
def storage_builder
|
74
|
-
@storage_builder ||= Proc.new {HashCache.new}
|
82
|
+
@storage_builder ||= Proc.new { HashCache.new }
|
75
83
|
end
|
76
84
|
|
77
85
|
def storage_builder=(builder)
|
@@ -80,4 +88,6 @@ module ForgetMeNot
|
|
80
88
|
end
|
81
89
|
|
82
90
|
end
|
91
|
+
mattr_accessor :logger
|
92
|
+
|
83
93
|
end
|
data/spec/cacheable_spec.rb
CHANGED
data/spec/memoizable_spec.rb
CHANGED
metadata
CHANGED
@@ -1,97 +1,97 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: forget-me-not
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.2.
|
4
|
+
version: 0.3.2.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Koan Health
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-02-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '3.2'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '3.2'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rspec
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
47
|
+
version: 2.14.0
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version:
|
54
|
+
version: 2.14.0
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: timecop
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- -
|
59
|
+
- - ">="
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: '0'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- -
|
66
|
+
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: coveralls
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
|
-
- -
|
73
|
+
- - ">="
|
74
74
|
- !ruby/object:Gem::Version
|
75
75
|
version: '0'
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
|
-
- -
|
80
|
+
- - ">="
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: simplecov
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
|
-
- -
|
87
|
+
- - ">="
|
88
88
|
- !ruby/object:Gem::Version
|
89
89
|
version: '0'
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
|
-
- -
|
94
|
+
- - ">="
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '0'
|
97
97
|
description: Caching and Memoization Mixins
|
@@ -101,15 +101,16 @@ executables: []
|
|
101
101
|
extensions: []
|
102
102
|
extra_rdoc_files: []
|
103
103
|
files:
|
104
|
-
- lib/forget-me-not/cacheable.rb
|
105
|
-
- lib/forget-me-not/hash_cache.rb
|
106
|
-
- lib/forget-me-not/memoizable.rb
|
107
|
-
- lib/forget-me-not/version.rb
|
108
|
-
- lib/forget-me-not.rb
|
109
104
|
- CHANGELOG.md
|
110
105
|
- LICENSE.txt
|
111
106
|
- README.md
|
112
107
|
- Rakefile
|
108
|
+
- lib/forget-me-not.rb
|
109
|
+
- lib/forget-me-not/cacheable.rb
|
110
|
+
- lib/forget-me-not/hash_cache.rb
|
111
|
+
- lib/forget-me-not/logging.rb
|
112
|
+
- lib/forget-me-not/memoizable.rb
|
113
|
+
- lib/forget-me-not/version.rb
|
113
114
|
- spec/cacheable_spec.rb
|
114
115
|
- spec/memoizable_spec.rb
|
115
116
|
- spec/spec_helper.rb
|
@@ -124,17 +125,17 @@ require_paths:
|
|
124
125
|
- lib
|
125
126
|
required_ruby_version: !ruby/object:Gem::Requirement
|
126
127
|
requirements:
|
127
|
-
- -
|
128
|
+
- - ">="
|
128
129
|
- !ruby/object:Gem::Version
|
129
130
|
version: '1.9'
|
130
131
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
131
132
|
requirements:
|
132
|
-
- -
|
133
|
+
- - ">="
|
133
134
|
- !ruby/object:Gem::Version
|
134
135
|
version: 1.3.6
|
135
136
|
requirements: []
|
136
137
|
rubyforge_project:
|
137
|
-
rubygems_version: 2.
|
138
|
+
rubygems_version: 2.4.6
|
138
139
|
signing_key:
|
139
140
|
specification_version: 4
|
140
141
|
summary: Mixins that provide caching and memoization for Ruby classes
|