lucid-shopify 0.61.0 → 0.64.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/README.md +1 -1
- data/lib/lucid/shopify.rb +1 -1
- data/lib/lucid/shopify/bulk_request.rb +54 -12
- data/lib/lucid/shopify/parse_link_header.rb +1 -1
- data/lib/lucid/shopify/response.rb +20 -5
- data/lib/lucid/shopify/version.rb +1 -1
- metadata +6 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1b0b5d01a7f0169127f5cb34c55771e87790f9e15059e384874321566cb257c4
|
4
|
+
data.tar.gz: fac44b65de85d005f9affe1532892a2b3baaa85b066ca407ffcadfe880c3d785
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1087a99b8ad46cb6fe571a4812dfc47eb3c67cfba2dd85d4d0c9bc069913f0ff9c8e869ed8b2e9a0a172307751a156eef080e0d560d573076946a32345f90fc8
|
7
|
+
data.tar.gz: 929282d2d2b752515a143cd06fcb26b66b1209594be0785c1cd9cc2418476f55c7ee63f7f95d975ca8530f276e2592269ee822f5dba5c99f56ed032fcffafdcb
|
data/README.md
CHANGED
@@ -35,7 +35,7 @@ Setup
|
|
35
35
|
|
36
36
|
Lucid::Shopify.configure do |config|
|
37
37
|
config.api_key = '...'
|
38
|
-
config.api_version = '...' # e.g. '2020-
|
38
|
+
config.api_version = '...' # e.g. '2020-04'
|
39
39
|
config.billing_callback_uri = '...'
|
40
40
|
config.callback_uri = '...' # (for OAuth; unused by this gem)
|
41
41
|
config.logger = Logger.new(STDOUT)
|
data/lib/lucid/shopify.rb
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
require 'json'
|
4
4
|
require 'lucid/shopify'
|
5
|
+
require 'timeout'
|
5
6
|
|
6
7
|
module Lucid
|
7
8
|
module Shopify
|
@@ -13,6 +14,8 @@ module Lucid
|
|
13
14
|
FailedOperationError = Class.new(OperationError)
|
14
15
|
ObsoleteOperationError = Class.new(OperationError)
|
15
16
|
|
17
|
+
TimeoutError = Class.new(Error)
|
18
|
+
|
16
19
|
class Operation
|
17
20
|
include Dry::Initializer.define -> do
|
18
21
|
# @return [Client]
|
@@ -31,6 +34,11 @@ module Lucid
|
|
31
34
|
# @param http [HTTP::Client]
|
32
35
|
#
|
33
36
|
# @yield [Enumerator<Hash>] yields each parsed line of JSONL
|
37
|
+
#
|
38
|
+
# @raise CanceledOperationError
|
39
|
+
# @raise ExpiredOperationError
|
40
|
+
# @raise FailedOperationError
|
41
|
+
# @raise ObsoleteOperationError
|
34
42
|
def call(delay: 1, http: Container[:http], &block)
|
35
43
|
url = loop do
|
36
44
|
status, url = poll
|
@@ -70,23 +78,52 @@ module Lucid
|
|
70
78
|
end
|
71
79
|
|
72
80
|
# Cancel the bulk operation.
|
81
|
+
#
|
82
|
+
# @raise ObsoleteOperationError
|
83
|
+
# @raise TimeoutError
|
73
84
|
def cancel
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
85
|
+
begin
|
86
|
+
client.post_graphql(credentials, <<~QUERY)
|
87
|
+
mutation {
|
88
|
+
bulkOperationCancel(id: "#{id}") {
|
89
|
+
userErrors {
|
90
|
+
field
|
91
|
+
message
|
92
|
+
}
|
80
93
|
}
|
81
94
|
}
|
82
|
-
|
83
|
-
|
95
|
+
QUERY
|
96
|
+
rescue Response::GraphQLClientError => e
|
97
|
+
return if e.response.error_message?([
|
98
|
+
/cannot be canceled when it is completed/,
|
99
|
+
])
|
100
|
+
|
101
|
+
raise e
|
102
|
+
end
|
84
103
|
|
85
|
-
|
86
|
-
|
104
|
+
poll_until(['CANCELED', 'COMPLETED'])
|
105
|
+
end
|
87
106
|
|
88
|
-
|
107
|
+
# Poll until operation status is met.
|
108
|
+
#
|
109
|
+
# @param statuses [Array<String>] to terminate polling on
|
110
|
+
# @param timeout [Integer] in seconds
|
111
|
+
#
|
112
|
+
# @raise ObsoleteOperationError
|
113
|
+
# @raise TimeoutError
|
114
|
+
def poll_until(statuses, timeout: 60)
|
115
|
+
Timeout.timeout(timeout) do
|
116
|
+
loop do
|
117
|
+
status, _ = poll
|
118
|
+
|
119
|
+
break if statuses.any? { |expected_status| status == expected_status }
|
120
|
+
end
|
89
121
|
end
|
122
|
+
rescue Timeout::Error
|
123
|
+
raise TimeoutError, 'exceeded %s seconds polling for status %s' % [
|
124
|
+
timeout,
|
125
|
+
statuses.join(', '),
|
126
|
+
]
|
90
127
|
end
|
91
128
|
|
92
129
|
# @return [Array(String, String | nil)] the operation status and the
|
@@ -155,7 +192,12 @@ module Lucid
|
|
155
192
|
}
|
156
193
|
QUERY
|
157
194
|
|
158
|
-
|
195
|
+
case op&.fetch('status')
|
196
|
+
when 'CANCELING'
|
197
|
+
Operation.new(client, credentials, op['id']).poll_until(['CANCELED'])
|
198
|
+
when 'CREATED', 'RUNNING'
|
199
|
+
Operation.new(client, credentials, op['id']).cancel
|
200
|
+
end
|
159
201
|
|
160
202
|
id = client.post_graphql(credentials, <<~QUERY)['data']['bulkOperationRunQuery']['bulkOperation']['id']
|
161
203
|
mutation {
|
@@ -15,7 +15,7 @@ module Lucid
|
|
15
15
|
case link_header
|
16
16
|
# NOTE: There is a strange behaviour where it seems that if the header
|
17
17
|
# value exceeds a certain length, it is split into chunks. It seems that
|
18
|
-
# if you use {HTTP::Headers#get}, you will always get {Array<String},
|
18
|
+
# if you use {HTTP::Headers#get}, you will always get {Array<String>},
|
19
19
|
# and it is the special behaviour of {HTTP::Headers#[]} causing this.
|
20
20
|
#
|
21
21
|
# However, why is it split in the first place? Does Shopify send
|
@@ -29,8 +29,8 @@ module Lucid
|
|
29
29
|
ClientError = Class.new(Error)
|
30
30
|
ServerError = Class.new(Error)
|
31
31
|
ShopError = Class.new(Error)
|
32
|
-
|
33
|
-
|
32
|
+
AccessTokenError = Class.new(ClientError)
|
33
|
+
GraphQLClientError = Class.new(ClientError) do
|
34
34
|
def message
|
35
35
|
case
|
36
36
|
when response.errors?
|
@@ -111,11 +111,24 @@ module Lucid
|
|
111
111
|
# @raise [ClientError] for status 4xx
|
112
112
|
# @raise [ServerError] for status 5xx
|
113
113
|
#
|
114
|
-
# @note https://
|
114
|
+
# @note https://shopify.dev/concepts/about-apis/response-codes
|
115
115
|
def assert!
|
116
116
|
case status_code
|
117
|
+
when 401
|
118
|
+
if error_message?([/access token/i])
|
119
|
+
raise AccessTokenError.new(request, self), 'Invalid access token'
|
120
|
+
else
|
121
|
+
raise ClientError.new(request, self)
|
122
|
+
end
|
117
123
|
when 402
|
118
124
|
raise ShopError.new(request, self), 'Shop is frozen, awaiting payment'
|
125
|
+
when 403
|
126
|
+
# NOTE: Not sure what this one means (undocumented).
|
127
|
+
if error_message?([/unavailable shop/i])
|
128
|
+
raise ShopError.new(request, self), 'Shop is unavailable'
|
129
|
+
else
|
130
|
+
raise ClientError.new(request, self)
|
131
|
+
end
|
119
132
|
when 423
|
120
133
|
raise ShopError.new(request, self), 'Shop is locked'
|
121
134
|
when 400..499
|
@@ -222,12 +235,14 @@ module Lucid
|
|
222
235
|
#
|
223
236
|
# @return [Boolean]
|
224
237
|
def error_message?(messages)
|
238
|
+
all_messages = error_messages + user_error_messages
|
239
|
+
|
225
240
|
messages.any? do |message|
|
226
241
|
case message
|
227
242
|
when Regexp
|
228
|
-
|
243
|
+
all_messages.any? { |other_message| other_message.match?(message) }
|
229
244
|
when String
|
230
|
-
|
245
|
+
all_messages.include?(message)
|
231
246
|
end
|
232
247
|
end
|
233
248
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lucid-shopify
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.64.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kelsey Judson
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-08-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: dotenv
|
@@ -136,7 +136,7 @@ dependencies:
|
|
136
136
|
- - "~>"
|
137
137
|
- !ruby/object:Gem::Version
|
138
138
|
version: '4.1'
|
139
|
-
description:
|
139
|
+
description:
|
140
140
|
email: kelsey@lucid.nz
|
141
141
|
executables: []
|
142
142
|
extensions: []
|
@@ -179,7 +179,7 @@ homepage: https://github.com/lucidnz/gem-lucid-shopify
|
|
179
179
|
licenses:
|
180
180
|
- ISC
|
181
181
|
metadata: {}
|
182
|
-
post_install_message:
|
182
|
+
post_install_message:
|
183
183
|
rdoc_options: []
|
184
184
|
require_paths:
|
185
185
|
- lib
|
@@ -195,7 +195,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
195
195
|
version: '0'
|
196
196
|
requirements: []
|
197
197
|
rubygems_version: 3.1.2
|
198
|
-
signing_key:
|
198
|
+
signing_key:
|
199
199
|
specification_version: 4
|
200
200
|
summary: Shopify client library
|
201
201
|
test_files: []
|