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 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