short_circu_it 0.29.1 → 0.29.2

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