shoptet 0.0.20 → 0.0.25

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: ef1cda0c1dbd2aa688506e37d4f371d27f4325d721f4076fe53c936f5b397893
4
- data.tar.gz: 9ba20f2dc64417f56cf3b400379785788bd2891e5fffdebe251016697329944b
3
+ metadata.gz: df7f60fd4783c4575ed4d5655d64c8dc6059bedbbfd617799b75bc39179c42a2
4
+ data.tar.gz: 45f65ff7f49e34929f2517776b98168d46ada03b9c51537299740a1342a6ac18
5
5
  SHA512:
6
- metadata.gz: 463a09bd5bd60ea844c49625a68bf09a279f0a0e8eb809300e2b419517ade5163b08646798d9cca6ad071e338e92cce7c3e29683cf7e7dfd3e098cee2df29cdf
7
- data.tar.gz: f8f356c49728209aceb667506733314be5d5b0a899279d0e7edbc1afe2a6777afa87a947008535522040858d807b1b1b2e9b236691c0e4aad56f5b8b3bbae38a
6
+ metadata.gz: 638f26a2866195b498176e89ec3c975f39218bb3e7c5720db75b1c8f6193a8e6390556dfdc090670e6148e6c532eb12f682a790b4c0bab81720fbe5cbe69ad91
7
+ data.tar.gz: 56a94a9e122ff6385b8bebcdb15abe279754d7b8253023ef1ab7a8ce235dfc8af6bb00dd44017e22f311b1dae5b54f26be8e527ffa0ff6095650cfbdeb2e395b
data/lib/shoptet.rb CHANGED
@@ -1,78 +1,26 @@
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
12
+ class StockNotFound < StandardError; end
13
13
 
14
14
  EXPIRED_TOKEN_CODE = 'expired-token'
15
15
  INVALID_TOKEN_CODE = 'invalid-token'
16
16
  ADDON_NOT_INSTALLED = 'Addon installation is not approved.'
17
17
 
18
- DEFAULT_ON_TOKEN_ERROR = -> (api) do
18
+ ON_TOKEN_ERROR = -> (api) do
19
19
  api.api_token = api.new_api_token
20
20
  end
21
21
 
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
22
  def self.version
75
- '0.0.20'
23
+ '0.0.25'
76
24
  end
77
25
 
78
26
  def self.ar_on_token_error(model)
@@ -102,7 +50,7 @@ class Shoptet
102
50
  'scope' => 'api'
103
51
  }
104
52
 
105
- Shoptet::Request.post url, data
53
+ Shoptet::Request.post(url, data)
106
54
  end
107
55
 
108
56
  def self.login_token url, code, client_id, client_secret, redirect_url
@@ -115,11 +63,11 @@ class Shoptet
115
63
  scope: 'basic_eshop'
116
64
  }
117
65
 
118
- Shoptet::Request.post url, data
66
+ Shoptet::Request.post(url, data)
119
67
  end
120
68
 
121
69
  def self.basic_eshop url, access_token
122
- Shoptet::Request.get url, { 'Authorization' => "Bearer #{access_token}" }
70
+ Shoptet::Request.get(url, { 'Authorization' => "Bearer #{access_token}" })
123
71
  end
124
72
 
125
73
  attr_accessor :api_token
@@ -130,11 +78,11 @@ class Shoptet
130
78
  @shop_url = shop_url
131
79
  @client_id = client_id
132
80
  @api_token = api_token
133
- @on_token_error = on_token_error || DEFAULT_ON_TOKEN_ERROR
81
+ @on_token_error = on_token_error || ON_TOKEN_ERROR
134
82
  end
135
83
 
136
84
  def endpoints api_params = {}
137
- enumerize 'https://api.myshoptet.com/api/system/endpoints', api_params
85
+ enumerize('https://api.myshoptet.com/api/system/endpoints', api_params)
138
86
  end
139
87
 
140
88
  def endpoint_approved? endpoint
@@ -144,7 +92,7 @@ class Shoptet
144
92
  end
145
93
 
