fume-aloader 0.1.1 → 0.1.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 12208e51420d3bf1332bd4b482170903d823458bdd62064bbc6a90c7b6e8af8a
4
- data.tar.gz: 86ef2d545231f0164d7d0c05e8279d924c00819ffb1395707157020274234493
3
+ metadata.gz: d28c0f8cbcfe64fca00ab2f6ca8b9cdefeab90b866707e3ce04385a8ea369d52
4
+ data.tar.gz: 16b395ef8d8a26e26f6997eb5af7f89f1acad2b1d48d9f7dca0381c14e3f1a86
5
5
  SHA512:
6
- metadata.gz: 2c974e163a5d91eddd8c933e54abfa56f3e0ae665d3a887113d343070e689560ec5b54d7d044eca8586341e364746890335e07aeeff501d21bf011c27952da45
7
- data.tar.gz: 215584ac4d4589fa16ffacfadebaa29d82ab91018234a8418daf6842c9c70ba528f5db6322c50fee3f0bed7326dda986e77f2600dd083555ab21a1b51433c7ca
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
- # ignore
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
@@ -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 = super
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 "base"
1
+ require_relative "base_single"
2
2
 
3
3
  module Fume::Aloader
4
4
  module Relationship
5
- class BelongsTo < Base
5
+ class BelongsTo < BaseSingle
6
6
  def get_cache_key(record)
7
7
  record.send(reflection.join_foreign_key)
8
8
  end
@@ -1,8 +1,8 @@
1
- require_relative "base"
1
+ require_relative "base_single"
2
2
 
3
3
  module Fume::Aloader
4
4
  module Relationship
5
- class BelongsToPolymorphic < Base
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
- hash[type] << value if !value.nil?
22
- end
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
@@ -1,8 +1,8 @@
1
- require_relative "base"
1
+ require_relative "base_single"
2
2
 
3
3
  module Fume::Aloader
4
4
  module Relationship
5
- class HasOne < Base
5
+ class HasOne < BaseSingle
6
6
  def get_cache_key(record)
7
7
  record.send(reflection.join_foreign_key)
8
8
  end
@@ -1,5 +1,5 @@
1
1
  module Fume
2
2
  module Aloader
3
- VERSION = "0.1.1"
3
+ VERSION = "0.1.4"
4
4
  end
5
5
  end
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.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-01 00:00:00.000000000 Z
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