lucid-shopify 0.60.0 → 0.63.1
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 +56 -13
- data/lib/lucid/shopify/response.rb +13 -4
- 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: ffe59e48e1d046fa4eb07460911384691bda6c07981b056cb3c89dd48d95514f
|
4
|
+
data.tar.gz: 778d7a488544cb0452290010eff0ff59db765afd55abd8bbdefd674b38984a79
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9ed2477757ec40d6464699bc8a930604f21b5aee5ccabaef0eebd1113fa4a73a1edbb76db8bfc50cb35a53f11440fda704535e0e982daa490f9e6e03deab66d8
|
7
|
+
data.tar.gz: 03d6ea262fc118da219fb18f11478da1d4a384c0d50b7a67e6b4941abd6112d82c854a4dd57f5de7b5510d28b781d0e647f28cd8ed1f14dffa6cca71753dc126
|
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
|
@@ -111,7 +148,8 @@ module Lucid
|
|
111
148
|
end
|
112
149
|
end
|
113
150
|
|
114
|
-
# Create and start a new bulk operation via the GraphQL API.
|
151
|
+
# Create and start a new bulk operation via the GraphQL API. Any currently
|
152
|
+
# running bulk operations are cancelled.
|
115
153
|
#
|
116
154
|
# @param client [Client]
|
117
155
|
# @param credentials [Credentials]
|
@@ -154,7 +192,12 @@ module Lucid
|
|
154
192
|
}
|
155
193
|
QUERY
|
156
194
|
|
157
|
-
|
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
|
158
201
|
|
159
202
|
id = client.post_graphql(credentials, <<~QUERY)['data']['bulkOperationRunQuery']['bulkOperation']['id']
|
160
203
|
mutation {
|
@@ -111,11 +111,18 @@ 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
117
|
when 402
|
118
118
|
raise ShopError.new(request, self), 'Shop is frozen, awaiting payment'
|
119
|
+
when 403
|
120
|
+
# NOTE: Not sure what this one means (undocumented).
|
121
|
+
if error_message?([/unavailable shop/i])
|
122
|
+
raise ShopError.new(request, self), 'Shop is unavailable'
|
123
|
+
else
|
124
|
+
raise ClientError.new(request, self)
|
125
|
+
end
|
119
126
|
when 423
|
120
127
|
raise ShopError.new(request, self), 'Shop is locked'
|
121
128
|
when 400..499
|
@@ -207,7 +214,7 @@ module Lucid
|
|
207
214
|
# @return [Array<String>]
|
208
215
|
def error_messages
|
209
216
|
errors.map do |field, message|
|
210
|
-
"#{
|
217
|
+
"#{message} [#{field}]"
|
211
218
|
end
|
212
219
|
end
|
213
220
|
|
@@ -222,12 +229,14 @@ module Lucid
|
|
222
229
|
#
|
223
230
|
# @return [Boolean]
|
224
231
|
def error_message?(messages)
|
232
|
+
all_messages = error_messages + user_error_messages
|
233
|
+
|
225
234
|
messages.any? do |message|
|
226
235
|
case message
|
227
236
|
when Regexp
|
228
|
-
|
237
|
+
all_messages.any? { |other_message| other_message.match?(message) }
|
229
238
|
when String
|
230
|
-
|
239
|
+
all_messages.include?(message)
|
231
240
|
end
|
232
241
|
end
|
233
242
|
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.63.1
|
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-06-06 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: []
|