146
94
  def endpoints_approved? *endpoints_to_check
147
- endpoints_to_check.all? { enpoint_approved? _1 }
95
+ endpoints_to_check.all? { endpoint_approved? _1 }
148
96
  end
149
97
 
150
98
  def authorize_url redirect_url, state
@@ -156,101 +104,101 @@ class Shoptet
156
104
  redirect_uri: redirect_url
157
105
  }.to_query
158
106
 
159
- URI("#{@shop_url}action/OAuthServer/authorize?#{query}").to_s
107
+ URI("#{@shop_url}action/OAuthServer/authorize?#{query}")
160
108
  end
161
109
 
162
110
  def shop_info api_params = {}
163
- url = assemble_uri 'https://api.myshoptet.com/api/eshop', api_params
164
- result = request url
111
+ result = request('https://api.myshoptet.com/api/eshop', api_params)
165
112
  result['data']
166
113
  end
167
114
 
168
115
  def design_info api_params = {}
169
- url = assemble_uri 'https://api.myshoptet.com/api/eshop/design', api_params
170
- result = request url
116
+ result = request('https://api.myshoptet.com/api/eshop/design', api_params)
171
117
 
172
118
  result['data']
173
119
  end
174
120
 
175
121
  def stocks api_params = {}
176
- enumerize 'https://api.myshoptet.com/api/stocks', api_params
122
+ enumerize('https://api.myshoptet.com/api/stocks', api_params)
177
123
  end
178
124
 
179
125
  def products api_params = {}
180
- enumerize "https://api.myshoptet.com/api/products", api_params
126
+ enumerize("https://api.myshoptet.com/api/products", api_params)
181
127
  end
182
128
 
183
129
  def supplies warehouse_id, api_params = {}
184
- uri = "https://api.myshoptet.com/api/stocks/#{warehouse_id}/supplies"
185
- enumerize uri, api_params
130
+ enumerize("https://api.myshoptet.com/api/stocks/#{warehouse_id}/supplies", api_params)
186
131
  end
187
132
 
188
133
  def stocks_movements warehouse_id, api_params = {}
189
- uri = "https://api.myshoptet.com/api/stocks/#{warehouse_id}/movements"
190
- enumerize uri, api_params
134
+ enumerize("https://api.myshoptet.com/api/stocks/#{warehouse_id}/movements", api_params)
191
135
  end
192
136
 
193
137
  def product_categories api_params = {}
194
- enumerize 'https://api.myshoptet.com/api/categories', api_params
138
+ enumerize('https://api.myshoptet.com/api/categories', api_params)
195
139
  end
196
140
 
197
141
  def products_changes api_params = {}
198
- uri = 'https://api.myshoptet.com/api/products/changes'
199
- enumerize uri, api_params
142
+ enumerize('https://api.myshoptet.com/api/products/changes', api_params)
200
143
  end
201
144
 
202
145
  def price_lists api_params = {}
203
- enumerize 'https://api.myshoptet.com/api/pricelists', api_params
146
+ enumerize('https://api.myshoptet.com/api/pricelists', api_params)
204
147
  end
205
148
 
206
149
  def prices price_list_id, api_params = {}
207
- uri = "https://api.myshoptet.com/api/pricelists/#{price_list_id}"
208
- enumerize uri, api_params, 'pricelist'
150
+ enumerize("https://api.myshoptet.com/api/pricelists/#{price_list_id}", api_params, 'pricelist')
209
151
  end
210
152
 
211
153
  def orders api_params = {}
212
- enumerize 'https://api.myshoptet.com/api/orders', api_params
154
+ enumerize('https://api.myshoptet.com/api/orders', api_params)
213
155
  end
214
156
 
215
- def orders_changes api_params = {}
216
- uri = 'https://api.myshoptet.com/api/orders/changes'
217
- enumerize uri, api_params
157
+ def orders_changes from:
158
+ api_params = { from: from.iso8601 }
159
+ enumerize('https://api.myshoptet.com/api/orders/changes', api_params)
218
160
  end
