memery 1.2.0 → 1.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 +4 -4
- data/.gitignore +0 -1
- data/.rubocop.yml +1 -1
- data/.travis.yml +1 -1
- data/CHANGELOG.md +18 -2
- data/Gemfile.lock +99 -0
- data/lib/memery.rb +49 -28
- data/lib/memery/version.rb +1 -1
- data/memery.gemspec +2 -0
- metadata +18 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 826d0bdf9b559052298b1d6fcd11b22c302533e35037f21213680f80d019528b
|
|
4
|
+
data.tar.gz: b953dc19e1d6743f4d12e088b2efad526dac3a92b4eaa9d2ee0aeb5e641b358b
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 741369cf1d8fb3cf743d19d7415cb96ede62ddb71419882089dd41cf19b461d06cb1dbd08b8c2358fd29e70f6637d34dba8fcc999ae6ea94b8a2adc623c2bac3
|
|
7
|
+
data.tar.gz: f7a8f6829fdf1b4b4a3f674ea5d9394c27230589ad7ccd4d4e61471261915fa81db4cc75ae6048daa068dba50864dc59109e25c8b2e00d48d54c24eddcc640ae
|
data/.gitignore
CHANGED
data/.rubocop.yml
CHANGED
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,15 @@
|
|
|
1
1
|
## [Unreleased]
|
|
2
2
|
|
|
3
|
+
## [1.3.0] - 2020-02-10
|
|
4
|
+
### Added
|
|
5
|
+
- Allow memoization after including module with Memery. ([@AlexWayfer]) [#23]
|
|
6
|
+
|
|
7
|
+
### Changed
|
|
8
|
+
- Make `memoize` return the method name to allow chaining. ([@JelF]) [#22]
|
|
9
|
+
|
|
10
|
+
### Fixed
|
|
11
|
+
- Fix warnings in Ruby 2.7. ([@AlexWayfer]) [#19], [#25]
|
|
12
|
+
|
|
3
13
|
## [1.2.0] - 2019-10-19
|
|
4
14
|
### Added
|
|
5
15
|
- Add `:ttl` option for `memoize` method ([@AlexWayfer]) [#11]
|
|
@@ -19,7 +29,7 @@
|
|
|
19
29
|
- Readme example for memoizing class methods. ([@AlexWayfer]) [#3]
|
|
20
30
|
- Memery raises `ArgumentError` if method is not defined when you call `memoize`.
|
|
21
31
|
|
|
22
|
-
## [0.5.0] - 2017-
|
|
32
|
+
## [0.5.0] - 2017-06-12
|
|
23
33
|
- Initial public version.
|
|
24
34
|
|
|
25
35
|
[0.5.0]: https://github.com/tycooon/memery/tree/v0.5.0
|
|
@@ -27,10 +37,12 @@
|
|
|
27
37
|
[1.0.0]: https://github.com/tycooon/memery/compare/v0.6.0...v1.0.0
|
|
28
38
|
[1.1.0]: https://github.com/tycooon/memery/compare/v1.0.0...v1.1.0
|
|
29
39
|
[1.2.0]: https://github.com/tycooon/memery/compare/v1.1.0...v1.2.0
|
|
30
|
-
[
|
|
40
|
+
[1.3.0]: https://github.com/tycooon/memery/compare/v1.2.0...v1.3.0
|
|
41
|
+
[Unreleased]: https://github.com/tycooon/memery/compare/v1.3.0...HEAD
|
|
31
42
|
|
|
32
43
|
[@tycooon]: https://github.com/tycooon
|
|
33
44
|
[@AlexWayfer]: https://github.com/AlexWayfer
|
|
45
|
+
[@JelF]: https://github.com/JelF
|
|
34
46
|
|
|
35
47
|
[#3]: https://github.com/tycooon/memery/pull/3
|
|
36
48
|
[#7]: https://github.com/tycooon/memery/pull/7
|
|
@@ -38,3 +50,7 @@
|
|
|
38
50
|
[#11]: https://github.com/tycooon/memery/pull/11
|
|
39
51
|
[#14]: https://github.com/tycooon/memery/pull/14
|
|
40
52
|
[#17]: https://github.com/tycooon/memery/pull/17
|
|
53
|
+
[#19]: https://github.com/tycooon/memery/pull/19
|
|
54
|
+
[#22]: https://github.com/tycooon/memery/pull/22
|
|
55
|
+
[#23]: https://github.com/tycooon/memery/pull/23
|
|
56
|
+
[#25]: https://github.com/tycooon/memery/pull/25
|
data/Gemfile.lock
ADDED
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
PATH
|
|
2
|
+
remote: .
|
|
3
|
+
specs:
|
|
4
|
+
memery (1.3.0)
|
|
5
|
+
ruby2_keywords (~> 0.0.2)
|
|
6
|
+
|
|
7
|
+
GEM
|
|
8
|
+
remote: https://rubygems.org/
|
|
9
|
+
specs:
|
|
10
|
+
ast (2.4.0)
|
|
11
|
+
benchmark-ips (2.7.2)
|
|
12
|
+
benchmark-memory (0.1.2)
|
|
13
|
+
memory_profiler (~> 0.9)
|
|
14
|
+
coderay (1.1.2)
|
|
15
|
+
coveralls (0.8.23)
|
|
16
|
+
json (>= 1.8, < 3)
|
|
17
|
+
simplecov (~> 0.16.1)
|
|
18
|
+
term-ansicolor (~> 1.3)
|
|
19
|
+
thor (>= 0.19.4, < 2.0)
|
|
20
|
+
tins (~> 1.6)
|
|
21
|
+
diff-lcs (1.3)
|
|
22
|
+
docile (1.3.2)
|
|
23
|
+
jaro_winkler (1.5.4)
|
|
24
|
+
json (2.3.0)
|
|
25
|
+
memory_profiler (0.9.14)
|
|
26
|
+
method_source (0.9.2)
|
|
27
|
+
parallel (1.19.1)
|
|
28
|
+
parser (2.7.0.2)
|
|
29
|
+
ast (~> 2.4.0)
|
|
30
|
+
pry (0.12.2)
|
|
31
|
+
coderay (~> 1.1.0)
|
|
32
|
+
method_source (~> 0.9.0)
|
|
33
|
+
rack (2.1.1)
|
|
34
|
+
rainbow (3.0.0)
|
|
35
|
+
rake (13.0.1)
|
|
36
|
+
rspec (3.9.0)
|
|
37
|
+
rspec-core (~> 3.9.0)
|
|
38
|
+
rspec-expectations (~> 3.9.0)
|
|
39
|
+
rspec-mocks (~> 3.9.0)
|
|
40
|
+
rspec-core (3.9.1)
|
|
41
|
+
rspec-support (~> 3.9.1)
|
|
42
|
+
rspec-expectations (3.9.0)
|
|
43
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
|
44
|
+
rspec-support (~> 3.9.0)
|
|
45
|
+
rspec-mocks (3.9.1)
|
|
46
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
|
47
|
+
rspec-support (~> 3.9.0)
|
|
48
|
+
rspec-support (3.9.2)
|
|
49
|
+
rubocop (0.79.0)
|
|
50
|
+
jaro_winkler (~> 1.5.1)
|
|
51
|
+
parallel (~> 1.10)
|
|
52
|
+
parser (>= 2.7.0.1)
|
|
53
|
+
rainbow (>= 2.2.2, < 4.0)
|
|
54
|
+
ruby-progressbar (~> 1.7)
|
|
55
|
+
unicode-display_width (>= 1.4.0, < 1.7)
|
|
56
|
+
rubocop-config-umbrellio (0.79.0.68)
|
|
57
|
+
rubocop (= 0.79.0)
|
|
58
|
+
rubocop-performance (= 1.5.2)
|
|
59
|
+
rubocop-rails (= 2.4.1)
|
|
60
|
+
rubocop-rspec (= 1.37.1)
|
|
61
|
+
rubocop-performance (1.5.2)
|
|
62
|
+
rubocop (>= 0.71.0)
|
|
63
|
+
rubocop-rails (2.4.1)
|
|
64
|
+
rack (>= 1.1)
|
|
65
|
+
rubocop (>= 0.72.0)
|
|
66
|
+
rubocop-rspec (1.37.1)
|
|
67
|
+
rubocop (>= 0.68.1)
|
|
68
|
+
ruby-progressbar (1.10.1)
|
|
69
|
+
ruby2_keywords (0.0.2)
|
|
70
|
+
simplecov (0.16.1)
|
|
71
|
+
docile (~> 1.1)
|
|
72
|
+
json (>= 1.8, < 3)
|
|
73
|
+
simplecov-html (~> 0.10.0)
|
|
74
|
+
simplecov-html (0.10.2)
|
|
75
|
+
sync (0.5.0)
|
|
76
|
+
term-ansicolor (1.7.1)
|
|
77
|
+
tins (~> 1.0)
|
|
78
|
+
thor (1.0.1)
|
|
79
|
+
tins (1.24.0)
|
|
80
|
+
sync
|
|
81
|
+
unicode-display_width (1.6.1)
|
|
82
|
+
|
|
83
|
+
PLATFORMS
|
|
84
|
+
ruby
|
|
85
|
+
|
|
86
|
+
DEPENDENCIES
|
|
87
|
+
benchmark-ips
|
|
88
|
+
benchmark-memory
|
|
89
|
+
bundler
|
|
90
|
+
coveralls
|
|
91
|
+
memery!
|
|
92
|
+
pry
|
|
93
|
+
rake
|
|
94
|
+
rspec
|
|
95
|
+
rubocop-config-umbrellio
|
|
96
|
+
simplecov
|
|
97
|
+
|
|
98
|
+
BUNDLED WITH
|
|
99
|
+
2.1.2
|
data/lib/memery.rb
CHANGED
|
@@ -1,34 +1,31 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
require "ruby2_keywords"
|
|
4
|
+
|
|
3
5
|
require "memery/version"
|
|
4
6
|
|
|
5
7
|
module Memery
|
|
6
8
|
class << self
|
|
9
|
+
def monotonic_clock
|
|
10
|
+
Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
module ModuleMethods
|
|
7
15
|
def included(base)
|
|
8
16
|
base.extend(ClassMethods)
|
|
9
17
|
base.include(InstanceMethods)
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
def method_visibility(klass, method_name)
|
|
13
|
-
case
|
|
14
|
-
when klass.private_method_defined?(method_name)
|
|
15
|
-
:private
|
|
16
|
-
when klass.protected_method_defined?(method_name)
|
|
17
|
-
:protected
|
|
18
|
-
when klass.public_method_defined?(method_name)
|
|
19
|
-
:public
|
|
20
|
-
end
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
def monotonic_clock
|
|
24
|
-
Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
|
18
|
+
base.extend ModuleMethods if base.instance_of?(Module)
|
|
25
19
|
end
|
|
26
20
|
end
|
|
27
21
|
|
|
22
|
+
extend ModuleMethods
|
|
23
|
+
|
|
28
24
|
module ClassMethods
|
|
29
25
|
def memoize(method_name, condition: nil, ttl: nil)
|
|
30
26
|
prepend_memery_module!
|
|
31
27
|
define_memoized_method!(method_name, condition: condition, ttl: ttl)
|
|
28
|
+
method_name
|
|
32
29
|
end
|
|
33
30
|
|
|
34
31
|
def memoized?(method_name)
|
|
@@ -42,37 +39,61 @@ module Memery
|
|
|
42
39
|
|
|
43
40
|
def prepend_memery_module!
|
|
44
41
|
return if defined?(@_memery_module)
|
|
45
|
-
@_memery_module = Module.new
|
|
42
|
+
@_memery_module = Module.new do
|
|
43
|
+
extend MemoizationModule
|
|
44
|
+
end
|
|
46
45
|
prepend @_memery_module
|
|
47
46
|
end
|
|
48
47
|
|
|
49
|
-
def define_memoized_method!(
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
48
|
+
def define_memoized_method!(*args, **kwargs)
|
|
49
|
+
@_memery_module.public_send __method__, self, *args, **kwargs
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
module MemoizationModule
|
|
53
|
+
def define_memoized_method!(klass, method_name, condition: nil, ttl: nil)
|
|
54
|
+
method_key = "#{method_name}_#{object_id}"
|
|
55
|
+
|
|
56
|
+
original_visibility = method_visibility(klass, method_name)
|
|
53
57
|
|
|
54
|
-
|
|
55
|
-
define_method(method_name) do |*args, &block|
|
|
58
|
+
define_method method_name do |*args, &block|
|
|
56
59
|
if block || (condition && !instance_exec(&condition))
|
|
57
60
|
return super(*args, &block)
|
|
58
61
|
end
|
|
59
62
|
|
|
60
|
-
|
|
63
|
+
store = (@_memery_memoized_values ||= {})[method_key] ||= {}
|
|
61
64
|
|
|
62
|
-
store
|
|
63
|
-
|
|
64
|
-
if store.key?(args) && (ttl.nil? || Memery.monotonic_clock <= store[args][:time] + ttl)
|
|
65
|
+
if store.key?(args) &&
|
|
66
|
+
(ttl.nil? || Memery.monotonic_clock <= store[args][:time] + ttl)
|
|
65
67
|
return store[args][:result]
|
|
66
68
|
end
|
|
67
69
|
|
|
68
70
|
result = super(*args)
|
|
69
|
-
@_memery_memoized_values[
|
|
71
|
+
@_memery_memoized_values[method_key][args] =
|
|
72
|
+
{ result: result, time: Memery.monotonic_clock }
|
|
70
73
|
result
|
|
71
74
|
end
|
|
72
75
|
|
|
73
|
-
|
|
76
|
+
ruby2_keywords method_name
|
|
77
|
+
|
|
78
|
+
send original_visibility, method_name
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
private
|
|
82
|
+
|
|
83
|
+
def method_visibility(klass, method_name)
|
|
84
|
+
if klass.private_method_defined?(method_name)
|
|
85
|
+
:private
|
|
86
|
+
elsif klass.protected_method_defined?(method_name)
|
|
87
|
+
:protected
|
|
88
|
+
elsif klass.public_method_defined?(method_name)
|
|
89
|
+
:public
|
|
90
|
+
else
|
|
91
|
+
raise ArgumentError, "Method #{method_name} is not defined on #{klass}"
|
|
92
|
+
end
|
|
74
93
|
end
|
|
75
94
|
end
|
|
95
|
+
|
|
96
|
+
private_constant :MemoizationModule
|
|
76
97
|
end
|
|
77
98
|
|
|
78
99
|
module InstanceMethods
|
data/lib/memery/version.rb
CHANGED
data/memery.gemspec
CHANGED
|
@@ -20,6 +20,8 @@ Gem::Specification.new do |spec|
|
|
|
20
20
|
end
|
|
21
21
|
spec.require_paths = ["lib"]
|
|
22
22
|
|
|
23
|
+
spec.add_runtime_dependency "ruby2_keywords", "~> 0.0.2"
|
|
24
|
+
|
|
23
25
|
spec.add_development_dependency "benchmark-ips"
|
|
24
26
|
spec.add_development_dependency "benchmark-memory"
|
|
25
27
|
spec.add_development_dependency "bundler"
|
metadata
CHANGED
|
@@ -1,15 +1,29 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: memery
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.
|
|
4
|
+
version: 1.3.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Yuri Smirnov
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2020-02-10 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
|
+
- !ruby/object:Gem::Dependency
|
|
14
|
+
name: ruby2_keywords
|
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
|
16
|
+
requirements:
|
|
17
|
+
- - "~>"
|
|
18
|
+
- !ruby/object:Gem::Version
|
|
19
|
+
version: 0.0.2
|
|
20
|
+
type: :runtime
|
|
21
|
+
prerelease: false
|
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
+
requirements:
|
|
24
|
+
- - "~>"
|
|
25
|
+
- !ruby/object:Gem::Version
|
|
26
|
+
version: 0.0.2
|
|
13
27
|
- !ruby/object:Gem::Dependency
|
|
14
28
|
name: benchmark-ips
|
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -150,6 +164,7 @@ files:
|
|
|
150
164
|
- ".travis.yml"
|
|
151
165
|
- CHANGELOG.md
|
|
152
166
|
- Gemfile
|
|
167
|
+
- Gemfile.lock
|
|
153
168
|
- LICENSE.txt
|
|
154
169
|
- README.md
|
|
155
170
|
- Rakefile
|
|
@@ -176,7 +191,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
176
191
|
- !ruby/object:Gem::Version
|
|
177
192
|
version: '0'
|
|
178
193
|
requirements: []
|
|
179
|
-
rubygems_version: 3.
|
|
194
|
+
rubygems_version: 3.1.2
|
|
180
195
|
signing_key:
|
|
181
196
|
specification_version: 4
|
|
182
197
|
summary: A gem for memoization.
|