n1_loader 2.1.0 → 2.2.1

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: b26072476fbcb5cd1635a97c0139aef964d7e2d89d22bd2aaf0f10bf50314337
4
- data.tar.gz: f998a2e0997e9c3657402fd5e351dfb02fc53d981cd63c0c723b3e09094ba5f0
3
+ metadata.gz: 24b29bd98ee754ae976c84c253a4d9018cc3372003a6965d1227d578f9cd6d4d
4
+ data.tar.gz: 39ccc3e7314dd901cd47c2dd15d16154fefa5529a33e269e7e42877e78d3f7fa
5
5
  SHA512:
6
- metadata.gz: 70c3fcdf22685895f3ead6f1987b6044b3d926c40a19d1c3a10295066a26831f729d91ac07ae6b6044798de7cf47b83792565ce8d710efdeb44e56afd9a4a7c4
7
- data.tar.gz: 21fd7cbb0bb2c2a751a74c3773dec35ecfa37ea1467fa553c7021142809053ede73a6a7149bab92da9529619e045d1bbf2dd90a5600381a8a894c7fb6f75545c
6
+ metadata.gz: 1ff08212965c0d67d3035be2e083ba6240fc1d034880d29615d88d7c88bbf7c3b61057779ff88c22d27a501d59098a4b67b5a406ff2e2e3984a72c5de6d33459
7
+ data.tar.gz: da51833d93a6109edb7eb284e024b3f24c8684e4765166ba55b4a4279dd2ea23c905e0f37762cef007adef12efbb3d8a46c52030ff3b047e38b18798b7579c2f
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  N1Loader::Loader.define_method :preloaded_records do
4
- @preloaded_records ||= loaded.values.flatten
4
+ @preloaded_records ||= loaded? && loaded_by_value.values.flatten
5
5
  end
@@ -6,17 +6,22 @@ module N1Loader
6
6
  module LoaderPatch
7
7
  attr_accessor :context_setup
8
8
 
9
- def loaded
10
- return @loaded if @already_loaded && @already_context
9
+ def loaded?
10
+ return true if @already_loaded && @already_context
11
11
 
12
12
  super
13
13
 
14
- synchronize do
15
- context_setup&.call(@loaded.values.flatten) unless @already_context
16
- end
14
+ synchronize { non_thread_safe_context_setting unless @already_context }
15
+
16
+ true
17
+ end
18
+
19
+ def non_thread_safe_context_setting
20
+ return if @already_context
21
+
22
+ context_setup&.call(loaded_by_identity.values.flatten)
17
23
 
18
24
  @already_context = true
19
- @loaded
20
25
  end
21
26
  end
22
27
  end
@@ -33,9 +33,21 @@ module N1Loader
33
33
  end
34
34
 
35
35
  def n1_bind_to(collection)
36
+ unless collection.is_a?(Array) && collection.any? do |obj|
37
+ obj == self || obj.equal?(self)
38
+ end
39
+
40
+ raise InvalidBinding,
41
+ "assigned collection should be array and include object"
42
+ end
43
+
36
44
  @n1_binding = collection
37
45
  end
38
46
 
47
+ def n1_bind_to?
48
+ !@n1_binding.nil?
49
+ end
50
+
39
51
  def n1_loader_reload(name)
40
52
  elements = @n1_binding || [self]
41
53
  collection = LoaderCollection.new(self.class.n1_loaders[name], elements)
@@ -45,6 +57,7 @@ module N1Loader
45
57
  end
46
58
 
47
59
  def n1_clear_cache
60
+ @n1_binding = nil
48
61
  self.class.n1_loaders.each_key do |name|
49
62
  n1_loaders[name] = nil
50
63
  end
@@ -47,12 +47,16 @@ module N1Loader
47
47
  end
48
48
 
49
49
  def for(element)
50
- if loaded.empty? && elements.any?
50
+ return unless loaded?
51
+
52
+ if loaded_by_identity.empty? && elements.any?
51
53
  raise NotFilled, "Nothing was preloaded, perhaps you forgot to use fulfill method"
52
54
  end
53
- raise NotLoaded, "The data was not preloaded for the given element" unless loaded.key?(element)
54
55
 
55
- loaded[element]
56
+ return loaded_by_identity[element] if loaded_by_identity.key?(element)
57
+ return loaded_by_value[element] if loaded_by_value.key?(element)
58
+
59
+ raise NotLoaded, "The data was not preloaded for the given element"
56
60
  end
57
61
 
58
62
  def cache_key
@@ -62,7 +66,7 @@ module N1Loader
62
66
 
63
67
  private
64
68
 
65
- attr_reader :elements, :args
69
+ attr_reader :elements, :args, :loaded_by_value, :loaded_by_identity
66
70
 
67
71
  def check_missing_arguments!
68
72
  return unless (arguments = self.class.arguments)
@@ -103,35 +107,39 @@ module N1Loader
103
107
  end
104
108
 
105
109
  def fulfill(element, value)
106
- @loaded[element] = value
110
+ loaded_by_identity[element] = value
111
+ loaded_by_value[element] = value
107
112
  end
108
113
 
109
- def loaded
110
- return @loaded if @already_loaded
114
+ def loaded?
115
+ return true if @already_loaded
111
116
 
112
- synchronize do
113
- non_thread_safe_loaded unless @already_loaded
114
- end
117
+ synchronize { non_thread_safe_loading unless @already_loaded }
115
118
 
116
- @loaded
119
+ true
117
120
  end
118
121
 
119
- def non_thread_safe_loaded # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
120
- return @loaded if @already_loaded
122
+ def non_thread_safe_loading # rubocop:disable Metrics/AbcSize, Metrics/MethodLength, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
123
+ return if @already_loaded
121
124
 
122
125
  check_arguments!
123
126
 
124
- @loaded = {}
127
+ @loaded_by_identity = {}.compare_by_identity
128
+ @loaded_by_value = {}
125
129
 
126
130
  if respond_to?(:single) && elements.size == 1
127
131
  fulfill(elements.first, single(elements.first))
128
132
  elsif elements.any?
129
- elements.each { |el| el.n1_bind_to(elements) if el.respond_to?(:n1_bind_to) }
130
133
  perform(elements)
134
+
135
+ # propagate context to loaded objects only when it was set
136
+ if elements.first.respond_to?(:n1_bind_to?) && elements.first.n1_bind_to?
137
+ loaded_objects = loaded_by_identity.values.flatten
138
+ loaded_objects.each { |el| el.n1_bind_to(loaded_objects) if el.respond_to?(:n1_bind_to) }
139
+ end
131
140
  end
132
141
 
133
142
  @already_loaded = true
134
- @loaded
135
143
  end
136
144
  end
137
145
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module N1Loader
4
- VERSION = "2.1.0"
4
+ VERSION = "2.2.1"
5
5
  end
data/lib/n1_loader.rb CHANGED
@@ -15,4 +15,5 @@ module N1Loader # :nodoc:
15
15
  class NotFilled < Error; end
16
16
  class MissingArgument < Error; end
17
17
  class InvalidArgument < Error; end
18
+ class InvalidBinding < Error; end
18
19
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: n1_loader
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.0
4
+ version: 2.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Evgeniy Demin
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2026-03-07 00:00:00.000000000 Z
11
+ date: 2026-03-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: mutex_m