memo_wise 1.8.0 → 1.9.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/dependency-review.yml +1 -1
- data/.github/workflows/main.yml +5 -4
- data/.ruby-version +1 -1
- data/CHANGELOG.md +18 -3
- data/Gemfile +4 -3
- data/Gemfile.lock +21 -17
- data/README.md +50 -27
- data/benchmarks/Gemfile +1 -1
- data/lib/memo_wise/version.rb +1 -1
- data/lib/memo_wise.rb +27 -14
- data/memo_wise.gemspec +1 -1
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bcbf16d5dbb7dcebd8181d89b17e550f493afb08e8c3f46c2e56d1c6d224a71d
|
4
|
+
data.tar.gz: bff1adee597c5a29fea1223604733a23b5b10e800e217d7b7e73d715b0c221cf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 477aac5ab8f66cf7287ff976a484d8ba06447587f997e612fccee952d003b688c79d9d934f28d730443d7c23fdeca4d90ec0adb79f6dea9f5bdc11b0b9d3820e
|
7
|
+
data.tar.gz: 99175b330fd6235bab7967545177298d2ccaa3fbab2c2d860aaa7f686f48e581ec7d5ef2e036a760759e48bec8618b24b1784227e9eb762052dac4649f102813
|
@@ -17,7 +17,7 @@
|
|
17
17
|
- name: 'Checkout Repository'
|
18
18
|
uses: actions/checkout@v4
|
19
19
|
- name: 'Dependency Review'
|
20
|
-
uses: actions/dependency-review-action@
|
20
|
+
uses: actions/dependency-review-action@v4
|
21
21
|
with:
|
22
22
|
# Possible values: "critical", "high", "moderate", "low"
|
23
23
|
fail-on-severity: high
|
data/.github/workflows/main.yml
CHANGED
@@ -14,7 +14,7 @@ jobs:
|
|
14
14
|
matrix:
|
15
15
|
# Due to https://github.com/actions/runner/issues/849, we have to use
|
16
16
|
# quotes for '3.0' -- without quotes, CI sees '3' and runs the latest.
|
17
|
-
ruby: [2.
|
17
|
+
ruby: [2.5, 2.6, 2.7, '3.0', 3.1, 3.2, jruby, truffleruby-head]
|
18
18
|
runs-on: ubuntu-latest
|
19
19
|
steps:
|
20
20
|
- uses: actions/checkout@v4
|
@@ -23,8 +23,8 @@ jobs:
|
|
23
23
|
# * https://github.com/ruby/setup-ruby#bundle-config
|
24
24
|
- name: Set bundler environment variables
|
25
25
|
run: |
|
26
|
-
echo "
|
27
|
-
if: matrix.ruby
|
26
|
+
echo "BUNDLE_WITH=checks:docs" >> $GITHUB_ENV
|
27
|
+
if: matrix.ruby == 3.2
|
28
28
|
|
29
29
|
# Use 'bundler-cache: true' instead of actions/cache as advised:
|
30
30
|
# * https://github.com/actions/cache/blob/main/examples.md#ruby---bundler
|
@@ -35,10 +35,11 @@ jobs:
|
|
35
35
|
|
36
36
|
- run: bundle exec rspec
|
37
37
|
|
38
|
-
- uses: codecov/codecov-action@
|
38
|
+
- uses: codecov/codecov-action@v4
|
39
39
|
with:
|
40
40
|
files: ./coverage/coverage.xml
|
41
41
|
fail_ci_if_error: true # optional (default = false)
|
42
|
+
token: ${{ secrets.CODECOV_TOKEN }}
|
42
43
|
verbose: true # optional (default = false)
|
43
44
|
if: matrix.ruby == 3.2
|
44
45
|
|
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
3.2.
|
1
|
+
3.2.2
|
data/CHANGELOG.md
CHANGED
@@ -5,13 +5,28 @@ follows a format inspired by [Keep a Changelog](https://keepachangelog.com/en/1.
|
|
5
5
|
|
6
6
|
This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
7
7
|
|
8
|
-
## [Unreleased](https://github.com/panorama-ed/memo_wise/compare/v1.
|
8
|
+
## [Unreleased](https://github.com/panorama-ed/memo_wise/compare/v1.9.0...HEAD)
|
9
9
|
|
10
|
-
**Gem enhancements:**
|
10
|
+
**Gem enhancements:**
|
11
11
|
|
12
12
|
_No breaking changes!_
|
13
13
|
|
14
|
-
**Project enhancements:**
|
14
|
+
**Project enhancements:**
|
15
|
+
|
16
|
+
## [v1.9.0](https://github.com/panorama-ed/memo_wise/compare/v1.8.0...v1.9.0)
|
17
|
+
|
18
|
+
**Gem enhancements:**
|
19
|
+
|
20
|
+
- Fixed a bug that overwrote existing self.extended method definitions. [[#324]](https://github.com/panorama-ed/memo_wise/pull/314)
|
21
|
+
- Fixed a bug that overwrote existing self.inherited method definitions. [[#325]](https://github.com/panorama-ed/memo_wise/pull/315)
|
22
|
+
|
23
|
+
_Breaking changes:_
|
24
|
+
- Removed Ruby 2.4 (EOL) support to allow upgrading rexml dependency version from a version that includes a [CVE](https://www.ruby-lang.org/en/news/2024/05/16/dos-rexml-cve-2024-35176/) [[#336]](https://github.com/panorama-ed/memo_wise/pull/336)
|
25
|
+
|
26
|
+
**Project enhancements:**
|
27
|
+
|
28
|
+
- Fixed `bundle exec yard server --reload` and related documentation [[#333]](https://github.com/panorama-ed/memo_wise/pull/333)
|
29
|
+
- Fixed Codecov rate limiting errors affecting pull requests by upgrading `codecov/codecov-action` and using a Codecov token [[#317]](https://github.com/panorama-ed/memo_wise/pull/317)
|
15
30
|
|
16
31
|
## [v1.8.0](https://github.com/panorama-ed/memo_wise/compare/v1.7.0...v1.8.0) - 2023-10-25
|
17
32
|
|
data/Gemfile
CHANGED
@@ -7,12 +7,12 @@ git_source(:github) { |repo| "https://github.com/#{repo}.git" }
|
|
7
7
|
gemspec
|
8
8
|
|
9
9
|
group :test do
|
10
|
-
gem "rspec", "~> 3.
|
10
|
+
gem "rspec", "~> 3.13"
|
11
11
|
gem "values", "~> 1"
|
12
12
|
end
|
13
13
|
|
14
14
|
# Excluded from CI except on latest MRI Ruby, to reduce compatibility burden
|
15
|
-
group :checks do
|
15
|
+
group :checks, optional: true do
|
16
16
|
gem "panolint-ruby", github: "panorama-ed/panolint-ruby", branch: "main"
|
17
17
|
|
18
18
|
# Simplecov to generate coverage info
|
@@ -23,9 +23,10 @@ group :checks do
|
|
23
23
|
end
|
24
24
|
|
25
25
|
# Excluded from CI except on latest MRI Ruby, to reduce compatibility burden
|
26
|
-
group :docs do
|
26
|
+
group :docs, optional: true do
|
27
27
|
gem "dokaz", "~> 0.0.5"
|
28
28
|
gem "redcarpet", "~> 3.6"
|
29
|
+
gem "webrick", "~> 1.8"
|
29
30
|
gem "yard", "~> 0.9"
|
30
31
|
gem "yard-doctest", "~> 0.1"
|
31
32
|
end
|
data/Gemfile.lock
CHANGED
@@ -11,14 +11,14 @@ GIT
|
|
11
11
|
PATH
|
12
12
|
remote: .
|
13
13
|
specs:
|
14
|
-
memo_wise (1.
|
14
|
+
memo_wise (1.9.0)
|
15
15
|
|
16
16
|
GEM
|
17
17
|
remote: https://rubygems.org/
|
18
18
|
specs:
|
19
19
|
ansi (1.5.0)
|
20
20
|
ast (2.4.2)
|
21
|
-
diff-lcs (1.5.
|
21
|
+
diff-lcs (1.5.1)
|
22
22
|
docile (1.4.0)
|
23
23
|
dokaz (0.0.5)
|
24
24
|
ansi
|
@@ -30,24 +30,25 @@ GEM
|
|
30
30
|
parser (3.2.2.1)
|
31
31
|
ast (~> 2.4.1)
|
32
32
|
rainbow (3.1.1)
|
33
|
-
rake (13.0
|
33
|
+
rake (13.1.0)
|
34
34
|
redcarpet (3.6.0)
|
35
35
|
regexp_parser (2.8.0)
|
36
|
-
rexml (3.2.
|
36
|
+
rexml (3.2.8)
|
37
|
+
strscan (>= 3.0.9)
|
37
38
|
rouge (4.1.0)
|
38
|
-
rspec (3.
|
39
|
-
rspec-core (~> 3.
|
40
|
-
rspec-expectations (~> 3.
|
41
|
-
rspec-mocks (~> 3.
|
42
|
-
rspec-core (3.
|
43
|
-
rspec-support (~> 3.
|
44
|
-
rspec-expectations (3.
|
39
|
+
rspec (3.13.0)
|
40
|
+
rspec-core (~> 3.13.0)
|
41
|
+
rspec-expectations (~> 3.13.0)
|
42
|
+
rspec-mocks (~> 3.13.0)
|
43
|
+
rspec-core (3.13.0)
|
44
|
+
rspec-support (~> 3.13.0)
|
45
|
+
rspec-expectations (3.13.0)
|
45
46
|
diff-lcs (>= 1.2.0, < 2.0)
|
46
|
-
rspec-support (~> 3.
|
47
|
-
rspec-mocks (3.
|
47
|
+
rspec-support (~> 3.13.0)
|
48
|
+
rspec-mocks (3.13.0)
|
48
49
|
diff-lcs (>= 1.2.0, < 2.0)
|
49
|
-
rspec-support (~> 3.
|
50
|
-
rspec-support (3.
|
50
|
+
rspec-support (~> 3.13.0)
|
51
|
+
rspec-support (3.13.1)
|
51
52
|
rubocop (1.51.0)
|
52
53
|
json (~> 2.3)
|
53
54
|
parallel (~> 1.10)
|
@@ -82,9 +83,11 @@ GEM
|
|
82
83
|
simplecov-html (0.12.3)
|
83
84
|
simplecov_json_formatter (0.1.4)
|
84
85
|
slop (3.6.0)
|
86
|
+
strscan (3.1.0)
|
85
87
|
unicode-display_width (2.4.2)
|
86
88
|
values (1.8.0)
|
87
|
-
|
89
|
+
webrick (1.8.1)
|
90
|
+
yard (0.9.36)
|
88
91
|
yard-doctest (0.1.17)
|
89
92
|
minitest
|
90
93
|
yard
|
@@ -98,10 +101,11 @@ DEPENDENCIES
|
|
98
101
|
panolint-ruby!
|
99
102
|
rake
|
100
103
|
redcarpet (~> 3.6)
|
101
|
-
rspec (~> 3.
|
104
|
+
rspec (~> 3.13)
|
102
105
|
simplecov
|
103
106
|
simplecov-cobertura
|
104
107
|
values (~> 1)
|
108
|
+
webrick (~> 1.8)
|
105
109
|
yard (~> 0.9)
|
106
110
|
yard-doctest (~> 0.1)
|
107
111
|
|
data/README.md
CHANGED
@@ -118,15 +118,15 @@ Results using Ruby 3.2.2:
|
|
118
118
|
|
119
119
|
|Method arguments|`Dry::Core`\* (1.0.1)|`Memery` (1.5.0)|
|
120
120
|
|--|--|--|
|
121
|
-
|`()` (none)|0.
|
122
|
-
|`(a)`|1.
|
123
|
-
|`(a, b)`|1.
|
124
|
-
|`(a:)`|1.
|
125
|
-
|`(a:, b:)`|1.
|
126
|
-
|`(a, b:)`|1.
|
127
|
-
|`(a, *args)`|0.
|
128
|
-
|`(a:, **kwargs)`|0.
|
129
|
-
|`(a, *args, b:, **kwargs)`|0.69x|1.
|
121
|
+
|`()` (none)|0.66x|3.54x|
|
122
|
+
|`(a)`|1.48x|8.49x|
|
123
|
+
|`(a, b)`|1.18x|6.52x|
|
124
|
+
|`(a:)`|1.53x|13.57x|
|
125
|
+
|`(a:, b:)`|1.27x|10.56x|
|
126
|
+
|`(a, b:)`|1.26x|10.44x|
|
127
|
+
|`(a, *args)`|0.78x|1.60x|
|
128
|
+
|`(a:, **kwargs)`|0.77x|2.12x|
|
129
|
+
|`(a, *args, b:, **kwargs)`|0.69x|1.40x|
|
130
130
|
|
131
131
|
\* `Dry::Core`
|
132
132
|
[may cause incorrect behavior caused by hash collisions](https://github.com/dry-rb/dry-core/issues/63).
|
@@ -135,15 +135,15 @@ Results using Ruby 2.7.8 (because these gems raise errors in Ruby 3.x):
|
|
135
135
|
|
136
136
|
|Method arguments|`DDMemoize` (1.0.0)|`Memoist` (0.16.2)|`Memoized` (1.1.1)|`Memoizer` (1.0.3)|
|
137
137
|
|--|--|--|--|--|
|
138
|
-
|`()` (none)|
|
139
|
-
|`(a)`|
|
140
|
-
|`(a, b)`|
|
141
|
-
|`(a:)`|30.
|
142
|
-
|`(a:, b:)`|27.
|
143
|
-
|`(a, b:)`|26.
|
144
|
-
|`(a, *args)`|3.
|
145
|
-
|`(a:, **kwargs)`|2.
|
146
|
-
|`(a, *args, b:, **kwargs)`|2.
|
138
|
+
|`()` (none)|22.57x|2.27x|23.46x|2.63x|
|
139
|
+
|`(a)`|20.96x|14.29x|20.54x|11.97x|
|
140
|
+
|`(a, b)`|18.22x|13.21x|17.76x|11.34x|
|
141
|
+
|`(a:)`|30.66x|23.52x|25.37x|21.61x|
|
142
|
+
|`(a:, b:)`|27.31x|21.98x|23.02x|20.31x|
|
143
|
+
|`(a, b:)`|26.21x|20.85x|21.57x|19.20x|
|
144
|
+
|`(a, *args)`|3.06x|2.23x|3.10x|1.92x|
|
145
|
+
|`(a:, **kwargs)`|2.67x|2.18x|2.39x|2.02x|
|
146
|
+
|`(a, *args, b:, **kwargs)`|2.14x|1.80x|1.89x|1.70x|
|
147
147
|
|
148
148
|
You can run benchmarks yourself with:
|
149
149
|
|
@@ -176,18 +176,42 @@ versions:
|
|
176
176
|
|
177
177
|
## Documentation
|
178
178
|
|
179
|
-
###
|
179
|
+
### Automatically Generated Docs
|
180
180
|
|
181
181
|
We maintain API documentation using [YARD](https://yardoc.org/), which is
|
182
182
|
published automatically at
|
183
|
-
[RubyDoc.info](https://rubydoc.info/gems/memo_wise).
|
184
|
-
|
183
|
+
[RubyDoc.info](https://rubydoc.info/gems/memo_wise).
|
184
|
+
|
185
|
+
To generate documentation locally or run documentation tests,
|
186
|
+
first install the `docs` dependencies (e.g. `yard`) as follows:
|
185
187
|
|
186
188
|
```bash
|
187
|
-
bundle
|
189
|
+
BUNDLE_WITH=docs bundle install
|
188
190
|
```
|
189
191
|
|
190
|
-
###
|
192
|
+
### Hot Reloading Docs Locally
|
193
|
+
|
194
|
+
To edit documentation locally and see it rendered in your browser
|
195
|
+
using hot reloading, run:
|
196
|
+
|
197
|
+
```bash
|
198
|
+
bundle exec yard server --reload
|
199
|
+
```
|
200
|
+
|
201
|
+
You can then open your web browser to `http://127.0.0.1:8808/`. As you
|
202
|
+
edit documentation locally, reload your browser to see it generated.
|
203
|
+
|
204
|
+
### Static Generate Docs Locally
|
205
|
+
|
206
|
+
To statically generate documentation locally, run:
|
207
|
+
|
208
|
+
```bash
|
209
|
+
bundle exec yard
|
210
|
+
```
|
211
|
+
|
212
|
+
You can then open the generated documentation at `docs/index.html`.
|
213
|
+
|
214
|
+
### Test all Docs Examples
|
191
215
|
|
192
216
|
We use [yard-doctest](https://github.com/p0deje/yard-doctest) to test all
|
193
217
|
code examples in our YARD documentation. To run `doctest` locally:
|
@@ -204,7 +228,7 @@ locally:
|
|
204
228
|
bundle exec dokaz
|
205
229
|
```
|
206
230
|
|
207
|
-
|
231
|
+
## A Note on Testing
|
208
232
|
|
209
233
|
When testing memoized *module* methods, note that some testing setups will
|
210
234
|
reuse the same instance (which `include`s/`extend`s/`prepend`s the module)
|
@@ -254,12 +278,11 @@ the [code of conduct](https://github.com/panorama-ed/memo_wise/blob/main/CODE_OF
|
|
254
278
|
## Releasing
|
255
279
|
|
256
280
|
To make a new release of `MemoWise` to
|
257
|
-
[RubyGems](https://rubygems.org/gems/memo_wise), first install the release
|
281
|
+
[RubyGems](https://rubygems.org/gems/memo_wise), first install the `release`
|
258
282
|
dependencies (e.g. `rake`) as follows:
|
259
283
|
|
260
284
|
```shell
|
261
|
-
bundle
|
262
|
-
bundle install
|
285
|
+
BUNDLE_WITH=release bundle install
|
263
286
|
```
|
264
287
|
|
265
288
|
Then carry out these steps:
|
data/benchmarks/Gemfile
CHANGED
data/lib/memo_wise/version.rb
CHANGED
data/lib/memo_wise.rb
CHANGED
@@ -31,12 +31,12 @@ module MemoWise
|
|
31
31
|
# [calling the original](https://medium.com/@jeremy_96642/ruby-method-auditing-using-module-prepend-4f4e69aacd95)
|
32
32
|
# constructor.
|
33
33
|
#
|
34
|
-
# - **Q:** Why is [Module#prepend](https://ruby-doc.org/3.2.
|
34
|
+
# - **Q:** Why is [Module#prepend](https://ruby-doc.org/3.2.2/Module.html#method-i-prepend)
|
35
35
|
# important here
|
36
36
|
# ([more info](https://medium.com/@leo_hetsch/ruby-modules-include-vs-prepend-vs-extend-f09837a5b073))?
|
37
37
|
# - **A:** To set up *mutable state* inside the instance, even if the original
|
38
38
|
# constructor will then call
|
39
|
-
# [Object#freeze](https://ruby-doc.org/3.2.
|
39
|
+
# [Object#freeze](https://ruby-doc.org/3.2.2/Object.html#method-i-freeze).
|
40
40
|
#
|
41
41
|
# This approach supports memoization on frozen (immutable) objects -- for
|
42
42
|
# example, classes created by the
|
@@ -78,6 +78,22 @@ module MemoWise
|
|
78
78
|
end
|
79
79
|
HEREDOC
|
80
80
|
|
81
|
+
module CreateMemoWiseStateOnExtended
|
82
|
+
def extended(base)
|
83
|
+
MemoWise::InternalAPI.create_memo_wise_state!(base)
|
84
|
+
super
|
85
|
+
end
|
86
|
+
end
|
87
|
+
private_constant(:CreateMemoWiseStateOnExtended)
|
88
|
+
|
89
|
+
module CreateMemoWiseStateOnInherited
|
90
|
+
def inherited(subclass)
|
91
|
+
MemoWise::InternalAPI.create_memo_wise_state!(subclass)
|
92
|
+
super
|
93
|
+
end
|
94
|
+
end
|
95
|
+
private_constant(:CreateMemoWiseStateOnInherited)
|
96
|
+
|
81
97
|
# @private
|
82
98
|
#
|
83
99
|
# Private setup method, called automatically by `prepend MemoWise` in a class.
|
@@ -85,7 +101,7 @@ module MemoWise
|
|
85
101
|
# @param target [Class]
|
86
102
|
# The `Class` into to prepend the MemoWise methods e.g. `memo_wise`
|
87
103
|
#
|
88
|
-
# @see https://ruby-doc.org/3.2.
|
104
|
+
# @see https://ruby-doc.org/3.2.2/Module.html#method-i-prepend
|
89
105
|
#
|
90
106
|
# @example
|
91
107
|
# class Example
|
@@ -100,7 +116,7 @@ module MemoWise
|
|
100
116
|
#
|
101
117
|
# This is necessary in addition to the `#initialize` method definition
|
102
118
|
# above because
|
103
|
-
# [`Class#allocate`](https://ruby-doc.org/3.2.
|
119
|
+
# [`Class#allocate`](https://ruby-doc.org/3.2.2/Class.html#method-i-allocate)
|
104
120
|
# bypasses `#initialize`, and when it's used (e.g.,
|
105
121
|
# [in ActiveRecord](https://github.com/rails/rails/blob/a395c3a6af1e079740e7a28994d77c8baadd2a9d/activerecord/lib/active_record/persistence.rb#L411))
|
106
122
|
# we still need to be able to access MemoWise's instance variable. Despite
|
@@ -136,9 +152,7 @@ module MemoWise
|
|
136
152
|
#
|
137
153
|
# On method call `@_memo_wise` would still be `nil`
|
138
154
|
# causing error when fetching cache from `@_memo_wise`
|
139
|
-
|
140
|
-
MemoWise::InternalAPI.create_memo_wise_state!(base)
|
141
|
-
end
|
155
|
+
klass.singleton_class.prepend(CreateMemoWiseStateOnExtended)
|
142
156
|
end
|
143
157
|
when Hash
|
144
158
|
unless method_name_or_hash.keys == [:self]
|
@@ -159,12 +173,11 @@ module MemoWise
|
|
159
173
|
|
160
174
|
# This ensures that a memoized method defined on a parent class can
|
161
175
|
# still be used in a child class.
|
162
|
-
klass.
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
HEREDOC
|
176
|
+
if klass.is_a?(Class) && !klass.singleton_class?
|
177
|
+
klass.singleton_class.prepend(CreateMemoWiseStateOnInherited)
|
178
|
+
else
|
179
|
+
klass.prepend(CreateMemoWiseStateOnInherited)
|
180
|
+
end
|
168
181
|
|
169
182
|
raise ArgumentError, "#{method_name.inspect} must be a Symbol" unless method_name.is_a?(Symbol)
|
170
183
|
|
@@ -255,7 +268,7 @@ module MemoWise
|
|
255
268
|
)
|
256
269
|
end
|
257
270
|
|
258
|
-
# Override [Module#instance_method](https://ruby-doc.org/3.2.
|
271
|
+
# Override [Module#instance_method](https://ruby-doc.org/3.2.2/Module.html#method-i-instance_method)
|
259
272
|
# to proxy the original `UnboundMethod#parameters` results. We want the
|
260
273
|
# parameters to reflect the original method in order to support callers
|
261
274
|
# who want to use Ruby reflection to process the method parameters,
|
data/memo_wise.gemspec
CHANGED
@@ -23,7 +23,7 @@ Gem::Specification.new do |spec|
|
|
23
23
|
"marc@usainnov.com",
|
24
24
|
]
|
25
25
|
|
26
|
-
spec.required_ruby_version = Gem::Requirement.new(">= 2.
|
26
|
+
spec.required_ruby_version = Gem::Requirement.new(">= 2.5.0")
|
27
27
|
|
28
28
|
# Specify which files should be added to the gem when it is released.
|
29
29
|
# The `git ls-files -z` loads the files in the RubyGem that have been added
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: memo_wise
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.9.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Panorama Education
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date:
|
14
|
+
date: 2024-06-04 00:00:00.000000000 Z
|
15
15
|
dependencies: []
|
16
16
|
description:
|
17
17
|
email:
|
@@ -64,14 +64,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
64
64
|
requirements:
|
65
65
|
- - ">="
|
66
66
|
- !ruby/object:Gem::Version
|
67
|
-
version: 2.
|
67
|
+
version: 2.5.0
|
68
68
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
69
69
|
requirements:
|
70
70
|
- - ">="
|
71
71
|
- !ruby/object:Gem::Version
|
72
72
|
version: '0'
|
73
73
|
requirements: []
|
74
|
-
rubygems_version: 3.4.
|
74
|
+
rubygems_version: 3.4.10
|
75
75
|
signing_key:
|
76
76
|
specification_version: 4
|
77
77
|
summary: The wise choice for Ruby memoization
|