shopify_unlimited 0.0.17.threadsafe → 0.1.0
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/.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'
|