vacuum 2.2.0 → 3.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.
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'minitest/autorun'
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
+ HTTPI.log = false
31
+
32
+ module Vacuum
33
+ class IntegrationTest < Minitest::Test
34
+ def setup
35
+ if ENV['LIVE']
36
+ VCR.turn_off!
37
+ WebMock.allow_net_connect!
38
+ else
39
+ VCR.insert_cassette('vacuum')
40
+ end
41
+ end
42
+
43
+ def teardown
44
+ VCR.eject_cassette if VCR.turned_on?
45
+ end
46
+
47
+ private
48
+
49
+ def requests
50
+ Locales.map { |credentials| Vacuum.new(credentials) }.shuffle
51
+ end
52
+ end
53
+ 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: DE
6
+ :access_key: AKIAIRMMTDVD7JUI65HA
7
+ :secret_key: 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
8
+ :partner_tag: partly0e-21
9
+ - :marketplace: ES
10
+ :access_key: AKIAIRMMTDVD7JUI65HA
11
+ :secret_key: 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
12
+ :partner_tag: partly01-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: AKIAIIJY6LYBYWTHITZQ
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,20 @@
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: GB
14
+ :access_key: access_key
15
+ :secret_key: secret_key
16
+ :partner_tag: partner_tag
17
+ - :marketplace: US
18
+ :access_key: access_key
19
+ :secret_key: secret_key
20
+ :partner_tag: partner_tag
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'minitest/autorun'
4
+ require 'vacuum/locale'
5
+
6
+ module Vacuum
7
+ class TestLocale < Minitest::Test
8
+ def test_find
9
+ assert_kind_of Locale, Locale.find(:us)
10
+ end
11
+
12
+ def test_find_uppercase_string
13
+ assert_kind_of Locale, Locale.find('US')
14
+ end
15
+
16
+ def test_find_uk
17
+ assert_equal :gb, Locale.find('UK').code
18
+ end
19
+
20
+ def test_raise_if_not_found
21
+ assert_raises Locale::NotFound do
22
+ Locale.find('foo')
23
+ end
24
+ end
25
+
26
+ def test_build_url
27
+ assert_equal 'https://webservices.amazon.com/paapi5/foo',
28
+ Locale.find('US').build_url('Foo')
29
+ end
30
+
31
+ def test_marketplace
32
+ assert_equal 'www.amazon.com', Locale.find('US').marketplace
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'integration_helper'
4
+
5
+ module Vacuum
6
+ class RequestTest < IntegrationTest
7
+ def test_get_browse_nodes
8
+ requests.each do |request|
9
+ response = request.get_browse_nodes(browse_node_ids: ['3045'])
10
+ refute response.error?
11
+ end
12
+ end
13
+
14
+ def test_get_items
15
+ requests.each do |request|
16
+ response = request.get_items(item_ids: ['B07212L4G2'])
17
+ refute response.error?
18
+ end
19
+ end
20
+
21
+ def test_get_items_with_options
22
+ requests.each do |request|
23
+ response = request.get_items(item_ids: 'B07212L4G2',
24
+ resources: ['BrowseNodeInfo.BrowseNodes'])
25
+ item = response.dig('ItemsResult', 'Items').first
26
+ assert item.key?('BrowseNodeInfo')
27
+ end
28
+ end
29
+
30
+ def test_get_variations
31
+ requests.each do |request|
32
+ response = request.get_variations(asin: 'B07212L4G2')
33
+ refute response.error?
34
+ end
35
+ end
36
+
37
+ def test_search_items
38
+ requests.each do |request|
39
+ response = request.search_items(keywords: 'Harry Potter')
40
+ refute response.error?
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'minitest/autorun'
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_cast_to_hash
15
+ assert_kind_of Hash, @response.to_h
16
+ end
17
+
18
+ def test_dig
19
+ assert @response.dig('ItemsResult', 'Items')
20
+ end
21
+ end
22
+ end
metadata CHANGED
@@ -1,45 +1,45 @@
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.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Hakan Ensari
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-06-17 00:00:00.000000000 Z
11
+ date: 2019-10-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: jeff
14
+ name: aws-sigv4
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '2.0'
19
+ version: '1.0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '2.0'
26
+ version: '1.0'
27
27
  - !ruby/object:Gem::Dependency