219
161
 
220
162
  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'
163
+ result = request("https://api.myshoptet.com/api/orders/#{code}", api_params)
164
+ result.dig('data', 'order')
224
165
  end
225
166
 
226
167
  def product guid, api_params = {}
227
- uri = "https://api.myshoptet.com/api/products/#{guid}"
228
- result = request assemble_uri(uri, api_params)
168
+ result = request("https://api.myshoptet.com/api/products/#{guid}", api_params)
169
+ result['data']
170
+ end
171
+
172
+ def product_by_code code, api_params = {}
173
+ result = request("https://api.myshoptet.com/api/products/code/#{code}", api_params)
229
174
  result['data']
230
175
  end
231
176
 
232
177
  def new_api_token
233
178
  headers = { 'Authorization' => "Bearer #{@oauth_token}" }
234
179
 
235
- result = Shoptet::Request.get @oauth_url, headers
236
- handle_errors result, @oauth_url, headers
180
+ result = Shoptet::Request.get(URI(@oauth_url), headers)
181
+ handle_errors(result)
237
182
 
238
- result.fetch 'access_token'
183
+ result.fetch('access_token')
239
184
  end
240
185
 
241
- def request uri, retry_on_token_error = true
186
+ def request url, api_params = {}, retry_on_token_error = true
187
+ url = URI(url)
188
+ url.query = URI.encode_www_form(api_params) if api_params.any?
189
+
242
190
  headers = { 'Shoptet-Access-Token' => @api_token,
243
191
  'Content-Type' => 'application/vnd.shoptet.v1.0' }
244
192
 
245
- result = Shoptet::Request.get uri, headers
246
- token_errors = handle_errors result, uri, headers
193
+ result = Shoptet::Request.get(url, headers)
194
+ token_errors = handle_errors(result)
247
195
 
248
196
  if token_errors.any?
249
197
  if retry_on_token_error
250
- @on_token_error.call self
251
- request uri, false
198
+ @on_token_error.call(self)
199
+ request(url, api_params, false)
252
200
  else
253
- raise Error.new result
201
+ raise Error.new(result)
254
202
  end
255
203
  else
256
204
  result
@@ -258,9 +206,7 @@ class Shoptet
258
206
  end
259
207
 
260
208
  def suspended?
261
- data = shop_info
262
-
263
- false if data
209
+ false if shop_info
264
210
  rescue Shoptet::AddonSuspended
265
211
  true
266
212
  end
@@ -268,10 +214,10 @@ class Shoptet
268
214
  private
269
215
 
270
216
  def enumerize base_url, filters = {}, data_key = nil
271
- ApiEnumerator.new base_url, filters, data_key, self
217
+ ApiEnumerator.new(base_url, filters, data_key, self)
272
218
  end
273
219
 
274
- def handle_errors result, uri, headers
220
+ def handle_errors result
275
221
  error = result['error']
276
222
  errors = result['errors'] || []
277
223
  token_errors, non_token_errors = errors.partition do |err|
@@ -289,6 +235,8 @@ class Shoptet
289
235
  raise AddonNotInstalled
290
236
  elsif errors.any? { |err| err["errorCode"] == 'invalid-token-no-rights' }
291
237
  raise InvalidTokenNoRights
238
+ elsif errors.any? { |err| err["errorCode"] == 'stock-not-found' }
239
+ raise StockNotFound
292
240
  elsif errors.any? { |err| err["errorCode"] == 'page-not-found' && err['message'].include?('max page is') }
293
241
  raise MaxPageReached
294
242
  else
@@ -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
data/shoptet.gemspec CHANGED
@@ -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.20
4
+ version: 0.0.25
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: 2021-04-28 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
@@ -63,7 +78,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
63
78
  - !ruby/object:Gem::Version
64
79
  version: '0'
65
80
  requirements: []
66
- rubygems_version: 3.1.4
81
+ rubygems_version: 3.2.13
67
82
  signing_key:
68
83
  specification_version: 4
69
84
  summary: API wrapper for interacting with Shoptet api