vacuum 0.2.2 → 0.3.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.
Files changed (38) hide show
  1. data/README.md +11 -113
  2. data/lib/vacuum/request.rb +66 -0
  3. data/lib/vacuum/version.rb +1 -1
  4. data/lib/vacuum.rb +5 -38
  5. data/test/request_test.rb +18 -0
  6. metadata +24 -96
  7. data/lib/vacuum/endpoint/base.rb +0 -58
  8. data/lib/vacuum/endpoint/mws.rb +0 -59
  9. data/lib/vacuum/endpoint/product_advertising.rb +0 -34
  10. data/lib/vacuum/mws.rb +0 -8
  11. data/lib/vacuum/product_advertising.rb +0 -7
  12. data/lib/vacuum/request/base.rb +0 -109
  13. data/lib/vacuum/request/mws.rb +0 -24
  14. data/lib/vacuum/request/product_advertising.rb +0 -101
  15. data/lib/vacuum/request/signature/authentication.rb +0 -32
  16. data/lib/vacuum/request/signature/builder.rb +0 -70
  17. data/lib/vacuum/request/utils.rb +0 -24
  18. data/lib/vacuum/response/base.rb +0 -57
  19. data/lib/vacuum/response/mws.rb +0 -7
  20. data/lib/vacuum/response/product_advertising.rb +0 -19
  21. data/lib/vacuum/response/utils.rb +0 -48
  22. data/spec/fixtures/product_advertising +0 -1
  23. data/spec/spec_helper.rb +0 -15
  24. data/spec/support/shared_examples/endpoint.rb +0 -43
  25. data/spec/support/shared_examples/request.rb +0 -142
  26. data/spec/support/shared_examples/response.rb +0 -51
  27. data/spec/vacuum/endpoint/base_spec.rb +0 -19
  28. data/spec/vacuum/endpoint/mws_spec.rb +0 -47
  29. data/spec/vacuum/endpoint/product_advertising_spec.rb +0 -25
  30. data/spec/vacuum/request/base_spec.rb +0 -22
  31. data/spec/vacuum/request/mws_spec.rb +0 -26
  32. data/spec/vacuum/request/product_advertising_spec.rb +0 -118
  33. data/spec/vacuum/request/signature/authentication_spec.rb +0 -30
  34. data/spec/vacuum/request/signature/builder_spec.rb +0 -76
  35. data/spec/vacuum/request/utils_spec.rb +0 -23
  36. data/spec/vacuum/response/base_spec.rb +0 -38
  37. data/spec/vacuum/response/product_advertising_spec.rb +0 -57
  38. data/spec/vacuum/response/utils_spec.rb +0 -42
