shoptet 0.0.17 → 0.0.22

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c6e34af9913575eccf62bb7733798b354a81e3fc00046ba5585461c8bb65a52f
4
- data.tar.gz: c531d53f42166c618b7d66bb7418d1c9d4d715037f482523718d5c717d25afb9
3
+ metadata.gz: 2009bb64f74a45fdc160d4cbe7040366ec918ad6ad392288cad5f00f3e4e2406
4
+ data.tar.gz: 72dfe3b46b578a2131e7c8b96ca1d951dddfa15eea60a8ce77d4666ae9186d91
5
5
  SHA512:
6
- metadata.gz: aff6a24d95315896100ee17100d53dad6293e51c860361dc78b2094466e3f0d260b0407f6701af426458a247c75aefa770233d8df24df2c3c1cde41cbed6bc40
7
- data.tar.gz: 1f57093bca36597126821cdc033980ca35cad71d440d2deae93eee4092a35e410b27ad76077f2b194b111c319cdc8918119026f7c4d32a91f33b43a79612e326
6
+ metadata.gz: 3aee7e5ad2e7c1006202513f8ca57faaeb07b96508097b6457b98b174e497530545553923106f61ec184a194d2af3caf3e14abffe81f4c1912c212c8846f7723
7
+ data.tar.gz: 89ae29433db50dede06c6eef59a311cef45aa9b0d59ae740ca5130cd47d207bf06cd172498862e7c2b6c4b6df96d25eb01f9b8485892d36750048e0f62bc3208
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- shoptet (0.0.1)
4
+ shoptet (0.0.19)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
@@ -1,79 +1,25 @@
1
1
  require 'delegate'
2
2
  require_relative 'shoptet/request'
3
+ require_relative 'shoptet/api_enumerator'
3
4
 
4
5
  class Shoptet
5
- include Shoptet::UrlHelpers
6
-
7
6
  class Error < StandardError; end
8
7
  class AddonSuspended < StandardError; end
9
8
  class AddonNotInstalled < StandardError; end
10
9
  class InvalidTokenNoRights < StandardError; end
11
- class EmptyRequestResponse < StandardError; end
10
+ class EmptyResponse < StandardError; end
12
11
  class MaxPageReached < StandardError; end
13
- class UnsuccessfulApiResponse < StandardError; end
14
12
 
15
13
  EXPIRED_TOKEN_CODE = 'expired-token'
16
14
  INVALID_TOKEN_CODE = 'invalid-token'
17
15
  ADDON_NOT_INSTALLED = 'Addon installation is not approved.'
18
16
 
19
- DEFAULT_ON_TOKEN_ERROR = -> (api) do
17
+ ON_TOKEN_ERROR = -> (api) do
20
18
  api.api_token = api.new_api_token
21
19
  end
22
20
 
23
- class ApiEnumerator < SimpleDelegator
24
- def initialize base_url, filters, data_key, api
25
- @base_url = base_url
26
- @filters = filters
27
- @data_key = data_key || URI(base_url).path.split('/').last
28
- @api = api
29
-
30
- @enum = Enumerator.new do |y|
31
- first_page.dig('data', @data_key).each { y.yield _1 }
32
-
33
- if total_pages > 1
34
- other_pages = 2..(total_pages - 1)
35
- other_pages.each do |page|
36
- uri = @api.assemble_uri base_url, filters.merge(page: page)
37
- result = @api.request uri
38
- result.dig('data', @data_key).each { y.yield _1 }
39
- end
40
-
41
- last_page.dig('data', @data_key).each { y.yield _1 }
42
- end
43
- end
44
-
45
- super @enum
46
- end
47
-
48
- def first_page
49
- @first_page ||=
50
- begin
51
- uri = @api.assemble_uri @base_url, @filters
52
- @api.request uri
53
- end
54
- end
55
-
56
- def total_pages
57
- first_page.dig('data', 'paginator', 'pageCount') || 0
58
- end
59
-
60
- def last_page
61
- return first_page if total_pages < 2
62
-
63
- @last_page ||=
64
- begin
65
- uri = @api.assemble_uri @base_url, @filters.merge(page: total_pages)
66
- @api.request uri
67
- end
68
- end
69
-
70
- def size
71
- first_page['data']['paginator']['totalCount']
72
- end
73
- end
74
-
75
21
  def self.version
76
- '0.0.17'
22
+ '0.0.22'
77
23
  end
78
24
 
79
25
  def self.ar_on_token_error(model)
