memery 1.4.0 → 1.4.1
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/.github/workflows/ci.yml +31 -0
- data/CHANGELOG.md +2 -1
- data/Gemfile.lock +15 -30
- data/benchmark.rb +19 -3
- data/lib/memery.rb +21 -14
- data/lib/memery/version.rb +1 -1
- data/memery.gemspec +1 -1
- metadata +10 -10
- data/.travis.yml +0 -17
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fa73eb81311be05525651697942d76ae7b171ffe70d0f1b5851e5f41bf74cebd
|
4
|
+
data.tar.gz: d5993503224c4c1e60e84c97343d373c0e59eebfe4f735302423b6f88a1d2d33
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bb9610aeab7ea46e94e411d5200f295910f01687f240b7ea21c0867c33a6e57a111649104199d0808dda3e0db2b36f944a3fd40c808eda26e78c3bb7ab5c3c6d
|
7
|
+
data.tar.gz: 3ced0dec017d683e82b698866a79072f97ad723b6df0a3e6029ac41037ff634343abbaec3f2fc5740799308108c3a1cc3ff7e36c15f4796121b287aaaf120858
|
@@ -0,0 +1,31 @@
|
|
1
|
+
name: CI
|
2
|
+
|
3
|
+
on: [push, pull_request]
|
4
|
+
|
5
|
+
jobs:
|
6
|
+
test:
|
7
|
+
runs-on: ubuntu-latest
|
8
|
+
|
9
|
+
# We want to run on external PRs, but not on our own internal PRs as they'll be run on push event
|
10
|
+
if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name != 'tycooon/memery'
|
11
|
+
|
12
|
+
strategy:
|
13
|
+
fail-fast: false
|
14
|
+
matrix:
|
15
|
+
ruby: ["2.5", "2.6", "2.7", "3.0"]
|
16
|
+
|
17
|
+
name: ${{ matrix.ruby }}
|
18
|
+
|
19
|
+
steps:
|
20
|
+
- uses: actions/checkout@v2
|
21
|
+
|
22
|
+
- uses: ruby/setup-ruby@v1
|
23
|
+
with:
|
24
|
+
ruby-version: ${{ matrix.ruby }}
|
25
|
+
bundler-cache: true
|
26
|
+
|
27
|
+
- run: bundle exec rake
|
28
|
+
|
29
|
+
- uses: coverallsapp/github-action@v1.1.2
|
30
|
+
with:
|
31
|
+
github-token: ${{ secrets.GITHUB_TOKEN }}
|
data/CHANGELOG.md
CHANGED
@@ -42,7 +42,8 @@
|
|
42
42
|
[1.1.0]: https://github.com/tycooon/memery/compare/v1.0.0...v1.1.0
|
43
43
|
[1.2.0]: https://github.com/tycooon/memery/compare/v1.1.0...v1.2.0
|
44
44
|
[1.3.0]: https://github.com/tycooon/memery/compare/v1.2.0...v1.3.0
|
45
|
-
[
|
45
|
+
[1.4.0]: https://github.com/tycooon/memery/compare/v1.3.0...v1.4.0
|
46
|
+
[Unreleased]: https://github.com/tycooon/memery/compare/v1.4.0...HEAD
|
46
47
|
|
47
48
|
[@tycooon]: https://github.com/tycooon
|
48
49
|
[@AlexWayfer]: https://github.com/AlexWayfer
|
data/Gemfile.lock
CHANGED
@@ -7,48 +7,36 @@ PATH
|
|
7
7
|
GEM
|
8
8
|
remote: https://rubygems.org/
|
9
9
|
specs:
|
10
|
-
activesupport (6.1.3)
|
10
|
+
activesupport (6.1.3.2)
|
11
11
|
concurrent-ruby (~> 1.0, >= 1.0.2)
|
12
12
|
i18n (>= 1.6, < 2)
|
13
13
|
minitest (>= 5.1)
|
14
14
|
tzinfo (~> 2.0)
|
15
15
|
zeitwerk (~> 2.3)
|
16
16
|
ast (2.4.2)
|
17
|
-
benchmark-ips (2.
|
17
|
+
benchmark-ips (2.9.1)
|
18
18
|
benchmark-memory (0.1.2)
|
19
19
|
memory_profiler (~> 0.9)
|
20
20
|
coderay (1.1.3)
|
21
|
-
concurrent-ruby (1.1.
|
22
|
-
coveralls (0.7.2)
|
23
|
-
multi_json (~> 1.3)
|
24
|
-
rest-client (= 1.6.7)
|
25
|
-
simplecov (>= 0.7)
|
26
|
-
term-ansicolor (= 1.2.2)
|
27
|
-
thor (= 0.18.1)
|
21
|
+
concurrent-ruby (1.1.9)
|
28
22
|
diff-lcs (1.4.4)
|
29
|
-
docile (1.
|
30
|
-
i18n (1.8.
|
23
|
+
docile (1.4.0)
|
24
|
+
i18n (1.8.10)
|
31
25
|
concurrent-ruby (~> 1.0)
|
32
26
|
memory_profiler (0.9.14)
|
33
27
|
method_source (1.0.0)
|
34
|
-
mime-types (3.3.1)
|
35
|
-
mime-types-data (~> 3.2015)
|
36
|
-
mime-types-data (3.2021.0225)
|
37
28
|
minitest (5.14.4)
|
38
|
-
multi_json (1.15.0)
|
39
29
|
parallel (1.20.1)
|
40
|
-
parser (3.0.
|
30
|
+
parser (3.0.1.1)
|
41
31
|
ast (~> 2.4.1)
|
42
|
-
pry (0.14.
|
32
|
+
pry (0.14.1)
|
43
33
|
coderay (~> 1.1)
|
44
34
|
method_source (~> 1.0)
|
45
35
|
rack (2.2.3)
|
46
36
|
rainbow (3.0.0)
|
47
37
|
rake (13.0.3)
|
48
38
|
regexp_parser (2.1.1)
|
49
|
-
|
50
|
-
mime-types (>= 1.16)
|
51
|
-
rexml (3.2.4)
|
39
|
+
rexml (3.2.5)
|
52
40
|
rspec (3.10.0)
|
53
41
|
rspec-core (~> 3.10.0)
|
54
42
|
rspec-expectations (~> 3.10.0)
|
@@ -71,9 +59,9 @@ GEM
|
|
71
59
|
rubocop-ast (>= 1.2.0, < 2.0)
|
72
60
|
ruby-progressbar (~> 1.7)
|
73
61
|
unicode-display_width (>= 1.4.0, < 3.0)
|
74
|
-
rubocop-ast (1.
|
75
|
-
parser (>=
|
76
|
-
rubocop-config-umbrellio (1.11.0.
|
62
|
+
rubocop-ast (1.7.0)
|
63
|
+
parser (>= 3.0.1.1)
|
64
|
+
rubocop-config-umbrellio (1.11.0.51)
|
77
65
|
rubocop (= 1.11.0)
|
78
66
|
rubocop-performance (= 1.10.0)
|
79
67
|
rubocop-rails (= 2.9.1)
|
@@ -101,11 +89,8 @@ GEM
|
|
101
89
|
simplecov-html (~> 0.11)
|
102
90
|
simplecov_json_formatter (~> 0.1)
|
103
91
|
simplecov-html (0.12.3)
|
104
|
-
|
105
|
-
|
106
|
-
tins (~> 0.8)
|
107
|
-
thor (0.18.1)
|
108
|
-
tins (0.13.2)
|
92
|
+
simplecov-lcov (0.8.0)
|
93
|
+
simplecov_json_formatter (0.1.3)
|
109
94
|
tzinfo (2.0.4)
|
110
95
|
concurrent-ruby (~> 1.0)
|
111
96
|
unicode-display_width (2.0.0)
|
@@ -119,13 +104,13 @@ DEPENDENCIES
|
|
119
104
|
benchmark-ips
|
120
105
|
benchmark-memory
|
121
106
|
bundler
|
122
|
-
coveralls
|
123
107
|
memery!
|
124
108
|
pry
|
125
109
|
rake
|
126
110
|
rspec
|
127
111
|
rubocop-config-umbrellio
|
128
112
|
simplecov
|
113
|
+
simplecov-lcov
|
129
114
|
|
130
115
|
BUNDLED WITH
|
131
|
-
2.2.
|
116
|
+
2.2.17
|
data/benchmark.rb
CHANGED
@@ -25,22 +25,38 @@ class Foo
|
|
25
25
|
("a".."k").find { |letter| letter == char }
|
26
26
|
end
|
27
27
|
|
28
|
+
memoize def find_z
|
29
|
+
base_find("z")
|
30
|
+
end
|
31
|
+
|
28
32
|
memoize def find_new(char)
|
29
33
|
base_find(char)
|
30
34
|
end
|
31
35
|
end
|
32
36
|
end
|
33
37
|
|
34
|
-
def
|
38
|
+
def test_no_args
|
39
|
+
Foo.find_z
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_with_args
|
35
43
|
Foo.find_new("d")
|
36
44
|
end
|
37
45
|
|
38
46
|
Benchmark.ips do |x|
|
39
|
-
x.report("
|
47
|
+
x.report("test_no_args") { test_no_args }
|
48
|
+
end
|
49
|
+
|
50
|
+
Benchmark.memory do |x|
|
51
|
+
x.report("test_no_args") { 100.times { test_no_args } }
|
52
|
+
end
|
53
|
+
|
54
|
+
Benchmark.ips do |x|
|
55
|
+
x.report("test_with_args") { test_with_args }
|
40
56
|
end
|
41
57
|
|
42
58
|
Benchmark.memory do |x|
|
43
|
-
x.report("
|
59
|
+
x.report("test_with_args") { 100.times { test_with_args } }
|
44
60
|
end
|
45
61
|
|
46
62
|
puts "```"
|
data/lib/memery.rb
CHANGED
@@ -53,40 +53,47 @@ module Memery
|
|
53
53
|
def prepend_memery_module!
|
54
54
|
return if defined?(@_memery_module)
|
55
55
|
@_memery_module = Module.new { extend MemoizationModule }
|
56
|
-
prepend
|
56
|
+
prepend(@_memery_module)
|
57
57
|
end
|
58
58
|
|
59
|
-
def define_memoized_method!(
|
60
|
-
@_memery_module.
|
59
|
+
def define_memoized_method!(method_name, **options)
|
60
|
+
@_memery_module.define_memoized_method!(self, method_name, **options)
|
61
61
|
end
|
62
62
|
|
63
63
|
module MemoizationModule
|
64
|
+
Cache = Struct.new(:result, :time) do
|
65
|
+
def fresh?(ttl)
|
66
|
+
return true if ttl.nil?
|
67
|
+
Memery.monotonic_clock <= time + ttl
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
64
71
|
def define_memoized_method!(klass, method_name, condition: nil, ttl: nil)
|
65
72
|
method_key = "#{method_name}_#{object_id}"
|
66
73
|
|
67
74
|
original_visibility = method_visibility(klass, method_name)
|
75
|
+
original_arity = klass.instance_method(method_name).arity
|
68
76
|
|
69
|
-
define_method
|
77
|
+
define_method(method_name) do |*args, &block|
|
70
78
|
if block || (condition && !instance_exec(&condition))
|
71
79
|
return super(*args, &block)
|
72
80
|
end
|
73
81
|
|
74
|
-
|
82
|
+
cache_store = (@_memery_memoized_values ||= {})
|
83
|
+
cache_key = original_arity.zero? ? method_key : [method_key, *args]
|
84
|
+
cache = cache_store[cache_key]
|
75
85
|
|
76
|
-
if
|
77
|
-
(ttl.nil? || Memery.monotonic_clock <= store[args][:time] + ttl)
|
78
|
-
return store[args][:result]
|
79
|
-
end
|
86
|
+
return cache.result if cache&.fresh?(ttl)
|
80
87
|
|
81
88
|
result = super(*args)
|
82
|
-
|
83
|
-
|
89
|
+
new_cache = Cache.new(result, Memery.monotonic_clock)
|
90
|
+
cache_store[cache_key] = new_cache
|
91
|
+
|
84
92
|
result
|
85
93
|
end
|
86
94
|
|
87
|
-
ruby2_keywords
|
88
|
-
|
89
|
-
send original_visibility, method_name
|
95
|
+
ruby2_keywords(method_name)
|
96
|
+
send(original_visibility, method_name)
|
90
97
|
end
|
91
98
|
|
92
99
|
private
|
data/lib/memery/version.rb
CHANGED
data/memery.gemspec
CHANGED
@@ -28,10 +28,10 @@ Gem::Specification.new do |spec|
|
|
28
28
|
spec.add_development_dependency "benchmark-ips"
|
29
29
|
spec.add_development_dependency "benchmark-memory"
|
30
30
|
spec.add_development_dependency "bundler"
|
31
|
-
spec.add_development_dependency "coveralls"
|
32
31
|
spec.add_development_dependency "pry"
|
33
32
|
spec.add_development_dependency "rake"
|
34
33
|
spec.add_development_dependency "rspec"
|
35
34
|
spec.add_development_dependency "rubocop-config-umbrellio"
|
36
35
|
spec.add_development_dependency "simplecov"
|
36
|
+
spec.add_development_dependency "simplecov-lcov"
|
37
37
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: memery
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.4.
|
4
|
+
version: 1.4.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yuri Smirnov
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-06-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ruby2_keywords
|
@@ -81,7 +81,7 @@ dependencies:
|
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
|
-
name:
|
84
|
+
name: pry
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
87
|
- - ">="
|
@@ -95,7 +95,7 @@ dependencies:
|
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '0'
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
|
-
name:
|
98
|
+
name: rake
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
101
|
- - ">="
|
@@ -109,7 +109,7 @@ dependencies:
|
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: '0'
|
111
111
|
- !ruby/object:Gem::Dependency
|
112
|
-
name:
|
112
|
+
name: rspec
|
113
113
|
requirement: !ruby/object:Gem::Requirement
|
114
114
|
requirements:
|
115
115
|
- - ">="
|
@@ -123,7 +123,7 @@ dependencies:
|
|
123
123
|
- !ruby/object:Gem::Version
|
124
124
|
version: '0'
|
125
125
|
- !ruby/object:Gem::Dependency
|
126
|
-
name:
|
126
|
+
name: rubocop-config-umbrellio
|
127
127
|
requirement: !ruby/object:Gem::Requirement
|
128
128
|
requirements:
|
129
129
|
- - ">="
|
@@ -137,7 +137,7 @@ dependencies:
|
|
137
137
|
- !ruby/object:Gem::Version
|
138
138
|
version: '0'
|
139
139
|
- !ruby/object:Gem::Dependency
|
140
|
-
name:
|
140
|
+
name: simplecov
|
141
141
|
requirement: !ruby/object:Gem::Requirement
|
142
142
|
requirements:
|
143
143
|
- - ">="
|
@@ -151,7 +151,7 @@ dependencies:
|
|
151
151
|
- !ruby/object:Gem::Version
|
152
152
|
version: '0'
|
153
153
|
- !ruby/object:Gem::Dependency
|
154
|
-
name: simplecov
|
154
|
+
name: simplecov-lcov
|
155
155
|
requirement: !ruby/object:Gem::Requirement
|
156
156
|
requirements:
|
157
157
|
- - ">="
|
@@ -172,10 +172,10 @@ extensions: []
|
|
172
172
|
extra_rdoc_files: []
|
173
173
|
files:
|
174
174
|
- ".editorconfig"
|
175
|
+
- ".github/workflows/ci.yml"
|
175
176
|
- ".gitignore"
|
176
177
|
- ".rspec"
|
177
178
|
- ".rubocop.yml"
|
178
|
-
- ".travis.yml"
|
179
179
|
- CHANGELOG.md
|
180
180
|
- Gemfile
|
181
181
|
- Gemfile.lock
|
@@ -205,7 +205,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
205
205
|
- !ruby/object:Gem::Version
|
206
206
|
version: '0'
|
207
207
|
requirements: []
|
208
|
-
rubygems_version: 3.2.
|
208
|
+
rubygems_version: 3.2.17
|
209
209
|
signing_key:
|
210
210
|
specification_version: 4
|
211
211
|
summary: A gem for memoization.
|