memo_wise 1.5.0 → 1.6.0

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: 9d94c6c36ed049177dffb78f2bc5b0196d06e7b334643770163b7140ee2e77e2
4
- data.tar.gz: 2be9bd8578a7357aabe70d9f748cb57fedf50708028ca7c3ed55815814b7ddc2
3
+ metadata.gz: aee2439aaa86140659e102e2269e4d773e34a933e73ff604b449918948b9cd29
4
+ data.tar.gz: bff512646d578b936d45267408be8681479c7316fa7ae16c683fc3b47261577a
5
5
  SHA512:
6
- metadata.gz: 848080fdd9596f0a0f477464ddbc2009ab2c5f3caec56d3fa3c97dd275aca7687c94793af8124a7dd567a1c33abcdf3474cb2e13ab6b8b91f47302a0059b6916
7
- data.tar.gz: e79de4347bbc5cd0701095574dfb7faafb320dc3f6e1de1cb0978ebd1fcdce5e65ca0c8fa2e0079d72385acabea582caac41a0c6c553078f69d1337006422e0e
6
+ metadata.gz: a820daf7cbc735f0bc586cc7e2b73c507f01592f8666ed3837b83584537466b4d06aee3202aa7c31b4545558f3e24a45ccc4063e315479fbbc4f3ece1606f7d8
7
+ data.tar.gz: 6349b73c2cec18df74259b79dceef15f7f9303001deffb94146c00abcc5e9f0d6be9ab82c0aa0adab0dc528dd75de4e5c8450df389f64c88c24bea50dead15ce
@@ -12,7 +12,7 @@ jobs:
12
12
  strategy:
13
13
  fail-fast: false
14
14
  matrix:
15
- ruby: [jruby, 2.4, 2.5, 2.6, 2.7, 3.0, truffleruby-head]
15
+ ruby: [jruby, 2.4, 2.5, 2.6, 2.7, 3.0, 3.1, truffleruby-head]
16
16
  runs-on: ubuntu-latest
17
17
  steps:
18
18
  - uses: actions/checkout@v2
@@ -22,7 +22,7 @@ jobs:
22
22
  - name: Set bundler environment variables
23
23
  run: |
24
24
  echo "BUNDLE_WITHOUT=checks:docs" >> $GITHUB_ENV
25
- if: matrix.ruby != 3.0
25
+ if: matrix.ruby != 3.1
26
26
 
27
27
  # Use 'bundler-cache: true' instead of actions/cache as advised:
28
28
  # * https://github.com/actions/cache/blob/main/examples.md#ruby---bundler
@@ -34,15 +34,15 @@ jobs:
34
34
  - run: bundle exec rspec
35
35
 
36
36
  - run: bundle exec rubocop
37
- if: matrix.ruby == 3.0
37
+ if: matrix.ruby == 3.1
38
38
 
39
39
  - run: |
40
40
  bundle exec yard doctest
41
41
  bundle exec dokaz
42
- if: matrix.ruby == 3.0
42
+ if: matrix.ruby == 3.1
43
43
 
44
- - name: Run benchmarks on Ruby 2.7 or 3.0
44
+ - name: Run benchmarks on Ruby 2.7 or 3.1
45
45
  run: |
46
46
  BUNDLE_GEMFILE=benchmarks/Gemfile bundle install --jobs 4 --retry 3
47
47
  BUNDLE_GEMFILE=benchmarks/Gemfile bundle exec ruby benchmarks/benchmarks.rb
48
- if: matrix.ruby == '2.7' || matrix.ruby == '3.0'
48
+ if: matrix.ruby == '2.7' || matrix.ruby == '3.1'
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 3.0.0
1
+ 3.1.0
data/CHANGELOG.md CHANGED
@@ -7,13 +7,28 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## Unreleased
9
9
 
