short_circu_it 0.29.1 → 0.29.2

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: 8e0e9cd02585abda82a6d4c0fa3dfa6b492c4aa22eee9b8dbb17d1dd2867728e
4
- data.tar.gz: 7c8b0bbd63cd82b46dbc056066157fef8cceeebbfff31f5173e7050166fd66e0
3
+ metadata.gz: ce12ac822aed393836ee26072bd9b0eade6df9d9aee2811a735bd217b2ede2ca
4
+ data.tar.gz: f3fd42c11368138e035955190d00aca55d5754067a8083173d952aac39d0ea6c
5
5
  SHA512:
6
- metadata.gz: ee46e23aadf0ef846f967872167ce7ed11326d0d1ec7b2550eb615051c18a1e40aff40bff03de8f298641781e3760b2b576f1b36ef53ddafd1337da5a8007deb
7
- data.tar.gz: e028fc7cdbe3cf54f120a44bee164a880a51a846e97c4ba99ee6509b93fd869f9058664163ccc4b52f1a9b0853a0a0cddce49c21b9faec8099b0371791fe25d8
6
+ metadata.gz: d7d05900cf5a4a20afee6f405bda95ff2e22523f048a23134734979ea7c29723c4dac6a01134241cd0bc637a8c958b3b3ed23ac3575cea4e7a28d84a87f63603
7
+ data.tar.gz: 16c5e13cf88cd8bca999340be8c2f6a2fa6e6ea8abb60a11eb18d73cdc023f8440ccc4131cb3bb2b444a56578f62ecfbb8a8de61d92062db9967fe17340df4f0
@@ -4,6 +4,9 @@ require "active_support/core_ext/module"
4
4
 
5
5
  module ShortCircuIt
6
6
  class MemoizationStore
7
+ NOT_MEMOIZED = Object.new
8
+ private_constant :NOT_MEMOIZED
9
+
7
10
  delegate :memoization_observers, to: :owner
8
11
 
9
12
  # @param owner [*] The object being memoized
@@ -12,16 +15,23 @@ module ShortCircuIt
12
15
  end
13
16
 
14
17
  # @param method_name [Symbol] The name of the method being memoized.
15
- # @param argument_hash [Integer] The hash value of the arguments passed to the method.
18
+ # @param args [Array<*>] Arguments passed to the method being memoized.
19
+ # @param kwargs [Hash] Keyword arguments passed to the method being memoized.
16
20
  # @yield [] Yields to a given block with no arguments. Memoizes the value returned by the block.
17
21
  # @return [*] The value returned either from the memoization cache if present, or yielded block if not.
18
- def memoize(method_name, argument_hash)
19
- return memoized_value(method_name, argument_hash) if memoized?(method_name, argument_hash)
22
+ def memoize(method_name, args, kwargs)
23
+ argument_hash = [ *args, kwargs ].hash
24
+
25
+ value = memoized_value(method_name, argument_hash)
26
+
27
+ return value unless value == NOT_MEMOIZED
20
28
 
21
- clear_memoization(method_name) unless current_memoization_for_method?(method_name)
29
+ state_hash = state_hash(method_name)
30
+
31
+ clear_memoization(method_name) unless current_memoization_for_method?(method_name, state_hash)
22
32
 
23
33
  yield.tap do |returned_value|
24
- current_memoization_for_method(method_name)[argument_hash] = returned_value
34
+ current_memoization_for_method(method_name, state_hash)[argument_hash] = returned_value
25
35
  end
26
36
  end
27
37
 
@@ -30,7 +40,7 @@ module ShortCircuIt
30
40
  # @param *method_names [Symbol] The name of a memoized method
31
41
  # @return [Boolean] True if a value was cleared, false if not
32
42
  def clear_memoization(*method_names)
33
- method_names.all? { |method_name| memoized_hash.delete(method_name.to_sym) }
43
+ method_names.all? { |method_name| memoized_hash.delete(method_name) }
34
44
  end
35
45
 
36
46
  # Clears all memoized values on the object
@@ -52,32 +62,28 @@ module ShortCircuIt
52
62
  memoized_hash[method_name] ||= {}
53
63
  end
54
64
 
55
- # @param method_name [Symbol] The name of the method to memoize
56
- # @param argument_hash [Integer] The hash value of the arguments passed to the method
57
- # @return [Boolean] True if the method has a current memoized value with the given arguments
58
- def memoized?(method_name, argument_hash)
59
- current_memoization_for_method?(method_name) && current_memoization_for_method(method_name).key?(argument_hash)
60
- end
61
-
62
65
  # @param method_name [String] The name of the method to memoize
63
66
  # @param argument_hash [Integer] The hash value of the arguments passed to the method
64
67
  # @return [*] The value that has been memoized for the method/argument combination
