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.
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