arctic-vendor 0.2.4 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +13 -0
- data/Gemfile.lock +1 -1
- data/lib/arctic/vendor/api.rb +46 -38
- data/lib/arctic/vendor/vendor.rb +29 -13
- data/lib/arctic/vendor/version.rb +1 -1
- metadata +2 -3
- data/lib/arctic/vendor/product.rb +0 -47
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 05635e7489082f52c9eae52ca87fe80b6ab52088d9bec08b2307c97aa2f290e3
|
4
|
+
data.tar.gz: 4487c41c01720ff83bbcaa93244d926f9d88d5780f34c1c0974505e87aa6a364
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1b07dfd68ee2df32d7aab75385f69b3ec16befd8621030be5017c2844ad5646f4f11cd6c8bc0b4f87536e272afa6c64327ee601049c72cf40d5d2d3280629801
|
7
|
+
data.tar.gz: 9ab9a0a28d01b1344c16956ffe75aade1522157407da2dc07562325505276d9673f29390d2939bcc7781c448baa948376bf0af60418e4386bee3759a48853bbb
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,18 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
### 1.0.0
|
4
|
+
|
5
|
+
* Remove a number of superfluous endpoints
|
6
|
+
* Remove need for account_id
|
7
|
+
* Rename some existing endpoints
|
8
|
+
* Remove Product objetc. Use POR hashes
|
9
|
+
* Add call to update when the shop was last collected after each collection cycle
|
10
|
+
|
11
|
+
### 0.2.5
|
12
|
+
|
13
|
+
* Add latest_only key to distribute_products
|
14
|
+
* Added api method for adding orders to the Core API
|
15
|
+
|
3
16
|
### 0.2.1
|
4
17
|
|
5
18
|
* Added Arctic::Vendor::API#list_products method to allow vendors to retrieve products from the Core API - Emil Kampp <emil@youwe.dk>
|
data/Gemfile.lock
CHANGED
data/lib/arctic/vendor/api.rb
CHANGED
@@ -2,79 +2,87 @@ require 'faraday'
|
|
2
2
|
require 'json'
|
3
3
|
require 'active_support/all'
|
4
4
|
|
5
|
-
require_relative 'product'
|
6
|
-
|
7
5
|
module Arctic
|
8
6
|
module Vendor
|
9
7
|
class API
|
10
|
-
attr_reader :token, :connection
|
8
|
+
attr_reader :vendor_id, :token, :connection
|
11
9
|
|
12
10
|
def initialize(**options)
|
13
|
-
|
11
|
+
@vendor_id = options.fetch(:vendor_id, ENV.fetch('VENDOR_ID'))
|
12
|
+
|
13
|
+
@token = options.fetch(:token, ENV.fetch('ARCTIC_CORE_API_TOKEN'))
|
14
|
+
|
14
15
|
api_url = options.fetch(:url,
|
15
16
|
ENV.fetch('ARCTIC_CORE_API_URL',
|
16
17
|
'http://localhost:5000/v1/vendors'))
|
17
18
|
|
18
|
-
@token = api_token
|
19
19
|
headers = {
|
20
|
-
Authorization: "Vendor #{token}",
|
21
20
|
'Content-Type': 'application/json',
|
22
21
|
Accept: 'application/json',
|
23
22
|
}
|
24
|
-
@connection = Faraday.new url: api_url.chomp('/'), headers: headers
|
25
|
-
end
|
26
23
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
# Show details about a single account
|
33
|
-
def show_account(account_id)
|
34
|
-
make_request :get, "accounts/#{account_id}"
|
24
|
+
@connection = Faraday.new url: api_url.chomp('/'), headers: headers do |conn|
|
25
|
+
conn.basic_auth(vendor_id, token)
|
26
|
+
conn.adapter Faraday.default_adapter
|
27
|
+
end
|
35
28
|
end
|
36
29
|
|
37
30
|
# List shops for a single account
|
38
|
-
def list_shops
|
39
|
-
make_request :get, "
|
31
|
+
def list_shops
|
32
|
+
make_request :get, "shops"
|
40
33
|
end
|
41
34
|
|
42
35
|
# Send products to the Core API
|
43
|
-
def send_products(
|
44
|
-
products.
|
45
|
-
|
36
|
+
def send_products(shop_id, products)
|
37
|
+
Arctic::Vendor.threaded(products.dup) do |prod|
|
38
|
+
begin
|
39
|
+
make_request :post, "shops/#{shop_id}/products", body: prod
|
40
|
+
rescue => e
|
41
|
+
Arctic.logger.error "Failed to send product (#{e.class}): #{e.message} -- #{prod}"
|
42
|
+
end
|
46
43
|
end
|
44
|
+
make_request :put, "shops/#{shop_id}", params: { collected_at: Time.now.to_s(:db) }
|
45
|
+
products
|
47
46
|
end
|
48
47
|
|
49
|
-
#
|
50
|
-
def
|
51
|
-
|
52
|
-
|
48
|
+
# Send products to the Core API
|
49
|
+
def send_currencies(shop_id, currencies)
|
50
|
+
Arctic::Vendor.threaded(currencies.dup) do |curr|
|
51
|
+
begin
|
52
|
+
make_request :put, "shops/#{shop_id}/currencies", body: curr
|
53
|
+
rescue => e
|
54
|
+
Arctic.logger.error "Failed to send currency (#{e.class}): #{e.message} -- #{curr}"
|
55
|
+
end
|
53
56
|
end
|
57
|
+
currencies
|
54
58
|
end
|
55
59
|
|
56
|
-
|
57
|
-
|
58
|
-
|
60
|
+
# Retrieve products from the Core API
|
61
|
+
def list_products(shop_id, **params)
|
62
|
+
params[:per_page] = params.delete(:batch_size) || 100
|
63
|
+
make_paginated_request(:get, "shops/#{shop_id}/products", params: params) do |products|
|
64
|
+
yield products
|
65
|
+
end
|
59
66
|
end
|
60
67
|
|
61
68
|
# Marks the shop as synchronized by the vendor
|
62
|
-
def
|
63
|
-
|
69
|
+
def update_product(shop_id, sku, **params)
|
70
|
+
Arctic.logger.debug "Updating Product(#{sku}).."
|
71
|
+
make_request :patch, "shops/#{shop_id}/products/#{sku}", params: params
|
64
72
|
end
|
65
73
|
|
66
|
-
|
67
|
-
|
68
|
-
|
74
|
+
def update_products(shop_id, products, **params)
|
75
|
+
Arctic::Vendor.threaded(products) do |prod|
|
76
|
+
begin
|
77
|
+
update_product shop_id, prod.fetch('sku'), **params
|
78
|
+
rescue KeyError => e
|
79
|
+
Arctic.logger.error "Invalid product: #{e.message} -- #{prod}"
|
80
|
+
end
|
81
|
+
end
|
69
82
|
end
|
70
83
|
|
71
84
|
private
|
72
85
|
|
73
|
-
def make_batch_request(*args, **options)
|
74
|
-
batches = Array(options.delete(:body)).flatten.in_groups_of(1000, false)
|
75
|
-
Arctic::Vendor.threaded(batches) { |batch| make_request *args, **(options.merge(body: batch)) }
|
76
|
-
end
|
77
|
-
|
78
86
|
def raw_request(method, path, body: {}, params: {})
|
79
87
|
# Remove preceeding slash to avoid going from base url /v1 to /
|
80
88
|
path = path.reverse.chomp('/').reverse
|
data/lib/arctic/vendor/vendor.rb
CHANGED
@@ -14,15 +14,29 @@ module Arctic
|
|
14
14
|
end
|
15
15
|
module_function :threaded
|
16
16
|
|
17
|
-
def each_shop(type
|
18
|
-
api.
|
19
|
-
|
20
|
-
yield shop, account if shop['type'] == type.to_s
|
21
|
-
end
|
17
|
+
def each_shop(type = :collection)
|
18
|
+
api.list_shops.with_indifferent_access[type].each do |shop|
|
19
|
+
yield shop
|
22
20
|
end
|
23
21
|
end
|
24
22
|
module_function :each_shop
|
25
23
|
|
24
|
+
def collect_currencies(&block)
|
25
|
+
Arctic.logger.info "Collecting currencies from collection shop"
|
26
|
+
|
27
|
+
currencies_count = 0
|
28
|
+
|
29
|
+
seconds = time do
|
30
|
+
each_shop(:collection) do |shop|
|
31
|
+
currencies = api.send_currencies shop['id'], yield(shop)
|
32
|
+
currencies_count += currencies.size
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
Arctic.logger.info "Collected #{currencies_count} exchange rates in #{seconds} seconds."
|
37
|
+
end
|
38
|
+
module_function :collect_currencies
|
39
|
+
|
26
40
|
def api(*args)
|
27
41
|
@api ||= Arctic::Vendor::API.new(*args)
|
28
42
|
end
|
@@ -38,14 +52,13 @@ module Arctic
|
|
38
52
|
# Fetches all products from all shops, where this vendor is the source
|
39
53
|
# vendor and pushes them to the Core API.
|
40
54
|
def collect_products(&block)
|
41
|
-
Arctic.logger.info "Collecting products from
|
55
|
+
Arctic.logger.info "Collecting products from vendor..."
|
42
56
|
products_count = 0
|
43
57
|
|
44
58
|
seconds = time do
|
45
|
-
each_shop do |shop
|
46
|
-
products = api.send_products
|
59
|
+
each_shop(:collection) do |shop|
|
60
|
+
products = api.send_products shop['id'], yield(shop)
|
47
61
|
products_count += products.size
|
48
|
-
api.synchronized account['id'], shop['id']
|
49
62
|
end
|
50
63
|
end
|
51
64
|
|
@@ -55,17 +68,20 @@ module Arctic
|
|
55
68
|
|
56
69
|
# Fetches all products from the Core API and distributes them to the
|
57
70
|
# target vendors
|
58
|
-
def distribute_products(
|
71
|
+
def distribute_products(**params)
|
59
72
|
Arctic.logger.info "Distributing products to target vendor..."
|
60
73
|
products_count = 0
|
61
74
|
|
75
|
+
params.reverse_merge! \
|
76
|
+
batch_size: 100
|
77
|
+
|
62
78
|
seconds = time do
|
63
|
-
each_shop(
|
64
|
-
api.list_products(
|
79
|
+
each_shop(:dispersal) do |shop|
|
80
|
+
api.list_products(shop['id'], params) do |products|
|
65
81
|
products_count += products.size
|
66
82
|
yield shop, products
|
83
|
+
# api.update_products shop['id'], products, dispersed_at: Time.now.to_s(:db)
|
67
84
|
end
|
68
|
-
api.synchronized account['id'], shop['id']
|
69
85
|
end
|
70
86
|
end
|
71
87
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: arctic-vendor
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Emil Kampp
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-07-
|
11
|
+
date: 2018-07-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -141,7 +141,6 @@ files:
|
|
141
141
|
- documentation/source/stylesheets/screen.css.scss
|
142
142
|
- lib/arctic/vendor.rb
|
143
143
|
- lib/arctic/vendor/api.rb
|
144
|
-
- lib/arctic/vendor/product.rb
|
145
144
|
- lib/arctic/vendor/uri.rb
|
146
145
|
- lib/arctic/vendor/vendor.rb
|
147
146
|
- lib/arctic/vendor/version.rb
|
@@ -1,47 +0,0 @@
|
|
1
|
-
module Arctic
|
2
|
-
module Vendor
|
3
|
-
class Product
|
4
|
-
class Characteristics
|
5
|
-
def initialize(characteristics)
|
6
|
-
@characteristics = characteristics
|
7
|
-
end
|
8
|
-
|
9
|
-
def method_missing(name, *args)
|
10
|
-
@characteristics[name.to_s]
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
attr_reader \
|
15
|
-
:product_hash,
|
16
|
-
:sku,
|
17
|
-
:characteristics,
|
18
|
-
:api,
|
19
|
-
:account_id,
|
20
|
-
:shop_id
|
21
|
-
|
22
|
-
def initialize(account_id, shop_id, product_hash, api_instance)
|
23
|
-
@product_hash = product_hash
|
24
|
-
|
25
|
-
@api = api_instance
|
26
|
-
|
27
|
-
@shop_id = shop_id
|
28
|
-
@account_id = account_id
|
29
|
-
|
30
|
-
@sku = product_hash.fetch 'sku'
|
31
|
-
@characteristics = Characteristics.new product_hash.fetch 'characteristics'
|
32
|
-
end
|
33
|
-
|
34
|
-
def update_state(state)
|
35
|
-
api.update_product_state account_id, shop_id, sku, state
|
36
|
-
end
|
37
|
-
|
38
|
-
def method_missing(name, *args)
|
39
|
-
if product_hash.stringify_keys.keys.include? name.to_s
|
40
|
-
product_hash.stringify_keys[name.to_s]
|
41
|
-
else
|
42
|
-
super name, *args
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|