vacuum 2.2.0 → 3.4.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.
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Keep SimpleCov at top.
4
+ require 'simplecov'
5
+
6
+ SimpleCov.start do
7
+ add_filter '/test/'
8
+ end
9
+
10
+ require 'minitest/autorun'
@@ -0,0 +1,62 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'integration_helper'
4
+
5
+ module Vacuum
6
+ class TestRequests < IntegrationTest
7
+ def test_get_browse_nodes
8
+ requests.each do |request|
9
+ response = request.get_browse_nodes(browse_node_ids: ['3045'])
10
+ assert_equal 200, response.status
11
+ end
12
+ end
13
+
14
+ def test_get_items
15
+ requests.each do |request|
16
+ response = request.get_items(item_ids: ['B07212L4G2'])
17
+ assert_equal 200, response.status
18
+ end
19
+ end
20
+
21
+ def test_get_items_with_all_resources
22
+ requests.each do |request|
23
+ response = request.get_items(item_ids: 'B07212L4G2',
24
+ resources: Resource.all)
25
+ assert_equal 200, response.status
26
+ item = response.dig('ItemsResult', 'Items').first
27
+ assert item.key?('BrowseNodeInfo')
28
+ end
29
+ end
30
+
31
+ def test_get_variations
32
+ requests.each do |request|
33
+ response = request.get_variations(asin: 'B07212L4G2')
34
+ assert_equal 200, response.status
35
+ end
36
+ end
37
+
38
+ def test_search_items
39
+ requests.each do |request|
40
+ response = request.search_items(keywords: 'Harry Potter')
41
+ assert_equal 200, response.status
42
+ end
43
+ end
44
+
45
+ def test_persistent
46
+ request = requests.sample
47
+ refute request.client.persistent?
48
+ request.persistent
49
+ assert request.client.persistent?
50
+ end
51
+
52
+ def test_logging
53
+ require 'logger'
54
+ logdev = StringIO.new
55
+ logger = Logger.new(logdev)
56
+ request = requests.sample
57
+ request.use(logging: { logger: logger })
58
+ request.search_items(keywords: 'Harry Potter')
59
+ refute_empty logdev.string
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'helper'
4
+ require 'vcr'
5
+
6
+ require 'locales'
7
+ require 'vacuum'
8
+ require 'vacuum/matcher'
9
+
10
+ VCR.configure do |c|
11
+ c.hook_into :webmock
12
+ c.cassette_library_dir = 'test/cassettes'
13
+ c.default_cassette_options = {
14
+ match_requests_on: [Vacuum::Matcher],
15
+ record: ENV['RECORD'] ? :new_episodes : :none
16
+ }
17
+ c.before_record do |interaction|
18
+ interaction.ignore! if interaction.response.status.code != 200
19
+ end
20
+
21
+ Locales.each do |record|
22
+ record.each do |key, val|
23
+ next if key == :marketplace
24
+
25
+ c.filter_sensitive_data(key.upcase) { val }
26
+ end
27
+ end
28
+ end
29
+
30
+ module Vacuum
31
+ class IntegrationTest < Minitest::Test
32
+ def setup
33
+ if ENV['LIVE']
34
+ VCR.turn_off!
35
+ WebMock.allow_net_connect!
36
+ else
37
+ VCR.insert_cassette('vacuum')
38
+ end
39
+ end
40
+
41
+ def teardown
42
+ VCR.eject_cassette if VCR.turned_on?
43
+ end
44
+
45
+ private
46
+
47
+ def requests
48
+ Locales.map { |credentials| Vacuum.new(**credentials) }.shuffle
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'forwardable'
4
+ require 'yaml'
5
+
6
+ module Locales
7
+ class << self
8
+ extend Forwardable
9
+ include Enumerable
10
+
11
+ attr_reader :all
12
+
13
+ def_delegators :all, :each
14
+ end
15
+
16
+ %w[locales.yml locales.yml.example].each do |filename|
17
+ path = File.expand_path(filename, __dir__)
18
+ if File.exist?(path)
19
+ @all = YAML.load_file(path)
20
+ break
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,28 @@
1
+ - :marketplace: CA
2
+ :access_key: AKIAIWQTVHVWCQA5THXQ
3
+ :secret_key: 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
4
+ :partner_tag: adabo00-20
5
+ - :marketplace: ES
6
+ :access_key: AKIAJJF26BJLZLSJLFBQ
7
+ :secret_key: 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
8
+ :partner_tag: adabo00-21
9
+ - :marketplace: DE
10
+ :access_key: AKIAJGN5UNM43HHV5MZA
11
+ :secret_key: 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
12
+ :partner_tag: adabo23-21
13
+ - :marketplace: FR
14
+ :access_key: AKIAJDNYBNMN23YBFK3A
15
+ :secret_key: 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
16
+ :partner_tag: adabo-21
17
+ - :marketplace: IT
18
+ :access_key: AKIAJVBAH4XJHK6YF46Q
19
+ :secret_key: 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
20
+ :partner_tag: adabo0c-21
21
+ - :marketplace: GB
22
+ :access_key: AKIAJPAXMP45DOQJPHJQ
23
+ :secret_key: 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
24
+ :partner_tag: adabo21-21
25
+ - :marketplace: US
26
+ :access_key: AKIAIWQTVHVWCQA5THXQ
27
+ :secret_key: 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
28
+ :partner_tag: adabo-20
@@ -0,0 +1,28 @@
1
+ - :marketplace: CA
2
+ :access_key: access_key
3
+ :secret_key: secret_key
4
+ :partner_tag: partner_tag
5
+ - :marketplace: ES
6
+ :access_key: access_key
7
+ :secret_key: secret_key
8
+ :partner_tag: partner_tag
9
+ - :marketplace: DE
10
+ :access_key: access_key
11
+ :secret_key: secret_key
12
+ :partner_tag: partner_tag
13
+ - :marketplace: FR
14
+ :access_key: access_key
15
+ :secret_key: secret_key
16
+ :partner_tag: partner_tag
17
+ - :marketplace: IT
18
+ :access_key: access_key
19
+ :secret_key: secret_key
20
+ :partner_tag: partner_tag
21
+ - :marketplace: GB
22
+ :access_key: access_key
23
+ :secret_key: secret_key
24
+ :partner_tag: partner_tag
25
+ - :marketplace: US
26
+ :access_key: access_key
27
+ :secret_key: secret_key
28
+ :partner_tag: partner_tag
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'helper'
4
+ require 'vacuum/locale'
5
+
6
+ module Vacuum
7
+ class TestLocale < Minitest::Test
8
+ def test_host
9
+ locale = Locale.new(:us, **credentials)
10
+ assert locale.host
11
+ end
12
+
13
+ def test_region
14
+ locale = Locale.new(:us, **credentials)
15
+ assert locale.region
16
+ end
17
+
18
+ def test_partner_type_default
19
+ locale = Locale.new(:us, **credentials)
20
+ assert locale.partner_type
21
+ end
22
+
23
+ def test_upcased_marketplace
24
+ Locale.new('US', **credentials) # does not raise
25
+ end
26
+
27
+ def test_uk
28
+ Locale.new(:uk, **credentials) # does not raise
29
+ end
30
+
31
+ def test_not_found
32
+ assert_raises Locale::NotFound do
33
+ Locale.new(:foo, **credentials)
34
+ end
35
+ end
36
+
37
+ private
38
+
39
+ def credentials
40
+ { access_key: '123', secret_key: '123', partner_tag: 'xyz-20' }
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'helper'
4
+ require 'vacuum/locale'
5
+ require 'vacuum/operation'
6
+
7
+ module Vacuum
8
+ class TestOperation < Minitest::Test
9
+ def setup
10
+ @operation = Operation.new('Action', params: { foo: 1 }, locale: locale)
11
+ end
12
+
13
+ def test_body
14
+ assert @operation.body
15
+ end
16
+
17
+ def test_url
18
+ assert @operation.url
19
+ end
20
+
21
+ def test_headers
22
+ assert @operation.headers
23
+ end
24
+
25
+ private
26
+
27
+ def locale
28
+ Locale.new(:us, access_key: '123', secret_key: '123', partner_tag: 'xyz')
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,61 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'helper'
4
+ require 'vacuum/request'
5
+
6
+ module Vacuum
7
+ class TestRequest < Minitest::Test
8
+ def test_search_keywords
9
+ err = assert_raises(ArgumentError) do
10
+ api.search_items(keywords: ['Harry Potter'])
11
+ end
12
+
13
+ assert_equal ':keyword argument expects a String', err.message
14
+ end
15
+
16
+ def test_search_resources
17
+ err = assert_raises(ArgumentError) do
18
+ api.search_items(
19
+ keywords: 'Harry Potter',
20
+ resources: %w[Images.Primary.Large ItemInfo.ExternalIds Offer.Listings.Price]
21
+ )
22
+ end
23
+
24
+ assert_equal 'There is not such resource: Offer.Listings.Price', err.message
25
+ end
26
+
27
+ def test_get_items_wrong_resource
28
+ err = assert_raises(ArgumentError) do
29
+ api.get_items(
30
+ item_ids: :B07212L4G2,
31
+ resources: %w[BrowseNodeInfo.BrowseNode.SalesRank]
32
+ )
33
+ end
34
+
35
+ assert_equal 'There is not such resource: BrowseNodeInfo.BrowseNode.SalesRank', err.message
36
+ end
37
+
38
+ def test_get_variations_wrong_resource
39
+ err = assert_raises(ArgumentError) do
40
+ api.get_variations(asin: 'B07212L4G2', resources: %w[BrowseNodeInfo.BrowseNode.SalesRank])
41
+ end
42
+
43
+ assert_equal 'There is not such resource: BrowseNodeInfo.BrowseNode.SalesRank', err.message
44
+ end
45
+
46
+ def test_resource_not_array
47
+ err = assert_raises(ArgumentError) do
48
+ api.get_items(item_ids: :B07212L4G2, resources: 'foo')
49
+ end
50
+
51
+ assert_equal ':resources argument expects an Array', err.message
52
+ end
53
+
54
+ def api
55
+ @api ||= Vacuum::Request.new(marketplace: 'US',
56
+ access_key: 'key',
57
+ secret_key: 'secret',
58
+ partner_tag: 'tag')
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'helper'
4
+ require 'vacuum/resource'
5
+
6
+ module Vacuum
7
+ class TestResource < Minitest::Test
8
+ def test_all
9
+ refute_empty Resource.all
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'helper'
4
+ require 'vacuum/response'
5
+
6
+ module Vacuum
7
+ class TestResponse < Minitest::Test
8
+ def setup
9
+ mock = Minitest::Mock.new
10
+ mock.expect(:body, %({"ItemsResult":{"Items":[{"ASIN":"B07212L4G2"}]}}))
11
+ @response = Response.new(mock)
12
+ end
13
+
14
+ def test_parse
15
+ assert @response.parse
16
+ end
17
+
18
+ def test_cast_to_hash
19
+ assert_kind_of Hash, @response.to_h
20
+ end
21
+
22
+ def test_dig
23
+ assert @response.dig('ItemsResult', 'Items')
24
+ end
25
+ end
26
+ end
metadata CHANGED
@@ -1,45 +1,46 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vacuum
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.0
4
+ version: 3.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Hakan Ensari
8
+ - Stanislav Katkov
8
9
  autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