28
- name: multi_xml
28
+ name: httpi
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 0.6.0
33
+ version: '2.0'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: 0.6.0
40
+ version: '2.0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: appraisal
42
+ name: minitest
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - ">="
@@ -53,7 +53,7 @@ dependencies:
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
- name: minitest
56
+ name: rake
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - ">="
@@ -67,7 +67,7 @@ dependencies:
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
- name: pry
70
+ name: rubocop
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - ">="
@@ -81,7 +81,7 @@ dependencies:
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
83
  - !ruby/object:Gem::Dependency
84
- name: rake
84
+ name: vcr
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - ">="
@@ -95,7 +95,7 @@ dependencies:
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0'
97
97
  - !ruby/object:Gem::Dependency
98
- name: rubocop
98
+ name: webmock
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
101
  - - ">="
@@ -109,7 +109,7 @@ dependencies:
109
109
  - !ruby/object:Gem::Version
110
110
  version: '0'
111
111
  - !ruby/object:Gem::Dependency
112
- name: vcr
112
+ name: yard
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
115
  - - ">="
@@ -132,12 +132,19 @@ files:
132
132
  - LICENSE
133
133
  - README.md
134
134
  - lib/vacuum.rb
135
+ - lib/vacuum/locale.rb
136
+ - lib/vacuum/matcher.rb
135
137
  - lib/vacuum/request.rb
136
138
  - lib/vacuum/response.rb
137
139
  - lib/vacuum/version.rb
138
140
  - test/cassettes/vacuum.yml
139
- - test/test_integration.rb
140
- - test/test_unit.rb
141
+ - test/integration_helper.rb
142
+ - test/locales.rb
143
+ - test/locales.yml
144
+ - test/locales.yml.example
145
+ - test/vacuum/test_locale.rb
146
+ - test/vacuum/test_request.rb
147
+ - test/vacuum/test_response.rb
141
148
  homepage: https://github.com/hakanensari/vacuum
142
149
  licenses:
143
150
  - MIT
@@ -150,7 +157,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
150
157
  requirements:
151
158
  - - ">="
152
159
  - !ruby/object:Gem::Version
153
- version: '2.3'
160
+ version: '2.4'
154
161
  required_rubygems_version: !ruby/object:Gem::Requirement
155
162
  requirements:
156
163
  - - ">="
@@ -162,6 +169,11 @@ signing_key:
162
169
  specification_version: 4
163
170
  summary: Amazon Product Advertising in Ruby
164
171
  test_files:
165
- - test/test_integration.rb
172
+ - test/vacuum/test_request.rb
173
+ - test/vacuum/test_response.rb
174
+ - test/vacuum/test_locale.rb
166
175
  - test/cassettes/vacuum.yml
