n1_loader 2.2.1 → 3.0.0

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: 24b29bd98ee754ae976c84c253a4d9018cc3372003a6965d1227d578f9cd6d4d
4
- data.tar.gz: 39ccc3e7314dd901cd47c2dd15d16154fefa5529a33e269e7e42877e78d3f7fa
3
+ metadata.gz: 993f807b671a08f82ed5ad7eff20cae7ab4d8e910772ba944543f8a46343c313
4
+ data.tar.gz: d0489f877243e19caf4c5b8fab6083dbe283aad6e89199386d611745840065ce
5
5
  SHA512:
6
- metadata.gz: 1ff08212965c0d67d3035be2e083ba6240fc1d034880d29615d88d7c88bbf7c3b61057779ff88c22d27a501d59098a4b67b5a406ff2e2e3984a72c5de6d33459
7
- data.tar.gz: da51833d93a6109edb7eb284e024b3f24c8684e4765166ba55b4a4279dd2ea23c905e0f37762cef007adef12efbb3d8a46c52030ff3b047e38b18798b7579c2f
6
+ metadata.gz: f47c6eb0400062948a5bb9c19cbb71b56cc10615773f5dd031fcc138485303ddbd3bb9b9f0070afc5f5baaaebd917c8da0f2c00dd93a29956bcdfca9d6581a73
7
+ data.tar.gz: 7cbcf9de6b8b20b0e2d100d79f787343f542200da3ec234d0f13ef6353ca0bbf3e05afd06584528d70701ff08bfd461d63c9c83625164f9579123417a092a406
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Returns cached N1Loader::LoaderCollection from context for a loader.
4
+ # In case there is none yet, saves passed block to a cache.
5
+ Goldiloader::AutoIncludeContext.define_method :fetch_n1_loader_collection do |loader, &block|
6
+ (@n1_loader_collections ||= {})[loader] ||= block.call
7
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module N1Loader
4
+ module Goldiloader
5
+ # Context adapter for injected N1Loader loaders.
6
+ class ContextAdapter
7
+ attr_reader :context
8
+
9
+ def initialize(context)
10
+ @context = context
11
+ end
12
+
13
+ # Trigger preloading for +association_name+ across all models in the context.
14
+ def try_preload_lazily(association_name)
15
+ perform_preloading(association_name) if context
16
+ end
17
+
18
+ # Initialize preloader for +association_name+ with context builder callback.
19
+ # The callback will be executed when records are loaded.
20
+ def perform_preloading(association_name)
21
+ context_setup = lambda { |records|
22
+ ar_records = records.flatten(1).select { |record| record.respond_to?(:auto_include_context=) }
23
+ ::Goldiloader::AutoIncludeContext.register_models(ar_records) unless ar_records.empty?
24
+ }
25
+
26
+ N1Loader::Preloader.new(context.models, context_setup).preload(association_name)
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module N1Loader
4
+ module Goldiloader
5
+ module Loadable # :nodoc:
6
+ def n1_loader(name)
7
+ return n1_loaders[name] if n1_loaders[name]
8
+
9
+ ContextAdapter.new(auto_include_context).try_preload_lazily(name) if respond_to?(:auto_include_context)
10
+
11
+ super
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Raised when a single object without Goldiloader context support was passed to an isolated loader.
4
+ N1Loader::Loader::UnsupportedGoldiloader = Class.new(StandardError)
5
+
6
+ # Defines a singleton method that allows isolated loaders
7
+ # to use Goldiloader context without passing sibling records.
8
+ N1Loader::Loader.define_singleton_method(:for) do |element, **args|
9
+ # It is required to have a Goldiloader context supported
10
+ raise N1Loader::Loader::UnsupportedGoldiloader unless element.respond_to?(:auto_include_context)
11
+
12
+ context = element.auto_include_context
13
+
14
+ # Fetch or initialize loader from Goldiloader context
15
+ loader_collection = context.fetch_n1_loader_collection(self) do
16
+ context_setup = lambda { |records|
17
+ ar_records = records.flatten(1).select { |record| record.respond_to?(:auto_include_context=) }
18
+ ::Goldiloader::AutoIncludeContext.register_models(ar_records) unless ar_records.empty?
19
+ }
20
+
21
+ N1Loader::LoaderCollection.new(self, context.models).tap do |collection|
22
+ collection.context_setup = context_setup
23
+ end
24
+ end
25
+
26
+ # Fetch value from loader
27
+ loader_collection.with(**args).for(element)
28
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module N1Loader
4
+ module Goldiloader
5
+ # A patch to {N1Loader::LoaderCollection} to setup lazy context lazily.
6
+ module LoaderCollectionPatch
7
+ attr_accessor :context_setup
8
+
9
+ def with(**args)
10
+ result = super
11
+
12
+ result.context_setup = context_setup if context_setup && result.context_setup.nil?
13
+
14
+ result
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module N1Loader
4
+ module Goldiloader
5
+ # A patch to {N1Loader::Loader} to setup lazy context lazily.
6
+ module LoaderPatch
7
+ attr_accessor :context_setup
8
+
9
+ def loaded?
10
+ return true if @already_loaded && @already_context
11
+
12
+ super
13
+
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)
23
+
24
+ @already_context = true
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module N1Loader
4
+ module Goldiloader
5
+ # A patch to {N1Loader::Preloader} to setup lazy context lazily.
6
+ module PreloaderPatch
7
+ def initialize(elements, context_setup = nil)
8
+ super(elements)
9
+ @context_setup = context_setup
10
+ end
11
+
12
+ def preload(*keys)
13
+ super.each do |loader_collection|
14
+ loader_collection.context_setup = context_setup
15
+ end
16
+ end
17
+
18
+ private
19
+
20
+ attr_reader :context_setup
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Load core library
4
+ require_relative "active_record"
5
+
6
+ # Load integration dependency
7
+ require "goldiloader"
8
+
9
+ # Library integration
10
+ require_relative "goldiloader/loadable"
11
+ require_relative "goldiloader/context_adapter"
12
+ require_relative "goldiloader/loader_collection_patch"
13
+ require_relative "goldiloader/preloader_patch"
14
+ require_relative "goldiloader/loader_patch"
15
+ require_relative "goldiloader/loader"
16
+ require_relative "goldiloader/context"
17
+
18
+ N1Loader::Loadable.prepend(N1Loader::Goldiloader::Loadable)
19
+ N1Loader::Preloader.prepend(N1Loader::Goldiloader::PreloaderPatch)
20
+ N1Loader::Loader.prepend(N1Loader::Goldiloader::LoaderPatch)
21
+ N1Loader::LoaderCollection.prepend(N1Loader::Goldiloader::LoaderCollectionPatch)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module N1Loader
4
- VERSION = "2.2.1"
4
+ VERSION = "3.0.0"
5
5
  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.1
