memery 1.4.0 → 1.4.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9deb1312add2edf331f0e4b5ff2b196c95f7de899d6ae15ee01e9d4e43fca950
4
- data.tar.gz: f228b03ab8ed0a286075a13f045a53337780c75d4eb9b015b285dfc3c48c3913
3
+ metadata.gz: fa73eb81311be05525651697942d76ae7b171ffe70d0f1b5851e5f41bf74cebd
4
+ data.tar.gz: d5993503224c4c1e60e84c97343d373c0e59eebfe4f735302423b6f88a1d2d33
5
5
  SHA512:
6
- metadata.gz: 8da63cbd319881210877b295f5791132ae80848758954e4ea0615baaf82bcee5fa06c5b93b4dd9a524af7efabad749a65caf428680673e7f68dea625fc806bf7
7
- data.tar.gz: 57806aadb6b7bd61520d068e1c3244836dc6c89c4ce550f8881adfee7eea139b6a07e5dddc4d5de072917693dd34596b49db5114716c9f0dc792023879d69c38
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
- [Unreleased]: https://github.com/tycooon/memery/compare/v1.3.0...HEAD
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.8.4)
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.8)
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.3.5)
30
- i18n (1.8.9)
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.0.0)
30
+ parser (3.0.1.1)
41
31
  ast (~> 2.4.1)
42
- pry (0.14.0)
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
- rest-client (1.6.7)
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.4.1)
75
- parser (>= 2.7.1.5)
76
- rubocop-config-umbrellio (1.11.0.40)
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
- simplecov_json_formatter (0.1.2)
105
- term-ansicolor (1.2.2)
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.11
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 test_memery
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("test_memery") { test_memery }
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("test_memery") { 100.times { test_memery } }
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 @_memery_module
56
+ prepend(@_memery_module)
57
57
  end
58
58
 
59
- def define_memoized_method!(*args, **kwargs)
60
- @_memery_module.public_send __method__, self, *args, **kwargs
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 method_name do |*args, &block|
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
- store = (@_memery_memoized_values ||= {})[method_key] ||= {}
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 store.key?(args) &&
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
- @_memery_memoized_values[method_key][args] =
83
- { result: result, time: Memery.monotonic_clock }
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 method_name
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Memery
4
- VERSION = "1.4.0"
4
+ VERSION = "1.4.1"
5
5
  end
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.0
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-03-15 00:00:00.000000000 Z
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: coveralls
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: pry
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: rake
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: rspec
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: rubocop-config-umbrellio
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.14
208
+ rubygems_version: 3.2.17
209
209
  signing_key:
210
210
  specification_version: 4
211
211
  summary: A gem for memoization.
data/.travis.yml DELETED
@@ -1,17 +0,0 @@
1
- language: ruby
2
-
3
- sudo: false
4
-
5
- rvm:
6
- - 2.5
7
- - 2.6
8
- - 2.7
9
- - 3.0
10
- - ruby-head
11
-
12
- before_install: gem install bundler
13
-
14
- matrix:
15
- fast_finish: true
16
- allow_failures:
17
- - rvm: ruby-head