mws_rb 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (114) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +2 -0
  3. data/.rspec +2 -0
  4. data/.rubocop.yml +2 -0
  5. data/.ruby-gemset +1 -0
  6. data/.travis.yml +9 -0
  7. data/CHANGELOG.md +43 -0
  8. data/Gemfile +3 -0
  9. data/Guardfile +12 -0
  10. data/LICENSE +20 -0
  11. data/README.markdown +73 -0
  12. data/Rakefile +1 -0
  13. data/lib/mws.rb +51 -0
  14. data/lib/mws/api/base.rb +55 -0
  15. data/lib/mws/api/feeds.rb +30 -0
  16. data/lib/mws/api/feeds/envelope.rb +84 -0
  17. data/lib/mws/api/feeds/xsd/AdditionalProductInformation.xsd +23 -0
  18. data/lib/mws/api/feeds/xsd/Amazon.xsd +94 -0
  19. data/lib/mws/api/feeds/xsd/Arts.xsd +144 -0
  20. data/lib/mws/api/feeds/xsd/AutoAccessory.xsd +1714 -0
  21. data/lib/mws/api/feeds/xsd/Baby.xsd +206 -0
  22. data/lib/mws/api/feeds/xsd/Beauty.xsd +170 -0
  23. data/lib/mws/api/feeds/xsd/Books.xsd +135 -0
  24. data/lib/mws/api/feeds/xsd/CE.xsd +2878 -0
  25. data/lib/mws/api/feeds/xsd/CameraPhoto.xsd +2612 -0
  26. data/lib/mws/api/feeds/xsd/ClothingAccessories.xsd +128 -0
  27. data/lib/mws/api/feeds/xsd/Computers.xsd +2347 -0
  28. data/lib/mws/api/feeds/xsd/EUCompliance.xsd +24 -0
  29. data/lib/mws/api/feeds/xsd/EntertainmentCollectibles.xsd +99 -0
  30. data/lib/mws/api/feeds/xsd/FBA.xsd +28 -0
  31. data/lib/mws/api/feeds/xsd/FoodAndBeverages.xsd +1000 -0
  32. data/lib/mws/api/feeds/xsd/FoodServiceAndJanSan.xsd +216 -0
  33. data/lib/mws/api/feeds/xsd/FulfillmentCenter.xsd +57 -0
  34. data/lib/mws/api/feeds/xsd/GiftCards.xsd +97 -0
  35. data/lib/mws/api/feeds/xsd/Gourmet.xsd +85 -0
  36. data/lib/mws/api/feeds/xsd/Health.xsd +335 -0
  37. data/lib/mws/api/feeds/xsd/Home.xsd +1362 -0
  38. data/lib/mws/api/feeds/xsd/HomeImprovement.xsd +1065 -0
  39. data/lib/mws/api/feeds/xsd/Industrial.xsd +315 -0
  40. data/lib/mws/api/feeds/xsd/Inventory.xsd +49 -0
  41. data/lib/mws/api/feeds/xsd/Jewelry.xsd +916 -0
  42. data/lib/mws/api/feeds/xsd/LabSupplies.xsd +178 -0
  43. data/lib/mws/api/feeds/xsd/LargeAppliances.xsd +646 -0
  44. data/lib/mws/api/feeds/xsd/Lighting.xsd +243 -0
  45. data/lib/mws/api/feeds/xsd/Listings.xsd +32 -0
  46. data/lib/mws/api/feeds/xsd/Luggage.xsd +93 -0
  47. data/lib/mws/api/feeds/xsd/MechanicalFasteners.xsd +172 -0
  48. data/lib/mws/api/feeds/xsd/Miscellaneous.xsd +157 -0
  49. data/lib/mws/api/feeds/xsd/Motorcycles.xsd +348 -0
  50. data/lib/mws/api/feeds/xsd/Music.xsd +251 -0
  51. data/lib/mws/api/feeds/xsd/MusicalInstruments.xsd +853 -0
  52. data/lib/mws/api/feeds/xsd/Office.xsd +586 -0
  53. data/lib/mws/api/feeds/xsd/OrderAcknowledgement.xsd +55 -0
  54. data/lib/mws/api/feeds/xsd/OrderAdjustment.xsd +175 -0
  55. data/lib/mws/api/feeds/xsd/OrderFulfillment.xsd +57 -0
  56. data/lib/mws/api/feeds/xsd/Override.xsd +48 -0
  57. data/lib/mws/api/feeds/xsd/PetSupplies.xsd +197 -0
  58. data/lib/mws/api/feeds/xsd/PowerTransmission.xsd +87 -0
  59. data/lib/mws/api/feeds/xsd/Price.xsd +59 -0
  60. data/lib/mws/api/feeds/xsd/ProcessingReport.xsd +87 -0
  61. data/lib/mws/api/feeds/xsd/Product.xsd +399 -0
  62. data/lib/mws/api/feeds/xsd/ProductClothing.xsd +285 -0
  63. data/lib/mws/api/feeds/xsd/ProductImage.xsd +39 -0
  64. data/lib/mws/api/feeds/xsd/RawMaterials.xsd +125 -0
  65. data/lib/mws/api/feeds/xsd/Relationship.xsd +47 -0
  66. data/lib/mws/api/feeds/xsd/SWVG.xsd +345 -0
  67. data/lib/mws/api/feeds/xsd/SettlementReport.xsd +158 -0
  68. data/lib/mws/api/feeds/xsd/Shoes.xsd +213 -0
  69. data/lib/mws/api/feeds/xsd/Sports.xsd +772 -0
  70. data/lib/mws/api/feeds/xsd/SportsMemorabilia.xsd +55 -0
  71. data/lib/mws/api/feeds/xsd/TiresAndWheels.xsd +159 -0
  72. data/lib/mws/api/feeds/xsd/Tools.xsd +82 -0
  73. data/lib/mws/api/feeds/xsd/Toys.xsd +272 -0
  74. data/lib/mws/api/feeds/xsd/ToysBaby.xsd +335 -0
  75. data/lib/mws/api/feeds/xsd/Video.xsd +406 -0
  76. data/lib/mws/api/feeds/xsd/WineAndAlcohol.xsd +181 -0
  77. data/lib/mws/api/feeds/xsd/Wireless.xsd +128 -0
  78. data/lib/mws/api/feeds/xsd/amzn-base.xsd +4350 -0
  79. data/lib/mws/api/feeds/xsd/amzn-envelope.xsd +98 -0
  80. data/lib/mws/api/feeds/xsd/amzn-header.xsd +45 -0
  81. data/lib/mws/api/fulfillment_inbound_shipment.rb +16 -0
  82. data/lib/mws/api/fulfillment_inventory.rb +14 -0
  83. data/lib/mws/api/fulfillment_outbound_shipment.rb +24 -0
  84. data/lib/mws/api/orders.rb +16 -0
  85. data/lib/mws/api/products.rb +19 -0
  86. data/lib/mws/api/recommendations.rb +14 -0
  87. data/lib/mws/api/reports.rb +17 -0
  88. data/lib/mws/api/sellers.rb +18 -0
  89. data/lib/mws/api/subscriptions.rb +15 -0
  90. data/lib/mws/connection.rb +56 -0
  91. data/lib/mws/query.rb +104 -0
  92. data/lib/mws/version.rb +4 -0
  93. data/mws_rb.gemspec +32 -0
  94. data/spec/fixtures/vcr_cassettes/feeds/submit_feed/invalid_request.yml +194 -0
  95. data/spec/fixtures/vcr_cassettes/feeds/submit_feed/text_request.yml +188 -0
  96. data/spec/fixtures/vcr_cassettes/feeds/submit_feed/xml_request.yml +224 -0
  97. data/spec/mws-rb/api/base_spec.rb +48 -0
  98. data/spec/mws-rb/api/feeds/envelope/general_spec.rb +31 -0
  99. data/spec/mws-rb/api/feeds/envelope/xml_building_spec.rb +101 -0
  100. data/spec/mws-rb/api/feeds_spec.rb +88 -0
  101. data/spec/mws-rb/api/fulfillment_inbound_shipment_spec.rb +24 -0
  102. data/spec/mws-rb/api/fulfillment_inventory_spec.rb +24 -0
  103. data/spec/mws-rb/api/fulfillment_outbound_shipment_spec.rb +24 -0
  104. data/spec/mws-rb/api/orders_spec.rb +24 -0
  105. data/spec/mws-rb/api/products_spec.rb +24 -0
  106. data/spec/mws-rb/api/recommendations_spec.rb +24 -0
  107. data/spec/mws-rb/api/reports_spec.rb +24 -0
  108. data/spec/mws-rb/api/sellers_spec.rb +28 -0
  109. data/spec/mws-rb/api/subscriptions_spec.rb +24 -0
  110. data/spec/mws-rb/connection_spec.rb +77 -0
  111. data/spec/mws-rb/mws_spec.rb +12 -0
  112. data/spec/mws-rb/query_spec.rb +150 -0
  113. data/spec/spec_helper.rb +17 -0
  114. metadata +310 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 6984f02c386959b4ed60082b2b1f733b069ce0f3
