shoptet 0.0.19 → 0.0.24

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: 2b113a80270421d336b758bbe4c90584de38af56b39a5ae5033cb43003d9c35c
4
- data.tar.gz: d0e8d093a745f7e6e148f0db1b12e9a43cf236928066232f0ee71053d946c85a
3
+ metadata.gz: c47eb6556f7edaf410be790e1e34d50a688f4e7e985b7c3ba13f1025534cbce6
4
+ data.tar.gz: 327dcd29816c88ba5c3657c5d4a9ca7d73fa5befc940226b669572f46666a562
5
5
  SHA512:
6
- metadata.gz: 167d0bbbf3be9fee81a24d680d26e551a45891ad2ce1c9c4e701fe94b869eeaa2b84ddae0af10d48e79780bad3db8adaee0ee48756c56694db3680f21516412e
7
- data.tar.gz: 9e3f1f86588a2dbd7154af9e0cd2c9317f6fe3952913f9b23ed0dfe14b3c123771eec44d7752be79ec2ecd660d6e905947e4b3fb7b5bb1bfa9c5c46c49db2d99
6
+ metadata.gz: 91cd6589e4a09aab0480f55807ae6e8ab8c256af0018753087f77f195cc8e06fb007774106586942ec90485f90804e02a48fe99857cf41ecb05ac1afe41b5bd8
7
+ data.tar.gz: f364707ed6c8c1a3c2381837f41e1b783a2d8902768d48bfd3762e50b4cd109b7ea6530898a38e2cf6c6984c543c8c4a12dd653d2a09679fcdd57831c84c43db
@@ -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,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.19'
22
+ '0.0.24'
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
@@ -143,6 +90,10 @@ class Shoptet
143
90
  @approved_endpoints.any? { _1['endpoint'] == endpoint }
144
91
  end
145
92
 
93
+ def endpoints_approved? *endpoints_to_check
94
+ endpoints_to_check.all? { endpoint_approved? _1 }
95
+ end
96
+
146
97
  def authorize_url redirect_url, state
147
98
  query = {
148
99
  client_id: @client_id,
@@ -152,101 +103,101 @@ class Shoptet
152
103
  redirect_uri: redirect_url
153
104
  }.to_query
154
105
 
155
- URI("#{@shop_url}action/OAuthServer/authorize?#{query}").to_s
106
+ URI("#{@shop_url}action/OAuthServer/authorize?#{query}")
156
107
  end
157
108
 
158
109
  def shop_info api_params = {}
159
- url = assemble_uri 'https://api.myshoptet.com/api/eshop', api_params
160
- result = request url
110
+ result = request('https://api.myshoptet.com/api/eshop', api_params)
161
111
  result['data']
162
112
  end
163
113
 
164
114
  def design_info api_params = {}
165
- url = assemble_uri 'https://api.myshoptet.com/api/eshop/design', api_params
166
- result = request url
115
+ result = request('https://api.myshoptet.com/api/eshop/design', api_params)
167
116
 
168
117
  result['data']
169
118
  end
170
119
 
171
120
  def stocks api_params = {}
172
- enumerize 'https://api.myshoptet.com/api/stocks', api_params
121
+ enumerize('https://api.myshoptet.com/api/stocks', api_params)
173
122
  end
174
123
 
175
124
  def products api_params = {}
176
- enumerize "https://api.myshoptet.com/api/products", api_params
125
+ enumerize("https://api.myshoptet.com/api/products", api_params)
177
126
  end
178
127
 
179
128
  def supplies warehouse_id, api_params = {}
180
- uri = "https://api.myshoptet.com/api/stocks/#{warehouse_id}/supplies"
181
- enumerize uri, api_params
129
+ enumerize("https://api.myshoptet.com/api/stocks/#{warehouse_id}/supplies", api_params)
182
130
  end
183
131
 
184
132
  def stocks_movements warehouse_id, api_params = {}
185
- uri = "https://api.myshoptet.com/api/stocks/#{warehouse_id}/movements"
186
- enumerize uri, api_params
133
+ enumerize("https://api.myshoptet.com/api/stocks/#{warehouse_id}/movements", api_params)
187
134
  end
188
135
 
189
136
  def product_categories api_params = {}
190
- enumerize 'https://api.myshoptet.com/api/categories', api_params
137
+ enumerize('https://api.myshoptet.com/api/categories', api_params)
191
138
  end
192
139
 
193
140
  def products_changes api_params = {}