- date: 2019-06-17 00:00:00.000000000 Z
12
+ date: 2020-05-27 00:00:00.000000000 Z
12
13
  dependencies:
13
14
  - !ruby/object:Gem::Dependency
14
- name: jeff
15
+ name: aws-sigv4
15
16
  requirement: !ruby/object:Gem::Requirement
16
17
  requirements:
17
18
  - - "~>"
18
19
  - !ruby/object:Gem::Version
19
- version: '2.0'
20
+ version: '1.0'
20
21
  type: :runtime
21
22
  prerelease: false
22
23
  version_requirements: !ruby/object:Gem::Requirement
23
24
  requirements:
24
25
  - - "~>"
25
26
  - !ruby/object:Gem::Version
26
- version: '2.0'
27
+ version: '1.0'
27
28
  - !ruby/object:Gem::Dependency
28
- name: multi_xml
29
+ name: http
29
30
  requirement: !ruby/object:Gem::Requirement
30
31
  requirements:
31
32
  - - "~>"
32
33
  - !ruby/object:Gem::Version
33
- version: 0.6.0
34
+ version: '4.0'
34
35
  type: :runtime
35
36
  prerelease: false
36
37
  version_requirements: !ruby/object:Gem::Requirement
37
38
  requirements:
38
39
  - - "~>"
