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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2d0f96166ae91c856012ea26c933cc56c7d33f68065b753a18adc3c6b9da7e87
4
- data.tar.gz: adccc88c382d9283c2af9b41059298fa15563e47615678ef20629a0183a51253
3
+ metadata.gz: fe90c7df57ebf6237efd043aafd9a988415182d86ec877dedb02b1afb2b28295
4
+ data.tar.gz: 0bd43d92e0de325a413f0f88680cc9cb9c79b2e165cbae1cfe7bd9b175c4ee2f
5
5
  SHA512:
6
- metadata.gz: ad3b1273627cf7abb5922cc7139c34e5e9543dc91d296d7e44deea690367d32082dd1ddc028ba40a4ed7fa402a65eb8f5aed36b6d8df0436937e59aaa6cef65a
7
- data.tar.gz: fde03e325f2b780a070786f1648a98d278933c84b3266cedf4db50cd268b029839ff06290416846a9ab2a85a25a0795c30684845e4da15909417389dbd1a7a82
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.class.n1_loader(key) }
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module N1Loader
4
- VERSION = "1.4.0"
4
+ VERSION = "1.4.3"
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: 1.4.0
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-02-22 00:00:00.000000000 Z
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.2.22
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.