@@ -103,7 +49,7 @@ class Shoptet
103
49
  'scope' => 'api'
104
50
  }
105
51
 
106
- Shoptet::Request.post url, data
52
+ Shoptet::Request.post(url, data)
107
53
  end
108
54
 
109
55
  def self.login_token url, code, client_id, client_secret, redirect_url
@@ -116,11 +62,11 @@ class Shoptet
116
62
  scope: 'basic_eshop'
117
63
  }
118
64
 
119
- Shoptet::Request.post url, data
65
+ Shoptet::Request.post(url, data)
120
66
  end
121
67
 
122
68
  def self.basic_eshop url, access_token
123
- Shoptet::Request.get url, { 'Authorization' => "Bearer #{access_token}" }
69
+ Shoptet::Request.get(url, { 'Authorization' => "Bearer #{access_token}" })
124
70
  end
125
71
 
126
72
  attr_accessor :api_token
@@ -131,11 +77,11 @@ class Shoptet
131
77
  @shop_url = shop_url
132
78
  @client_id = client_id
133
79
  @api_token = api_token
134
- @on_token_error = on_token_error || DEFAULT_ON_TOKEN_ERROR
80
+ @on_token_error = on_token_error || ON_TOKEN_ERROR
135
81
  end
136
82
 
137
83
  def endpoints api_params = {}
138
- enumerize 'https://api.myshoptet.com/api/system/endpoints', api_params
84
+ enumerize('https://api.myshoptet.com/api/system/endpoints', api_params)
139
85
  end
140
86
 
141
87
  def endpoint_approved? endpoint
@@ -144,6 +90,10 @@ class Shoptet
144
90
  @approved_endpoints.any? { _1['endpoint'] == endpoint }
145
91
  end
146
92
 
93
+ def endpoints_approved? *endpoints_to_check
94
+ endpoints_to_check.all? { endpoint_approved? _1 }
95
+ end
96
+
147
97
  def authorize_url redirect_url, state
148
98
  query = {
149
99
  client_id: @client_id,
@@ -153,101 +103,95 @@ class Shoptet
153
103
  redirect_uri: redirect_url
154
104
  }.to_query
155
105
 
156
- URI("#{@shop_url}action/OAuthServer/authorize?#{query}").to_s
106
+ URI("#{@shop_url}action/OAuthServer/authorize?#{query}")
157
107
  end
158
108
 
159
109
  def shop_info api_params = {}
160
- url = assemble_uri 'https://api.myshoptet.com/api/eshop', api_params
161
- result = request url
110
+ result = request('https://api.myshoptet.com/api/eshop', api_params)
162
111
  result['data']
163
112
  end
164
113
 
165
114
  def design_info api_params = {}
166
- url = assemble_uri 'https://api.myshoptet.com/api/eshop/design', api_params
167
- result = request url
115
+ result = request('https://api.myshoptet.com/api/eshop/design', api_params)
168
116
 
169
117
  result['data']
170
118
  end
171
119
 
172
120
  def stocks api_params = {}
173
- enumerize 'https://api.myshoptet.com/api/stocks', api_params
121
+ enumerize('https://api.myshoptet.com/api/stocks', api_params)
174
122
  end
175
123
 
176
124
  def products api_params = {}
177
- enumerize "https://api.myshoptet.com/api/products", api_params
125
+ enumerize("https://api.myshoptet.com/api/products", api_params)
178
126
  end
179
127
 
180
128
  def supplies warehouse_id, api_params = {}
181
- uri = "https://api.myshoptet.com/api/stocks/#{warehouse_id}/supplies"
182
- enumerize uri, api_params
129
+ enumerize("https://api.myshoptet.com/api/stocks/#{warehouse_id}/supplies", api_params)
183
130
  end
184
131
 
185
132
  def stocks_movements warehouse_id, api_params = {}
186
- uri = "https://api.myshoptet.com/api/stocks/#{warehouse_id}/movements"
187
- enumerize uri, api_params
133
+ enumerize("https://api.myshoptet.com/api/stocks/#{warehouse_id}/movements", api_params)
188
134
  end
189
135
 
190
136
  def product_categories api_params = {}
191
- enumerize 'https://api.myshoptet.com/api/categories', api_params
137
+ enumerize('https://api.myshoptet.com/api/categories', api_params)
192
138
  end
193
139
 
194
140
  def products_changes api_params = {}
