shoptet 0.0.21 → 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: e1efde55dd585d22094917b78272e10cbc8614b2083970ae2128ec834b385e8c
4
- data.tar.gz: 183788a89692e1d7c30b72fdee0457d08ec24e3be612e16fa88b919f6e8664fc
3
+ metadata.gz: 2009bb64f74a45fdc160d4cbe7040366ec918ad6ad392288cad5f00f3e4e2406
4
+ data.tar.gz: 72dfe3b46b578a2131e7c8b96ca1d951dddfa15eea60a8ce77d4666ae9186d91
5
5
  SHA512:
6
- metadata.gz: 18dd464f3bbb098b4a167696af5a85d89c3663d6146b0fad2cde5d83647a9415d3fb9d160e67b5a908a3740da8fafbb6a5120b572190251959dea291566be78e
7
- data.tar.gz: 99112fd817ee04c38e26f4d2f31079551dfb3cefb2dd0ff76a8f5cecaab3fcc80694da4c94678f339a6de26cc09b62a60b8e3859f1816da97d1a84ced6faa0e6
6
+ metadata.gz: 3aee7e5ad2e7c1006202513f8ca57faaeb07b96508097b6457b98b174e497530545553923106f61ec184a194d2af3caf3e14abffe81f4c1912c212c8846f7723
7
+ data.tar.gz: 89ae29433db50dede06c6eef59a311cef45aa9b0d59ae740ca5130cd47d207bf06cd172498862e7c2b6c4b6df96d25eb01f9b8485892d36750048e0f62bc3208
@@ -1,78 +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
12
 
14
13
  EXPIRED_TOKEN_CODE = 'expired-token'
15
14
  INVALID_TOKEN_CODE = 'invalid-token'
16
15
  ADDON_NOT_INSTALLED = 'Addon installation is not approved.'
17
16
 
18
- DEFAULT_ON_TOKEN_ERROR = -> (api) do
17
+ ON_TOKEN_ERROR = -> (api) do
19
18
  api.api_token = api.new_api_token
20
19
  end
21
20
 
22
- class ApiEnumerator < SimpleDelegator
23
- def initialize base_url, filters, data_key, api
24
- @base_url = base_url
25
- @filters = filters
26
- @data_key = data_key || URI(base_url).path.split('/').last
27
- @api = api
28
-
29
- @enum = Enumerator.new do |y|
30
- first_page.dig('data', @data_key).each { y.yield _1 }
31
-
32
- if total_pages > 1
33
- other_pages = 2..(total_pages - 1)
34
- other_pages.each do |page|
35
- uri = @api.assemble_uri base_url, filters.merge(page: page)
36
- result = @api.request uri
37
- result.dig('data', @data_key).each { y.yield _1 }
38
- end
39
-
40
- last_page.dig('data', @data_key).each { y.yield _1 }
41
- end
42
- end
43
-
44
- super @enum
45
- end
46
-
47
- def first_page
48
- @first_page ||=
49
- begin
50
- uri = @api.assemble_uri @base_url, @filters
51
- @api.request uri
52
- end
53
- end
54
-
55
- def total_pages
56
- first_page.dig('data', 'paginator', 'pageCount') || 0
57
- end
58
-
59
- def last_page
60
- return first_page if total_pages < 2
61
-
62
- @last_page ||=
63
- begin
64
- uri = @api.assemble_uri @base_url, @filters.merge(page: total_pages)
65
- @api.request uri
66
- end
67
- end
68
-
69
- def size
70
- first_page['data']['paginator']['totalCount']
71
- end
72
- end
73
-
74
21
  def self.version
75
- '0.0.21'
22
+ '0.0.22'
76
23
  end
77
24
 
78
25
  def self.ar_on_token_error(model)
@@ -102,7 +49,7 @@ class Shoptet
102
49
  'scope' => 'api'
103
50
  }
104
51
 
105
- Shoptet::Request.post url, data
52
+ Shoptet::Request.post(url, data)
106
53
  end
107
54
 
108
55
  def self.login_token url, code, client_id, client_secret, redirect_url
@@ -115,11 +62,11 @@ class Shoptet
115
62
  scope: 'basic_eshop'
116
63
  }
117
64
 
118
- Shoptet::Request.post url, data
65
+ Shoptet::Request.post(url, data)
119
66
  end
120
67
 
121
68
  def self.basic_eshop url, access_token
