memoist 0.12.0 → 0.13.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 +4 -4
- data/README.md +64 -49
- data/lib/memoist.rb +32 -22
- data/lib/memoist/version.rb +1 -1
- data/memoist.gemspec +2 -2
- data/test/memoist_test.rb +1 -1
- metadata +9 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5f737a677ee84ae6e38db47c459ce5151d87d57b
|
4
|
+
data.tar.gz: 454244a7dc119201a0339227a5e6c54a8ec64e06
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 67f7764129d2f645a6d9e4d586bf8fed469460b10af0eb56bf7906191ce271a1d1ca7413e2f67cab12519862342b516c305994f2e1f73d263443f48e79dfffc9
|
7
|
+
data.tar.gz: 2b7d05ccffe29ce0cd42b93aa430ed682fbe90dae8badfe632f6e2573f9daa1705aabb2fb16bf360ba7b649128caecddd9a7ce8cfebcedf055beefd5d690db07
|
data/README.md
CHANGED
@@ -14,72 +14,81 @@ Usage
|
|
14
14
|
|
15
15
|
Just extend with the Memoist module
|
16
16
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
17
|
+
```ruby
|
18
|
+
require 'memoist'
|
19
|
+
class Person
|
20
|
+
extend Memoist
|
21
|
+
|
22
|
+
def social_security
|
23
|
+
decrypt_social_security
|
24
|
+
end
|
25
|
+
memoize :social_security
|
26
|
+
end
|
27
|
+
```
|
26
28
|
|
27
29
|
And person.social_security will only be calculated once.
|
28
30
|
|
29
31
|
Every memoized function (which initially was not accepting any arguments) has a ```(reload)```
|
30
32
|
argument you can pass in to bypass and reset the memoization:
|
31
33
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
34
|
+
```ruby
|
35
|
+
def some_method
|
36
|
+
Time.now
|
37
|
+
end
|
38
|
+
memoize :some_method
|
39
|
+
```
|
36
40
|
|
37
41
|
Calling ```some_method``` will be memoized, but calling ```some_method(true)``` will rememoize each time.
|
38
42
|
|
39
43
|
You can even memoize method that takes arguments.
|
40
44
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
45
|
+
```ruby
|
46
|
+
class Person
|
47
|
+
def taxes_due(income)
|
48
|
+
income * 0.40
|
49
|
+
end
|
50
|
+
memoize :taxes_due
|
51
|
+
end
|
52
|
+
```
|
48
53
|
|
49
54
|
This will only be calculated once per value of income.
|
50
55
|
|
51
56
|
You can also memoize class methods.
|
52
57
|
|
53
|
-
|
54
|
-
|
55
|
-
class << self
|
56
|
-
extend Memoist
|
57
|
-
def with_overdue_taxes
|
58
|
-
# ...
|
59
|
-
end
|
60
|
-
memoize :with_overdue_taxes
|
61
|
-
end
|
58
|
+
```ruby
|
59
|
+
class Person
|
62
60
|
|
61
|
+
class << self
|
62
|
+
extend Memoist
|
63
|
+
def with_overdue_taxes
|
64
|
+
# ...
|
63
65
|
end
|
66
|
+
memoize :with_overdue_taxes
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
70
|
+
```
|
64
71
|
|
65
72
|
When a sub-class overrides one of its parent's methods and you need to memoize both.
|
66
73
|
Then you can use the `:identifier` parameter in order to help _Memoist_ distinguish between the two.
|
67
74
|
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
75
|
+
```ruby
|
76
|
+
class Clock
|
77
|
+
extend Memoist
|
78
|
+
def now
|
79
|
+
"The time now is #{Time.now.hour} o'clock and #{Time.now.min} minutes"
|
80
|
+
end
|
81
|
+
memoize :now
|
82
|
+
end
|
83
|
+
|
84
|
+
class AccurateClock < Clock
|
85
|
+
extend Memoist
|
86
|
+
def now
|
87
|
+
"#{super} and #{Time.now.sec} seconds"
|
88
|
+
end
|
89
|
+
memoize :now, :identifier => :accurate_clock
|
90
|
+
end
|
91
|
+
```
|
83
92
|
|
84
93
|
|
85
94
|
Reload
|
@@ -87,17 +96,23 @@ Reload
|
|
87
96
|
|
88
97
|
Each memoized function comes with a way to flush the existing value.
|
89
98
|
|
90
|
-
|
91
|
-
|
99
|
+
```ruby
|
100
|
+
person.social_security # returns the memoized value
|
101
|
+
person.social_security(true) # bypasses the memoized value and rememoizes it
|
102
|
+
```
|
92
103
|
|
93
104
|
This also works with a memoized method with arguments
|
94
105
|
|
95
|
-
|
96
|
-
|
106
|
+
```ruby
|
107
|
+
person.taxes_due(100_000) # returns the memoized value
|
108
|
+
person.taxes_due(100_000, true) # bypasses the memoized value and rememoizes it
|
109
|
+
```
|
97
110
|
|
98
111
|
If you want to flush the entire memoization cache for an object
|
99
112
|
|
100
|
-
|
113
|
+
```ruby
|
114
|
+
person.flush_cache
|
115
|
+
```
|
101
116
|
|
102
117
|
Authors
|
103
118
|
===========
|
data/lib/memoist.rb
CHANGED
@@ -3,23 +3,40 @@ require 'memoist/core_ext/singleton_class'
|
|
3
3
|
module Memoist
|
4
4
|
|
5
5
|
def self.memoized_ivar_for(method_name, identifier=nil)
|
6
|
-
|
6
|
+
"@#{memoized_prefix(identifier)}_#{escape_punctuation(method_name.to_s)}"
|
7
7
|
end
|
8
8
|
|
9
9
|
def self.unmemoized_method_for(method_name, identifier=nil)
|
10
|
-
|
10
|
+
"#{unmemoized_prefix(identifier)}_#{method_name}".to_sym
|
11
11
|
end
|
12
12
|
|
13
13
|
def self.memoized_prefix(identifier=nil)
|
14
|
-
|
14
|
+
if identifier
|
15
|
+
"_memoized_#{identifier}"
|
16
|
+
else
|
17
|
+
"_memoized".freeze
|
18
|
+
end
|
15
19
|
end
|
16
20
|
|
17
21
|
def self.unmemoized_prefix(identifier=nil)
|
18
|
-
|
22
|
+
if identifier
|
23
|
+
"_unmemoized_#{identifier}"
|
24
|
+
else
|
25
|
+
"_unmemoized".freeze
|
26
|
+
end
|
19
27
|
end
|
20
28
|
|
21
29
|
def self.escape_punctuation(string)
|
22
|
-
string.
|
30
|
+
return string unless string.end_with?('?'.freeze, '!'.freeze)
|
31
|
+
|
32
|
+
string = string.dup
|
33
|
+
|
34
|
+
# A String can't end in both ? and !
|
35
|
+
if string.sub!(/\?\Z/, '_query'.freeze)
|
36
|
+
else
|
37
|
+
string.sub!(/!\Z/, '_bang'.freeze)
|
38
|
+
end
|
39
|
+
string
|
23
40
|
end
|
24
41
|
|
25
42
|
def self.memoist_eval(klass, *args, &block)
|
@@ -47,15 +64,7 @@ module Memoist
|
|
47
64
|
end
|
48
65
|
|
49
66
|
def prime_cache(*method_names)
|
50
|
-
if method_names.empty?
|
51
|
-
prefix = Memoist.unmemoized_prefix+"_"
|
52
|
-
method_names = methods.collect do |method_name|
|
53
|
-
if method_name.to_s.start_with?(prefix)
|
54
|
-
method_name[prefix.length..-1]
|
55
|
-
end
|
56
|
-
end.compact
|
57
|
-
end
|
58
|
-
|
67
|
+
method_names = self.class.memoized_methods if method_names.empty?
|
59
68
|
method_names.each do |method_name|
|
60
69
|
if method(Memoist.unmemoized_method_for(method_name)).arity == 0
|
61
70
|
__send__(method_name)
|
@@ -67,14 +76,7 @@ module Memoist
|
|
67
76
|
end
|
68
77
|
|
69
78
|
def flush_cache(*method_names)
|
70
|
-
if method_names.empty?
|
71
|
-
prefix = Memoist.unmemoized_prefix+"_"
|
72
|
-
method_names = (methods + private_methods + protected_methods).collect do |method_name|
|
73
|
-
if method_name.to_s.start_with?(prefix)
|
74
|
-
method_name[prefix.length..-1]
|
75
|
-
end
|
76
|
-
end.compact
|
77
|
-
end
|
79
|
+
method_names = self.class.memoized_methods if method_names.empty?
|
78
80
|
|
79
81
|
method_names.each do |method_name|
|
80
82
|
ivar = Memoist.memoized_ivar_for(method_name)
|
@@ -88,6 +90,13 @@ module Memoist
|
|
88
90
|
identifier = method_names.pop[:identifier]
|
89
91
|
end
|
90
92
|
|
93
|
+
Memoist.memoist_eval(self) do
|
94
|
+
def self.memoized_methods
|
95
|
+
require 'set'
|
96
|
+
@_memoized_methods ||= Set.new
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
91
100
|
method_names.each do |method_name|
|
92
101
|
unmemoized_method = Memoist.unmemoized_method_for(method_name, identifier)
|
93
102
|
memoized_ivar = Memoist.memoized_ivar_for(method_name, identifier)
|
@@ -101,6 +110,7 @@ module Memoist
|
|
101
110
|
end
|
102
111
|
alias_method unmemoized_method, method_name
|
103
112
|
|
113
|
+
self.memoized_methods << method_name
|
104
114
|
if instance_method(method_name).arity == 0
|
105
115
|
|
106
116
|
# define a method like this;
|
data/lib/memoist/version.rb
CHANGED
data/memoist.gemspec
CHANGED
@@ -32,7 +32,7 @@ Gem::Specification.new do |spec|
|
|
32
32
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
33
33
|
spec.require_paths = ["lib"]
|
34
34
|
|
35
|
-
spec.add_development_dependency "bundler"
|
35
|
+
spec.add_development_dependency "bundler"
|
36
36
|
spec.add_development_dependency "rake"
|
37
|
-
spec.add_development_dependency "minitest", "~>
|
37
|
+
spec.add_development_dependency "minitest", "~> 5.5.1"
|
38
38
|
end
|
data/test/memoist_test.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: memoist
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.13.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Joshua Peek
|
@@ -19,22 +19,22 @@ authors:
|
|
19
19
|
autorequire:
|
20
20
|
bindir: bin
|
21
21
|
cert_chain: []
|
22
|
-
date: 2015-
|
22
|
+
date: 2015-11-26 00:00:00.000000000 Z
|
23
23
|
dependencies:
|
24
24
|
- !ruby/object:Gem::Dependency
|
25
25
|
name: bundler
|
26
26
|
requirement: !ruby/object:Gem::Requirement
|
27
27
|
requirements:
|
28
|
-
- - "
|
28
|
+
- - ">="
|
29
29
|
- !ruby/object:Gem::Version
|
30
|
-
version: '
|
30
|
+
version: '0'
|
31
31
|
type: :development
|
32
32
|
prerelease: false
|
33
33
|
version_requirements: !ruby/object:Gem::Requirement
|
34
34
|
requirements:
|
35
|
-
- - "
|
35
|
+
- - ">="
|
36
36
|
- !ruby/object:Gem::Version
|
37
|
-
version: '
|
37
|
+
version: '0'
|
38
38
|
- !ruby/object:Gem::Dependency
|
39
39
|
name: rake
|
40
40
|
requirement: !ruby/object:Gem::Requirement
|
@@ -55,14 +55,14 @@ dependencies:
|
|
55
55
|
requirements:
|
56
56
|
- - "~>"
|
57
57
|
- !ruby/object:Gem::Version
|
58
|
-
version:
|
58
|
+
version: 5.5.1
|
59
59
|
type: :development
|
60
60
|
prerelease: false
|
61
61
|
version_requirements: !ruby/object:Gem::Requirement
|
62
62
|
requirements:
|
63
63
|
- - "~>"
|
64
64
|
- !ruby/object:Gem::Version
|
65
|
-
version:
|
65
|
+
version: 5.5.1
|
66
66
|
description:
|
67
67
|
email:
|
68
68
|
- josh@joshpeek.com
|
@@ -113,7 +113,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
113
113
|
version: '0'
|
114
114
|
requirements: []
|
115
115
|
rubyforge_project:
|
116
|
-
rubygems_version: 2.4.
|
116
|
+
rubygems_version: 2.4.8
|
117
117
|
signing_key:
|
118
118
|
specification_version: 4
|
119
119
|
summary: memoize methods invocation
|