shopify_unlimited 0.0.17.threadsafe → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/README.md +8 -2
- data/lib/shopify_unlimited/active_resource/base_extensions.rb +24 -7
- data/lib/shopify_unlimited/throttle.rb +11 -11
- data/lib/shopify_unlimited/version.rb +1 -1
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6330aa14a7c439f7200721b4af410b9f7a099be8
|
4
|
+
data.tar.gz: 5d3379107c2df7a6d24af4c10e8d315a89f70222
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ba55b1d9a242f79fd7de2d364841c1a7fe660d338e973dfc0910e88248f25321cef6a9f03e4232d5e3f748ef4452883d081acada92cdf0a3a76c283a8350d23c
|
7
|
+
data.tar.gz: 2c421eeef8d843bfe5dc0d8d3d91c2c0f90cda817e27a9a9f96b036dfc21e742f26d349ada86a5f3a655a2d870ab333293735b6d24dd776ff47da7c83bf89540
|
data/.gitignore
CHANGED
data/README.md
CHANGED
@@ -1,8 +1,9 @@
|
|
1
1
|
# ShopifyUnlimited
|
2
2
|
|
3
3
|
1. Allows API calls like products = Product.find(:all, params:{limit: false}), which will make as many requests as needed to fetch all Products in batches of 250. The result set can be queried for the number of requests required: ```products.requests_made```
|
4
|
-
2.
|
5
|
-
|
4
|
+
2.Contains a throttle tuned for 4-8 workers consuming a single shop's api limit. It will keep all workers busy while limiting the number of refused requests.
|
5
|
+
3. Retries 404's once. This is because Shopify in the past has occasionally 404'd on count queries.
|
6
|
+
|
6
7
|
|
7
8
|
## Installation
|
8
9
|
|
@@ -18,6 +19,11 @@ Or install it yourself as:
|
|
18
19
|
|
19
20
|
$ gem install shopify_unlimited
|
20
21
|
|
22
|
+
|
23
|
+
## Usage
|
24
|
+
1. to fetch all records using behind the scenes batching, use find with limit: false
|
25
|
+
2. to see the throttle in action, set ENV['SHOPIFY_UNLIMITED_DEBUG'] and it will log info to STDOUT
|
26
|
+
|
21
27
|
## Contributing
|
22
28
|
|
23
29
|
1. Fork it
|
@@ -7,19 +7,36 @@ end
|
|
7
7
|
|
8
8
|
|
9
9
|
module ActiveResource
|
10
|
-
class Base
|
10
|
+
class Base
|
11
11
|
SHOPIFY_MAX_RECORDS_PER_REQUEST = 250
|
12
|
-
|
12
|
+
|
13
|
+
def self.find_all(params = {}, &block)
|
14
|
+
records = 0
|
15
|
+
params[:limit] ||= 50
|
16
|
+
params[:page] = 1
|
17
|
+
|
18
|
+
begin
|
19
|
+
page = find(:all, :params => params)
|
20
|
+
return records if page.nil?
|
21
|
+
page.each do |value|
|
22
|
+
records += 1
|
23
|
+
block.call(value)
|
24
|
+
end
|
25
|
+
params[:page] += 1
|
26
|
+
end until page.length < params[:limit]
|
27
|
+
records
|
28
|
+
end
|
29
|
+
|
13
30
|
class << self
|
14
31
|
# get reference to unbound class-method #find_every
|
15
32
|
find_every = self.instance_method(:find_every)
|
16
33
|
|
17
34
|
define_method(:find_every) do |options|
|
18
35
|
options[:params] ||= {}
|
19
|
-
|
36
|
+
|
20
37
|
# Determine number of ShopifyAPI requests to stitch together all records of this query.
|
21
38
|
limit = options[:params][:limit]
|
22
|
-
|
39
|
+
|
23
40
|
|
24
41
|
results = []
|
25
42
|
results.singleton_class.class_eval do
|
@@ -30,7 +47,7 @@ module ActiveResource
|
|
30
47
|
# Bail out to default functionality unless limit == false
|
31
48
|
# NOTE: the algorithm was switched from doing a count and pre-calculating pages
|
32
49
|
# because Shopify 404s on some count requests
|
33
|
-
if limit == false
|
50
|
+
if limit == false
|
34
51
|
options[:params].update(:limit => SHOPIFY_MAX_RECORDS_PER_REQUEST)
|
35
52
|
|
36
53
|
limit = SHOPIFY_MAX_RECORDS_PER_REQUEST
|
@@ -51,8 +68,8 @@ module ActiveResource
|
|
51
68
|
results.requests_made += 1
|
52
69
|
end
|
53
70
|
|
54
|
-
results
|
71
|
+
results
|
55
72
|
end
|
56
|
-
end
|
73
|
+
end
|
57
74
|
end
|
58
75
|
end
|
@@ -12,19 +12,21 @@ module ShopifyUnlimited
|
|
12
12
|
@throttle_increment = @throttle
|
13
13
|
@requests_threshold = 10
|
14
14
|
@debug = ! ENV['SHOPIFY_UNLIMITED_DEBUG'].blank?
|
15
|
+
@not_found_retries = Integer(ENV['SHOPIFY_UNLIMITED_NOTFOUND_RETRIES']) rescue 1
|
15
16
|
end
|
16
|
-
|
17
|
+
|
17
18
|
def dbg(msg)
|
18
19
|
puts msg if @debug
|
19
20
|
end
|
20
|
-
|
21
|
+
|
21
22
|
def run
|
22
23
|
if @running
|
23
24
|
return yield
|
24
25
|
end
|
25
26
|
@running = true
|
26
27
|
value = nil
|
27
|
-
|
28
|
+
tries ||= 0
|
29
|
+
not_found_tries ||= 0
|
28
30
|
orig_logger = ActiveResource::Base.logger
|
29
31
|
begin
|
30
32
|
dbg "--- throttle.run ---"
|
@@ -45,9 +47,9 @@ module ShopifyUnlimited
|
|
45
47
|
case e.response.code
|
46
48
|
when '404'
|
47
49
|
dbg " 404"
|
48
|
-
sleep 5 +
|
49
|
-
|
50
|
-
if
|
50
|
+
sleep 5 + not_found_tries + (rand * rand * 5)
|
51
|
+
not_found_tries += 1
|
52
|
+
if not_found_tries <= @not_found_retries
|
51
53
|
ActiveResource::Base.logger ||= Logger.new(STDOUT)
|
52
54
|
ActiveResource::Base.logger.info "Shopify returned not found: #{e.message}. Retrying"
|
53
55
|
retry
|
@@ -59,9 +61,9 @@ module ShopifyUnlimited
|
|
59
61
|
dbg " 429"
|
60
62
|
ActiveResource::Base.logger.info "Shopify hit api limit" if ActiveResource::Base.logger
|
61
63
|
@throttle += rand/5
|
62
|
-
|
63
|
-
sleep (@throttle * 4 *
|
64
|
-
if
|
64
|
+
tries += 1
|
65
|
+
sleep (@throttle * 4 * tries) + rand/10
|
66
|
+
if tries < 10
|
65
67
|
retry
|
66
68
|
else
|
67
69
|
raise
|
@@ -79,8 +81,6 @@ module ShopifyUnlimited
|
|
79
81
|
sleep fuzzy_sleep_time
|
80
82
|
else
|
81
83
|
@throttle = (0.94 + rand/20) * @throttle
|
82
|
-
dbg " sleep #{rand/20}"
|
83
|
-
sleep rand/20
|
84
84
|
end
|
85
85
|
dbg "=== throttle.done ==="
|
86
86
|
value
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: shopify_unlimited
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michael Johnston
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-02-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activeresource
|
@@ -129,12 +129,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
129
129
|
version: '0'
|
130
130
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
131
131
|
requirements:
|
132
|
-
- - "
|
132
|
+
- - ">="
|
133
133
|
- !ruby/object:Gem::Version
|
134
|
-
version:
|
134
|
+
version: '0'
|
135
135
|
requirements: []
|
136
136
|
rubyforge_project:
|
137
|
-
rubygems_version: 2.
|
137
|
+
rubygems_version: 2.6.10
|
138
138
|
signing_key:
|
139
139
|
specification_version: 4
|
140
140
|
summary: 'allow use of limit: false in api requests'
|