active_memoize 1.1.1 → 2.0.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 +37 -10
- data/lib/active_memoize.rb +1 -1
- data/lib/active_memoize/{cache.rb → instance.rb} +20 -30
- data/lib/active_memoize/klass.rb +17 -0
- data/lib/active_memoize/shared.rb +17 -0
- data/lib/active_memoize/version.rb +1 -1
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 91f66190445f2955c5905be5a7e0f5fce6a9842dbb5cc6b92755927cfe29f0b9
|
4
|
+
data.tar.gz: a1806275ccb0004f7260b5cb38d54f2651299216932eb4db1c52558baa7d6ede
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3f1e19d175f9e2ba0ca739737c88d347aadb9c8a7f7b8e00569593452384d8ac9d9ffec1e73975f0065bed362dddfb549ecff411795f8f236785eb20b9d9e4f8
|
7
|
+
data.tar.gz: 06fa2777ea5b110690dd16e55c6f6773a8c3b6aec1fb695c96cfedc9f31809ad812207f0044535eb4514fe456adcf0627270d74915dc65d22c9efdbbb120cf72
|
data/README.md
CHANGED
@@ -6,6 +6,9 @@
|
|
6
6
|
ActiveMemoize provides an API caching and memoizing local
|
7
7
|
expensive calculations including those with parameters.
|
8
8
|
|
9
|
+
The flexible API allows you to memoize results using class
|
10
|
+
or instance level cache.
|
11
|
+
|
9
12
|
## Installation
|
10
13
|
|
11
14
|
Add this line to your application's Gemfile:
|
@@ -24,31 +27,55 @@ Or install it yourself as:
|
|
24
27
|
|
25
28
|
## Table of Contents
|
26
29
|
|
27
|
-
* [
|
30
|
+
* [Klass](#klass)
|
31
|
+
* [Instance](#instance)
|
32
|
+
|
33
|
+
## Klass
|
28
34
|
|
29
|
-
|
35
|
+
Class level memoization is the quickest way to get up and running using your cache, but provides the least amount of flexibility. You can only cache results
|
36
|
+
without access to any information about your cache.
|
37
|
+
|
38
|
+
```ruby
|
39
|
+
class Movies
|
40
|
+
extend ActiveMemoize::Klass
|
41
|
+
|
42
|
+
def random
|
43
|
+
HTTP.get('http://movies.com/any')
|
44
|
+
end
|
45
|
+
|
46
|
+
memoize :random
|
47
|
+
|
48
|
+
def search(title)
|
49
|
+
HTTP.get("http://movies.com?title=#{title}")
|
50
|
+
end
|
51
|
+
|
52
|
+
memoize :search, as: :find
|
53
|
+
|
54
|
+
end
|
55
|
+
```
|
56
|
+
|
57
|
+
## Instance
|
58
|
+
|
59
|
+
Instance level memoization is a more involved way to setup your cache, but provides the most amount of flexibility. You can access almost all methods
|
60
|
+
in the `instance.rb` file.
|
30
61
|
|
31
62
|
```ruby
|
32
63
|
class Movies
|
33
64
|
|
34
65
|
def cache
|
35
|
-
@cache ||= ActiveMemoize::
|
66
|
+
@cache ||= ActiveMemoize::Instance.new
|
36
67
|
end
|
37
68
|
|
38
69
|
def all
|
39
|
-
cache.memoize(
|
40
|
-
HTTP.get("http://movies.com/all")
|
41
|
-
end
|
70
|
+
cache.memoize { HTTP.get("http://movies.com/all") }
|
42
71
|
end
|
43
72
|
|
44
73
|
def random
|
45
74
|
cache['random'] ||= HTTP.get('http://movies.com/any')
|
46
75
|
end
|
47
76
|
|
48
|
-
def search(title
|
49
|
-
cache.
|
50
|
-
|
51
|
-
cache.memoize do
|
77
|
+
def search(title)
|
78
|
+
cache.memoize(as: :find, refresh: !cache.empty?) do
|
52
79
|
HTTP.get("http://movies.com?title=#{title}")
|
53
80
|
end
|
54
81
|
end
|
data/lib/active_memoize.rb
CHANGED
@@ -1,67 +1,60 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module ActiveMemoize
|
4
|
-
class
|
4
|
+
class Instance
|
5
|
+
include ActiveMemoize::Shared
|
5
6
|
|
6
7
|
CALLER_METHOD_REGEX ||= /`([^']*)'/.freeze
|
7
8
|
|
8
|
-
|
9
|
-
|
10
|
-
def initialize
|
11
|
-
@cache = {}
|
12
|
-
end
|
9
|
+
def initialize; end
|
13
10
|
|
14
11
|
def [](key)
|
15
|
-
|
12
|
+
cache[key]
|
16
13
|
end
|
17
14
|
|
18
15
|
def []=(key, val)
|
19
|
-
|
16
|
+
cache[key] = val
|
20
17
|
end
|
21
18
|
|
22
19
|
def clear
|
23
|
-
|
20
|
+
cache.clear
|
24
21
|
end
|
25
22
|
|
26
23
|
def delete(key)
|
27
|
-
|
24
|
+
cache.delete(key)
|
28
25
|
end
|
29
26
|
|
30
27
|
# :nocov:
|
31
28
|
def each
|
32
|
-
|
29
|
+
cache.each { |key, val| yield(key, val) }
|
33
30
|
end
|
34
31
|
# :nocov:
|
35
32
|
|
36
33
|
def empty?
|
37
|
-
|
34
|
+
cache.empty?
|
38
35
|
end
|
39
36
|
|
40
37
|
alias_method :blank?, :empty?
|
41
38
|
|
42
39
|
def key?(key)
|
43
|
-
|
40
|
+
cache.key?(key)
|
44
41
|
end
|
45
42
|
|
46
43
|
alias_method :hit?, :key?
|
47
44
|
|
48
45
|
def keys
|
49
|
-
|
46
|
+
cache.keys
|
50
47
|
end
|
51
48
|
|
52
49
|
def merge!(hash)
|
53
|
-
|
50
|
+
cache.merge!(hash)
|
54
51
|
end
|
55
52
|
|
56
|
-
def memoize(
|
57
|
-
|
58
|
-
|
59
|
-
method_locals.nil? ? caller_method : "#{caller_method}:#{method_locals}"
|
60
|
-
end
|
53
|
+
def memoize(as: nil, refresh: false, &block)
|
54
|
+
key = key(as || caller_method, caller_locals(block))
|
55
|
+
return cache[key] if !refresh && cache.key?(key)
|
61
56
|
|
62
|
-
|
63
|
-
|
64
|
-
@cache[method_name] = yield(block)
|
57
|
+
cache[key] = yield(block)
|
65
58
|
end
|
66
59
|
|
67
60
|
def present?
|
@@ -71,18 +64,18 @@ module ActiveMemoize
|
|
71
64
|
alias_method :hits?, :present?
|
72
65
|
|
73
66
|
def size
|
74
|
-
|
67
|
+
cache.size
|
75
68
|
end
|
76
69
|
|
77
70
|
def to_hash
|
78
|
-
|
71
|
+
cache
|
79
72
|
end
|
80
73
|
|
81
74
|
alias_method :as_json, :to_hash
|
82
75
|
alias_method :hits, :to_hash
|
83
76
|
|
84
77
|
def values
|
85
|
-
|
78
|
+
cache.values
|
86
79
|
end
|
87
80
|
|
88
81
|
private
|
@@ -90,10 +83,7 @@ module ActiveMemoize
|
|
90
83
|
# rubocop:disable Metrics/LineLength
|
91
84
|
def caller_locals(block)
|
92
85
|
local_vars = block.binding.local_variables
|
93
|
-
local_vars
|
94
|
-
return if local_vars.empty?
|
95
|
-
|
96
|
-
local_vars.join(',')
|
86
|
+
local_vars.flat_map { |name| [name, block.binding.local_variable_get(name)] }
|
97
87
|
end
|
98
88
|
# rubocop:enable Metrics/LineLength
|
99
89
|
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ActiveMemoize
|
4
|
+
module Klass
|
5
|
+
include ActiveMemoize::Shared
|
6
|
+
|
7
|
+
def memoize(method_name, as: nil)
|
8
|
+
inner_method = instance_method(method_name)
|
9
|
+
|
10
|
+
define_method(method_name) do |*args|
|
11
|
+
key = self.class.key(as || method_name, args)
|
12
|
+
self.class.cache[key] ||= inner_method.bind(self).call(*args)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'digest'
|
4
|
+
|
5
|
+
module ActiveMemoize
|
6
|
+
module Shared
|
7
|
+
|
8
|
+
def cache
|
9
|
+
@cache ||= {}
|
10
|
+
end
|
11
|
+
|
12
|
+
def key(method_name, method_args)
|
13
|
+
Digest::SHA1.hexdigest("#{method_name}:#{method_args}")
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: active_memoize
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Juan Gomez
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-03-
|
11
|
+
date: 2019-03-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -118,7 +118,9 @@ files:
|
|
118
118
|
- bin/rake
|
119
119
|
- bin/setup
|
120
120
|
- lib/active_memoize.rb
|
121
|
-
- lib/active_memoize/
|
121
|
+
- lib/active_memoize/instance.rb
|
122
|
+
- lib/active_memoize/klass.rb
|
123
|
+
- lib/active_memoize/shared.rb
|
122
124
|
- lib/active_memoize/version.rb
|
123
125
|
homepage: http://drexed.github.io/active_memoize
|
124
126
|
licenses:
|