cnf 1.4.1
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 +7 -0
- data/lib/cnf.rb +56 -0
- data/lib/cnf/catalog.rb +199 -0
- data/lib/cnf/marketplace.rb +15 -0
- data/lib/cnf/watcher.rb +45 -0
- metadata +133 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 0be447ca1371b02e03647742a5f43ea44f684290
|
4
|
+
data.tar.gz: 168bf46f1e70811be0da5267491ebdfb93f12e62
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: ead22cfa545185e5e0abc8a993af3a9e2db2b3a18017a349a25a9c96e7fbdd5c2bbcafe250a057053e9722abe125a371d8fcdb5d264844e15d53115174f253ed
|
7
|
+
data.tar.gz: 4014641fa7d5ad89b50ba06298bb6d93d652c4c615a608182259770a37cfc15f2bb22d6d7cbd932756c760592f497573f0fb637c5cf24dfde56d2e0f12ca1c66
|
data/lib/cnf.rb
ADDED
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'excon'
|
3
|
+
require 'recursive-open-struct'
|
4
|
+
require 'cnf/watcher'
|
5
|
+
|
6
|
+
module Cnf
|
7
|
+
extend self
|
8
|
+
|
9
|
+
def fetch_data
|
10
|
+
@_cnf ||= begin
|
11
|
+
res = Excon.get(url, headers: headers)
|
12
|
+
RecursiveOpenStruct.new(JSON.load(res.body), recurse_over_arrays: true)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
alias_method :all, :fetch_data
|
16
|
+
|
17
|
+
def method_missing(m, *args, &block)
|
18
|
+
fetch_data.send(m)
|
19
|
+
end
|
20
|
+
|
21
|
+
def hosts
|
22
|
+
return if amazon.nil?
|
23
|
+
|
24
|
+
amazon.map do |catalog|
|
25
|
+
[ catalog.marketplace.country_code, catalog.api_hostname ]
|
26
|
+
end.to_h
|
27
|
+
end
|
28
|
+
|
29
|
+
def marketplace_ids
|
30
|
+
return if amazon.nil?
|
31
|
+
|
32
|
+
amazon.map do |catalog|
|
33
|
+
[ catalog.marketplace.country_code, catalog.marketplace.id ]
|
34
|
+
end.to_h
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def headers
|
40
|
+
{
|
41
|
+
header_key => header_value
|
42
|
+
}
|
43
|
+
end
|
44
|
+
|
45
|
+
def url
|
46
|
+
ENV['CONFIGURATION_URL']
|
47
|
+
end
|
48
|
+
|
49
|
+
def header_key
|
50
|
+
ENV['CONFIGURATION_HEADER_KEY']
|
51
|
+
end
|
52
|
+
|
53
|
+
def header_value
|
54
|
+
ENV['CONFIGURATION_HEADER_VALUE']
|
55
|
+
end
|
56
|
+
end
|
data/lib/cnf/catalog.rb
ADDED
@@ -0,0 +1,199 @@
|
|
1
|
+
require 'forwardable'
|
2
|
+
require 'virtus'
|
3
|
+
require 'cnf/marketplace'
|
4
|
+
require 'cnf'
|
5
|
+
|
6
|
+
module Cnf
|
7
|
+
class Catalog
|
8
|
+
include Virtus.model
|
9
|
+
|
10
|
+
attribute :aws_access_key_id, String
|
11
|
+
attribute :aws_secret_key, String
|
12
|
+
attribute :merchant_id, String
|
13
|
+
attribute :marketplace, Marketplace
|
14
|
+
|
15
|
+
class << self
|
16
|
+
extend Forwardable
|
17
|
+
include Enumerable
|
18
|
+
|
19
|
+
def_delegator :data, :each
|
20
|
+
alias :all :to_a
|
21
|
+
|
22
|
+
def data
|
23
|
+
@data ||= Cnf.amazon.map { |country| new(country.to_h) }
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def name
|
28
|
+
marketplace.hostname
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.names
|
32
|
+
map(&:name) + Cnf::AbebooksCatalog.names
|
33
|
+
end
|
34
|
+
|
35
|
+
def country
|
36
|
+
marketplace.country_code
|
37
|
+
end
|
38
|
+
|
39
|
+
def currency
|
40
|
+
marketplace.currency_code
|
41
|
+
end
|
42
|
+
|
43
|
+
def supported_parent_offer?(_)
|
44
|
+
true
|
45
|
+
end
|
46
|
+
|
47
|
+
alias_method :seller, :merchant_id
|
48
|
+
|
49
|
+
def marketplace_id
|
50
|
+
marketplace.id
|
51
|
+
end
|
52
|
+
|
53
|
+
def in?(marketplace_ids)
|
54
|
+
active? && marketplace_ids.include?(marketplace_id)
|
55
|
+
end
|
56
|
+
|
57
|
+
def active?
|
58
|
+
Cnf.active_channels.include? marketplace.country_code
|
59
|
+
end
|
60
|
+
|
61
|
+
def language
|
62
|
+
marketplace.language_code
|
63
|
+
end
|
64
|
+
|
65
|
+
def self.filter_by_marketplace(marketplace_ids)
|
66
|
+
Catalog.select { |catalog| catalog.in? marketplace_ids }
|
67
|
+
end
|
68
|
+
|
69
|
+
def self.find_catalog_by_country_code(country_code)
|
70
|
+
Catalog.find { |catalog| catalog.country == country_code }
|
71
|
+
end
|
72
|
+
|
73
|
+
def self.find_by_name(name)
|
74
|
+
return TestCatalog.call if name == 'www.amazon.com-richardson'
|
75
|
+
return AbebooksCatalog.find_by_name(name) if name =~ /abebooks/
|
76
|
+
return MiraklCatalog.find_by_name(name) if name =~ /libro/
|
77
|
+
Catalog.find { |catalog| catalog.name == name }
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
class AbebooksCatalog
|
82
|
+
include Virtus.model
|
83
|
+
|
84
|
+
attribute :id, String
|
85
|
+
attribute :password, String
|
86
|
+
attribute :name, String
|
87
|
+
attribute :language, String
|
88
|
+
attribute :country, String
|
89
|
+
attribute :currency, String
|
90
|
+
attribute :pricing_method, String
|
91
|
+
attribute :active, Boolean
|
92
|
+
attribute :flat_rate, Float
|
93
|
+
attribute :parent_offer_conditions, Array
|
94
|
+
attribute :borrowable_offer_conditions, Array
|
95
|
+
|
96
|
+
class << self
|
97
|
+
extend Forwardable
|
98
|
+
include Enumerable
|
99
|
+
|
100
|
+
def_delegator :data, :each
|
101
|
+
alias :all :to_a
|
102
|
+
|
103
|
+
def data
|
104
|
+
@data ||= Cnf.abebooks_channels.map do |channel|
|
105
|
+
new(channel.to_h)
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
def self.names
|
111
|
+
map(&:name)
|
112
|
+
end
|
113
|
+
|
114
|
+
def self.call
|
115
|
+
warn "[DEPRECATION] `call` is deprecated. Please use `find_by_name(name)` instead."
|
116
|
+
Catalog.new(
|
117
|
+
marketplace: {
|
118
|
+
country_code: "US",
|
119
|
+
currency_code: "USD",
|
120
|
+
hostname: "www.abebooks.com",
|
121
|
+
id: "abebooks",
|
122
|
+
language_code: "en"
|
123
|
+
}
|
124
|
+
)
|
125
|
+
end
|
126
|
+
|
127
|
+
def self.active
|
128
|
+
AbebooksCatalog.select { |catalog| catalog.active }
|
129
|
+
end
|
130
|
+
|
131
|
+
def self.find_by_name(name)
|
132
|
+
AbebooksCatalog.find { |catalog| catalog.name == name }
|
133
|
+
end
|
134
|
+
|
135
|
+
def use_flat_rate?
|
136
|
+
pricing_method == 'flat_rate'
|
137
|
+
end
|
138
|
+
|
139
|
+
def use_competition?
|
140
|
+
pricing_method == 'competition'
|
141
|
+
end
|
142
|
+
|
143
|
+
def supported_parent_offer?(offer)
|
144
|
+
matches_any_conditions?(parent_offer_conditions, offer)
|
145
|
+
end
|
146
|
+
|
147
|
+
def borrowable_offer?(offer)
|
148
|
+
matches_any_conditions?(borrowable_offer_conditions, offer)
|
149
|
+
end
|
150
|
+
|
151
|
+
def matches_any_conditions?(conditions, offer)
|
152
|
+
conditions.any? do |hash|
|
153
|
+
hash.all? do |attribute, value|
|
154
|
+
offer[attribute.to_sym] == value
|
155
|
+
end
|
156
|
+
end
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
class MiraklCatalog < AbebooksCatalog
|
161
|
+
attribute :api_url, String
|
162
|
+
|
163
|
+
class << self
|
164
|
+
extend Forwardable
|
165
|
+
include Enumerable
|
166
|
+
|
167
|
+
def_delegator :data, :each
|
168
|
+
alias :all :to_a
|
169
|
+
|
170
|
+
def data
|
171
|
+
@data ||= Cnf.mirakl_channels.map do |channel|
|
172
|
+
new(channel.to_h)
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
def active
|
177
|
+
MiraklCatalog.select { |catalog| catalog.active }
|
178
|
+
end
|
179
|
+
|
180
|
+
def find_by_name(name)
|
181
|
+
MiraklCatalog.find { |catalog| catalog.name == name }
|
182
|
+
end
|
183
|
+
end
|
184
|
+
end
|
185
|
+
|
186
|
+
class TestCatalog
|
187
|
+
def self.call
|
188
|
+
Catalog.new(
|
189
|
+
marketplace: {
|
190
|
+
country_code: "US",
|
191
|
+
currency_code: "USD",
|
192
|
+
hostname: "www.amazon.com",
|
193
|
+
language_code: "en"
|
194
|
+
},
|
195
|
+
merchant_id: "A2R2OHJS21PGNN"
|
196
|
+
)
|
197
|
+
end
|
198
|
+
end
|
199
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'forwardable'
|
2
|
+
require 'virtus'
|
3
|
+
require 'cnf'
|
4
|
+
|
5
|
+
module Cnf
|
6
|
+
class Marketplace
|
7
|
+
include Virtus.model
|
8
|
+
|
9
|
+
attribute :id, String
|
10
|
+
attribute :country_code, String
|
11
|
+
attribute :currency_code, String
|
12
|
+
attribute :language_code, String
|
13
|
+
attribute :hostname, String
|
14
|
+
end
|
15
|
+
end
|
data/lib/cnf/watcher.rb
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'redis'
|
2
|
+
require 'cnf'
|
3
|
+
|
4
|
+
module Cnf
|
5
|
+
class Watcher
|
6
|
+
def self.call
|
7
|
+
new().call
|
8
|
+
end
|
9
|
+
|
10
|
+
attr_reader :redis
|
11
|
+
|
12
|
+
def initialize
|
13
|
+
@redis = Redis.new(url: ENV["REDIS_PUBSUB_URL"])
|
14
|
+
end
|
15
|
+
|
16
|
+
def channel
|
17
|
+
"console"
|
18
|
+
end
|
19
|
+
|
20
|
+
def call
|
21
|
+
keep_connecting(redis) do
|
22
|
+
redis.subscribe(channel) do |on|
|
23
|
+
on.message do |_, msg|
|
24
|
+
on_message_received(msg)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def on_message_received(_)
|
31
|
+
raise NotImplementedError.new
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
def keep_connecting(redis)
|
37
|
+
begin
|
38
|
+
yield
|
39
|
+
rescue Redis::CannotConnectError
|
40
|
+
sleep 5
|
41
|
+
retry
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
metadata
ADDED
@@ -0,0 +1,133 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: cnf
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.4.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Jacek Jakubik
|
8
|
+
- Marek Waligórski
|
9
|
+
- Hakan Ensari
|
10
|
+
- Marek Mikołajczyk
|
11
|
+
autorequire:
|
12
|
+
bindir: bin
|
13
|
+
cert_chain: []
|
14
|
+
date: 2017-03-28 00:00:00.000000000 Z
|
15
|
+
dependencies:
|
16
|
+
- !ruby/object:Gem::Dependency
|
17
|
+
name: excon
|
18
|
+
requirement: !ruby/object:Gem::Requirement
|
19
|
+
requirements:
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 0.45.0
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
requirements:
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 0.45.0
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: recursive-open-struct
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
requirements:
|
34
|
+
- - "~>"
|
35
|
+
- !ruby/object:Gem::Version
|
36
|
+
version: '1.0'
|
37
|
+
type: :runtime
|
38
|
+
prerelease: false
|
39
|
+
version_requirements: !ruby/object:Gem::Requirement
|
40
|
+
requirements:
|
41
|
+
- - "~>"
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '1.0'
|
44
|
+
- !ruby/object:Gem::Dependency
|
45
|
+
name: redis
|
46
|
+
requirement: !ruby/object:Gem::Requirement
|
47
|
+
requirements:
|
48
|
+
- - "~>"
|
49
|
+
- !ruby/object:Gem::Version
|
50
|
+
version: '3.3'
|
51
|
+
type: :runtime
|
52
|
+
prerelease: false
|
53
|
+
version_requirements: !ruby/object:Gem::Requirement
|
54
|
+
requirements:
|
55
|
+
- - "~>"
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
version: '3.3'
|
58
|
+
- !ruby/object:Gem::Dependency
|
59
|
+
name: virtus
|
60
|
+
requirement: !ruby/object:Gem::Requirement
|
61
|
+
requirements:
|
62
|
+
- - ">="
|
63
|
+
- !ruby/object:Gem::Version
|
64
|
+
version: 1.0.5
|
65
|
+
type: :runtime
|
66
|
+
prerelease: false
|
67
|
+
version_requirements: !ruby/object:Gem::Requirement
|
68
|
+
requirements:
|
69
|
+
- - ">="
|
70
|
+
- !ruby/object:Gem::Version
|
71
|
+
version: 1.0.5
|
72
|
+
- !ruby/object:Gem::Dependency
|
73
|
+
name: rspec
|
74
|
+
requirement: !ruby/object:Gem::Requirement
|
75
|
+
requirements:
|
76
|
+
- - ">="
|
77
|
+
- !ruby/object:Gem::Version
|
78
|
+
version: '0'
|
79
|
+
type: :development
|
80
|
+
prerelease: false
|
81
|
+
version_requirements: !ruby/object:Gem::Requirement
|
82
|
+
requirements:
|
83
|
+
- - ">="
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '0'
|
86
|
+
- !ruby/object:Gem::Dependency
|
87
|
+
name: rspec-its
|
88
|
+
requirement: !ruby/object:Gem::Requirement
|
89
|
+
requirements:
|
90
|
+
- - ">="
|
91
|
+
- !ruby/object:Gem::Version
|
92
|
+
version: '0'
|
93
|
+
type: :development
|
94
|
+
prerelease: false
|
95
|
+
version_requirements: !ruby/object:Gem::Requirement
|
96
|
+
requirements:
|
97
|
+
- - ">="
|
98
|
+
- !ruby/object:Gem::Version
|
99
|
+
version: '0'
|
100
|
+
description:
|
101
|
+
email:
|
102
|
+
executables: []
|
103
|
+
extensions: []
|
104
|
+
extra_rdoc_files: []
|
105
|
+
files:
|
106
|
+
- lib/cnf.rb
|
107
|
+
- lib/cnf/catalog.rb
|
108
|
+
- lib/cnf/marketplace.rb
|
109
|
+
- lib/cnf/watcher.rb
|
110
|
+
homepage:
|
111
|
+
licenses: []
|
112
|
+
metadata: {}
|
113
|
+
post_install_message:
|
114
|
+
rdoc_options: []
|
115
|
+
require_paths:
|
116
|
+
- lib
|
117
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
118
|
+
requirements:
|
119
|
+
- - ">="
|
120
|
+
- !ruby/object:Gem::Version
|
121
|
+
version: '0'
|
122
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
123
|
+
requirements:
|
124
|
+
- - ">="
|
125
|
+
- !ruby/object:Gem::Version
|
126
|
+
version: '0'
|
127
|
+
requirements: []
|
128
|
+
rubyforge_project:
|
129
|
+
rubygems_version: 2.5.1
|
130
|
+
signing_key:
|
131
|
+
specification_version: 4
|
132
|
+
summary: Fetches stack configuration
|
133
|
+
test_files: []
|