shoptet 0.0.7 → 0.0.12

Sign up to get free protection for your applications and to get access to all the features.
Files changed (4) hide show
  1. checksums.yaml +4 -4
  2. data/lib/shoptet.rb +77 -32
  3. data/lib/shoptet/request.rb +20 -5
  4. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8facc56cfe2afc649cbad1f5094830d94d83f1f8d3d564e8886f17efe1b5bc87
4
- data.tar.gz: 82c8517d218cc6182c54620e1161428d992a43e70364c23438fb0970bf303a6f
3
+ metadata.gz: 44764e9a3baef43fabb596f7702f030f9ee3b2d2ef3cd4cd7ec5e9de26622a69
4
+ data.tar.gz: cbf1cf85542a688455bb984d30db96986b9bc941ebffdb587e7b6bfbb423493e
5
5
  SHA512:
6
- metadata.gz: 3ff366765e02c7fe423368d0afa62bda693811c96f4f681b490161274228d39e0713cca821d4d49768c17e5f7de51e80a291bad2473e5087ff3bf4f22ccf872b
7
- data.tar.gz: c74cda5f867dd363950b031cd4995fdf9585b843e8f66b11bdd7ec4f5e8e3f728e8340d7cebf796756133b05b3b3678716994692a46b169454e680b8a357f516
6
+ metadata.gz: d07510d07f5a1fd3bd6f91fac8f3cd1f932013c43c836ab9c5c34525ca926d6b251e88f41831abaaa0e46d726a206fbfd9c4ca473e8cdca1218050c1d2b7ecd0
7
+ data.tar.gz: fffebdf455902541dbf7aa8acd9c26ab66e454e391f622390b92364bcc787ef0ba25f362e137cc199b787a8b145da834b920e92a961f02c4ed0daec03eb7a470
@@ -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.7'
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
- result = request 'https://api.myshoptet.com/api/eshop'
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
- result = request 'https://api.myshoptet.com/api/eshop/design'
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'] || []
@@ -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 = 10
16
- http.read_timeout = 10
17
- http.write_timeout = 10
18
- http.ssl_timeout = 10
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
- JSON.parse response.body
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.7
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 00:00:00.000000000 Z
11
+ date: 2020-11-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: irb