195
- uri = 'https://api.myshoptet.com/api/products/changes'
196
- enumerize uri, api_params
141
+ enumerize('https://api.myshoptet.com/api/products/changes', api_params)
197
142
  end
198
143
 
199
144
  def price_lists api_params = {}
200
- enumerize 'https://api.myshoptet.com/api/pricelists', api_params
145
+ enumerize('https://api.myshoptet.com/api/pricelists', api_params)
201
146
  end
202
147
 
203
148
  def prices price_list_id, api_params = {}
204
- uri = "https://api.myshoptet.com/api/pricelists/#{price_list_id}"
205
- enumerize uri, api_params, 'pricelist'
149
+ enumerize("https://api.myshoptet.com/api/pricelists/#{price_list_id}", api_params, 'pricelist')
206
150
  end
207
151
 
208
152
  def orders api_params = {}
209
- enumerize 'https://api.myshoptet.com/api/orders', api_params
153
+ enumerize('https://api.myshoptet.com/api/orders', api_params)
210
154
  end
211
155
 
212
156
  def orders_changes api_params = {}
213
- uri = 'https://api.myshoptet.com/api/orders/changes'
214
- enumerize uri, api_params
157
+ enumerize('https://api.myshoptet.com/api/orders/changes', api_params)
215
158
  end
216
159
 
217
160
  def order code, api_params = {}
218
- uri = "https://api.myshoptet.com/api/orders/#{code}"
219
- result = request assemble_uri(uri, api_params)
220
- result.dig 'data', 'order'
161
+ result = request("https://api.myshoptet.com/api/orders/#{code}", api_params)
162
+ result.dig('data', 'order')
221
163
  end
222
164
 
223
165
  def product guid, api_params = {}
224
- uri = "https://api.myshoptet.com/api/products/#{guid}"
225
- result = request assemble_uri(uri, api_params)
166
+ result = request("https://api.myshoptet.com/api/products/#{guid}", api_params)
226
167
  result['data']
227
168
  end
228
169
 
229
170
  def new_api_token
230
171
  headers = { 'Authorization' => "Bearer #{@oauth_token}" }
231
172
 
232
- result = Shoptet::Request.get @oauth_url, headers
233
- handle_errors result, @oauth_url, headers
173
+ result = Shoptet::Request.get(URI(@oauth_url), headers)
174
+ handle_errors(result)
234
175
 
235
- result.fetch 'access_token'
176
+ result.fetch('access_token')
236
177
  end
237
178
 
238
- def request uri, retry_on_token_error = true
179
+ def request url, api_params = {}, retry_on_token_error = true
180
+ url = URI(url)
181
+ url.query = URI.encode_www_form(api_params) if api_params.any?
182
+
239
183
  headers = { 'Shoptet-Access-Token' => @api_token,
240
184
  'Content-Type' => 'application/vnd.shoptet.v1.0' }
241
185
 
242
- result = Shoptet::Request.get uri, headers
243
- token_errors = handle_errors result, uri, headers
186
+ result = Shoptet::Request.get(url, headers)
187
+ token_errors = handle_errors(result)
244
188
 
245
189
  if token_errors.any?
246
190
  if retry_on_token_error
247
- @on_token_error.call self
248
- request uri, false
191
+ @on_token_error.call(self)
192
+ request(url, api_params, false)
249
193
  else
250
- raise Error.new result
194
+ raise Error.new(result)
251
195
  end
252
196
  else
253
197
  result
@@ -255,9 +199,7 @@ class Shoptet
255
199
  end
256
200
 
257
201
  def suspended?
258
- data = shop_info
259
-
260
- false if data
202
+ false if shop_info
261
203
  rescue Shoptet::AddonSuspended
262
204
  true
263
205
  end
@@ -265,10 +207,10 @@ class Shoptet
265
207
  private
266
208
 
267
209
  def enumerize base_url, filters = {}, data_key = nil
268
- ApiEnumerator.new base_url, filters, data_key, self
210
+ ApiEnumerator.new(base_url, filters, data_key, self)
269
211
  end
270
212
 
271
- def handle_errors result, uri, headers
213
+ def handle_errors result
272
214
  error = result['error']
273
215
  errors = result['errors'] || []
274
216
  token_errors, non_token_errors = errors.partition do |err|