39
40
  - !ruby/object:Gem::Version
40
- version: 0.6.0
41
+ version: '4.0'
41
42
  - !ruby/object:Gem::Dependency
42
- name: appraisal
43
+ name: minitest
43
44
  requirement: !ruby/object:Gem::Requirement
44
45
  requirements:
45
46
  - - ">="
@@ -53,7 +54,7 @@ dependencies:
53
54
  - !ruby/object:Gem::Version
54
55
  version: '0'
55
56
  - !ruby/object:Gem::Dependency
56
- name: minitest
57
+ name: rake
57
58
  requirement: !ruby/object:Gem::Requirement
58
59
  requirements:
59
60
  - - ">="
@@ -67,7 +68,7 @@ dependencies:
67
68
  - !ruby/object:Gem::Version
68
69
  version: '0'
69
70
  - !ruby/object:Gem::Dependency
70
- name: pry
71
+ name: rubocop
71
72
  requirement: !ruby/object:Gem::Requirement
72
73
  requirements:
73
74
  - - ">="
@@ -81,7 +82,21 @@ dependencies:
81
82
  - !ruby/object:Gem::Version
82
83
  version: '0'
83
84
  - !ruby/object:Gem::Dependency
84
- name: rake
85
+ name: simplecov
86
+ requirement: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - '='
89
+ - !ruby/object:Gem::Version
90
+ version: 0.17.1
91
+ type: :development
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - '='
96
+ - !ruby/object:Gem::Version
97
+ version: 0.17.1
98
+ - !ruby/object:Gem::Dependency
99
+ name: vcr
85
100
  requirement: !ruby/object:Gem::Requirement
