batch-loader 1.0.1 → 1.0.2
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 +8 -1
- data/Gemfile +0 -2
- data/batch-loader.gemspec +1 -0
- data/lib/batch_loader.rb +22 -30
- data/lib/batch_loader/version.rb +1 -1
- metadata +16 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bb37551b8e0c52cb65a331801fa0110e311aebf9
|
4
|
+
data.tar.gz: 9f5a59bd9626c0341103c2d5c422119ff71aedba
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 92e829a4416c25050380ef59dbe43873f89911140ade537b9420bc05fb6bb45364591781010b0b0ecab5f71e1a5ec1bb56fa15f4cdb6ef4859547687e3bb30d0
|
7
|
+
data.tar.gz: 6101f58d4292906aa512ae16e88f3c563c351984c2edea960fc1d4ff7ddd87a95dbb69e0fdd201376e93d0f189638f27ad0a76ff191c30dc79ba6d5fbf61b5c2
|
data/CHANGELOG.md
CHANGED
@@ -8,10 +8,17 @@ one of the following labels: `Added`, `Changed`, `Deprecated`,
|
|
8
8
|
to manage the versions of this gem so
|
9
9
|
that you can set version constraints properly.
|
10
10
|
|
11
|
-
#### [Unreleased](https://github.com/exAspArk/batch-loader/compare/v1.0.
|
11
|
+
#### [Unreleased](https://github.com/exAspArk/batch-loader/compare/v1.0.2...HEAD)
|
12
12
|
|
13
13
|
* WIP
|
14
14
|
|
15
|
+
#### [v1.0.2](https://github.com/exAspArk/batch-loader/compare/v1.0.1...v1.0.2) – 2017-09-14
|
16
|
+
|
17
|
+
* `Added`: `BatchLoader#inspect` method because of Pry, which [swallows errors](https://github.com/pry/pry/issues/1642).
|
18
|
+
* `Added`: benchmarks.
|
19
|
+
* `Fixed`: caching `nil`s for not loaded values only after successful `#batch` execution.
|
20
|
+
* `Changed`: internal implementation with Ruby `Forwardable`, don't delegate methods like `object_id` and `__send__`.
|
21
|
+
|
15
22
|
#### [v1.0.1](https://github.com/exAspArk/batch-loader/compare/v1.0.0...v1.0.1) – 2017-09-03
|
16
23
|
|
17
24
|
* `Fixed`: loading `BatchLoader` by requiring `Set`.
|
data/Gemfile
CHANGED
data/batch-loader.gemspec
CHANGED
data/lib/batch_loader.rb
CHANGED
@@ -1,12 +1,20 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require "set"
|
4
|
+
require "forwardable"
|
5
|
+
|
4
6
|
require "batch_loader/version"
|
5
7
|
require "batch_loader/executor_proxy"
|
6
8
|
require "batch_loader/middleware"
|
7
9
|
require "batch_loader/graphql"
|
8
10
|
|
9
11
|
class BatchLoader
|
12
|
+
extend Forwardable
|
13
|
+
|
14
|
+
IMPLEMENTED_INSTANCE_METHODS = %i[object_id __id__ __send__ singleton_method_added batch_loader? respond_to? batch inspect].freeze
|
15
|
+
REPLACABLE_INSTANCE_METHODS = %i[batch inspect].freeze
|
16
|
+
LEFT_INSTANCE_METHODS = (IMPLEMENTED_INSTANCE_METHODS - REPLACABLE_INSTANCE_METHODS).freeze
|
17
|
+
|
10
18
|
NoBatchError = Class.new(StandardError)
|
11
19
|
|
12
20
|
def self.for(item)
|
@@ -32,7 +40,11 @@ class BatchLoader
|
|
32
40
|
end
|
33
41
|
|
34
42
|
def respond_to?(method_name)
|
35
|
-
method_name
|
43
|
+
LEFT_INSTANCE_METHODS.include?(method_name) || method_missing(:respond_to?, method_name)
|
44
|
+
end
|
45
|
+
|
46
|
+
def inspect
|
47
|
+
"#<BatchLoader:0x#{(object_id << 1)}>"
|
36
48
|
end
|
37
49
|
|
38
50
|
private
|
@@ -62,28 +74,22 @@ class BatchLoader
|
|
62
74
|
|
63
75
|
items = executor_proxy.list_items
|
64
76
|
loader = ->(item, value) { executor_proxy.load(item: item, value: value) }
|
65
|
-
|
77
|
+
|
66
78
|
@batch_block.call(items, loader)
|
79
|
+
items.each do |item|
|
80
|
+
next if executor_proxy.value_loaded?(item: item)
|
81
|
+
loader.call(item, nil) # use "nil" for not loaded item after succesfull batching
|
82
|
+
end
|
67
83
|
executor_proxy.delete(items: items)
|
68
84
|
end
|
69
85
|
|
70
86
|
def singleton_class
|
71
|
-
class << self
|
72
|
-
self
|
73
|
-
end
|
87
|
+
class << self ; self ; end
|
74
88
|
end
|
75
89
|
|
76
90
|
def replace_with!(value)
|
77
|
-
|
78
|
-
|
79
|
-
singleton_class.class_eval do
|
80
|
-
(value.methods - ignore_method_names).each do |method_name|
|
81
|
-
define_method(method_name) do |*args, &block|
|
82
|
-
value.public_send(method_name, *args, &block)
|
83
|
-
end
|
84
|
-
end
|
85
|
-
end
|
86
|
-
end
|
91
|
+
@loaded_value = value
|
92
|
+
singleton_class.class_eval { def_delegators :@loaded_value, *(value.methods - LEFT_INSTANCE_METHODS) }
|
87
93
|
end
|
88
94
|
|
89
95
|
def purge_cache
|
@@ -98,19 +104,5 @@ class BatchLoader
|
|
98
104
|
end
|
99
105
|
end
|
100
106
|
|
101
|
-
|
102
|
-
private
|
103
|
-
|
104
|
-
def without_warnings(&block)
|
105
|
-
warning_level = $VERBOSE
|
106
|
-
$VERBOSE = nil
|
107
|
-
block.call
|
108
|
-
$VERBOSE = warning_level
|
109
|
-
end
|
110
|
-
end
|
111
|
-
|
112
|
-
without_warnings do
|
113
|
-
leave_method_names = %i[batch batch_loader? respond_to?].freeze
|
114
|
-
(instance_methods - leave_method_names).each { |method_name| undef_method(method_name) }
|
115
|
-
end
|
107
|
+
(instance_methods - IMPLEMENTED_INSTANCE_METHODS).each { |method_name| undef_method(method_name) }
|
116
108
|
end
|
data/lib/batch_loader/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: batch-loader
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- exAspArk
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-09-
|
11
|
+
date: 2017-09-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -80,6 +80,20 @@ dependencies:
|
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '3.4'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: benchmark-ips
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '2.7'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '2.7'
|
83
97
|
description: Powerful tool to avoid N+1 DB or HTTP queries
|
84
98
|
email:
|
85
99
|
- exaspark@gmail.com
|