dustbag 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/LICENSE.txt +21 -0
- data/README.md +92 -0
- data/lib/dustbag.rb +47 -0
- data/lib/dustbag/accessories.rb +7 -0
- data/lib/dustbag/accessory.rb +6 -0
- data/lib/dustbag/arguments.rb +8 -0
- data/lib/dustbag/availability_attributes.rb +9 -0
- data/lib/dustbag/browse_node.rb +15 -0
- data/lib/dustbag/browse_nodes.rb +7 -0
- data/lib/dustbag/common.rb +7 -0
- data/lib/dustbag/customer_reviews.rb +11 -0
- data/lib/dustbag/dimension.rb +13 -0
- data/lib/dustbag/dimensions.rb +10 -0
- data/lib/dustbag/editorial_review.rb +11 -0
- data/lib/dustbag/editorial_reviews.rb +7 -0
- data/lib/dustbag/http_headers.rb +8 -0
- data/lib/dustbag/image.rb +5 -0
- data/lib/dustbag/image_set.rb +9 -0
- data/lib/dustbag/image_sets.rb +7 -0
- data/lib/dustbag/item.rb +21 -0
- data/lib/dustbag/item_attributes.rb +79 -0
- data/lib/dustbag/item_link.rb +9 -0
- data/lib/dustbag/item_links.rb +7 -0
- data/lib/dustbag/item_search_request.rb +7 -0
- data/lib/dustbag/item_search_response.rb +8 -0
- data/lib/dustbag/items.rb +14 -0
- data/lib/dustbag/language.rb +7 -0
- data/lib/dustbag/languages.rb +7 -0
- data/lib/dustbag/offer.rb +52 -0
- data/lib/dustbag/offer_summary.rb +12 -0
- data/lib/dustbag/offers.rb +7 -0
- data/lib/dustbag/operation_request.rb +13 -0
- data/lib/dustbag/parser.rb +26 -0
- data/lib/dustbag/parser/collection_node.rb +37 -0
- data/lib/dustbag/parser/map_collection_node.rb +19 -0
- data/lib/dustbag/parser/node.rb +112 -0
- data/lib/dustbag/price.rb +13 -0
- data/lib/dustbag/request.rb +11 -0
- data/lib/dustbag/similar_product.rb +6 -0
- data/lib/dustbag/similar_products.rb +7 -0
- data/lib/dustbag/simple_product.rb +9 -0
- data/lib/dustbag/variation_attribute.rb +7 -0
- data/lib/dustbag/variation_attributes.rb +7 -0
- data/lib/dustbag/variation_summary.rb +13 -0
- data/lib/dustbag/variations.rb +18 -0
- data/lib/dustbag/version.rb +3 -0
- data/spec/dustbag/accessories_spec.rb +9 -0
- data/spec/dustbag/accessory_spec.rb +10 -0
- data/spec/dustbag/arguments_spec.rb +9 -0
- data/spec/dustbag/availability_attributes_spec.rb +21 -0
- data/spec/dustbag/browse_node_spec.rb +33 -0
- data/spec/dustbag/browse_nodes_spec.rb +9 -0
- data/spec/dustbag/customer_reviews_spec.rb +17 -0
- data/spec/dustbag/dimension_spec.rb +17 -0
- data/spec/dustbag/dimensions_spec.rb +29 -0
- data/spec/dustbag/editorial_review_spec.rb +21 -0
- data/spec/dustbag/editorial_reviews_spec.rb +9 -0
- data/spec/dustbag/http_headers_spec.rb +11 -0
- data/spec/dustbag/image_set_spec.rb +13 -0
- data/spec/dustbag/image_sets_spec.rb +9 -0
- data/spec/dustbag/image_spec.rb +9 -0
- data/spec/dustbag/item_attributes_spec.rb +188 -0
- data/spec/dustbag/item_link_spec.rb +17 -0
- data/spec/dustbag/item_links_spec.rb +9 -0
- data/spec/dustbag/item_search_request_spec.rb +21 -0
- data/spec/dustbag/item_search_response_spec.rb +13 -0
- data/spec/dustbag/item_spec.rb +110 -0
- data/spec/dustbag/items_spec.rb +25 -0
- data/spec/dustbag/language_spec.rb +17 -0
- data/spec/dustbag/languages_spec.rb +9 -0
- data/spec/dustbag/offer_spec.rb +43 -0
- data/spec/dustbag/offer_summary_spec.rb +30 -0
- data/spec/dustbag/offers_spec.rb +9 -0
- data/spec/dustbag/operation_request_spec.rb +27 -0
- data/spec/dustbag/parser_spec.rb +23 -0
- data/spec/dustbag/price_spec.rb +18 -0
- data/spec/dustbag/request_spec.rb +25 -0
- data/spec/dustbag/similar_product_spec.rb +18 -0
- data/spec/dustbag/similar_products_spec.rb +9 -0
- data/spec/dustbag/variation_attribute_spec.rb +17 -0
- data/spec/dustbag/variation_attributes_spec.rb +9 -0
- data/spec/dustbag/variation_summary_spec.rb +19 -0
- data/spec/dustbag/variations_spec.rb +22 -0
- data/spec/fixtures/accessories.xml +23 -0
- data/spec/fixtures/accessory.xml +4 -0
- data/spec/fixtures/arguments.xml +11 -0
- data/spec/fixtures/availability_attributes.xml +5 -0
- data/spec/fixtures/book_item_attributes.xml +61 -0
- data/spec/fixtures/browse_node.xml +23 -0
- data/spec/fixtures/browse_nodes.xml +25 -0
- data/spec/fixtures/customer_reviews.xml +5 -0
- data/spec/fixtures/dimension.xml +1 -0
- data/spec/fixtures/dimensions.xml +6 -0
- data/spec/fixtures/editorial_review.xml +5 -0
- data/spec/fixtures/editorial_reviews.xml +7 -0
- data/spec/fixtures/http_headers.xml +3 -0
- data/spec/fixtures/image.xml +5 -0
- data/spec/fixtures/image_set.xml +32 -0
- data/spec/fixtures/image_sets.xml +34 -0
- data/spec/fixtures/invalid_request.xml +8 -0
- data/spec/fixtures/item.xml +40 -0
- data/spec/fixtures/item_attributes.xml +58 -0
- data/spec/fixtures/item_large.xml +500 -0
- data/spec/fixtures/item_link.xml +4 -0
- data/spec/fixtures/item_links.xml +30 -0
- data/spec/fixtures/item_medium.xml +123 -0
- data/spec/fixtures/item_search_request.xml +5 -0
- data/spec/fixtures/item_search_response.xml +433 -0
- data/spec/fixtures/item_small.xml +40 -0
- data/spec/fixtures/item_with_accessories.xml +122 -0
- data/spec/fixtures/item_with_variation_attributes.xml +264 -0
- data/spec/fixtures/item_with_variations.xml +1016 -0
- data/spec/fixtures/items.xml +411 -0
- data/spec/fixtures/language.xml +4 -0
- data/spec/fixtures/languages.xml +6 -0
- data/spec/fixtures/movie_item_attributes.xml +30 -0
- data/spec/fixtures/offer.xml +26 -0
- data/spec/fixtures/offer_summary.xml +11 -0
- data/spec/fixtures/offers.xml +31 -0
- data/spec/fixtures/operation_request.xml +18 -0
- data/spec/fixtures/price.xml +5 -0
- data/spec/fixtures/request.xml +8 -0
- data/spec/fixtures/root_browse_node.xml +11 -0
- data/spec/fixtures/similar_product.xml +4 -0
- data/spec/fixtures/similar_products.xml +18 -0
- data/spec/fixtures/variation_attribute.xml +4 -0
- data/spec/fixtures/variation_attributes.xml +6 -0
- data/spec/fixtures/variation_summary.xml +12 -0
- data/spec/fixtures/variations.xml +1000 -0
- data/spec/shared_examples/collection_node.rb +15 -0
- data/spec/shared_examples/common_response.rb +7 -0
- data/spec/shared_examples/map_collection_node.rb +13 -0
- data/spec/shared_examples/node.rb +9 -0
- data/spec/shared_examples/node_context.rb +6 -0
- data/spec/shared_examples/simple_product.rb +4 -0
- data/spec/spec_helper.rb +16 -0
- metadata +356 -0
@@ -0,0 +1,18 @@
|
|
1
|
+
module Dustbag
|
2
|
+
class Variations
|
3
|
+
include Parser::Node
|
4
|
+
include Parser::CollectionNode
|
5
|
+
|
6
|
+
member_name 'Item'
|
7
|
+
|
8
|
+
numeric_attributes total: 'TotalVariations',
|
9
|
+
total_pages: 'TotalVariationPages'
|
10
|
+
|
11
|
+
def dimensions
|
12
|
+
dimensions = subnode('VariationDimensions')
|
13
|
+
dimensions && dimensions.locate('VariationDimension').map do |dimension|
|
14
|
+
dimension.text
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Dustbag
|
4
|
+
describe AvailabilityAttributes do
|
5
|
+
include_context 'load xml from fixture'
|
6
|
+
|
7
|
+
it_behaves_like 'a node'
|
8
|
+
|
9
|
+
describe '#type' do
|
10
|
+
it { expect(subject.type).to eq 'now' }
|
11
|
+
end
|
12
|
+
|
13
|
+
describe '#maximum_hours' do
|
14
|
+
it { expect(subject.maximum_hours).to eq 0 }
|
15
|
+
end
|
16
|
+
|
17
|
+
describe '#minimum_hours' do
|
18
|
+
it { expect(subject.minimum_hours).to eq 0 }
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Dustbag
|
4
|
+
describe BrowseNode do
|
5
|
+
include_context 'load xml from fixture'
|
6
|
+
|
7
|
+
it_behaves_like 'a node'
|
8
|
+
|
9
|
+
describe '#id' do
|
10
|
+
it { expect(subject.id).to eq 2407749011 }
|
11
|
+
end
|
12
|
+
|
13
|
+
describe '#name' do
|
14
|
+
it { expect(subject.name).to eq 'Unlocked Cell Phones' }
|
15
|
+
end
|
16
|
+
|
17
|
+
describe '#ancestors' do
|
18
|
+
it { expect(subject.ancestors).to be_a_kind_of BrowseNodes }
|
19
|
+
end
|
20
|
+
|
21
|
+
describe '#category_root?' do
|
22
|
+
context 'when category root' do
|
23
|
+
include_context 'load xml from fixture', 'root_browse_node'
|
24
|
+
|
25
|
+
it { expect(subject.category_root?).to be_truthy }
|
26
|
+
end
|
27
|
+
|
28
|
+
context 'when not category root' do
|
29
|
+
it { expect(subject.category_root?).to be_falsy }
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Dustbag
|
4
|
+
describe CustomerReviews do
|
5
|
+
include_context 'load xml from fixture'
|
6
|
+
|
7
|
+
it_behaves_like 'a node'
|
8
|
+
|
9
|
+
describe '#iframe_url' do
|
10
|
+
it { expect(subject.iframe_url).to eq 'http://www.amazon.com/reviews/iframe?akid=AKIAIHNK3TBF4L5EDREQ&alinkCode=xm2&asin=B00ZQVSKSM&atag=magmalabs-20&exp=2015-11-06T18%3A09%3A07Z&v=2&sig=LVQAhPoL48XLrPTdDEa%2FjC4h8r81FFEVqO2OmhIosT8%3D' }
|
11
|
+
end
|
12
|
+
|
13
|
+
describe '#any?' do
|
14
|
+
it { expect(subject.any?).to be_truthy }
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Dustbag
|
4
|
+
describe Dimension do
|
5
|
+
include_context 'load xml from fixture'
|
6
|
+
|
7
|
+
it_behaves_like 'a node'
|
8
|
+
|
9
|
+
describe '#value' do
|
10
|
+
it { expect(subject.value).to eq 559 }
|
11
|
+
end
|
12
|
+
|
13
|
+
describe '#units' do
|
14
|
+
it { expect(subject.units).to eq 'hundredths-inches' }
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Dustbag
|
4
|
+
describe Dimensions do
|
5
|
+
include_context 'load xml from fixture'
|
6
|
+
|
7
|
+
it_behaves_like 'a node'
|
8
|
+
|
9
|
+
describe '#height' do
|
10
|
+
it { expect(subject.height.value).to eq 559 }
|
11
|
+
it { expect(subject.height.units).to eq 'hundredths-inches' }
|
12
|
+
end
|
13
|
+
|
14
|
+
describe '#length' do
|
15
|
+
it { expect(subject.length.value).to eq 263 }
|
16
|
+
it { expect(subject.length.units).to eq 'hundredths-inches' }
|
17
|
+
end
|
18
|
+
|
19
|
+
describe '#weight' do
|
20
|
+
it { expect(subject.weight.value).to eq 34 }
|
21
|
+
it { expect(subject.weight.units).to eq 'hundredths-pounds' }
|
22
|
+
end
|
23
|
+
|
24
|
+
describe '#width' do
|
25
|
+
it { expect(subject.width.value).to eq 285 }
|
26
|
+
it { expect(subject.width.units).to eq 'hundredths-inches'}
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Dustbag
|
4
|
+
describe EditorialReview do
|
5
|
+
include_context 'load xml from fixture'
|
6
|
+
|
7
|
+
it_behaves_like 'a node'
|
8
|
+
|
9
|
+
describe '#source' do
|
10
|
+
it { expect(subject.source).to eq 'Product Description' }
|
11
|
+
end
|
12
|
+
|
13
|
+
describe '#content' do
|
14
|
+
it { expect(subject.content).to eq 'Quad core processing power in a great value product. 4.5" display. 5MP rear camera with a VGA front facing camera. Great 24hr battery performance with a 2390mAh battery. Personalize with colored bands.' }
|
15
|
+
end
|
16
|
+
|
17
|
+
describe '#link_suppressed?' do
|
18
|
+
it { expect(subject.link_suppressed?).to be_falsy }
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,188 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Dustbag
|
4
|
+
describe ItemAttributes do
|
5
|
+
include_context 'load xml from fixture'
|
6
|
+
|
7
|
+
it_behaves_like 'a node'
|
8
|
+
|
9
|
+
describe '#manufacturer' do
|
10
|
+
it { expect(subject.manufacturer).to eq 'Motorola' }
|
11
|
+
end
|
12
|
+
|
13
|
+
describe '#product_group' do
|
14
|
+
it { expect(subject.product_group).to eq 'Wireless' }
|
15
|
+
end
|
16
|
+
|
17
|
+
describe '#title' do
|
18
|
+
it { expect(subject.title).to eq 'Motorola Moto G (3rd Generation) - Black - 8 GB - Global GSM Unlocked Phone' }
|
19
|
+
end
|
20
|
+
|
21
|
+
describe '#binding' do
|
22
|
+
it { expect(subject.binding).to eq 'Unlocked Phone' }
|
23
|
+
end
|
24
|
+
|
25
|
+
describe '#brand' do
|
26
|
+
it { expect(subject.brand).to eq 'Motorola' }
|
27
|
+
end
|
28
|
+
|
29
|
+
describe '#color' do
|
30
|
+
it { expect(subject.color).to eq 'Black' }
|
31
|
+
end
|
32
|
+
|
33
|
+
describe '#ean' do
|
34
|
+
it { expect(subject.ean).to eq '0701799787331' }
|
35
|
+
end
|
36
|
+
|
37
|
+
describe '#ean_list' do
|
38
|
+
it { expect(subject.ean_list).to_not be_empty }
|
39
|
+
it { expect(subject.ean_list).to include('0701799787331') }
|
40
|
+
it { expect(subject.ean_list).to include('0723755007703') }
|
41
|
+
end
|
42
|
+
|
43
|
+
describe '#features' do
|
44
|
+
it { expect(subject.features).to_not be_empty }
|
45
|
+
it { expect(subject.features.first).to eq 'Advanced water resistance'}
|
46
|
+
it { expect(subject.features.last).to eq '4G LTE Speed; Browse, stream music, watch video, and play games at blazing speed.'}
|
47
|
+
end
|
48
|
+
|
49
|
+
describe '#eligible_for_trade_in?' do
|
50
|
+
context 'when eligible'
|
51
|
+
context 'when not eligible'
|
52
|
+
end
|
53
|
+
|
54
|
+
describe '#item_dimensions' do
|
55
|
+
it { expect(subject.item_dimensions).to be_a_kind_of Dimensions }
|
56
|
+
end
|
57
|
+
|
58
|
+
describe '#labels' do
|
59
|
+
it { expect(subject.labels).to_not be_empty }
|
60
|
+
it { expect(subject.labels.first).to eq 'Motorola' }
|
61
|
+
end
|
62
|
+
|
63
|
+
describe '#list_price' do
|
64
|
+
it { expect(subject.list_price).to be_a_kind_of Money }
|
65
|
+
end
|
66
|
+
|
67
|
+
describe '#model' do
|
68
|
+
it { expect(subject.model).to eq 'XT1540' }
|
69
|
+
end
|
70
|
+
|
71
|
+
describe '#mpn' do
|
72
|
+
it { expect(subject.mpn).to eq '00770NARTL' }
|
73
|
+
end
|
74
|
+
|
75
|
+
describe '#package_dimensions' do
|
76
|
+
it { expect(subject.package_dimensions).to be_a_kind_of Dimensions }
|
77
|
+
end
|
78
|
+
|
79
|
+
describe '#package_quantity' do
|
80
|
+
it { expect(subject.package_quantity).to eq 1 }
|
81
|
+
end
|
82
|
+
|
83
|
+
describe '#part_number' do
|
84
|
+
it { expect(subject.part_number).to eq '00770NARTL' }
|
85
|
+
end
|
86
|
+
|
87
|
+
describe '#product_type_name' do
|
88
|
+
it { expect(subject.product_type_name).to eq 'WIRELESS_ACCESSORY' }
|
89
|
+
end
|
90
|
+
|
91
|
+
describe '#publisher' do
|
92
|
+
it { expect(subject.publisher).to eq 'Motorola' }
|
93
|
+
end
|
94
|
+
|
95
|
+
describe '#size' do
|
96
|
+
it { expect(subject.size).to eq '8 GB' }
|
97
|
+
end
|
98
|
+
|
99
|
+
describe '#studio' do
|
100
|
+
it { expect(subject.studio).to eq 'Motorola' }
|
101
|
+
end
|
102
|
+
|
103
|
+
describe '#trade_in_value' do
|
104
|
+
it { expect(subject.trade_in_value).to be_a_kind_of Money }
|
105
|
+
end
|
106
|
+
|
107
|
+
describe '#upc' do
|
108
|
+
it { expect(subject.upc).to eq '723755007703' }
|
109
|
+
end
|
110
|
+
|
111
|
+
describe '#upc_list' do
|
112
|
+
it { expect(subject.upc_list).to_not be_empty }
|
113
|
+
it { expect(subject.upc_list).to include('723755007703') }
|
114
|
+
it { expect(subject.upc_list).to include('701799787331') }
|
115
|
+
end
|
116
|
+
|
117
|
+
context 'when a movie' do
|
118
|
+
include_context 'load xml from fixture', 'movie_item_attributes'
|
119
|
+
|
120
|
+
describe '#actors' do
|
121
|
+
it { expect(subject.actors).to eq ['Robert Downey Jr.', 'Chris Hemsworth', 'Mark Ruffalo', 'Chris Evans', 'Scarlett Johansson'] }
|
122
|
+
end
|
123
|
+
|
124
|
+
describe '#creators' do
|
125
|
+
it { expect(subject.creators).to eq({ 'Producer' => 'Kevin Feige', 'Writer' => 'Joss Whedon' }) }
|
126
|
+
end
|
127
|
+
|
128
|
+
describe '#director' do
|
129
|
+
it { expect(subject.director).to eq 'Joss Whedon' }
|
130
|
+
end
|
131
|
+
|
132
|
+
describe '#audience_rating' do
|
133
|
+
it { expect(subject.audience_rating).to eq 'PG-13 (Parental Guidance Suggested)' }
|
134
|
+
end
|
135
|
+
|
136
|
+
describe '#genre' do
|
137
|
+
it { expect(subject.genre).to eq 'Action' }
|
138
|
+
end
|
139
|
+
|
140
|
+
describe '#languages' do
|
141
|
+
it { expect(subject.languages).to be_a_kind_of Languages }
|
142
|
+
it { expect(subject.languages.first).to be_a_kind_of Language }
|
143
|
+
end
|
144
|
+
|
145
|
+
describe '#release_date' do
|
146
|
+
it { expect(subject.release_date).to eq Date.parse('2015-10-02') }
|
147
|
+
end
|
148
|
+
|
149
|
+
describe '#running_time' do
|
150
|
+
it { expect(subject.running_time).to be_a_kind_of Dimension }
|
151
|
+
it { expect(subject.running_time.value).to eq 189 }
|
152
|
+
it { expect(subject.running_time.units).to eq 'minutes'}
|
153
|
+
end
|
154
|
+
|
155
|
+
describe '#adult_product?' do
|
156
|
+
it { expect(subject.adult_product?).to be_falsy }
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
context 'when a book' do
|
161
|
+
include_context 'load xml from fixture', 'book_item_attributes'
|
162
|
+
|
163
|
+
describe '#authors' do
|
164
|
+
it { expect(subject.authors).to eq ['Ryan Bigg', 'Yehuda Katz', 'Steve Klabnik', 'Rebecca Skinner'] }
|
165
|
+
end
|
166
|
+
|
167
|
+
describe '#isbn' do
|
168
|
+
it { expect(subject.isbn).to eq '1617291099' }
|
169
|
+
end
|
170
|
+
|
171
|
+
describe '#number_of_items' do
|
172
|
+
it { expect(subject.number_of_items).to eq 1 }
|
173
|
+
end
|
174
|
+
|
175
|
+
describe '#number_of_pages' do
|
176
|
+
it { expect(subject.number_of_pages).to eq 576 }
|
177
|
+
end
|
178
|
+
|
179
|
+
describe '#package_quantity' do
|
180
|
+
it { expect(subject.package_quantity).to eq 1 }
|
181
|
+
end
|
182
|
+
|
183
|
+
describe '#publication_date' do
|
184
|
+
it { expect(subject.publication_date).to eq Date.parse('2015-09-19') }
|
185
|
+
end
|
186
|
+
end
|
187
|
+
end
|
188
|
+
end
|