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 +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 +13 -0
- data/lib/n1_loader/core/loader.rb +24 -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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
110
|
+
loaded_by_identity[element] = value
|
|
111
|
+
loaded_by_value[element] = value
|
|
107
112
|
end
|
|
108
113
|
|
|
109
|
-
def loaded
|
|
110
|
-
return
|
|
114
|
+
def loaded?
|
|
115
|
+
return true if @already_loaded
|
|
111
116
|
|
|
112
|
-
synchronize
|
|
113
|
-
non_thread_safe_loaded unless @already_loaded
|
|
114
|
-
end
|
|
117
|
+
synchronize { non_thread_safe_loading unless @already_loaded }
|
|
115
118
|
|
|
116
|
-
|
|
119
|
+
true
|
|
117
120
|
end
|
|
118
121
|
|
|
119
|
-
def
|
|
120
|
-
return
|
|
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
|
-
@
|
|
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
|
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.1
|
|
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
|