shoptet 0.0.18 → 0.0.23

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: 5e027e9838f1031078700fefa9208685301227a87998272534abab291b6592cc
4
- data.tar.gz: b54940690e5ac0eeccce25a6d5cc44e8537eb934468e08334ae07393449bc28f
3
+ metadata.gz: fc8d869c6ef4b6751344e65f3a2e78cd481e2202cc3ce813887763c203a5bff8
4
+ data.tar.gz: bf8d3f1755e53a53fdc4a1a1853ca34cedb155969abcfb2320bd9859e0961b77
5
5
  SHA512:
6
- metadata.gz: 5b432895ea1a1d8214531bb0097fcf036cd8f12016069410ae1cb04e4707420f117f59006245eeec87fe194cf8254b4f05dc0d96add6eddcf872a58d788f5f4c
7
- data.tar.gz: e4a97e102621cc21658d07152d1a75c94b68807457edaf9eafb9da39323f924fef2f748236cba221cc0f0ed5307ec166f9a928ffb169e67043f8b0bf5e7188d9
6
+ metadata.gz: ded272bb577be32901ff2c743ec9922542da6341ca25759cf463b71ac0ce9beae3d8b52468624e370ab64bc3fd12b4185584808d6d239aef6ba92bf85a796b60
7
+ data.tar.gz: f24ec182b15b894c67410cec543490b65b512bbbada5cbdd0777c234e5ffcb4b5c5ab18464ff2fad6a322b7a27bd9c13a9c0400de793fe89128299a8a778aa3b
@@ -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.18'
22
+ '0.0.23'
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,96 @@ 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
- def orders_changes api_params = {}
213
- uri = 'https://api.myshoptet.com/api/orders/changes'
214
- 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)
215
159
  end
216
160
 
217
161
  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'
162
+ result = request("https://api.myshoptet.com/api/orders/#{code}", api_params)
163
+ result.dig('data', 'order')
221
164
  end
222
165
 
223
166
  def product guid, api_params = {}
224
- uri = "https://api.myshoptet.com/api/products/#{guid}"
225
- result = request assemble_uri(uri, api_params)
167
+ result = request("https://api.myshoptet.com/api/products/#{guid}", api_params)
226
168
  result['data']
227
169
  end
228
170
 
229
171
  def new_api_token
230
172
  headers = { 'Authorization' => "Bearer #{@oauth_token}" }
231
173
 
232
- result = Shoptet::Request.get @oauth_url, headers
233
- handle_errors result, @oauth_url, headers
174
+ result = Shoptet::Request.get(URI(@oauth_url), headers)
175
+ handle_errors(result)
234
176
 
235
- result.fetch 'access_token'
177
+ result.fetch('access_token')
236
178
  end
237
179
 
238
- def request uri, retry_on_token_error = true
180
+ def request url, api_params = {}, retry_on_token_error = true
181
+ url = URI(url)
182
+ url.query = URI.encode_www_form(api_params) if api_params.any?
183
+
239
184
  headers = { 'Shoptet-Access-Token' => @api_token,
240
185
  'Content-Type' => 'application/vnd.shoptet.v1.0' }
241
186
 
242
- result = Shoptet::Request.get uri, headers
243
- token_errors = handle_errors result, uri, headers
187
+ result = Shoptet::Request.get(url, headers)
188
+ token_errors = handle_errors(result)
244
189
 
245
190
  if token_errors.any?
246
191
  if retry_on_token_error
247
- @on_token_error.call self
248
- request uri, false
192
+ @on_token_error.call(self)
193
+ request(url, api_params, false)
249
194
  else
250
- raise Error.new result
195
+ raise Error.new(result)
251
196
  end
252
197
  else
253
198
  result
@@ -255,9 +200,7 @@ class Shoptet
255
200
  end
256
201
 
257
202
  def suspended?
258
- data = shop_info
259
-
260
- false if data
203
+ false if shop_info
261
204
  rescue Shoptet::AddonSuspended
262
205
  true
263
206
  end
@@ -265,10 +208,10 @@ class Shoptet
265
208
  private
266
209
 
267
210
  def enumerize base_url, filters = {}, data_key = nil
268
- ApiEnumerator.new base_url, filters, data_key, self
211
+ ApiEnumerator.new(base_url, filters, data_key, self)
269
212
  end
270
213
 
271
- def handle_errors result, uri, headers
214
+ def handle_errors result
272
215
  error = result['error']
273
216
  errors = result['errors'] || []
274
217
  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,58 +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)
37
- end
38
-
39
- unless response.code == '200'
40
- message = "Status code: #{response.code}, url: #{uri}"
41
- fail Shoptet::UnsuccessfulApiResponse.new(message)
23
+ message = "Status code: #{response.code}, url: #{url}"
24
+ fail Shoptet::EmptyResponse.new(message)
42
25
  end
43
26
 
44
27
  parsed_body
45
28
  end
46
29
 
47
- def self.post uri, body
48
- req = Net::HTTP::Post.new uri
49
- req.set_form_data body
30
+ def self.post url, body
31
+ request = Net::HTTP::Post.new(url)
32
+ request.set_form_data(body)
50
33
 
51
- res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http|
52
- http.request req
34
+ response = Net::HTTP.start(url.host, url.port, use_ssl: true) do |http|
35
+ http.request(request)
53
36
  end
54
37
 
55
- JSON.parse res.body
38
+ Oj.load(response.body, mode: :compat)
56
39
  end
57
40
  end
58
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.18
4
+ version: 0.0.23
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-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