65
68
  def memoized_value(method_name, argument_hash)
66
- raise NotMemoizedError unless memoized?(method_name, argument_hash)
67
-
68
69
  current_memoization_for_method(method_name)[argument_hash]
69
70
  end
70
71
 
71
72
  # @param method_name [Symbol] The name of a memoized method
72
73
  # @return [Hash] A hash of memoized values for the current state of the observed objects for the given method.
73
- def current_memoization_for_method(method_name)
74
- memoization_for_method(method_name)[state_hash(method_name)] ||= {}
74
+ def current_memoization_for_method(method_name, state_hash = nil)
75
+ state_hash ||= state_hash(method_name)
76
+
77
+ # Memoize values inside a hash with default value of NOT_MEMOIZED
78
+ memoization_for_method(method_name)[state_hash] ||= Hash.new(NOT_MEMOIZED)
75
79
  end
76
80
 
77
81
  # @param method_name [Symbol] The name of a memoized method
78
82
  # @return [Boolean] True if there are any memoized values for the current state of the observed objects.
79
- def current_memoization_for_method?(method_name)
80
- memoization_for_method(method_name).key?(state_hash(method_name))
83
+ def current_memoization_for_method?(method_name, state_hash = nil)
84
+ state_hash ||= state_hash(method_name)
85
+
86
+ memoization_for_method(method_name).key?(state_hash)
81
87
  end
82
88
 
83
89
  # @param method_name [Symbol] The name of a memoized method
@@ -2,5 +2,5 @@
2
2
 
3
3
  module ShortCircuIt
4
4
  # This constant is managed by spicerack
5
- VERSION = "0.29.1"
5
+ VERSION = "0.29.2"
6
6
  end
@@ -1,13 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "short_circu_it/version"
4
- require "short_circu_it/errors"
5
- require "short_circu_it/memoization_store"
6
3
  require "active_support/core_ext/module"
7
4
  require "active_support/core_ext/array"
8
5
  require "active_support/concern"
9
6
  require "around_the_world"
10
7
 
8
+ require_relative "short_circu_it/version"
9
+ require_relative "short_circu_it/errors"
10
+ require_relative "short_circu_it/memoization_store"
11
+
11
12
  module ShortCircuIt
12
13
  extend ActiveSupport::Concern
13
14
  include AroundTheWorld
@@ -80,13 +81,8 @@ module ShortCircuIt
80
81
  method_name,
81
82
  prevent_double_wrapping_for: ShortCircuIt,
82
83
  ) do |*args, **opts|
83
- memoization_store.memoize(method_name, (args + [ opts ]).hash) do
84
- # TODO: replace with `super(*args, **opts)` when <= 2.6 support is dropped
85
- if RUBY_VERSION < "2.7" && opts.blank?
86
- super(*args)
87
- else
88
- super(*args, **opts)
89
- end
84
+ memoization_store.memoize(method_name, args, opts) do
85
+ super(*args, **opts)
90
86
  end
91
87
  end
92
88
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: short_circu_it
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.29.1
4
+ version: 0.29.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Allen Rettberg
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-08-23 00:00:00.000000000 Z
11
+ date: 2023-02-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -16,28 +16,28 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 5.2.1
19
+ version: 6.0.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: 5.2.1
26
+ version: 6.0.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: around_the_world
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - '='
32
32
  - !ruby/object:Gem::Version
33
- version: 0.29.1
33
+ version: 0.29.2
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - '='
39
39
  - !ruby/object:Gem::Version
40
- version: 0.29.1
40
+ version: 0.29.2
41
41
  description: Memoize methods safely with parameter and dependency observation
42
42
  email:
43
43
  - allen.rettberg@freshly.com
@@ -59,7 +59,7 @@ metadata:
59
59
  homepage_uri: https://github.com/RubyAfterAll/spicerack/tree/main/short_circu_it
60
60
  source_code_uri: https://github.com/RubyAfterAll/spicerack/tree/main/short_circu_it
61
61
  changelog_uri: https://github.com/RubyAfterAll/spicerack/blob/main/short_circu_it/CHANGELOG.md
62
- documentation_uri: https://www.rubydoc.info/gems/short_circu_it/0.29.1
62
+ documentation_uri: https://www.rubydoc.info/gems/short_circu_it/0.29.2
63
63
  post_install_message:
64
64
  rdoc_options: []
65
65
  require_paths:
@@ -75,7 +75,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
75
75
  - !ruby/object:Gem::Version
76
76
  version: '0'
77
77
  requirements: []
78
- rubygems_version: 3.3.7
78
+ rubygems_version: 3.3.15
79
79
  signing_key:
80
80
  specification_version: 4
81
81
  summary: An intelligent and feature rich memoization gem