@@ -0,0 +1,44 @@
1
+ class Shoptet
2
+ class ApiEnumerator < SimpleDelegator
3
+ def initialize base_url, filters, data_key, api
4
+ @base_url = base_url
5
+ @filters = filters
6
+ @data_key = data_key || URI(base_url).path.split('/').last
7
+ @api = api
8
+
9
+ @enum = Enumerator.new do |y|
10
+ first_page.dig('data', @data_key).each { y.yield _1 }
11
+
12
+ if total_pages > 1
13
+ other_pages = 2..(total_pages - 1)
14
+ other_pages.each do |page|
15
+ result = @api.request(base_url, filters.merge(page: page))
16
+ result.dig('data', @data_key).each { y.yield _1 }
17
+ end
18
+
19
+ last_page.dig('data', @data_key).each { y.yield _1 }
20
+ end
21
+ end
22
+
23
+ super @enum
24
+ end
25
+
26
+ def first_page
27
+ @first_page ||= @api.request(@base_url, @filters)
28
+ end
29
+
30
+ def last_page
31
+ return first_page if total_pages < 2
32
+
33
+ @last_page ||= @api.request(@base_url, @filters.merge(page: total_pages))
34
+ end
35
+
36
+ def total_pages
37
+ first_page.dig('data', 'paginator', 'pageCount') || 0
38
+ end
39
+
40
+ def size
41
+ first_page.dig('data', 'paginator', 'totalCount')
42
+ end
43
+ end
44
+ end
@@ -1,63 +1,41 @@
1
1
  require 'net/http'
2
-
3
- #TODO: keep_alive_timeout ?
2
+ require 'oj'
4
3
 
5
4
  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
-
15
5
  class Request
16
- def self.get uri, headers
17
- attempt ||= 0
18
- attempt += 1
19
-
20
- parsed_uri = URI(uri)
21
-
22
- http = Net::HTTP.new parsed_uri.host, parsed_uri.port
6
+ def self.get url, headers
7
+ http = Net::HTTP.new(url.host, url.port)
23
8
  http.use_ssl = true
24
9
  http.open_timeout = 60
25
10
  http.read_timeout = 60
26
11
  http.write_timeout = 60
27
12
  http.ssl_timeout = 60
28
13
 
29
- request = Net::HTTP::Get.new parsed_uri
14
+ request = Net::HTTP::Get.new(url)
30
15
  headers.each do |key, value|
31
16
  request[key] = value
32
17
  end
33
18
 
34
- response = http.request request
35
- parsed_body = JSON.parse response.body
19
+ response = http.request(request)
20
+ parsed_body = Oj.load(response.body, mode: :compat)
36
21
 
37
22
  unless parsed_body
38
- message = "Status code: #{response.code}, url: #{uri}"
39
- fail Shoptet::EmptyRequestResponse.new(message)
40
- end
41
-
42
- unless response.code == '200'
43
- message = "Status code: #{response.code}, url: #{uri}"
44
- fail Shoptet::UnsuccessfulApiResponse.new(message)
23
+ message = "Status code: #{response.code}, url: #{url}"
24
+ fail Shoptet::EmptyResponse.new(message)
45
25
  end
46
26
 
47
27
  parsed_body
48
- rescue Net::OpenTimeout
49
- retry if attempt < 4
50
28
  end
51
29
 
52
- def self.post uri, body
53
- req = Net::HTTP::Post.new uri
54
- req.set_form_data body
30
+ def self.post url, body
31
+ request = Net::HTTP::Post.new(url)
32
+ request.set_form_data(body)
55
33
 
56
- res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http|
57
- http.request req
34
+ response = Net::HTTP.start(url.host, url.port, use_ssl: true) do |http|
35
+ http.request(request)
58
36
  end
59
37
 
60
- JSON.parse res.body
38
+ Oj.load(response.body, mode: :compat)
61
39
  end
62
40
  end
63
41
  end
@@ -22,5 +22,7 @@ Gem::Specification.new do |spec|
22
22
  end
23
23
  spec.require_paths = ["lib"]
24
24
 
25
+ spec.add_dependency 'oj'
26
+
25
27
  spec.add_development_dependency 'irb'
26
28
  end
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: shoptet
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.17
4
+ version: 0.0.22
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-26 00:00:00.000000000 Z
11
+ date: 2020-12-22 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: oj
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: irb
15
29
  requirement: !ruby/object:Gem::Requirement
@@ -40,6 +54,7 @@ files:
40
54
  - bin/console
41
55
  - bin/setup
42
56
  - lib/shoptet.rb
57
+ - lib/shoptet/api_enumerator.rb
43
58
  - lib/shoptet/request.rb
44
59
  - shoptet.gemspec
45
60
  homepage: https://github.com/Masa331/shoptet