4
+ data.tar.gz: aa2c13fc770dcb14c5e0d3a0e4f0ee3a4bc304f8
5
+ SHA512:
6
+ metadata.gz: c02ac371ce06c65d342090c382adfe33497b039dcb8bfd1caa048a795974df716a324717fe745662cad9b8306f0ddeba2f8d570a3d81a062cbe092ce378c5b0a
7
+ data.tar.gz: 59f664c80f238b037435013eae1350b1a04ed078a4526b2a097667a55b87d49aa17747d80ab298e84251300872235d78524652f8c09f6a18dcdb1d6f2f3a5285
data/.gitignore ADDED
@@ -0,0 +1,2 @@
1
+ tmp
2
+ /Gemfile.lock
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --colour
2
+ --format progress
data/.rubocop.yml ADDED
@@ -0,0 +1,2 @@
1
+ Metrics/LineLength:
2
+ Max: 500
data/.ruby-gemset ADDED
@@ -0,0 +1 @@
1
+ mws-rb
data/.travis.yml ADDED
@@ -0,0 +1,9 @@
1
+ ---
2
+ language: ruby
3
+ cache: bundler
4
+
5
+ rvm:
6
+ - 2.2.3
7
+
8
+ script:
9
+ - bundle exec rspec
data/CHANGELOG.md ADDED
@@ -0,0 +1,43 @@
1
+ Changelog
2
+ =========
3
+
4
+ Version 0.0.2 (February 2, 2015)
5
+ -----------------------------
6
+
7
+ * Completed Orders API
8
+ * Completed Products API
9
+ * Completed Sellers API
10
+ * Completed Recommendations API
11
+ * Completed FulfillmentInventory API
12
+ * Completed FulfillmentInboundShipment API
13
+ * Completed FulfillmentOutboundShipment API
14
+ * Completed Feeds API
15
+ * Completed Subscriptions API
16
+
17
+ Version 0.0.3 (February 21, 2015)
18
+ -----------------------------
19
+
20
+ * Fix Orders API spec
21
+ * Add default timeout for requests
22
+
23
+ Version 0.0.4 (April 7, 2015)
24
+ -----------------------------
25
+
26
+ * Add support of MWS Auth Token
27
+ * Add global reference to the location of XSD files
28
+
29
+ Version 0.0.5 (May 29, 2015)
30
+ -----------------------------
31
+
32
+ * Fix signature generation
33
+ * Add support text based feeds
34
+
35
+ Version 0.0.6 (Next release)
36
+ -----------------------------
37
+
38
+ * Add missing specs
39
+ * Update rspec expectations
40
+ * Update dependencies
41
+ * Fix query action SKU|ASIN capitalization
42
+ * Default connection params to ENV variables
43
+ * Enforce ruby guidelines using Rubocop
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'http://rubygems.org'
2
+
3
+ gemspec
data/Guardfile ADDED
@@ -0,0 +1,12 @@
1
+ # A sample Guardfile
2
+ # More info at https://github.com/guard/guard#readme
3
+
4
+ guard :rspec, cmd: 'bundle exec rspec' do
5
+ watch(%r{^lib/(.+)\.rb$}) { 'spec' }
6
+ watch(%r{^spec/(.+)\.rb$}) { 'spec' }
7
+ end
8
+
9
+ guard :rubocop do
10
+ watch(/.+\.rb$/)
11
+ watch(%r{(?:.+/)?\.rubocop\.yml$}) { |m| File.dirname(m[0]) }
12
+ end
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2013 Jhimy Fernandes Villar
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.markdown ADDED
@@ -0,0 +1,73 @@
1
+ # mws_rb
2
+
3
+ This gem is a complete wrapper for Amazon.com's Marketplace Web Service (MWS) API extracted from http://veeqo.com
4
+
5
+ ## Installation
6
+
7
+ Using with a Gemfile:
8
+
9
+ gem 'mws_rb', require: 'mws'
10
+ bundle install
11
+
12
+ Using in a simple ruby file:
13
+
14
+ gem install mws_rb
15
+ require 'mws'
16
+
17
+ ## Initialization
18
+
19
+ ```ruby
20
+ mws_api = MWS.new(
21
+ host: "mws-eu.amazonservices.com",
22
+ aws_access_key_id: "Your access key id",
23
+ aws_secret_access_key: "Your secret access key",
24
+ seller_id: "Your seller/merchant id"
25
+ )
26
+ ```
27
+
28
+ ## Using
29
+
30
+ To access the apis you can use:
31
+
32
+ ```ruby
33
+ mws_api._api_name_._action_to_calll(params={})
34
+ ```
35
+
36
+ Let's say we want to retrieve a list of orders using MWS orders api:
37
+
38
+ ```ruby
39
+ mws_api.orders.list_orders(
40
+ "MarketplaceId.Id.1" => "marketplace id",
41
+ created_after: Time.new(2013, 1, 1)
42
+ )
43
+ ```
44
+
45
+ Here is a list of all available APIS:
46
+
47
+ - mws_api.feeds
48
+ - mws_api.orders
49
+ - mws_api.reports
50
+ - mws_api.products
51
+ - mws_api.sellers
52
+ - mws_api.recommendations
53
+ - mws_api.fulfillment_inventory
54
+ - mws_api.fulfillment_inbound_shipment
55
+ - mws_api.fulfillment_outbound_shipment
56
+
57
+ ## API docs/actions/params
58
+
59
+ You can check on the MWS documentation section all actions and params needed:
60
+
61
+ - http://docs.developer.amazonservices.com/en_US/feeds/index.html
62
+ - http://docs.developer.amazonservices.com/en_US/reports/index.html
63
+ - http://docs.developer.amazonservices.com/en_US/fba_inbound/index.html
64
+ - http://docs.developer.amazonservices.com/en_US/fba_inventory/index.html
65
+ - http://docs.developer.amazonservices.com/en_US/fba_outbound/index.html
66
+ - http://docs.developer.amazonservices.com/en_US/orders/index.html
67
+ - http://docs.developer.amazonservices.com/en_US/products/index.html
68
+ - http://docs.developer.amazonservices.com/en_US/recommendations/index.html
69
+ - http://docs.developer.amazonservices.com/en_US/sellers/index.html
70
+
71
+ ## LICENSE
72
+
73
+ Copyright (c) Jhimy Fernandes Villar
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require 'bundler/gem_tasks'
data/lib/mws.rb ADDED
@@ -0,0 +1,51 @@
1
+ # rubocop:disable all
2
+ require 'httparty'
3
+ require 'base64'
4
+ require 'openssl'
5
+ require 'active_support/core_ext'
6
+ require 'builder'
7
+ require 'nokogiri'
8
+
9
+ require_relative 'mws/query'
10
+ require_relative 'mws/connection'
11
+ require_relative 'mws/api/base'
12
+ require_relative 'mws/api/orders'
13
+ require_relative 'mws/api/reports'
14
+ require_relative 'mws/api/products'
15
+ require_relative 'mws/api/sellers'
16
+ require_relative 'mws/api/subscriptions'
17
+ require_relative 'mws/api/recommendations'
18
+ require_relative 'mws/api/fulfillment_inventory'
19
+ require_relative 'mws/api/fulfillment_inbound_shipment'
20
+ require_relative 'mws/api/fulfillment_outbound_shipment'
21
+ require_relative 'mws/api/feeds'
22
+ require_relative 'mws/api/feeds/envelope'
23
+
24
+ module MWS
25
+ @@aws_access_key_id = nil
26
+ @@aws_secret_access_key = nil
27
+
28
+ def self.aws_access_key_id=(key_id)
29
+ @@aws_access_key_id = key_id
30
+ end
31
+
32
+ def self.aws_access_key_id
33
+ @@aws_access_key_id
34
+ end
35
+
36
+ def self.aws_secret_access_key=(secret_key)
37
+ @@aws_secret_access_key = secret_key
38
+ end
39
+
40
+ def self.aws_secret_access_key
41
+ @@aws_secret_access_key
42
+ end
43
+
44
+ def self.new(options = {})
45
+ @connection = MWS::Connection.new(options)
46
+ end
47
+
48
+ def self.config
49
+ yield self
50
+ end
51
+ end
@@ -0,0 +1,55 @@
1
+ module MWS
2
+ module API
3
+ # Base Class
4
+ class Base
5
+ attr_reader :connection, :uri, :version, :verb
6
+
7
+ # TODO: Temporary solution, move to configuration
8
+ DEFAULT_TIMEOUT = 2000
9
+
10
+ def initialize(connection)
11
+ @verb ||= :get
12
+ @connection = connection
13
+ end
14
+
15
+ def call(action, params = {})
16
+ @verb ||= params.delete(:verb)
17
+ query = build_query_from_params(action, params)
18
+
19
+ case @verb.to_s.upcase
20
+ when 'GET'
21
+ HTTParty.get(query.request_uri, http_request_options)
22
+ when 'POST'
23
+ HTTParty.post(query.request_uri, (params[:request_params] || {}).merge(http_request_options))
24
+ end
25
+ end
26
+
27
+ def build_query_from_params(action, params)
28
+ Query.new(verb: @verb,
29
+ uri: @uri,
30
+ host: @connection.host,
31
+ aws_access_key_id: @connection.aws_access_key_id,
32
+ aws_secret_access_key: @connection.aws_secret_access_key,
33
+ seller_id: @connection.seller_id,
34
+ mws_auth_token: @connection.mws_auth_token,
35
+ action: action.to_s.camelize,
36
+ version: @version,
37
+ params: params.except(:request_params))
38
+ end
39
+
40
+ def method_missing(name, *args)
41
+ if self.class::ACTIONS.include?(name)
42
+ call(name, *args)
43
+ else
44
+ super
45
+ end
46
+ end
47
+
48
+ def http_request_options
49
+ {
50
+ timeout: DEFAULT_TIMEOUT
51
+ }
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,30 @@
1
+ module MWS
2
+ module API
3
+ # Feeds
4
+ class Feeds < Base
5
+ XSD_PATH = File.join(File.dirname(__FILE__), 'feeds', 'xsd')
6
+
7
+ ACTIONS = [:get_feed_submission_list, :get_feed_submission_list_by_next_token,
8
+ :get_feed_submission_count, :cancel_feed_submissions, :get_feed_submission_result]
9
+
10
+ def initialize(connection)
11
+ @uri = '/'
12
+ @version = '2009-01-01'
13
+ @verb = :post
14
+ super
15
+ end
16
+
17
+ def submit_feed(params = {})
18
+ xml_envelope = Envelope.new(params.merge!(merchant_id: connection.seller_id))
19
+ params = params.except(:merchant_id, :message_type, :message, :messages, :skip_schema_validation)
20
+ call(:submit_feed, params.merge!(
21
+ request_params: {
22
+ format: :xml,
23
+ headers: { 'Content-MD5' => xml_envelope.md5 },
24
+ body: xml_envelope.to_s
25
+ }
26
+ ))
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,84 @@
1
+ module MWS
2
+ module API
3
+ class Feeds
4
+ # Envelope
5
+ class Envelope
6
+ def initialize(params = {})
7
+ if params[:type].to_s == 'text'
8
+ @type = :text
9
+ @envelope = params[:message]
10
+ else
11
+ @type = :xml
12
+ @envelope = build_envelope(params)
13
+ end
14
+ validate! unless params[:skip_schema_validation] || @type == :text
15
+ end
16
+
17
+ def valid?
18
+ errors.count == 0
19
+ end
20
+
21
+ def validate!
22
+ fail "Invalid XML:\n" + errors.join("\n") unless valid?
23
+ end
24
+
25
+ def md5
26
+ Digest::MD5.base64digest(self)
27
+ end
28
+
29
+ def to_str
30
+ to_s
31
+ end
32
+
33
+ def to_s
34
+ if @type == :text
35
+ result = @envelope
36
+ else
37
+ result = @envelope.target!
38
+ result.gsub!('<Items type="array">', '')
39
+ result.gsub!('</Items>', '')
40
+ result.gsub!('<Inventories type="array">', '')
41
+ result.gsub!('</Inventories>', '')
42
+ end
43
+ result
44
+ end
45
+
46
+ def xsd
47
+ Nokogiri::XML::Schema(File.open(File.join(MWS::API::Feeds::XSD_PATH, 'amzn-envelope.xsd')))
48
+ end
49
+
50
+ def errors
51
+ @errors ||= xsd.validate(Nokogiri::XML(self))
52
+ end
53
+
54
+ private
55
+
56
+ # rubocop:disable all
57
+ def build_envelope(params = {})
58
+ xml = Builder::XmlMarkup.new
59
+ xml.AmazonEnvelope do
60
+ xml.Header do
61
+ xml.DocumentVersion '1.01'
62
+ xml.MerchantIdentifier params[:merchant_id]
63
+ end
64
+ xml.MessageType params[:message_type].to_s.camelize
65
+ xml.PurgeAndReplace params[:purge_and_replace] || false
66
+ messages_array(params).each { |message| xml << message_xml(message) }
67
+ end; xml
68
+ end
69
+
70
+ def messages_array(params)
71
+ get_array(params[:message]) + get_array(params[:messages])
72
+ end
73
+
74
+ def get_array(parameter)
75
+ [parameter].flatten.compact
76
+ end
77
+
78
+ def message_xml(message)
79
+ message.to_xml(skip_instruct: true, root: 'Message')
80
+ end
81
+ end
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,23 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!-- Revision="$Revision: #1 $" -->
3
+ <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
4
+ <!--
5
+ $Date: 2012/09/11/ $
6
+ AMAZON.COM CONFIDENTIAL. This document and the information contained in it are
7
+ confidential and proprietary information of Amazon.com and may not be reproduced,
8
+ distributed or used, in whole or in part, for any purpose other than as necessary
9
+ to list products for sale on the www.amazon.com web site pursuant to an agreement
10
+ with Amazon.com.
11
+ -->
12
+ <xsd:include schemaLocation="amzn-base.xsd"/>
13
+ <xsd:element name="AdditionalProductInformation">
14
+ <xsd:complexType>
15
+ <xsd:sequence>
16
+ <xsd:element name="MaterialFabric" type="HundredString" minOccurs="0" maxOccurs="3"/>
17
+ <xsd:element name="ImportDesignation" type="HundredString" minOccurs="0"/>
18
+ <xsd:element name="CountryAsLabeled" type="CountryOfOriginType" minOccurs="0"/>
19
+ <xsd:element name="FurDescription" type="HundredString" minOccurs="0"/>
20
+ </xsd:sequence>
21
+ </xsd:complexType>
22
+ </xsd:element>
23
+ </xsd:schema>