10
- - Nothing yet!
10
+ Nothing yet!
11
+
12
+ ## [1.6.0] - 2022-01-24
13
+
14
+ ### Fixed
15
+
16
+ - Fixed a bug relating to inheritance of classes which include module which
17
+ prepends MemoWise ([#265](https://github.com/panorama-ed/memo_wise/pull/265))
18
+
19
+ ### Updated
20
+
21
+ - Update official test coverage to support Ruby 3.1
11
22
 
12
23
  ## [1.5.0] - 2021-12-17
13
24
 
14
- - Remove optimization for truthy results to fix race condition bugs
25
+ ### Fixed
26
+
27
+ - Remove optimization for truthy results to fix thread safety race condition
28
+ bugs
15
29
  - Switch to a simpler internal data structure to fix several classes of bugs
16
- that the previous few versions were unable to sufficiently address
30
+ related to inheritance that the previous few versions were unable to
31
+ sufficiently address
17
32
 
18
33
  ## [1.4.0] - 2021-12-10
19
34
 
@@ -116,7 +131,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
116
131
  - Panolint
117
132
  - Dependabot setup
118
133
 
119
- [Unreleased]: https://github.com/panorama-ed/memo_wise/compare/v1.5.0...HEAD
134
+ [Unreleased]: https://github.com/panorama-ed/memo_wise/compare/v1.6.0...HEAD
135
+ [1.6.0]: https://github.com/panorama-ed/memo_wise/compare/v1.5.0...v1.6.0
120
136
  [1.5.0]: https://github.com/panorama-ed/memo_wise/compare/v1.4.0...v1.5.0
121
137
  [1.4.0]: https://github.com/panorama-ed/memo_wise/compare/v1.3.0...v1.4.0
122
138
  [1.3.0]: https://github.com/panorama-ed/memo_wise/compare/v1.2.0...v1.3.0
data/Gemfile.lock CHANGED
@@ -14,7 +14,7 @@ GIT
14
14
  PATH
15
15
  remote: .
16
16
  specs:
17
- memo_wise (1.5.0)
17
+ memo_wise (1.6.0)
18
18
 
19
19
  GEM
20
20
  remote: https://rubygems.org/
@@ -41,13 +41,13 @@ GEM
41
41
  concurrent-ruby (~> 1.0)
42
42
  minitest (5.14.4)
43
43
  parallel (1.21.0)
44
- parser (3.0.3.1)
44
+ parser (3.1.0.0)
45
45
  ast (~> 2.4.1)
46
46
  rack (2.2.3)
47
47
  rainbow (3.0.0)
48
48
  rake (13.0.6)
49
49
  redcarpet (3.5.1)
50
- regexp_parser (2.1.1)
50
+ regexp_parser (2.2.0)
51
51
  rexml (3.2.5)
52
52
  rouge (3.26.0)
53
53
  rspec (3.10.0)
@@ -63,16 +63,16 @@ GEM
63
63
  diff-lcs (>= 1.2.0, < 2.0)
64
64
  rspec-support (~> 3.10.0)
65
65
  rspec-support (3.10.0)
66
- rubocop (1.23.0)
66
+ rubocop (1.24.1)
67
67
  parallel (~> 1.10)
68
68
  parser (>= 3.0.0.0)
69
69
  rainbow (>= 2.2.2, < 4.0)
70
70
  regexp_parser (>= 1.8, < 3.0)
71
71
  rexml
72
- rubocop-ast (>= 1.12.0, < 2.0)
72
+ rubocop-ast (>= 1.15.1, < 2.0)
73
73
  ruby-progressbar (~> 1.7)
74
74
  unicode-display_width (>= 1.4.0, < 3.0)
75
- rubocop-ast (1.13.0)
75
+ rubocop-ast (1.15.1)
76
76
  parser (>= 3.0.1.1)
77
77
  rubocop-performance (1.12.0)
78
78
  rubocop (>= 1.7.0, < 2.0)
@@ -95,7 +95,9 @@ GEM
95
95
  concurrent-ruby (~> 1.0)
96
96
  unicode-display_width (2.1.0)
97
97
  values (1.8.0)
98
- yard (0.9.26)
98
+ webrick (1.7.0)
99
+ yard (0.9.27)
100
+ webrick (~> 1.7.0)
99
101
  yard-doctest (0.1.17)
100
102
  minitest
101
103
  yard
data/LICENSE.txt CHANGED
@@ -1,6 +1,6 @@
1
1
  The MIT License (MIT)
2
2
 
3
- Copyright (c) 2020-2021 Panorama Education
3
+ Copyright (c) 2020-2022 Panorama Education
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
data/README.md CHANGED
@@ -115,19 +115,19 @@ For more usage details, see our detailed [documentation](#documentation).
115
115
 
116
116
  Benchmarks are run in GitHub Actions, and the tables below are updated with every code change. **Values >1.00x represent how much _slower_ each gem’s memoized value retrieval is than the latest commit of `MemoWise`**, according to [`benchmark-ips`](https://github.com/evanphx/benchmark-ips) (2.9.2).
117
117
 
118
- Results using Ruby 3.0.3:
118
+ Results using Ruby 3.1.0:
119
119
 
120
- |Method arguments|`Dry::Core`\* (0.7.1)|`Memery` (1.4.0)|
120
+ |Method arguments|`Dry::Core` (0.7.1)|`Memery` (1.4.0)|
121
121
  |--|--|--|
122
- |`()` (none)|1.06x|11.96x|
123
- |`(a)`|1.99x|10.19x|
124
- |`(a, b)`|0.39x|1.94x|
125
- |`(a:)`|1.80x|19.36x|
126
- |`(a:, b:)`|0.43x|4.26x|
127
- |`(a, b:)`|0.39x|3.97x|
128
- |`(a, *args)`|0.83x|1.85x|
129
- |`(a:, **kwargs)`|0.77x|2.94x|
130
- |`(a, *args, b:, **kwargs)`|0.59x|1.57x|
122
+ |`()` (none)|1.09x|11.80x|
123
+ |`(a)`|1.64x|9.74x|
124
+ |`(a, b)`|0.34x|2.00x|
125
+ |`(a:)`|1.49x|18.84x|
126
+ |`(a:, b:)`|0.35x|4.26x|
127
+ |`(a, b:)`|0.35x|4.18x|
128
+ |`(a, *args)`|0.83x|1.89x|
129
+ |`(a:, **kwargs)`|0.84x|3.30x|
130
+ |`(a, *args, b:, **kwargs)`|0.54x|1.47x|
131
131
 
132
132
  \* `Dry::Core`
133
133
  [may cause incorrect behavior caused by hash collisions](https://github.com/dry-rb/dry-core/issues/63).
@@ -191,7 +191,7 @@ benchmark_lambdas.map do |benchmark|
191
191
  json_file = Tempfile.new
192
192
 
193
193
  Benchmark.ips do |x|
194
- x.config(suite: suite)
194
+ x.config(suite: suite) # rubocop:disable Style/HashSyntax
195
195
  BENCHMARK_GEMS.each do |benchmark_gem|
196
196
  instance = Object.const_get("#{benchmark_gem.klass}Example").new
197
197
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module MemoWise
4
- VERSION = "1.5.0"
4
+ VERSION = "1.6.0"
5
5
  end
data/lib/memo_wise.rb CHANGED
@@ -30,12 +30,12 @@ module MemoWise
30
30
  # [calling the original](https://medium.com/@jeremy_96642/ruby-method-auditing-using-module-prepend-4f4e69aacd95)
31
31
  # constructor.
32
32
  #
33
- # - **Q:** Why is [Module#prepend](https://ruby-doc.org/core-3.0.0/Module.html#method-i-prepend)
33
+ # - **Q:** Why is [Module#prepend](https://ruby-doc.org/core-3.1.0/Module.html#method-i-prepend)
34
34
  # important here
35
35
  # ([more info](https://medium.com/@leo_hetsch/ruby-modules-include-vs-prepend-vs-extend-f09837a5b073))?
36
36
  # - **A:** To set up *mutable state* inside the instance, even if the original
37
37
  # constructor will then call
38
- # [Object#freeze](https://ruby-doc.org/core-3.0.0/Object.html#method-i-freeze).
38
+ # [Object#freeze](https://ruby-doc.org/core-3.1.0/Object.html#method-i-freeze).
39
39
  #
40
40
  # This approach supports memoization on frozen (immutable) objects -- for
41
41
  # example, classes created by the
@@ -84,7 +84,7 @@ module MemoWise
84
84
  # @param target [Class]
85
85
  # The `Class` into to prepend the MemoWise methods e.g. `memo_wise`
86
86
  #
87
- # @see https://ruby-doc.org/core-3.0.0/Module.html#method-i-prepended
87
+ # @see https://ruby-doc.org/core-3.1.0/Module.html#method-i-prepended
88
88
  #
89
89
  # @example
90
90
  # class Example
@@ -99,7 +99,7 @@ module MemoWise
99
99
  #
100
100
  # This is necessary in addition to the `#initialize` method definition
101
101
  # above because
102
- # [`Class#allocate`](https://ruby-doc.org/core-3.0.0/Class.html#method-i-allocate)
102
+ # [`Class#allocate`](https://ruby-doc.org/core-3.1.0/Class.html#method-i-allocate)
103
103
  # bypasses `#initialize`, and when it's used (e.g.,
104
104
  # [in ActiveRecord](https://github.com/rails/rails/blob/a395c3a6af1e079740e7a28994d77c8baadd2a9d/activerecord/lib/active_record/persistence.rb#L411))
105
105
  # we still need to be able to access MemoWise's instance variable. Despite
@@ -156,16 +156,14 @@ module MemoWise
156
156
  klass = klass.singleton_class
157
157
  end
158
158
 
159
- if klass.singleton_class?
160
- # This ensures that a memoized method defined on a parent class can
161
- # still be used in a child class.
162
- klass.module_eval <<~HEREDOC, __FILE__, __LINE__ + 1
163
- def inherited(subclass)
164
- super
165
- MemoWise::InternalAPI.create_memo_wise_state!(subclass)
166
- end
167
- HEREDOC
168
- end
159
+ # This ensures that a memoized method defined on a parent class can
160
+ # still be used in a child class.
161
+ klass.module_eval <<~HEREDOC, __FILE__, __LINE__ + 1
162
+ def inherited(subclass)
163
+ super
164
+ MemoWise::InternalAPI.create_memo_wise_state!(subclass)
165
+ end
166
+ HEREDOC
169
167
 
170
168
  raise ArgumentError, "#{method_name.inspect} must be a Symbol" unless method_name.is_a?(Symbol)
171
169
 
@@ -225,7 +223,7 @@ module MemoWise
225
223
  )
226
224
  end
227
225
 
228
- # Override [Module#instance_method](https://ruby-doc.org/core-3.0.0/Module.html#method-i-instance_method)
226
+ # Override [Module#instance_method](https://ruby-doc.org/core-3.1.0/Module.html#method-i-instance_method)
229
227
  # to proxy the original `UnboundMethod#parameters` results. We want the
230
228
  # parameters to reflect the original method in order to support callers
231
229
  # who want to use Ruby reflection to process the method parameters,
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.5.0
4
+ version: 1.6.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: 2021-12-20 00:00:00.000000000 Z
14
+ date: 2022-01-24 00:00:00.000000000 Z
15
15
  dependencies: []
16
16
  description:
17
17
  email:
@@ -70,7 +70,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
70
70
  - !ruby/object:Gem::Version
71
71
  version: '0'
72
72
  requirements: []
73
- rubygems_version: 3.2.22
73
+ rubygems_version: 3.3.3
74
74
  signing_key:
75
75
  specification_version: 4
76
76
  summary: The wise choice for Ruby memoization