4
+ version: 3.0.0
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-17 00:00:00.000000000 Z
11
+ date: 2026-03-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: mutex_m
@@ -66,6 +66,20 @@ dependencies:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0.11'
69
+ - !ruby/object:Gem::Dependency
70
+ name: goldiloader
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '3'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '3'
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: graphql
71
85
  requirement: !ruby/object:Gem::Requirement
@@ -179,6 +193,14 @@ files:
179
193
  - lib/n1_loader/core/loader_builder.rb
180
194
  - lib/n1_loader/core/loader_collection.rb
181
195
  - lib/n1_loader/core/preloader.rb
196
+ - lib/n1_loader/goldiloader.rb
197
+ - lib/n1_loader/goldiloader/context.rb
198
+ - lib/n1_loader/goldiloader/context_adapter.rb
199
+ - lib/n1_loader/goldiloader/loadable.rb
200
+ - lib/n1_loader/goldiloader/loader.rb
201
+ - lib/n1_loader/goldiloader/loader_collection_patch.rb
202
+ - lib/n1_loader/goldiloader/loader_patch.rb
203
+ - lib/n1_loader/goldiloader/preloader_patch.rb
182
204
  - lib/n1_loader/version.rb
183
205
  homepage: https://github.com/djezzzl/n1_loader
184
206
  licenses: