shoptet 0.0.7 → 0.0.12
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/lib/shoptet.rb +77 -32
- data/lib/shoptet/request.rb +20 -5
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 44764e9a3baef43fabb596f7702f030f9ee3b2d2ef3cd4cd7ec5e9de26622a69
|
4
|
+
data.tar.gz: cbf1cf85542a688455bb984d30db96986b9bc941ebffdb587e7b6bfbb423493e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d07510d07f5a1fd3bd6f91fac8f3cd1f932013c43c836ab9c5c34525ca926d6b251e88f41831abaaa0e46d726a206fbfd9c4ca473e8cdca1218050c1d2b7ecd0
|
7
|
+
data.tar.gz: fffebdf455902541dbf7aa8acd9c26ab66e454e391f622390b92364bcc787ef0ba25f362e137cc199b787a8b145da834b920e92a961f02c4ed0daec03eb7a470
|
data/lib/shoptet.rb
CHANGED
@@ -1,17 +1,73 @@
|
|
1
|
+
require 'delegate'
|
1
2
|
require_relative 'shoptet/request'
|
2
3
|
|
3
4
|
class Shoptet
|
5
|
+
include Shoptet::UrlHelpers
|
6
|
+
|
4
7
|
class Error < StandardError; end
|
5
8
|
class AddonSuspended < StandardError; end
|
6
9
|
class AddonNotInstalled < StandardError; end
|
7
10
|
class InvalidTokenNoRights < StandardError; end
|
11
|
+
class EmptyRequestResponse < StandardError; end
|
8
12
|
|
9
13
|
DEFAULT_ON_TOKEN_ERROR = -> (api) do
|
10
14
|
api.api_token = api.new_api_token
|
11
15
|
end
|
12
16
|
|
17
|
+
class ApiEnumerator < SimpleDelegator
|
18
|
+
def initialize base_url, filters, data_key, api
|
19
|
+
@base_url = base_url
|
20
|
+
@filters = filters
|
21
|
+
@data_key = data_key || URI(base_url).path.split('/').last
|
22
|
+
@api = api
|
23
|
+
|
24
|
+
@enum = Enumerator.new do |y|
|
25
|
+
first_page.dig('data', @data_key).each { y.yield _1 }
|
26
|
+
|
27
|
+
if total_pages > 1
|
28
|
+
other_pages = 2..(total_pages - 1)
|
29
|
+
other_pages.each do |page|
|
30
|
+
uri = @api.assemble_uri base_url, filters.merge(page: page)
|
31
|
+
result = @api.request uri
|
32
|
+
result.dig('data', @data_key).each { y.yield _1 }
|
33
|
+
end
|
34
|
+
|
35
|
+
last_page.dig('data', @data_key).each { y.yield _1 }
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
super @enum
|
40
|
+
end
|
41
|
+
|
42
|
+
def first_page
|
43
|
+
@first_page ||=
|
44
|
+
begin
|
45
|
+
uri = @api.assemble_uri @base_url, @filters
|
46
|
+
@api.request uri
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def total_pages
|
51
|
+
first_page.dig('data', 'paginator', 'pageCount') || 0
|
52
|
+
end
|
53
|
+
|
54
|
+
def last_page
|
55
|
+
return first_page if total_pages < 2
|
56
|
+
|
57
|
+
@last_page ||=
|
58
|
+
begin
|
59
|
+
uri = @api.assemble_uri @base_url, @filters.merge(page: total_pages)
|
60
|
+
@api.request uri
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def size
|
65
|
+
first_page['data']['paginator']['totalCount']
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
13
69
|
def self.version
|
14
|
-
'0.0.
|
70
|
+
'0.0.12'
|
15
71
|
end
|
16
72
|
|
17
73
|
def self.ar_on_token_error(model)
|
@@ -72,6 +128,16 @@ class Shoptet
|
|
72
128
|
@on_token_error = on_token_error || DEFAULT_ON_TOKEN_ERROR
|
73
129
|
end
|
74
130
|
|
131
|
+
def endpoints api_params = {}
|
132
|
+
enumerize 'https://api.myshoptet.com/api/system/endpoints', api_params
|
133
|
+
end
|
134
|
+
|
135
|
+
def endpoint_approved? endpoint
|
136
|
+
@approved_endpoints ||= endpoints
|
137
|
+
|
138
|
+
@approved_endpoints.any? { _1['endpoint'] == endpoint }
|
139
|
+
end
|
140
|
+
|
75
141
|
def authorize_url redirect_url, state
|
76
142
|
query = {
|
77
143
|
client_id: @client_id,
|
@@ -85,12 +151,14 @@ class Shoptet
|
|
85
151
|
end
|
86
152
|
|
87
153
|
def shop_info api_params = {}
|
88
|
-
|
154
|
+
url = assemble_uri 'https://api.myshoptet.com/api/eshop', api_params
|
155
|
+
result = request url
|
89
156
|
result['data']
|
90
157
|
end
|
91
158
|
|
92
159
|
def design_info api_params = {}
|
93
|
-
|
160
|
+
url = assemble_uri 'https://api.myshoptet.com/api/eshop/design', api_params
|
161
|
+
result = request url
|
94
162
|
|
95
163
|
result['data']
|
96
164
|
end
|
@@ -161,35 +229,6 @@ class Shoptet
|
|
161
229
|
result.fetch 'access_token'
|
162
230
|
end
|
163
231
|
|
164
|
-
private
|
165
|
-
|
166
|
-
def assemble_uri base, params = {}
|
167
|
-
u = URI(base)
|
168
|
-
u.query = URI.encode_www_form(params) if params.any?
|
169
|
-
|
170
|
-
u.to_s
|
171
|
-
end
|
172
|
-
|
173
|
-
def enumerize base_uri, filters = {}, data_key = nil
|
174
|
-
data_key ||= URI(base_uri).path.split('/').last
|
175
|
-
uri = assemble_uri base_uri, filters
|
176
|
-
size_proc = -> () { request(uri)['data']['paginator']['totalCount'] }
|
177
|
-
|
178
|
-
Enumerator.new(size_proc) do |y|
|
179
|
-
first_page = request uri
|
180
|
-
total_pages = first_page.dig('data', 'paginator', 'pageCount') || 0
|
181
|
-
other_pages = 2..total_pages
|
182
|
-
|
183
|
-
first_page.dig('data', data_key).each { y.yield _1 }
|
184
|
-
|
185
|
-
other_pages.each do |page|
|
186
|
-
uri = assemble_uri base_uri, filters.merge(page: page)
|
187
|
-
result = request uri
|
188
|
-
result.dig('data', data_key).each { y.yield _1 }
|
189
|
-
end
|
190
|
-
end
|
191
|
-
end
|
192
|
-
|
193
232
|
def request uri, retry_on_token_error = true
|
194
233
|
headers = { 'Shoptet-Access-Token' => @api_token,
|
195
234
|
'Content-Type' => 'application/vnd.shoptet.v1.0' }
|
@@ -209,6 +248,12 @@ class Shoptet
|
|
209
248
|
end
|
210
249
|
end
|
211
250
|
|
251
|
+
private
|
252
|
+
|
253
|
+
def enumerize base_url, filters = {}, data_key = nil
|
254
|
+
ApiEnumerator.new base_url, filters, data_key, self
|
255
|
+
end
|
256
|
+
|
212
257
|
def handle_errors result, uri, headers
|
213
258
|
error = result['error']
|
214
259
|
errors = result['errors'] || []
|
data/lib/shoptet/request.rb
CHANGED
@@ -3,6 +3,15 @@ require 'net/http'
|
|
3
3
|
#TODO: keep_alive_timeout ?
|
4
4
|
|
5
5
|
class Shoptet
|
6
|
+
module UrlHelpers
|
7
|
+
def assemble_uri base, params = {}
|
8
|
+
u = URI(base)
|
9
|
+
u.query = URI.encode_www_form(params) if params.any?
|
10
|
+
|
11
|
+
u.to_s
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
6
15
|
class Request
|
7
16
|
def self.get uri, headers
|
8
17
|
attempt ||= 0
|
@@ -12,10 +21,10 @@ class Shoptet
|
|
12
21
|
|
13
22
|
http = Net::HTTP.new parsed_uri.host, parsed_uri.port
|
14
23
|
http.use_ssl = true
|
15
|
-
http.open_timeout =
|
16
|
-
http.read_timeout =
|
17
|
-
http.write_timeout =
|
18
|
-
http.ssl_timeout =
|
24
|
+
http.open_timeout = 60
|
25
|
+
http.read_timeout = 60
|
26
|
+
http.write_timeout = 60
|
27
|
+
http.ssl_timeout = 60
|
19
28
|
|
20
29
|
request = Net::HTTP::Get.new parsed_uri
|
21
30
|
headers.each do |key, value|
|
@@ -23,8 +32,14 @@ class Shoptet
|
|
23
32
|
end
|
24
33
|
|
25
34
|
response = http.request request
|
35
|
+
parsed_body = JSON.parse response.body
|
36
|
+
|
37
|
+
unless parsed_body
|
38
|
+
message = "Status code: #{response.code}, url: #{uri}"
|
39
|
+
fail Shoptet::EmptyRequestResponse.new(message)
|
40
|
+
end
|
26
41
|
|
27
|
-
|
42
|
+
parsed_body
|
28
43
|
rescue Net::OpenTimeout
|
29
44
|
retry if attempt < 4
|
30
45
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: shoptet
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.12
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Premysl Donat
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-11-
|
11
|
+
date: 2020-11-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: irb
|