Module: Arctic::Vendor

Defined in:
lib/arctic/vendor.rb,
lib/arctic/vendor/api.rb,
lib/arctic/vendor/vendor.rb,
lib/arctic/vendor/version.rb

Defined Under Namespace

Classes: API

Constant Summary collapse

MAX_THREADS =
ENV.fetch('MAX_THREADS', 4).to_s.to_i.freeze
VERSION =
"1.0.1"

Class Method Summary collapse

Class Method Details

.api(*args) ⇒ Object



40
41
42
# File 'lib/arctic/vendor/vendor.rb', line 40

def api(*args)
  @api ||= Arctic::Vendor::API.new(*args)
end

.collect_currencies(&block) ⇒ Object



24
25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/arctic/vendor/vendor.rb', line 24

def collect_currencies(&block)
  Arctic.logger.info "Collecting currencies from collection shop"

  currencies_count = 0

  seconds = time do
    each_shop(:collection) do |shop|
      currencies = api.send_currencies shop['id'], yield(shop)
      currencies_count += currencies.size
    end
  end

  Arctic.logger.info "Collected #{currencies_count} exchange rates in #{seconds} seconds."
end

.collect_products(&block) ⇒ Object

Fetches all products from all shops, where this vendor is the source vendor and pushes them to the Core API.



54
55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/arctic/vendor/vendor.rb', line 54

def collect_products(&block)
  Arctic.logger.info "Collecting products from vendor..."
  products_count = 0

  seconds = time do
    each_shop(:collection) do |shop|
      products = api.send_products shop['id'], yield(shop)
      products_count += products.size
    end
  end

  Arctic.logger.info "Collected #{products_count} products in #{seconds} seconds"
end

.distribute_products(**params) ⇒ Object

Fetches all products from the Core API and distributes them to the target vendors



71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
# File 'lib/arctic/vendor/vendor.rb', line 71

def distribute_products(**params)
  Arctic.logger.info "Distributing products to target vendor..."
  products_count = 0

  params.reverse_merge! \
    batch_size: 100

  seconds = time do
    each_shop(:dispersal) do |shop|
      api.list_products(shop['id'], params) do |products|
        products_count += products.size
        yield shop, products
        # api.update_products shop['id'], products, dispersed_at: Time.now.to_s(:db)
      end
    end
  end

  Arctic.logger.info "Distributed #{products_count} products in #{seconds} seconds"
end

.each_shop(type = :collection) ⇒ Object



17
18
19
20
21
# File 'lib/arctic/vendor/vendor.rb', line 17

def each_shop(type = :collection)
  api.list_shops.with_indifferent_access[type].each do |shop|
    yield shop
  end
end

.threaded(collection, &block) ⇒ Object



5
6
7
8
9
10
11
12
13
14
# File 'lib/arctic/vendor/vendor.rb', line 5

def threaded(collection, &block)
  threads = Arctic::Vendor::MAX_THREADS.times.collect do
    Thread.new do
      while item = collection.pop do
        yield item
      end
    end
  end
  threads.compact.map &:join
end

.timeObject



45
46
47
48
49
# File 'lib/arctic/vendor/vendor.rb', line 45

def time
  t1 = Time.now.to_f
  yield
  Time.now.to_f - t1
end