194
- uri = 'https://api.myshoptet.com/api/products/changes'
195
- enumerize uri, api_params
141
+ enumerize('https://api.myshoptet.com/api/products/changes', api_params)
196
142
  end
197
143
 
198
144
  def price_lists api_params = {}
199
- enumerize 'https://api.myshoptet.com/api/pricelists', api_params
145
+ enumerize('https://api.myshoptet.com/api/pricelists', api_params)
200
146
  end
201
147
 
202
148
  def prices price_list_id, api_params = {}
203
- uri = "https://api.myshoptet.com/api/pricelists/#{price_list_id}"
204
- enumerize uri, api_params, 'pricelist'
149
+ enumerize("https://api.myshoptet.com/api/pricelists/#{price_list_id}", api_params, 'pricelist')
205
150
  end
206
151
 
207
152
  def orders api_params = {}
208
- enumerize 'https://api.myshoptet.com/api/orders', api_params
153
+ enumerize('https://api.myshoptet.com/api/orders', api_params)
209
154
  end
210
155
 
211
- def orders_changes api_params = {}
212
- uri = 'https://api.myshoptet.com/api/orders/changes'
213
- enumerize uri, api_params
156
+ def orders_changes from:
157
+ api_params = { from: from.iso8601 }
158
+ enumerize('https://api.myshoptet.com/api/orders/changes', api_params)
214
159
  end
215
160
 
216
161
  def order code, api_params = {}
217
- uri = "https://api.myshoptet.com/api/orders/#{code}"
218
- result = request assemble_uri(uri, api_params)
219
- result.dig 'data', 'order'
162
+ result = request("https://api.myshoptet.com/api/orders/#{code}", api_params)
163
+ result.dig('data', 'order')
220
164
  end
221
165
 
222
166
  def product guid, api_params = {}
223
- uri = "https://api.myshoptet.com/api/products/#{guid}"
224
- result = request assemble_uri(uri, api_params)
167
+ result = request("https://api.myshoptet.com/api/products/#{guid}", api_params)
168
+ result['data']
169
+ end
170
+
171
+ def product_by_code code, api_params = {}
172
+ result = request("https://api.myshoptet.com/api/products/code/#{code}", api_params)
225
173
  result['data']
226
174
  end
227
175
 
228
176
  def new_api_token
229
177
  headers = { 'Authorization' => "Bearer #{@oauth_token}" }
230
178
 
231
- result = Shoptet::Request.get @oauth_url, headers
232
- handle_errors result, @oauth_url, headers
179
+ result = Shoptet::Request.get(URI(@oauth_url), headers)
180
+ handle_errors(result)
233
181
 
234
- result.fetch 'access_token'
182
+ result.fetch('access_token')
235
183
  end
236
184
 
237
- def request uri, retry_on_token_error = true
185
+ def request url, api_params = {}, retry_on_token_error = true
186
+ url = URI(url)
187
+ url.query = URI.encode_www_form(api_params) if api_params.any?
188
+
238
189
  headers = { 'Shoptet-Access-Token' => @api_token,
239
190
  'Content-Type' => 'application/vnd.shoptet.v1.0' }
240
191
 
241
- result = Shoptet::Request.get uri, headers
242
- token_errors = handle_errors result, uri, headers
192
+ result = Shoptet::Request.get(url, headers)
193
+ token_errors = handle_errors(result)
243
194
 
244
195
  if token_errors.any?
245
196
  if retry_on_token_error
246
- @on_token_error.call self
247
- request uri, false
197
+ @on_token_error.call(self)
198
+ request(url, api_params, false)
248
199
  else
249
- raise Error.new result
200
+ raise Error.new(result)
250
201
  end
251
202
  else
252
203
  result
@@ -254,9 +205,7 @@ class Shoptet
254
205
  end
255
206
 
256
207
  def suspended?
257
- data = shop_info
258
-
259
- false if data
208
+ false if shop_info
260
209
  rescue Shoptet::AddonSuspended
261
210
  true
262
211
  end
@@ -264,10 +213,10 @@ class Shoptet
264
213
  private
265
214
 
266
215
  def enumerize base_url, filters = {}, data_key = nil
267
- ApiEnumerator.new base_url, filters, data_key, self
216
+ ApiEnumerator.new(base_url, filters, data_key, self)
268
217
  end
269
218
 
270
- def handle_errors result, uri, headers
219
+ def handle_errors result
271
220
  error = result['error']
272
221
  errors = result['errors'] || []
273
222
  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.19
4
+ version: 0.0.24
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: 2021-01-25 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