batch-loader 1.0.1 → 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
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