122
- Shoptet::Request.get url, { 'Authorization' => "Bearer #{access_token}" }
69
+ Shoptet::Request.get(url, { 'Authorization' => "Bearer #{access_token}" })
123
70
  end
124
71
 
125
72
  attr_accessor :api_token
@@ -130,11 +77,11 @@ class Shoptet
130
77
  @shop_url = shop_url
131
78
  @client_id = client_id
132
79
  @api_token = api_token
133
- @on_token_error = on_token_error || DEFAULT_ON_TOKEN_ERROR
80
+ @on_token_error = on_token_error || ON_TOKEN_ERROR
134
81
  end
135
82
 
136
83
  def endpoints api_params = {}
137
- enumerize 'https://api.myshoptet.com/api/system/endpoints', api_params
84
+ enumerize('https://api.myshoptet.com/api/system/endpoints', api_params)
138
85
  end
139
86
 
140
87
  def endpoint_approved? endpoint
@@ -156,101 +103,95 @@ class Shoptet
156
103
  redirect_uri: redirect_url
157
104
  }.to_query
158
105
 
159
- URI("#{@shop_url}action/OAuthServer/authorize?#{query}").to_s
106
+ URI("#{@shop_url}action/OAuthServer/authorize?#{query}")
160
107
  end
161
108
 
162
109
  def shop_info api_params = {}
163
- url = assemble_uri 'https://api.myshoptet.com/api/eshop', api_params
164
- result = request url
110
+ result = request('https://api.myshoptet.com/api/eshop', api_params)
165
111
  result['data']
166
112
  end
167
113
 
168
114
  def design_info api_params = {}
169
- url = assemble_uri 'https://api.myshoptet.com/api/eshop/design', api_params
170
- result = request url
115
+ result = request('https://api.myshoptet.com/api/eshop/design', api_params)
171
116
 
172
117
  result['data']
173
118
  end
174
119
 
175
120
  def stocks api_params = {}
176
- enumerize 'https://api.myshoptet.com/api/stocks', api_params
121
+ enumerize('https://api.myshoptet.com/api/stocks', api_params)
177
122
  end
178
123
 
179
124
  def products api_params = {}
180
- enumerize "https://api.myshoptet.com/api/products", api_params
125
+ enumerize("https://api.myshoptet.com/api/products", api_params)
181
126
  end
182
127
 
183
128
  def supplies warehouse_id, api_params = {}
184
- uri = "https://api.myshoptet.com/api/stocks/#{warehouse_id}/supplies"
185
- enumerize uri, api_params
129
+ enumerize("https://api.myshoptet.com/api/stocks/#{warehouse_id}/supplies", api_params)
186
130
  end
187
131
 
188
132
  def stocks_movements warehouse_id, api_params = {}
189
- uri = "https://api.myshoptet.com/api/stocks/#{warehouse_id}/movements"
190
- enumerize uri, api_params
133
+ enumerize("https://api.myshoptet.com/api/stocks/#{warehouse_id}/movements", api_params)
191
134
  end
192
135
 
193
136
  def product_categories api_params = {}
194
- enumerize 'https://api.myshoptet.com/api/categories', api_params
137
+ enumerize('https://api.myshoptet.com/api/categories', api_params)
195
138
  end
196
139
 
197
140
  def products_changes api_params = {}
198
- uri = 'https://api.myshoptet.com/api/products/changes'
199
- enumerize uri, api_params
141
+ enumerize('https://api.myshoptet.com/api/products/changes', api_params)
200
142
  end
201
143
 
202
144
  def price_lists api_params = {}
203
- enumerize 'https://api.myshoptet.com/api/pricelists', api_params
145
+ enumerize('https://api.myshoptet.com/api/pricelists', api_params)
204
146
  end
205
147
 
206
148
  def prices price_list_id, api_params = {}
207
- uri = "https://api.myshoptet.com/api/pricelists/#{price_list_id}"
208
- enumerize uri, api_params, 'pricelist'
149
+ enumerize("https://api.myshoptet.com/api/pricelists/#{price_list_id}", api_params, 'pricelist')
209
150
  end
210
151
 
211
152
  def orders api_params = {}
212
- enumerize 'https://api.myshoptet.com/api/orders', api_params
153
+ enumerize('https://api.myshoptet.com/api/orders', api_params)
213
154
  end
214
155
 
215
156
  def orders_changes api_params = {}
216
- uri = 'https://api.myshoptet.com/api/orders/changes'
217
- enumerize uri, api_params
157
+ enumerize('https://api.myshoptet.com/api/orders/changes', api_params)
218
158
  end
