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 +4 -4
- data/lib/n1_loader/active_record/loader.rb +1 -1
- data/lib/n1_loader/ar_lazy_preload/loader_patch.rb +11 -6
- data/lib/n1_loader/core/loadable.rb +12 -0
- data/lib/n1_loader/core/loader.rb +18 -16
- data/lib/n1_loader/version.rb +1 -1
- data/lib/n1_loader.rb +1 -0
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 24b29bd98ee754ae976c84c253a4d9018cc3372003a6965d1227d578f9cd6d4d
|
|
4
|
+
data.tar.gz: 39ccc3e7314dd901cd47c2dd15d16154fefa5529a33e269e7e42877e78d3f7fa
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 1ff08212965c0d67d3035be2e083ba6240fc1d034880d29615d88d7c88bbf7c3b61057779ff88c22d27a501d59098a4b67b5a406ff2e2e3984a72c5de6d33459
|
|
7
|
+
data.tar.gz: da51833d93a6109edb7eb284e024b3f24c8684e4765166ba55b4a4279dd2ea23c905e0f37762cef007adef12efbb3d8a46c52030ff3b047e38b18798b7579c2f
|
|
@@ -6,17 +6,22 @@ module N1Loader
|
|
|
6
6
|
module LoaderPatch
|
|
7
7
|
attr_accessor :context_setup
|
|
8
8
|
|
|
9
|
-
def loaded
|
|
10
|
-
return
|
|
9
|
+
def loaded?
|
|
10
|
+
return true if @already_loaded && @already_context
|
|
11
11
|
|
|
12
12
|
super
|
|
13
13
|
|
|
14
|
-
synchronize
|
|
15
|
-
|
|
16
|
-
|
|
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
|
-
|
|
50
|
+
return unless loaded?
|
|
51
51
|
|
|
52
|
-
if
|
|
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
|
|
57
|
-
return
|
|
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
|
-
|
|
111
|
-
|
|
110
|
+
loaded_by_identity[element] = value
|
|
111
|
+
loaded_by_value[element] = value
|
|
112
112
|
end
|
|
113
113
|
|
|
114
|
-
def
|
|
115
|
-
return if @already_loaded
|
|
114
|
+
def loaded?
|
|
115
|
+
return true if @already_loaded
|
|
116
116
|
|
|
117
|
-
synchronize {
|
|
118
|
-
end
|
|
117
|
+
synchronize { non_thread_safe_loading unless @already_loaded }
|
|
119
118
|
|
|
120
|
-
|
|
121
|
-
ensure_loaded
|
|
122
|
-
@loaded_by_identity
|
|
119
|
+
true
|
|
123
120
|
end
|
|
124
121
|
|
|
125
|
-
def
|
|
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
|
data/lib/n1_loader/version.rb
CHANGED
data/lib/n1_loader.rb
CHANGED
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.
|
|
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-
|
|
11
|
+
date: 2026-03-17 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: mutex_m
|