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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9c1006b1dafb626b3f813414b950eee5ed8ad9d1
4
- data.tar.gz: 4933dd5d233cb7758ee3f7a95074db31b68e0b22
3
+ metadata.gz: bb37551b8e0c52cb65a331801fa0110e311aebf9
4
+ data.tar.gz: 9f5a59bd9626c0341103c2d5c422119ff71aedba
5
5
  SHA512:
6
- metadata.gz: 53a253059db7baf8900aad0d7cb57aca0a91d551013ea67fb869a0c2a9415e89488641b6990c1b9dfe3cf84cadd5d0d1f83f6039cfbf7097e231d3d7ca2f3475
7
- data.tar.gz: 73214bc99ebb831e2a2f3ecb3edb970762408c289ddb7d42fab6d57119aea89f7c984436fc1dccc4860596a466e207f8701bf572553fc0c72e6ee1e16cbbb0a0
6
+ metadata.gz: 92e829a4416c25050380ef59dbe43873f89911140ade537b9420bc05fb6bb45364591781010b0b0ecab5f71e1a5ec1bb56fa15f4cdb6ef4859547687e3bb30d0
7
+ data.tar.gz: 6101f58d4292906aa512ae16e88f3c563c351984c2edea960fc1d4ff7ddd87a95dbb69e0fdd201376e93d0f189638f27ad0a76ff191c30dc79ba6d5fbf61b5c2
@@ -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.1...HEAD)
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
@@ -1,7 +1,5 @@
1
1
  source "https://rubygems.org"
2
2
 
3
- git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
4
-
5
3
  gem 'coveralls', require: false
6
4
 
7
5
  # Specify your gem's dependencies in batch-loader.gemspec
@@ -28,4 +28,5 @@ Gem::Specification.new do |spec|
28
28
  spec.add_development_dependency "rspec", "~> 3.0"
29
29
  spec.add_development_dependency "graphql", "~> 1.6"
30
30
  spec.add_development_dependency "pry-byebug", "~> 3.4"
31
+ spec.add_development_dependency "benchmark-ips", "~> 2.7"
31
32
  end
@@ -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 == :batch_loader? || method_missing(:respond_to?, 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
- items.each { |item| loader.call(item, nil) }
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
- BatchLoader.send(:without_warnings) do
78
- ignore_method_names = %i[singleton_method_added].freeze
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
- class << self
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class BatchLoader
4
- VERSION = "1.0.1"
4
+ VERSION = "1.0.2"
5
5
  end
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.1
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-03 00:00:00.000000000 Z
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