219
159
 
220
160
  def order code, api_params = {}
221
- uri = "https://api.myshoptet.com/api/orders/#{code}"
222
- result = request assemble_uri(uri, api_params)
223
- result.dig 'data', 'order'
161
+ result = request("https://api.myshoptet.com/api/orders/#{code}", api_params)
162
+ result.dig('data', 'order')
224
163
  end
225
164
 
226
165
  def product guid, api_params = {}
227
- uri = "https://api.myshoptet.com/api/products/#{guid}"
228
- result = request assemble_uri(uri, api_params)
166
+ result = request("https://api.myshoptet.com/api/products/#{guid}", api_params)
229
167
  result['data']
230
168
  end
231
169
 
232
170
  def new_api_token
233
171
  headers = { 'Authorization' => "Bearer #{@oauth_token}" }
234
172
 
235
- result = Shoptet::Request.get @oauth_url, headers
236
- handle_errors result, @oauth_url, headers
173
+ result = Shoptet::Request.get(URI(@oauth_url), headers)
174
+ handle_errors(result)
237
175
 
238
- result.fetch 'access_token'
176
+ result.fetch('access_token')
239
177
  end
240
178
 
241
- 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
+
242
183
  headers = { 'Shoptet-Access-Token' => @api_token,
243
184
  'Content-Type' => 'application/vnd.shoptet.v1.0' }
244
185
 
245
- result = Shoptet::Request.get uri, headers
246
- token_errors = handle_errors result, uri, headers
186
+ result = Shoptet::Request.get(url, headers)
187
+ token_errors = handle_errors(result)
247
188
 
248
189
  if token_errors.any?
249
190
  if retry_on_token_error
250
- @on_token_error.call self
251
- request uri, false
191
+ @on_token_error.call(self)
192
+ request(url, api_params, false)
252
193
  else
253
- raise Error.new result
194
+ raise Error.new(result)
254
195
  end
255
196
  else
256
197
  result
@@ -258,9 +199,7 @@ class Shoptet
258
199
  end
259
200
 
260
201
  def suspended?
261
- data = shop_info
262
-
263
- false if data
202
+ false if shop_info
264
203
  rescue Shoptet::AddonSuspended
265
204
  true
266
205
  end
@@ -268,10 +207,10 @@ class Shoptet
268
207
  private
269
208
 
270
209
  def enumerize base_url, filters = {}, data_key = nil
271
- ApiEnumerator.new base_url, filters, data_key, self
210
+ ApiEnumerator.new(base_url, filters, data_key, self)
272
211
  end
273
212
 
274
- def handle_errors result, uri, headers
213
+ def handle_errors result
275
214
  error = result['error']
276
215
  errors = result['errors'] || []
277
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,53 +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
- parsed_uri = URI(uri)
18
-
19
- 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)
20
8
  http.use_ssl = true
21
9
  http.open_timeout = 60
22
10
  http.read_timeout = 60
23
11
  http.write_timeout = 60
24
12
  http.ssl_timeout = 60
25
13
 
26
- request = Net::HTTP::Get.new parsed_uri
14
+ request = Net::HTTP::Get.new(url)
27
15
  headers.each do |key, value|
28
16
  request[key] = value
29
17
  end
30
18
 
31
- response = http.request request
32
- parsed_body = JSON.parse response.body
19
+ response = http.request(request)
20
+ parsed_body = Oj.load(response.body, mode: :compat)
33
21
 
34
22
  unless parsed_body
35
- message = "Status code: #{response.code}, url: #{uri}"
36
- fail Shoptet::EmptyRequestResponse.new(message)
23
+ message = "Status code: #{response.code}, url: #{url}"
24
+ fail Shoptet::EmptyResponse.new(message)
37
25
  end
38
26
 
39
27
  parsed_body
40
28
  end
41
29
 
42
- def self.post uri, body
43
- req = Net::HTTP::Post.new uri
44
- req.set_form_data body
30
+ def self.post url, body
31
+ request = Net::HTTP::Post.new(url)
32
+ request.set_form_data(body)
45
33
 
46
- res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http|
47
- http.request req
34
+ response = Net::HTTP.start(url.host, url.port, use_ssl: true) do |http|
35
+ http.request(request)
48
36
  end
49
37
 
50
- JSON.parse res.body
38
+ Oj.load(response.body, mode: :compat)
51
39
  end
52
40
  end
53
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.21
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-27 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