@@ -1,109 +0,0 @@
1
- module Vacuum
2
- module Request
3
- # An Amazon Web Services (AWS) API request.
4
- class Base
5
- # Returns the AWS API Endpoint.
6
- attr :endpoint
7
-
8
- # Creates a new request for given locale and credentials.
9
- #
10
- # Yields the AWS API endpoint if a block is given.
11
- def initialize(&blk)
12
- @parameters = {}
13
- @endpoint = Endpoint.const_get(class_basename).new
14
-
15
- configure &blk if block_given?
16
- end
17
-
18
- # Adds given parameters to the request.
19
- #
20
- # hsh - A Hash of parameter key and value pairs.
21
- #
22
- # Returns self.
23
- def build(hsh)
24
- hsh.each do |k, v|
25
- k = Utils.camelize k.to_s if k.is_a? Symbol
26
- @parameters[k] = v.is_a?(Array) ? v.join(',') : v.to_s
27
- end
28
-
29
- self
30
- end
31
-
32
- # Resets the request to the given parameters.
33
- #
34
- # hsh - A Hash of parameter key and value pairs.
35
- #
36
- # Returns self.
37
- def build!(hsh = {})
38
- @parameters = {}
39
- build hsh
40
- end
41
-
42
- # Yields the AWS API Endpoint.
43
- #
44
- # Returns nothing.
45
- def configure(&blk)
46
- yield @endpoint
47
- end
48
-
49
- # Returns a Faraday::Connection.
50
- #
51
- # Yields a Faraday::Builder to configure the connection if a block is
52
- # given.
53
- def connection
54
- @connection ||= Faraday.new do |builder|
55
- builder.use Signature::Authentication, endpoint.secret
56
-
57
- yield builder if block_given?
58
-
59
- unless builder.handlers.any? { |h| h.name.include? ':Adapter:' }
60
- builder.adapter Faraday.default_adapter
61
- end
62
- end
63
- end
64
-
65
- # Performs the AWS API request.
66
- #
67
- # Returns a Vacuum::Response::Base or a subclass thereof.
68
- def get
69
- res = connection.get url
70
- Response.const_get(class_basename).new res.body, res.status
71
- end
72
-
73
- # Performs the AWS API request.
74
- #
75
- # Raises a Bad Response if the response is not valid.
76
- #
77
- # Returns a Vacuum::Response::Base or a subclass thereof.
78
- def get!
79
- unless (res = get).valid?
80
- raise BadResponse, "#{res.code} #{res['Code'].first}"
81
- end
82
-
83
- res
84
- end
85
-
86
- # Returns the Hash parameters of the AWS API request.
87
- def parameters
88
- default_parameters.merge @parameters
89
- end
90
-
91
- # Raises a Not Implemented Error.
92
- #
93
- # When implemented, this should return an Addressable::URI.
94
- def url
95
- raise NotImplementedError
96
- end
97
-
98
- private
99
-
100
- def class_basename
101
- self.class.name.split('::').last
102
- end
103
-
104
- def default_parameters
105
- { 'AWSAccessKeyId' => endpoint.key }
106
- end
107
- end
108
- end
109
- end
@@ -1,24 +0,0 @@
1
- module Vacuum
2
- module Request
3
- # A Marketplace Web Services (MWS) API request.
4
- class MWS < Base
5
- # Returns the Addressable::URI URL of the MWS API request.
6
- def url
7
- Addressable::URI.new :scheme => 'https',
8
- :host => endpoint.host,
9
- :path => endpoint.path,
10
- :query_values => parameters
11
- end
12
-
13
- private
14
-
15
- def default_parameters
16
- super.merge 'MarketplaceId' => endpoint.marketplace,
17
- 'SellerId' => endpoint.seller,
18
- 'Service' => 'AWSECommerceService',
19
- 'SignatureMethod' => 'HmacSHA256',
20
- 'SignatureVersion' => 2
21
- end
22
- end
23
- end
24
- end
@@ -1,101 +0,0 @@
1
- module Vacuum
2
- module Request
3
- # A Product Advertising API request.
4
- class ProductAdvertising < Base
5
- # Looks up attributes of up to twenty items.
6
- #
7
- # item_ids - Splat Array of item IDs. The last element may optionally
8
- # specify a Hash of parameter key and value pairs.
9
- #
10
- # Examples
11
- #
12
- # request.find '0679753354', response_group: 'Images'
13
- #
14
- # Raises a Bad Response if response is not valid.
15
- #
16
- # Returns a Vacuum::Response::ProductAdvertising.
17
- def look_up(*item_ids)
18
- given = item_ids.last.is_a?(Hash) ? item_ids.pop : {}
19
-
20
- params = begin
21
- case item_ids.size
22
- when 1..10
23
- {
24
- 'Operation' => 'ItemLookup',
25
- 'ItemId' => item_ids
26
- }.merge given
27
- when 11..20
28
- default = {
29
- 'Operation' => 'ItemLookup',
30
- 'ItemLookup.1.ItemId' => item_ids.shift(10),
31
- 'ItemLookup.2.ItemId' => item_ids
32
- }
33
-
34
- if version = given.delete('Version') || given.delete(:version)
35
- default['Version'] = version
36
- end
37
-
38
- given.reduce(default) do |a, (k, v)|
39
- a.merge "ItemLookup.Shared.#{Utils.camelize k.to_s}" => v
40
- end
41
- else
42
- raise ArgumentError, "Can't look up #{item_ids.size} items"
43
- end
44
- end
45
- build! params
46
-
47
- get!
48
- end
49
-
50
- # Searches for items that satisfy the given criteria, including one or
51
- # more search indices.
52
- #
53
- # index - Symbol search index
54
- # query_or_params - String keyword query or Hash of parameter key and
55
- # value pairs.
56
- #
57
- # Examples
58
- #
59
- # # Search the entire Amazon catalog for Deleuze.
60
- # request.search :all, 'Deleuze'
61
- #
62
- # # Search books for non-fiction titles authored by Deleuze and sort
63
- # # results by relevance.
64
- # request.search :books, power: 'author:lacan and not fiction',
65
- # sort: 'relevancerank'
66
- #
67
- # Raises a Bad Response if response is not valid.
68
- #
69
- # Returns a Vacuum::Response::ProductAdvertising.
70
- def search(index, query_or_params = nil)
71
- params = case query_or_params
72
- when String
73
- { 'Keywords' => query_or_params }
74
- else
75
- query_or_params
76
- end
77
- build! params.merge! 'Operation' => 'ItemSearch',
78
- 'SearchIndex' => Utils.camelize(index.to_s)
79
-
80
- get!
81
- end
82
-
83
- # Returns the Addressable::URI URL of the Product Advertising API
84
- # request.
85
- def url
86
- Addressable::URI.new :scheme => 'http',
87
- :host => endpoint.host,
88
- :path => '/onca/xml',
89
- :query_values => parameters
90
- end
91
-
92
- private
93
-
94
- def default_parameters
95
- super.merge 'AssociateTag' => endpoint.tag,
96
- 'Service' => 'AWSECommerceService',
97
- 'Version' => '2011-08-01'
98
- end
99
- end
100
- end
101
- end
@@ -1,32 +0,0 @@
1
- module Vacuum
2
- module Request
3
- module Signature
4
- # Internal: Middleware that signs REST requests to various Amazon API
5
- # endpoints.
6
- class Authentication < Faraday::Middleware
7
- # Initializes the middleware.
8
- #
9
- # app - An Object that responds to `call` and returns a
10
- # Faraday::Response.
11
- # secret - The String Amazon AWS access secret key.
12
- def initialize(app, secret)
13
- @secret = secret
14
- super app
15
- end
16
-
17
- # Signs the request.
18
- #
19
- # env - A Hash that contains info about the request.
20
- #
21
- # Returns an Object that responds to `call` and returns a
22
- # Faraday::Response.
23
- def call(env)
24
- builder = Builder.new env, @secret
25
- builder.timestamp.sort_query.sign
26
-
27
- @app.call builder.env
28
- end
29
- end
30
- end
31
- end
32
- end
@@ -1,70 +0,0 @@
1
- module Vacuum
2
- module Request
3
- module Signature
4
- # Internal: Signs a request to an Amazon API with an HMAC-SHA256
5
- # signature.
6
- class Builder
7
- # Returns a Hash that contains info about the request.
8
- attr :env
9
-
10
- # Returns the String Amazon AWS access secret key.
11
- attr :secret
12
-
13
- # Initializes a new Builder.
14
- #
15
- # env - A Hash that contains info about the request.
16
- def initialize(env, secret)
17
- env[:url] = Addressable::URI.parse env[:url]
18
- @env, @secret = env, secret
19
- end
20
-
21
- # Returns the String name of the HTTP method used by the request.
22
- def method
23
- env[:method].to_s.upcase
24
- end
25
-
26
- # Signs the request.
27
- #
28
- # Returns self.
29
- def sign
30
- url.query = url.query.to_s + "&Signature=#{Utils.encode signature}"
31
- self
32
- end
33
-
34
- # Returns a String signature.
35
- def signature
36
- sha256 = OpenSSL::Digest::SHA256.new
37
- hash = OpenSSL::HMAC.digest sha256, secret, string_to_sign
38
-
39
- Base64.encode64(hash).chomp
40
- end
41
-
42
- # Sorts the URL query values of the request.
43
- #
44
- # Returns self.
45
- def sort_query
46
- url.query_values = url.query_values
47
- self
48
- end
49
-
50
- # Returns a String to sign based on pseudo-grammar specified by Amazon.
51
- def string_to_sign
52
- [method, url.host, url.path, url.query].join "\n"
53
- end
54
-
55
- # Timestamps the request.
56
- #
57
- # Returns self.
58
- def timestamp
59
- url.query = url.query.to_s + "&Timestamp=#{Utils.encode Time.now.utc.iso8601}"
60
- self
61
- end
62
-
63
- # Returns the Addressable::URI URL of the request.
64
- def url
65
- env[:url]
66
- end
67
- end
68
- end
69
- end
70
- end
@@ -1,24 +0,0 @@
1
- module Vacuum
2
- module Request
3
- module Utils
4
- # Camelizes a value.
5
- #
6
- # val - A String value.
7
- #
8
- # Returns an upper-camelcased String.
9
- def self.camelize(val)
10
- val.split('_').map(&:capitalize).join
11
- end
12
-
13
- # Percent encodes a URI component.
14
- #
15
- # component - The String URI component to encode.
16
- #
17
- # Returns the String encoded component.
18
- def self.encode(component)
19
- Addressable::URI.encode_component \
20
- component, Addressable::URI::CharacterClasses::UNRESERVED
21
- end
22
- end
23
- end
24
- end
@@ -1,57 +0,0 @@
1
- module Vacuum
2
- module Response
3
- # An Amazon Web Services (AWS) API response.
4
- class Base
5
- # Gets/Sets the String response body.
6
- attr_accessor :body
7
-
8
- # Gets/Sets the Integer HTTP response code.
9
- attr_accessor :code
10
-
11
- # Initializes a new Response.
12
- #
13
- # body - The String response body.
14
- # code - An HTTP response code that responds to to_i.
15
- def initialize(body, code)
16
- @body, @code = body, code.to_i
17
- end
18
-
19
- # Queries the response.
20
- #
21
- # query - String attribute to be queried.
22
- #
23
- # Yields matching nodes to a given block if one is given.
24
- #
25
- # Returns an Array of matching nodes or the return values of the yielded
26
- # block if latter was given.
27
- def find(query)
28
- path = if xml.namespaces.empty?
29
- "//#{query}"
30
- else
31
- "//xmlns:#{query}"
32
- end
33
-
34
- xml.xpath(path).map do |node|
35
- hsh = Utils.xml_to_hash node
36
- block_given? ? yield(hsh) : hsh
37
- end
38
- end
39
- alias [] find
40
-
41
- # Returns a Hash representation of the response.
42
- def to_hash
43
- Utils.xml_to_hash xml
44
- end
45
-
46
- # Returns whether the HTTP response is OK.
47
- def valid?
48
- code == 200
49
- end
50
-
51
- # Returns an XML document.
52
- def xml
53
- @xml ||= Nokogiri::XML.parse @body
54
- end
55
- end
56
- end
57
- end
@@ -1,7 +0,0 @@
1
- module Vacuum
2
- module Response
3
- # A Marketplace Web Services (MWS) API response.
4
- class MWS < Base
5
- end
6
- end
7
- end
@@ -1,19 +0,0 @@
1
- module Vacuum
2
- module Response
3
- # A Product Advertising API response.
4
- class ProductAdvertising < Base
5
- # Returns an Array of errors.
6
- def errors
7
- find 'Error'
8
- end
9
-
10
- # Returns whether the response has errors.
11
- #
12
- # Note that a response with errors is still technically valid, i.e. the
13
- # response code is 200.
14
- def has_errors?
15
- errors.count > 0
16
- end
17
- end
18
- end
19
- end
@@ -1,48 +0,0 @@
1
- module Vacuum
2
- module Response
3
- module Utils
4
- # Builds a Hash from an XML document.
5
- #
6
- # xml - a Nokogiri::XML::Document or Nokogiri::XML::Element.
7
- #
8
- # Returns a Hash representation of the XML document.
9
- def self.xml_to_hash(xml)
10
- case xml
11
- when Nokogiri::XML::Document
12
- xml_to_hash xml.root
13
- when Nokogiri::XML::Element
14
- hsh = {}
15
-
16
- xml.attributes.each_pair do |key, attribute|
17
- hsh[key] = attribute.value
18
- end
19
-
20
- xml.children.each do |child|
21
- result = xml_to_hash child
22
-
23
- if child.name == 'text'
24
- if hsh.empty?
25
- return result
26
- else
27
- hsh['__content__'] = result
28
- end
29
- elsif hsh[child.name]
30
- case hsh[child.name]
31
- when Array
32
- hsh[child.name] << result
33
- else
34
- hsh[child.name] = [hsh[child.name]] << result
35
- end
36
- else
37
- hsh[child.name] = result
38
- end
39
- end
40
-
41
- hsh
42
- else
43
- xml.content.to_s
44
- end
45
- end
46
- end
47
- end
48
- end
@@ -1 +0,0 @@
1
- <?xml version="1.0" ?><ItemLookupResponse xmlns="http://webservices.amazon.com/AWSECommerceService/2011-08-01"><OperationRequest><RequestId>86b89a15-b717-4d95-99aa-fe531b4ca762</RequestId><Arguments><Argument Name="Operation" Value="ItemLookup"></Argument><Argument Name="Service" Value="AWSECommerceService"></Argument><Argument Name="AssociateTag" Value="theorydot08-20"></Argument><Argument Name="Version" Value="2011-08-01"></Argument><Argument Name="Signature" Value="vOT9O1NW8PYLvrUX6KI3jrZ4Fg7LdtEYTrlsWzhbm1k="></Argument><Argument Name="ItemId" Value="0816614024,0143105825"></Argument><Argument Name="IdType" Value="ASIN"></Argument><Argument Name="AWSAccessKeyId" Value="0ZVSQ33MDFPQS8H2PM02"></Argument><Argument Name="Timestamp" Value="2011-07-29T17:52:34Z"></Argument></Arguments><RequestProcessingTime>0.0111990000000000</RequestProcessingTime></OperationRequest><Items><Request><IsValid>True</IsValid><ItemLookupRequest><IdType>ASIN</IdType><ItemId>0816614024</ItemId><ItemId>0143105825</ItemId><ResponseGroup>Small</ResponseGroup><VariationPage>All</VariationPage></ItemLookupRequest></Request><Item><ASIN>0816614024</ASIN><DetailPageURL>http://www.amazon.com/Thousand-Plateaus-Schizophrenia-Gilles-Deleuze/dp/0816614024%3FSubscriptionId%3D0ZVSQ33MDFPQS8H2PM02%26tag%3Dtheorydot08-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0816614024</DetailPageURL><ItemLinks><ItemLink><Description>Technical Details</Description><URL>http://www.amazon.com/Thousand-Plateaus-Schizophrenia-Gilles-Deleuze/dp/tech-data/0816614024%3FSubscriptionId%3D0ZVSQ33MDFPQS8H2PM02%26tag%3Dtheorydot08-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D386001%26creativeASIN%3D0816614024</URL></ItemLink><ItemLink><Description>Add To Baby Registry</Description><URL>http://www.amazon.com/gp/registry/baby/add-item.html%3Fasin.0%3D0816614024%26SubscriptionId%3D0ZVSQ33MDFPQS8H2PM02%26tag%3Dtheorydot08-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D386001%26creativeASIN%3D0816614024</URL></ItemLink><ItemLink><Description>Add To Wedding Registry</Description><URL>http://www.amazon.com/gp/registry/wedding/add-item.html%3Fasin.0%3D0816614024%26SubscriptionId%3D0ZVSQ33MDFPQS8H2PM02%26tag%3Dtheorydot08-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D386001%26creativeASIN%3D0816614024</URL></ItemLink><ItemLink><Description>Add To Wishlist</Description><URL>http://www.amazon.com/gp/registry/wishlist/add-item.html%3Fasin.0%3D0816614024%26SubscriptionId%3D0ZVSQ33MDFPQS8H2PM02%26tag%3Dtheorydot08-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D386001%26creativeASIN%3D0816614024</URL></ItemLink><ItemLink><Description>Tell A Friend</Description><URL>http://www.amazon.com/gp/pdp/taf/0816614024%3FSubscriptionId%3D0ZVSQ33MDFPQS8H2PM02%26tag%3Dtheorydot08-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D386001%26creativeASIN%3D0816614024</URL></ItemLink><ItemLink><Description>All Customer Reviews</Description><URL>http://www.amazon.com/review/product/0816614024%3FSubscriptionId%3D0ZVSQ33MDFPQS8H2PM02%26tag%3Dtheorydot08-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D386001%26creativeASIN%3D0816614024</URL></ItemLink><ItemLink><Description>All Offers</Description><URL>http://www.amazon.com/gp/offer-listing/0816614024%3FSubscriptionId%3D0ZVSQ33MDFPQS8H2PM02%26tag%3Dtheorydot08-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D386001%26creativeASIN%3D0816614024</URL></ItemLink></ItemLinks><ItemAttributes><Author>Gilles Deleuze</Author><Creator Role="Contributor">Felix Guattari</Creator><Manufacturer>Univ Of Minnesota Press</Manufacturer><ProductGroup>Book</ProductGroup><Title>Thousand Plateaus: Capitalism and Schizophrenia</Title></ItemAttributes></Item><Item><ASIN>0143105825</ASIN><DetailPageURL>http://www.amazon.com/Anti-Oedipus-Capitalism-Schizophrenia-Penguin-Classics/dp/0143105825%3FSubscriptionId%3D0ZVSQ33MDFPQS8H2PM02%26tag%3Dtheorydot08-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0143105825</DetailPageURL><ItemLinks><ItemLink><Description>Technical Details</Description><URL>http://www.amazon.com/Anti-Oedipus-Capitalism-Schizophrenia-Penguin-Classics/dp/tech-data/0143105825%3FSubscriptionId%3D0ZVSQ33MDFPQS8H2PM02%26tag%3Dtheorydot08-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D386001%26creativeASIN%3D0143105825</URL></ItemLink><ItemLink><Description>Add To Baby Registry</Description><URL>http://www.amazon.com/gp/registry/baby/add-item.html%3Fasin.0%3D0143105825%26SubscriptionId%3D0ZVSQ33MDFPQS8H2PM02%26tag%3Dtheorydot08-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D386001%26creativeASIN%3D0143105825</URL></ItemLink><ItemLink><Description>Add To Wedding Registry</Description><URL>http://www.amazon.com/gp/registry/wedding/add-item.html%3Fasin.0%3D0143105825%26SubscriptionId%3D0ZVSQ33MDFPQS8H2PM02%26tag%3Dtheorydot08-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D386001%26creativeASIN%3D0143105825</URL></ItemLink><ItemLink><Description>Add To Wishlist</Description><URL>http://www.amazon.com/gp/registry/wishlist/add-item.html%3Fasin.0%3D0143105825%26SubscriptionId%3D0ZVSQ33MDFPQS8H2PM02%26tag%3Dtheorydot08-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D386001%26creativeASIN%3D0143105825</URL></ItemLink><ItemLink><Description>Tell A Friend</Description><URL>http://www.amazon.com/gp/pdp/taf/0143105825%3FSubscriptionId%3D0ZVSQ33MDFPQS8H2PM02%26tag%3Dtheorydot08-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D386001%26creativeASIN%3D0143105825</URL></ItemLink><ItemLink><Description>All Customer Reviews</Description><URL>http://www.amazon.com/review/product/0143105825%3FSubscriptionId%3D0ZVSQ33MDFPQS8H2PM02%26tag%3Dtheorydot08-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D386001%26creativeASIN%3D0143105825</URL></ItemLink><ItemLink><Description>All Offers</Description><URL>http://www.amazon.com/gp/offer-listing/0143105825%3FSubscriptionId%3D0ZVSQ33MDFPQS8H2PM02%26tag%3Dtheorydot08-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D386001%26creativeASIN%3D0143105825</URL></ItemLink></ItemLinks><ItemAttributes><Author>Gilles Deleuze</Author><Author>Felix Guattari</Author><Creator Role="Translator">Robert Hurley</Creator><Creator Role="Translator">Mark Seem</Creator><Creator Role="Introduction">Mark Seem</Creator><Creator Role="Translator">Helen Lane</Creator><Creator Role="Preface">Michel Foucault</Creator><Manufacturer>Penguin Classics</Manufacturer><ProductGroup>Book</ProductGroup><Title>Anti-Oedipus: Capitalism and Schizophrenia (Penguin Classics)</Title></ItemAttributes></Item></Items></ItemLookupResponse>
data/spec/spec_helper.rb DELETED
@@ -1,15 +0,0 @@
1
- require 'rspec'
2
- begin
3
- require 'pry'
4
- rescue LoadError
5
- end
6
-
7
- require 'vacuum'
8
- require 'vacuum/mws'
9
- require 'vacuum/product_advertising'
10
-
11
- RSpec.configure do |c|
12
- c.treat_symbols_as_metadata_keys_with_true_values = true
13
- end
14
-
15
- Dir['./spec/support/**/*.rb'].each { |f| require f }
@@ -1,43 +0,0 @@
1
- shared_examples 'an endpoint' do
2
- describe '#key' do
3
- it 'requires key to have been set' do
4
- expect { endpoint.key }.to raise_error Vacuum::MissingKey
5
- end
6
- end
7
-
8
- describe '#locale' do
9
- it 'defaults to the US' do
10
- endpoint.locale.should eql 'US'
11
- end
12
-
13
- context 'if not valid' do
14
- before do
15
- endpoint.locale = 'foo'
16
- end
17
-
18
- it 'raises an error' do
19
- expect { endpoint.locale }.to raise_error Vacuum::BadLocale
20
- end
21
- end
22
- end
23
-
24
- describe '#secret' do
25
- it 'requires secret to have been set' do
26
- expect { endpoint.secret }.to raise_error Vacuum::MissingSecret
27
- end
28
- end
29
-
30
- describe '#user_agent' do
31
- it 'includes the library version number' do
32
- endpoint.user_agent.should match /Vacuum\/[\d\w.]+\s/
33
- end
34
-
35
- it 'describes the Ruby interpreter' do
36
- endpoint.user_agent.should match /Language=(?:j?ruby|rbx)/
37
- end
38
-
39
- it 'describes the host' do
40
- endpoint.user_agent.should match /Host=[\w\d]+/
41
- end
42
- end
43
- end