fume-aloader 0.1.1 → 0.1.4
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/fume/aloader/association_loader.rb +12 -1
- data/lib/fume/aloader/railtie.rb +5 -0
- data/lib/fume/aloader/record_addons.rb +6 -0
- data/lib/fume/aloader/relation_addons.rb +3 -3
- data/lib/fume/aloader/relationship/base_single.rb +25 -0
- data/lib/fume/aloader/relationship/belongs_to.rb +2 -2
- data/lib/fume/aloader/relationship/belongs_to_polymorphic.rb +36 -6
- data/lib/fume/aloader/relationship/has_many.rb +18 -0
- data/lib/fume/aloader/relationship/has_one.rb +2 -2
- data/lib/fume/aloader/version.rb +1 -1
- metadata +17 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d28c0f8cbcfe64fca00ab2f6ca8b9cdefeab90b866707e3ce04385a8ea369d52
|
4
|
+
data.tar.gz: 16b395ef8d8a26e26f6997eb5af7f89f1acad2b1d48d9f7dca0381c14e3f1a86
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5a3c7e7784c54ece83c902c5c890d4ba608cd7726993af164446bd21dba029fadda12a8b95b3d85d0587033a059f800c5899e78335cf010075a69793ed668962
|
7
|
+
data.tar.gz: 902c5cbb173817c7e1df8de2a4ca2790251a4ca63fac323a6b219e3b5b2b4907ffaf3ae793068d660311c7d7716e58305dbac21875a92c09600ff8cc7ace5a0a
|
@@ -33,13 +33,24 @@ module Fume::Aloader
|
|
33
33
|
# prefer use cached value
|
34
34
|
association.target = find_cached_value(record, name)
|
35
35
|
elsif association.loaded?
|
36
|
-
|
36
|
+
ensure_attribute_aloader_inited(record, name)
|
37
37
|
else
|
38
38
|
init_records_value(name)
|
39
39
|
association.target = find_cached_value(record, name)
|
40
40
|
end
|
41
41
|
end
|
42
42
|
|
43
|
+
def ensure_attribute_aloader_inited(record, name)
|
44
|
+
relationship = Relationship.build(klass, name)
|
45
|
+
return if relationship.loader_is_inited?(record)
|
46
|
+
|
47
|
+
options = active_preset.dig(:attributes, name) || {}
|
48
|
+
loaders = relationship.loaders_init(self.records, options[:preset])
|
49
|
+
(self.preload_values[name] || []).each do |args|
|
50
|
+
loaders.each { |it| it.preload_all(*args) }
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
43
54
|
def preload_all(*path, values)
|
44
55
|
path = [ path ].flatten
|
45
56
|
name = path.shift
|
data/lib/fume/aloader/railtie.rb
CHANGED
@@ -9,6 +9,11 @@ module Fume::Aloader
|
|
9
9
|
initializer 'fume-aloader.configure_rails_initialization' do |app|
|
10
10
|
::ActiveRecord::Base.include(RecordAddons)
|
11
11
|
::ActiveRecord::Relation.prepend(RelationAddons)
|
12
|
+
|
13
|
+
# CollectionProxy is inhert from Relation, proxy back to Relation
|
14
|
+
::ActiveRecord::Associations::CollectionProxy.class_eval do
|
15
|
+
delegate :al_to_scope, :aloader, to: :scope
|
16
|
+
end
|
12
17
|
end
|
13
18
|
end
|
14
19
|
end
|
@@ -20,6 +20,12 @@ module Fume::Aloader
|
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
23
|
+
def al_build(preset = :default)
|
24
|
+
return self.aloader if self.aloader
|
25
|
+
self.aloader = self.class.al_build([ self ])
|
26
|
+
self.aloader.active(preset)
|
27
|
+
end
|
28
|
+
|
23
29
|
module ClassMethods
|
24
30
|
def aloader_init(&block)
|
25
31
|
define_singleton_method :al_build do |records|
|
@@ -1,6 +1,5 @@
|
|
1
1
|
module Fume::Aloader
|
2
2
|
module RelationAddons
|
3
|
-
|
4
3
|
attr_accessor :aloader
|
5
4
|
|
6
5
|
def load(*args, &block)
|
@@ -11,7 +10,7 @@ module Fume::Aloader
|
|
11
10
|
end
|
12
11
|
|
13
12
|
def spawn(*args)
|
14
|
-
result =
|
13
|
+
result = already_in_scope? ? klass.all : clone
|
15
14
|
result.aloader = nil
|
16
15
|
result.al_init_loader
|
17
16
|
result.aloader&.spawn_from(self.aloader) if self.aloader
|
@@ -49,7 +48,8 @@ module Fume::Aloader
|
|
49
48
|
def al_to_scope(preset = :default)
|
50
49
|
al_init_loader
|
51
50
|
self.aloader.active(preset)
|
52
|
-
self.aloader.apply_profile_scope_includes(self)
|
51
|
+
result = self.aloader.apply_profile_scope_includes(self)
|
52
|
+
result
|
53
53
|
end
|
54
54
|
end
|
55
55
|
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require_relative "base"
|
2
|
+
|
3
|
+
module Fume::Aloader
|
4
|
+
module Relationship
|
5
|
+
class BaseSingle < Base
|
6
|
+
def loader_is_inited?(parent)
|
7
|
+
value = parent.send(reflection.name)
|
8
|
+
value.nil? || !!value.aloader
|
9
|
+
end
|
10
|
+
|
11
|
+
def loaders_init(parents, preset)
|
12
|
+
values = parents.map { |it| it.send(reflection.name) }.compact
|
13
|
+
return [] if !reflection.klass.respond_to?(:al_build)
|
14
|
+
loader = reflection.klass.al_build(values)
|
15
|
+
|
16
|
+
values.each do |value|
|
17
|
+
value.aloader = loader
|
18
|
+
end
|
19
|
+
|
20
|
+
loader.active(preset) if preset
|
21
|
+
[ loader ]
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -1,8 +1,8 @@
|
|
1
|
-
require_relative "
|
1
|
+
require_relative "base_single"
|
2
2
|
|
3
3
|
module Fume::Aloader
|
4
4
|
module Relationship
|
5
|
-
class BelongsToPolymorphic <
|
5
|
+
class BelongsToPolymorphic < BaseSingle
|
6
6
|
def get_cache_key(record)
|
7
7
|
[ record.send(reflection.join_foreign_type), record.send(reflection.join_foreign_key) ]
|
8
8
|
end
|
@@ -15,12 +15,13 @@ module Fume::Aloader
|
|
15
15
|
values_mapping = records.each_with_object({}).each do |record, hash|
|
16
16
|
type = record.read_attribute(reflection.join_foreign_type)
|
17
17
|
next if type.nil?
|
18
|
-
hash[type] ||= Set.new
|
19
18
|
|
20
19
|
value = record.read_attribute(reflection.join_foreign_key)
|
21
|
-
|
22
|
-
|
23
|
-
|
20
|
+
if value
|
21
|
+
hash[type] ||= Set.new
|
22
|
+
hash[type] << value
|
23
|
+
end
|
24
|
+
end.compact
|
24
25
|
|
25
26
|
values_mapping.map do |type, values|
|
26
27
|
values = [ values.to_a ]
|
@@ -39,6 +40,35 @@ module Fume::Aloader
|
|
39
40
|
values_scope
|
40
41
|
end
|
41
42
|
end
|
43
|
+
|
44
|
+
def build_values_mapping(records)
|
45
|
+
end
|
46
|
+
|
47
|
+
def loaders_init(parents, preset)
|
48
|
+
values_mapping = parents.each_with_object({}).each do |parent, hash|
|
49
|
+
type = parent.read_attribute(reflection.join_foreign_type)
|
50
|
+
next if type.nil?
|
51
|
+
|
52
|
+
value = parent.send(reflection.name)
|
53
|
+
if value
|
54
|
+
hash[type] ||= Set.new
|
55
|
+
hash[type] << value
|
56
|
+
end
|
57
|
+
end.compact
|
58
|
+
|
59
|
+
values_mapping.each do |type, values|
|
60
|
+
loader_klass = type.constantize
|
61
|
+
next if !loader_klass.respond_to?(:al_build)
|
62
|
+
loader = loader_klass.al_build(values)
|
63
|
+
|
64
|
+
values.each do |value|
|
65
|
+
value.aloader = loader
|
66
|
+
end
|
67
|
+
|
68
|
+
loader.active(preset) if preset
|
69
|
+
loader
|
70
|
+
end
|
71
|
+
end
|
42
72
|
end
|
43
73
|
end
|
44
74
|
end
|
@@ -13,6 +13,24 @@ module Fume::Aloader
|
|
13
13
|
result[key] += [ it ]
|
14
14
|
end
|
15
15
|
end
|
16
|
+
|
17
|
+
def loader_is_inited?(parent)
|
18
|
+
values = parent.send(reflection.name)
|
19
|
+
values.nil? || values.empty? || !!values.first.aloader
|
20
|
+
end
|
21
|
+
|
22
|
+
def loaders_init(parents, preset)
|
23
|
+
values = parents.flat_map { |it| it.send(reflection.name) }.compact
|
24
|
+
return [] if !reflection.klass.respond_to?(:al_build)
|
25
|
+
loader = reflection.klass.al_build(values)
|
26
|
+
|
27
|
+
values.each do |value|
|
28
|
+
value.aloader = loader
|
29
|
+
end
|
30
|
+
|
31
|
+
loader.active(preset) if preset
|
32
|
+
[ loader ]
|
33
|
+
end
|
16
34
|
end
|
17
35
|
end
|
18
36
|
end
|
data/lib/fume/aloader/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fume-aloader
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- sunteya
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-05-
|
11
|
+
date: 2022-05-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -80,6 +80,20 @@ dependencies:
|
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '3.0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rspec-rails
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 5.1.2
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 5.1.2
|
83
97
|
- !ruby/object:Gem::Dependency
|
84
98
|
name: simplecov
|
85
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -142,6 +156,7 @@ files:
|
|
142
156
|
- lib/fume/aloader/relation_addons.rb
|
143
157
|
- lib/fume/aloader/relationship.rb
|
144
158
|
- lib/fume/aloader/relationship/base.rb
|
159
|
+
- lib/fume/aloader/relationship/base_single.rb
|
145
160
|
- lib/fume/aloader/relationship/belongs_to.rb
|
146
161
|
- lib/fume/aloader/relationship/belongs_to_polymorphic.rb
|
147
162
|
- lib/fume/aloader/relationship/has_and_belongs_to_many.rb
|