n1_loader 2.2.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: 56479004f7a3456664bac05e808268177dabffa616848b57efb734865fd5ec49
4
- data.tar.gz: 2d65c334abe26c5eb9baeb17ebe186d201b6c362b60d628758defd696b3e3522
3
+ metadata.gz: 24b29bd98ee754ae976c84c253a4d9018cc3372003a6965d1227d578f9cd6d4d
4
+ data.tar.gz: 39ccc3e7314dd901cd47c2dd15d16154fefa5529a33e269e7e42877e78d3f7fa
5
5
  SHA512:
6
- metadata.gz: 9d83a5cc7742f23b0702f56fbcd2320f46e309731c7734df825406a657709259dae08e2e3ed78db322f815438e5e0db82cbe40799e02bb7d0f7cd469ad453585
7
- data.tar.gz: 225fa5c982e60ceaae8d5a8cbd90ff6ecd8d54cff5105bc1338d45e6fb9969586af5ced3fa6b3a7c6948a453ee7bd7956a30f2972527719d32467116da48f7ce
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_by_identity 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_by_identity.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_by_identity
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)
@@ -47,14 +47,14 @@ module N1Loader
47
47
  end
48
48
 
49
49
  def for(element)
50
- identity_loaded = loaded
50
+ return unless loaded?
51
51
 
52
- if identity_loaded.empty? && elements.any?
52
+ if loaded_by_identity.empty? && elements.any?
53
53
  raise NotFilled, "Nothing was preloaded, perhaps you forgot to use fulfill method"
54
54
  end
55
55
 
56
- return identity_loaded[element] if identity_loaded.key?(element)
57
- return @loaded_by_value[element] if @loaded_by_value.key?(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
58
 
59
59
  raise NotLoaded, "The data was not preloaded for the given element"
60
60
  end
@@ -66,7 +66,7 @@ module N1Loader
66
66
 
67
67
  private
68
68
 
69
- attr_reader :elements, :args
69
+ attr_reader :elements, :args, :loaded_by_value, :loaded_by_identity
70
70
 
71
71
  def check_missing_arguments!
72
72
  return unless (arguments = self.class.arguments)
@@ -107,22 +107,19 @@ module N1Loader
107
107
  end
108
108
 
109
109
  def fulfill(element, value)
110
- @loaded_by_identity[element] = value
111
- @loaded_by_value[element] = value
110
+ loaded_by_identity[element] = value
111
+ loaded_by_value[element] = value
112
112
  end
113
113
 
114
- def ensure_loaded
115
- return if @already_loaded
114
+ def loaded?
115
+ return true if @already_loaded
116
116
 
117
- synchronize { non_thread_safe_loaded unless @already_loaded }
118
- end
117
+ synchronize { non_thread_safe_loading unless @already_loaded }
119
118
 
120
- def loaded
121
- ensure_loaded
122
- @loaded_by_identity
119
+ true
123
120
  end
124
121
 
125
- def non_thread_safe_loaded # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
122
+ def non_thread_safe_loading # rubocop:disable Metrics/AbcSize, Metrics/MethodLength, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
126
123
  return if @already_loaded
127
124
 
128
125
  check_arguments!
@@ -133,8 +130,13 @@ module N1Loader
133
130
  if respond_to?(:single) && elements.size == 1
134
131
  fulfill(elements.first, single(elements.first))
135
132
  elsif elements.any?
136
- elements.each { |el| el.n1_bind_to(elements) if el.respond_to?(:n1_bind_to) }
137
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
138
140
  end
139
141
 
140
142
  @already_loaded = true
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module N1Loader
4
- VERSION = "2.2.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.2.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-16 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