shoptet 0.0.7 → 0.0.12
Sign up to get free protection for your applications and to get access to all the features.
- 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
|