167
- - test/test_unit.rb
176
+ - test/integration_helper.rb
177
+ - test/locales.rb
178
+ - test/locales.yml
179
+ - test/locales.yml.example
@@ -1,69 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'minitest/autorun'
4
- require 'vcr'
5
- require_relative '../lib/vacuum'
6
-
7
- ENV['AWS_ACCESS_KEY_ID'] ||= 'key'
8
- ENV['AWS_SECRET_ACCESS_KEY'] ||= 'secret'
9
-
10
- VCR.configure do |c|
11
- c.hook_into :excon
12
- c.cassette_library_dir = 'test/cassettes'
13
- c.default_cassette_options = {
14
- match_requests_on: [VCR.request_matchers.uri_without_param(
15
- 'AWSAccessKeyId', 'AssociateTag', 'Signature', 'Timestamp', 'Version'
16
- )],
17
- record: :new_episodes
18
- }
19
- end
20
-
21
- class TestIntegration < Minitest::Test
22
- include Vacuum
23
-
24
- def setup
25
- VCR.insert_cassette('vacuum')
26
- end
27
-
28
- def teardown
29
- VCR.eject_cassette
30
- end
31
-
32
- def test_happy_path
33
- req = Vacuum.new
34
- req.associate_tag = 'foo'
35
- params = { 'SearchIndex' => 'All', 'Keywords' => 'vacuum' }
36
- res = req.item_search(query: params)
37
- assert res.dig('ItemSearchResponse', 'Items', 'Item')
38
- end
39
-
40
- def test_encoding_issues
41
- params = { 'SearchIndex' => 'All', 'Keywords' => 'google' }
42
- titles = locales.flat_map do |locale|
43
- req = Vacuum.new(locale)
44
- req.associate_tag = 'foo'
45
- res = req.item_search(query: params)
46
- items = res.dig('ItemSearchResponse', 'Items', 'Item') || []
47
- items.map { |item| item['ItemAttributes']['Title'] }
48
- end
49
- encodings = titles.map { |t| t.encoding.name }.uniq
50
-
51
- # Newer JRuby now appears to return both US-ASCII and UTF-8, depending on
52
- # whether the string has non-ASCII characters. MRI will only return latter.
53
- assert(encodings.any? { |encoding| encoding == 'UTF-8' })
54
- end
55
-
56
- def test_unauthorized_errors
57
- req = Vacuum.new
58
- req.associate_tag = 'foo'
59
- params = { 'SearchIndex' => 'All', 'Keywords' => 'amazon' }
60
- res = req.item_search(query: params)
61
- assert_equal 'InvalidClientTokenId', res.dig('ItemSearchErrorResponse', 'Error', 'Code')
62
- end
63
-
64
- private
65
-
66
- def locales
67
- Request::HOSTS.keys
68
- end
69
- end
@@ -1,106 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'minitest/autorun'
4
- require_relative '../lib/vacuum'
5
-
6
- class TestVacuum < Minitest::Test
7
- include Vacuum
8
-
9
- def setup
10
- @req = Request.new
11
- end
12
-
13
- def teardown
14
- Excon.stubs.clear
15
- end
16
-
17
- def test_requires_valid_locale
18
- assert_raises(Request::BadLocale) { Request.new('foo') }
19
- end
20
-
21
- def test_defaults_to_us_endpoint
22
- assert_equal 'http://webservices.amazon.com/onca/xml', @req.aws_endpoint
23
- end
24
-
25
- def test_defaults_to_latest_api_version
26
- assert_equal Request::LATEST_VERSION, @req.version
27
- end
28
-
29
- def test_accepts_uk_as_locale
30
- Request.new('UK')
31
- end
32
-
33
- def test_accepts_mx_as_locale
34
- Request.new('MX')
35
- end
36
-
37
- def test_fetches_parsable_response
38
- Excon.stub({}, body: '<foo/>')
39
- res = @req.item_lookup({}, mock: true)
40
- refute_empty res.parse
41
- end
42
-
43
- def test_alternative_query_syntax
44
- Excon.stub({}, body: '<foo/>')
45
- res = @req.item_lookup(query: {}, mock: true)
46
- refute_empty res.parse
47
- end
48
-
49
- def test_force_encodes_body
50
- res = Object.new
51
- def res.body
52
- (+'').force_encoding(Encoding::ASCII_8BIT)
53
- end
54
- assert_equal 'UTF-8', Response.new(res).body.encoding.name
55
- end
56
-
57
- def test_sets_custom_parser_on_class_level
58
- original_parser = Response.parser
59
- Excon.stub({}, body: '<foo/>')
60
- parser = MiniTest::Mock.new
61
- parser.expect(:parse, '123', ['<foo/>'])
62
- Response.parser = parser
63
- res = @req.item_lookup(query: {}, mock: true)
64
- assert_equal '123', res.parse
65
- Response.parser = original_parser # clean up
66
- end
67
-
68
- def test_sets_custom_parser_on_instance_level
69
- Excon.stub({}, body: '<foo/>')
70
- res = @req.item_lookup(query: {}, mock: true)
71
- parser = MiniTest::Mock.new
72
- parser.expect(:parse, '123', ['<foo/>'])
73
- res.parser = parser
74
- assert_equal '123', res.parse
75
- end
76
-
77
- def test_casts_to_hash
78
- Excon.stub({}, body: '<foo/>')
79
- parser = MiniTest::Mock.new
80
- res = @req.item_lookup(query: {}, mock: true)
81
- assert_kind_of Hash, res.to_h
82
- res.parser = parser
83
- assert_kind_of Hash, res.to_h
84
- end
85
-
86
- def test_digs
87
- Excon.stub({}, body: '<foo><bar>baz</bar></foo>')
88
- parser = MiniTest::Mock.new
89
- res = @req.item_lookup(query: {}, mock: true)
90
- assert_equal 'baz', res.dig('foo', 'bar')
91
- res.parser = parser
92
- assert_equal 'baz', res.dig('foo', 'bar')
93
- end
94
-
95
- def test_handles_authorisation_errors
96
- Excon.stub({}, status: 400)
97
- res = @req.item_lookup(query: {}, mock: true)
98
- assert_equal 400, res.status
99
- assert_raises Excon::Error::BadRequest do
100
- @req.item_lookup(query: {}, expects: 200, mock: true)
101
- end
102
- Excon.stub({}, status: 403)
103
- res = @req.item_lookup(query: {}, mock: true)
104
- assert_equal 403, res.status
105
- end
106
- end