memery 1.4.0 → 1.5.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9deb1312add2edf331f0e4b5ff2b196c95f7de899d6ae15ee01e9d4e43fca950
4
- data.tar.gz: f228b03ab8ed0a286075a13f045a53337780c75d4eb9b015b285dfc3c48c3913
3
+ metadata.gz: 97a9a87378334fd120a2d5cff1090a77c77c07fd7ade8f7826b7f224fb38a19c
4
+ data.tar.gz: 06b10e5f165da54db22aa802d78e3af7146ff63b3eeb08c9192f17d8a713d9c0
5
5
  SHA512:
6
- metadata.gz: 8da63cbd319881210877b295f5791132ae80848758954e4ea0615baaf82bcee5fa06c5b93b4dd9a524af7efabad749a65caf428680673e7f68dea625fc806bf7
7
- data.tar.gz: 57806aadb6b7bd61520d068e1c3244836dc6c89c4ce550f8881adfee7eea139b6a07e5dddc4d5de072917693dd34596b49db5114716c9f0dc792023879d69c38
6
+ metadata.gz: 301a7a83ea1b19acba82fecbd4cba2372f881514717ee42f10b909a8806bb457f5ec82d1209f23cdaf3ea9d6c3ef1b6a32d520280dbd9385674a03a12147da5f
7
+ data.tar.gz: 045412175d2776f97f7ff231556de4d7fef00147a7b8e92b7021c603afacf65b8d73d20b8b9eb2ad2b3f97affe979a0b591087c35c05ca83ffea28c8b8b0af80
@@ -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", "3.1"]
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
@@ -1,54 +1,42 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- memery (1.4.0)
4
+ memery (1.5.0)
5
5
  ruby2_keywords (~> 0.0.2)
6
6
 
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)
@@ -95,17 +83,14 @@ GEM
95
83
  rubocop-sequel (0.2.0)
96
84
  rubocop (~> 1.0)
97
85
  ruby-progressbar (1.11.0)
98
- ruby2_keywords (0.0.4)
86
+ ruby2_keywords (0.0.5)
99
87
  simplecov (0.21.2)
100
88
  docile (~> 1.1)
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.4.14
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # Memery   [![Gem Version](https://badge.fury.io/rb/memery.svg)](https://badge.fury.io/rb/memery) [![Build Status](https://travis-ci.org/tycooon/memery.svg?branch=master)](https://travis-ci.org/tycooon/memery) [![Coverage Status](https://coveralls.io/repos/github/tycooon/memery/badge.svg?branch=master)](https://coveralls.io/github/tycooon/memery?branch=master)
1
+ # Memery   [![Gem Version](https://badge.fury.io/rb/memery.svg)](https://badge.fury.io/rb/memery) ![Build Status](https://github.com/tycooon/memery/actions/workflows/ci.yml/badge.svg) [![Coverage Status](https://coveralls.io/repos/github/tycooon/memery/badge.svg?branch=master)](https://coveralls.io/github/tycooon/memery?branch=master)
2
2
 
3
3
  Memery is a Ruby gem for memoization of method return values. The normal memoization in Ruby doesn't require any gems and looks like this:
4
4
 
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 "```"
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Memery
4
- VERSION = "1.4.0"
4
+ VERSION = "1.5.0"
5
5
  end
data/lib/memery.rb CHANGED
@@ -35,10 +35,12 @@ module Memery
35
35
  extend ModuleMethods
36
36
 
37
37
  module ClassMethods
38
- def memoize(method_name, condition: nil, ttl: nil)
38
+ def memoize(*method_names, condition: nil, ttl: nil)
39
39
  prepend_memery_module!
40
- define_memoized_method!(method_name, condition: condition, ttl: ttl)
41
- method_name
40
+ method_names.each do |method_name|
41
+ define_memoized_method!(method_name, condition: condition, ttl: ttl)
42
+ end
43
+ method_names.length > 1 ? method_names : method_names.first
42
44
  end
43
45
 
44
46
  def memoized?(method_name)
@@ -53,40 +55,47 @@ module Memery
53
55
  def prepend_memery_module!
54
56
  return if defined?(@_memery_module)
55
57
  @_memery_module = Module.new { extend MemoizationModule }
56
- prepend @_memery_module
58
+ prepend(@_memery_module)
57
59
  end
58
60
 
59
- def define_memoized_method!(*args, **kwargs)
60
- @_memery_module.public_send __method__, self, *args, **kwargs
61
+ def define_memoized_method!(method_name, **options)
62
+ @_memery_module.define_memoized_method!(self, method_name, **options)
61
63
  end
62
64
 
63
65
  module MemoizationModule
66
+ Cache = Struct.new(:result, :time) do
67
+ def fresh?(ttl)
68
+ return true if ttl.nil?
69
+ Memery.monotonic_clock <= time + ttl
70
+ end
71
+ end
72
+
64
73
  def define_memoized_method!(klass, method_name, condition: nil, ttl: nil)
65
74
  method_key = "#{method_name}_#{object_id}"
66
75
 
67
76
  original_visibility = method_visibility(klass, method_name)
77
+ original_arity = klass.instance_method(method_name).arity
68
78
 
69
- define_method method_name do |*args, &block|
79
+ define_method(method_name) do |*args, &block|
70
80
  if block || (condition && !instance_exec(&condition))
71
81
  return super(*args, &block)
72
82
  end
73
83
 
74
- store = (@_memery_memoized_values ||= {})[method_key] ||= {}
84
+ cache_store = (@_memery_memoized_values ||= {})
85
+ cache_key = original_arity.zero? ? method_key : [method_key, *args]
86
+ cache = cache_store[cache_key]
75
87
 
76
- if store.key?(args) &&
77
- (ttl.nil? || Memery.monotonic_clock <= store[args][:time] + ttl)
78
- return store[args][:result]
79
- end
88
+ return cache.result if cache&.fresh?(ttl)
80
89
 
81
90
  result = super(*args)
82
- @_memery_memoized_values[method_key][args] =
83
- { result: result, time: Memery.monotonic_clock }
91
+ new_cache = Cache.new(result, Memery.monotonic_clock)
92
+ cache_store[cache_key] = new_cache
93
+
84
94
  result
85
95
  end
86
96
 
87
- ruby2_keywords method_name
88
-
89
- send original_visibility, method_name
97
+ ruby2_keywords(method_name)
98
+ send(original_visibility, method_name)
90
99
  end
91
100
 
92
101
  private
data/memery.gemspec CHANGED
@@ -10,7 +10,7 @@ Gem::Specification.new do |spec|
10
10
  spec.name = "memery"
11
11
  spec.version = Memery::VERSION
12
12
  spec.authors = ["Yuri Smirnov"]
13
- spec.email = ["tycooon@yandex.ru"]
13
+ spec.email = ["tycoooon@gmail.com"]
14
14
 
15
15
  spec.summary = "A gem for memoization."
16
16
  spec.description = "Memery is a gem for memoization."
@@ -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.5.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: 2021-03-15 00:00:00.000000000 Z
11
+ date: 2023-06-14 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
  - - ">="
@@ -166,16 +166,16 @@ dependencies:
166
166
  version: '0'
167
167
  description: Memery is a gem for memoization.
168
168
  email:
169
- - tycooon@yandex.ru
169
+ - tycoooon@gmail.com
170
170
  executables: []
171
171
  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.4.13
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