86
101
  requirements:
87
102
  - - ">="
@@ -95,7 +110,7 @@ dependencies:
95
110
  - !ruby/object:Gem::Version
96
111
  version: '0'
97
112
  - !ruby/object:Gem::Dependency
98
- name: rubocop
113
+ name: webmock
99
114
  requirement: !ruby/object:Gem::Requirement
100
115
  requirements:
101
116
  - - ">="
@@ -109,7 +124,7 @@ dependencies:
109
124
  - !ruby/object:Gem::Version
110
125
  version: '0'
111
126
  - !ruby/object:Gem::Dependency
112
- name: vcr
127
+ name: yard
113
128
  requirement: !ruby/object:Gem::Requirement
114
129
  requirements:
115
130
  - - ">="
@@ -125,6 +140,7 @@ dependencies:
125
140
  description: A wrapper to the Amazon Product Advertising API
126
141
  email:
127
142
  - me@hakanensari.com
143
+ - sk@skylup.com
128
144
  executables: []
129
145
  extensions: []
130
146
  extra_rdoc_files: []
@@ -132,12 +148,25 @@ files:
132
148
  - LICENSE
133
149
  - README.md
134
150
  - lib/vacuum.rb
151
+ - lib/vacuum/locale.rb
152
+ - lib/vacuum/matcher.rb
153
+ - lib/vacuum/operation.rb
135
154
  - lib/vacuum/request.rb
155
+ - lib/vacuum/resource.rb
136
156
  - lib/vacuum/response.rb
137
157
  - lib/vacuum/version.rb
138
158
  - test/cassettes/vacuum.yml
139
- - test/test_integration.rb
140
- - test/test_unit.rb
159
+ - test/helper.rb
160
+ - test/integration/test_requests.rb
161
+ - test/integration_helper.rb
162
+ - test/locales.rb
163
+ - test/locales.yml
164
+ - test/locales.yml.example
165
+ - test/unit/test_locale.rb
166
+ - test/unit/test_operation.rb
167
+ - test/unit/test_request.rb
168
+ - test/unit/test_resource.rb
169
+ - test/unit/test_response.rb
141
170
  homepage: https://github.com/hakanensari/vacuum
142
171
  licenses:
143
172
  - MIT
@@ -150,18 +179,27 @@ required_ruby_version: !ruby/object:Gem::Requirement
150
179
  requirements:
151
180
  - - ">="
152
181
  - !ruby/object:Gem::Version
153
- version: '2.3'
182
+ version: '2.5'
154
183
  required_rubygems_version: !ruby/object:Gem::Requirement
155
184
  requirements:
156
185
  - - ">="
157
186
  - !ruby/object:Gem::Version
158
187
  version: '0'
159
188
  requirements: []
160
- rubygems_version: 3.0.3
189
+ rubygems_version: 3.1.2
161
190
  signing_key:
162
191
  specification_version: 4
163
192
  summary: Amazon Product Advertising in Ruby
164
193
  test_files:
165
- - test/test_integration.rb
194
+ - test/unit/test_operation.rb
195
+ - test/unit/test_request.rb
196
+ - test/unit/test_resource.rb
197
+ - test/unit/test_response.rb
198
+ - test/unit/test_locale.rb
199
+ - test/helper.rb
200
+ - test/integration/test_requests.rb
166
201
  - test/cassettes/vacuum.yml
167
- - test/test_unit.rb
202
+ - test/integration_helper.rb
203
+ - test/locales.rb
204
+ - test/locales.yml
205
+ - test/locales.yml.example