n1_loader 1.4.0 → 1.4.3
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/CHANGELOG.md +12 -0
- data/README.md +24 -1
- data/lib/n1_loader/core/loadable.rb +12 -0
- data/lib/n1_loader/core/loader.rb +4 -1
- data/lib/n1_loader/core/preloader.rb +12 -2
- data/lib/n1_loader/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fe90c7df57ebf6237efd043aafd9a988415182d86ec877dedb02b1afb2b28295
|
4
|
+
data.tar.gz: 0bd43d92e0de325a413f0f88680cc9cb9c79b2e165cbae1cfe7bd9b175c4ee2f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d44ce33e6d822ee2121e5adf436c4841d92c89abc4fc98bace13371602987d21e813c530ddf1bf07b3fe5cbe42ba79bb71520a7161c37e95bd304dcca803d31d
|
7
|
+
data.tar.gz: 1391dd9fa95f7e267e1e5c684a1dddbb025982f3fbf2c56207f1e868972b0ee4efafbca5919c781abf6a2bc8e85ce3d9251b8762d357d1bc82592b2d1ba540d4
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,15 @@
|
|
1
|
+
## [1.4.3] - 2022-04-13
|
2
|
+
|
3
|
+
- Add `default` support to arguments
|
4
|
+
|
5
|
+
## [1.4.2] - 2022-03-01
|
6
|
+
|
7
|
+
- Add n1_clear_cache method which is useful for cases like reload in ActiveRecord
|
8
|
+
|
9
|
+
## [1.4.1] - 2022-02-24
|
10
|
+
|
11
|
+
- Fix preloading of invalid objects
|
12
|
+
|
1
13
|
## [1.4.0] - 2022-02-22
|
2
14
|
|
3
15
|
- add support of optional arguments
|
data/README.md
CHANGED
@@ -31,11 +31,31 @@ gem 'n1_loader'
|
|
31
31
|
You can add integration with [ActiveRecord][5] by:
|
32
32
|
```ruby
|
33
33
|
gem 'n1_loader', require: 'n1_loader/active_record'
|
34
|
+
|
35
|
+
# You also may be interested in injecting it to models
|
36
|
+
class ActiveRecord::Base
|
37
|
+
include N1Loader::Loadable
|
38
|
+
|
39
|
+
def reload(*)
|
40
|
+
n1_clear_cache
|
41
|
+
super
|
42
|
+
end
|
43
|
+
end
|
34
44
|
```
|
35
45
|
|
36
46
|
You can add the integration with [ActiveRecord][5] and [ArLazyPreload][6] by:
|
37
47
|
```ruby
|
38
48
|
gem 'n1_loader', require: 'n1_loader/ar_lazy_preload'
|
49
|
+
|
50
|
+
# You also may be interested in injecting it to models
|
51
|
+
class ActiveRecord::Base
|
52
|
+
include N1Loader::Loadable
|
53
|
+
|
54
|
+
def reload(*)
|
55
|
+
n1_clear_cache
|
56
|
+
super
|
57
|
+
end
|
58
|
+
end
|
39
59
|
```
|
40
60
|
|
41
61
|
## Usage
|
@@ -129,6 +149,9 @@ end
|
|
129
149
|
user = User.new
|
130
150
|
user.orders_count # => loader is executed first time and value was cached
|
131
151
|
user.orders_count(reload: true) # => loader is executed again and a new value was cached
|
152
|
+
# or
|
153
|
+
user.n1_clear_cache
|
154
|
+
user.orders_count
|
132
155
|
|
133
156
|
users = [User.new, User.new]
|
134
157
|
N1Loader::Preloader.new(users).preload(:orders_count) # => loader was initialized but not yet executed
|
@@ -217,7 +240,7 @@ class User
|
|
217
240
|
include N1Loader::Loadable
|
218
241
|
|
219
242
|
n1_optimized :orders_count do
|
220
|
-
argument :sale
|
243
|
+
argument :sale, optional: true, default: -> { Sale.last }
|
221
244
|
|
222
245
|
cache_key { sale.id }
|
223
246
|
|
@@ -32,6 +32,12 @@ module N1Loader
|
|
32
32
|
send("#{name}_loader=", loader_collection)
|
33
33
|
end
|
34
34
|
|
35
|
+
def n1_clear_cache
|
36
|
+
self.class.n1_loaders.each do |name|
|
37
|
+
n1_loader_set(name, nil)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
35
41
|
def self.included(base)
|
36
42
|
base.extend(ClassMethods)
|
37
43
|
end
|
@@ -45,6 +51,10 @@ module N1Loader
|
|
45
51
|
respond_to?("#{name}_loader")
|
46
52
|
end
|
47
53
|
|
54
|
+
def n1_loaders
|
55
|
+
@n1_loaders ||= superclass.respond_to?(:n1_loaders) ? superclass.n1_loaders.dup : []
|
56
|
+
end
|
57
|
+
|
48
58
|
def n1_optimized(name, loader = nil, &block) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
|
49
59
|
loader ||= Class.new(N1Loader::Loader) do
|
50
60
|
if block.arity == 1
|
@@ -56,6 +66,8 @@ module N1Loader
|
|
56
66
|
loader_name = "#{name}_loader"
|
57
67
|
loader_variable_name = "@#{loader_name}"
|
58
68
|
|
69
|
+
n1_loaders << name
|
70
|
+
|
59
71
|
define_singleton_method(loader_name) do
|
60
72
|
loader
|
61
73
|
end
|
@@ -17,10 +17,13 @@ module N1Loader
|
|
17
17
|
# @param name [Symbol]
|
18
18
|
# @param opts [Hash]
|
19
19
|
# @option opts [Boolean] optional false by default
|
20
|
+
# @option opts [Proc] default
|
20
21
|
def argument(name, **opts)
|
22
|
+
opts[:optional] = true if opts[:default]
|
23
|
+
|
21
24
|
@arguments ||= []
|
22
25
|
|
23
|
-
define_method(name) { args[name] }
|
26
|
+
define_method(name) { args[name] ||= opts[:default]&.call }
|
24
27
|
|
25
28
|
@arguments << opts.merge(name: name)
|
26
29
|
end
|
@@ -17,13 +17,23 @@ module N1Loader
|
|
17
17
|
def preload(*keys)
|
18
18
|
keys.flatten(1).flat_map do |key|
|
19
19
|
elements
|
20
|
-
.group_by { |element| element
|
20
|
+
.group_by { |element| loader_class(element, key) }
|
21
21
|
.map do |loader_class, grouped_elements|
|
22
|
+
next unless loader_class
|
23
|
+
|
22
24
|
loader_collection = N1Loader::LoaderCollection.new(loader_class, grouped_elements)
|
23
25
|
grouped_elements.each { |grouped_element| grouped_element.n1_loader_set(key, loader_collection) }
|
24
26
|
loader_collection
|
25
|
-
end
|
27
|
+
end.compact
|
26
28
|
end
|
27
29
|
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
def loader_class(element, key)
|
34
|
+
element.class.respond_to?(:n1_loader_defined?) &&
|
35
|
+
element.class.n1_loader_defined?(key) &&
|
36
|
+
element.class.n1_loader(key)
|
37
|
+
end
|
28
38
|
end
|
29
39
|
end
|
data/lib/n1_loader/version.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: 1.4.
|
4
|
+
version: 1.4.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Evgeniy Demin
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-04-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -186,7 +186,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
186
186
|
- !ruby/object:Gem::Version
|
187
187
|
version: '0'
|
188
188
|
requirements: []
|
189
|
-
rubygems_version: 3.
|
189
|
+
rubygems_version: 3.1.6
|
190
190
|
signing_key:
|
191
191
|
specification_version: 4
|
192
192
|
summary: Loader to solve N+1 issue for good.
|