diff env/lib/python3.7/site-packages/boto/mws/connection.py @ 5:9b1c78e6ba9c draft default tip

"planemo upload commit 6c0a8142489327ece472c84e558c47da711a9142"
author shellac
date Mon, 01 Jun 2020 08:59:25 -0400
parents 79f47841a781
children
line wrap: on
line diff
--- a/env/lib/python3.7/site-packages/boto/mws/connection.py	Thu May 14 16:47:39 2020 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1168 +0,0 @@
-# Copyright (c) 2012-2014 Andy Davidoff http://www.disruptek.com/
-#
-# Permission is hereby granted, free of charge, to any person obtaining a
-# copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish, dis-
-# tribute, sublicense, and/or sell copies of the Software, and to permit
-# persons to whom the Software is furnished to do so, subject to the fol-
-# lowing conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
-# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
-# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-# IN THE SOFTWARE.
-import xml.sax
-import hashlib
-import string
-import collections
-from boto.connection import AWSQueryConnection
-from boto.exception import BotoServerError
-import boto.mws.exception
-import boto.mws.response
-from boto.handler import XmlHandler
-from boto.compat import filter, map, six, encodebytes
-
-__all__ = ['MWSConnection']
-
-api_version_path = {
-    'Feeds':             ('2009-01-01', 'Merchant', '/'),
-    'Reports':           ('2009-01-01', 'Merchant', '/'),
-    'Orders':            ('2013-09-01', 'SellerId', '/Orders/2013-09-01'),
-    'Products':          ('2011-10-01', 'SellerId', '/Products/2011-10-01'),
-    'Sellers':           ('2011-07-01', 'SellerId', '/Sellers/2011-07-01'),
-    'Inbound':           ('2010-10-01', 'SellerId',
-                          '/FulfillmentInboundShipment/2010-10-01'),
-    'Outbound':          ('2010-10-01', 'SellerId',
-                          '/FulfillmentOutboundShipment/2010-10-01'),
-    'Inventory':         ('2010-10-01', 'SellerId',
-                          '/FulfillmentInventory/2010-10-01'),
-    'Recommendations':   ('2013-04-01', 'SellerId',
-                          '/Recommendations/2013-04-01'),
-    'CustomerInfo':      ('2014-03-01', 'SellerId',
-                          '/CustomerInformation/2014-03-01'),
-    'CartInfo':          ('2014-03-01', 'SellerId',
-                          '/CartInformation/2014-03-01'),
-    'Subscriptions':     ('2013-07-01', 'SellerId',
-                          '/Subscriptions/2013-07-01'),
-    'OffAmazonPayments': ('2013-01-01', 'SellerId',
-                          '/OffAmazonPayments/2013-01-01'),
-}
-content_md5 = lambda c: encodebytes(hashlib.md5(c).digest()).strip()
-decorated_attrs = ('action', 'response', 'section',
-                   'quota', 'restore', 'version')
-api_call_map = {}
-
-
-def add_attrs_from(func, to):
-    for attr in decorated_attrs:
-        setattr(to, attr, getattr(func, attr, None))
-    to.__wrapped__ = func
-    return to
-
-
-def structured_lists(*fields):
-
-    def decorator(func):
-
-        def wrapper(self, *args, **kw):
-            for key, acc in [f.split('.') for f in fields]:
-                if key in kw:
-                    newkey = key + '.' + acc + (acc and '.' or '')
-                    for i in range(len(kw[key])):
-                        kw[newkey + str(i + 1)] = kw[key][i]
-                    kw.pop(key)
-            return func(self, *args, **kw)
-        wrapper.__doc__ = "{0}\nLists: {1}".format(func.__doc__,
-                                                   ', '.join(fields))
-        return add_attrs_from(func, to=wrapper)
-    return decorator
-
-
-def http_body(field):
-
-    def decorator(func):
-
-        def wrapper(*args, **kw):
-            if any([f not in kw for f in (field, 'content_type')]):
-                message = "{0} requires {1} and content_type arguments for " \
-                          "building HTTP body".format(func.action, field)
-                raise KeyError(message)
-            kw['body'] = kw.pop(field)
-            kw['headers'] = {
-                'Content-Type': kw.pop('content_type'),
-                'Content-MD5':  content_md5(kw['body']),
-            }
-            return func(*args, **kw)
-        wrapper.__doc__ = "{0}\nRequired HTTP Body: " \
-                          "{1}".format(func.__doc__, field)
-        return add_attrs_from(func, to=wrapper)
-    return decorator
-
-
-def destructure_object(value, into, prefix, members=False):
-    if isinstance(value, boto.mws.response.ResponseElement):
-        destructure_object(value.__dict__, into, prefix, members=members)
-    elif isinstance(value, collections.Mapping):
-        for name in value:
-            if name.startswith('_'):
-                continue
-            destructure_object(value[name], into, prefix + '.' + name,
-                               members=members)
-    elif isinstance(value, six.string_types):
-        into[prefix] = value
-    elif isinstance(value, collections.Iterable):
-        for index, element in enumerate(value):
-            suffix = (members and '.member.' or '.') + str(index + 1)
-            destructure_object(element, into, prefix + suffix,
-                               members=members)
-    elif isinstance(value, bool):
-        into[prefix] = str(value).lower()
-    else:
-        into[prefix] = value
-
-
-def structured_objects(*fields, **kwargs):
-
-    def decorator(func):
-
-        def wrapper(*args, **kw):
-            members = kwargs.get('members', False)
-            for field in filter(lambda i: i in kw, fields):
-                destructure_object(kw.pop(field), kw, field, members=members)
-            return func(*args, **kw)
-        wrapper.__doc__ = "{0}\nElement|Iter|Map: {1}\n" \
-                          "(ResponseElement or anything iterable/dict-like)" \
-                          .format(func.__doc__, ', '.join(fields))
-        return add_attrs_from(func, to=wrapper)
-    return decorator
-
-
-def requires(*groups):
-
-    def decorator(func):
-
-        def requires(*args, **kw):
-            hasgroup = lambda group: all(key in kw for key in group)
-            if 1 != len(list(filter(hasgroup, groups))):
-                message = ' OR '.join(['+'.join(g) for g in groups])
-                message = "{0} requires {1} argument(s)" \
-                          "".format(func.action, message)
-                raise KeyError(message)
-            return func(*args, **kw)
-        message = ' OR '.join(['+'.join(g) for g in groups])
-        requires.__doc__ = "{0}\nRequired: {1}".format(func.__doc__,
-                                                       message)
-        return add_attrs_from(func, to=requires)
-    return decorator
-
-
-def exclusive(*groups):
-
-    def decorator(func):
-
-        def wrapper(*args, **kw):
-            hasgroup = lambda group: all(key in kw for key in group)
-            if len(list(filter(hasgroup, groups))) not in (0, 1):
-                message = ' OR '.join(['+'.join(g) for g in groups])
-                message = "{0} requires either {1}" \
-                          "".format(func.action, message)
-                raise KeyError(message)
-            return func(*args, **kw)
-        message = ' OR '.join(['+'.join(g) for g in groups])
-        wrapper.__doc__ = "{0}\nEither: {1}".format(func.__doc__,
-                                                    message)
-        return add_attrs_from(func, to=wrapper)
-    return decorator
-
-
-def dependent(field, *groups):
-
-    def decorator(func):
-
-        def wrapper(*args, **kw):
-            hasgroup = lambda group: all(key in kw for key in group)
-            if field in kw and not any(hasgroup(g) for g in groups):
-                message = ' OR '.join(['+'.join(g) for g in groups])
-                message = "{0} argument {1} requires {2}" \
-                          "".format(func.action, field, message)
-                raise KeyError(message)
-            return func(*args, **kw)
-        message = ' OR '.join(['+'.join(g) for g in groups])
-        wrapper.__doc__ = "{0}\n{1} requires: {2}".format(func.__doc__,
-                                                          field,
-                                                          message)
-        return add_attrs_from(func, to=wrapper)
-    return decorator
-
-
-def requires_some_of(*fields):
-
-    def decorator(func):
-
-        def requires(*args, **kw):
-            if not any(i in kw for i in fields):
-                message = "{0} requires at least one of {1} argument(s)" \
-                          "".format(func.action, ', '.join(fields))
-                raise KeyError(message)
-            return func(*args, **kw)
-        requires.__doc__ = "{0}\nSome Required: {1}".format(func.__doc__,
-                                                            ', '.join(fields))
-        return add_attrs_from(func, to=requires)
-    return decorator
-
-
-def boolean_arguments(*fields):
-
-    def decorator(func):
-
-        def wrapper(*args, **kw):
-            for field in [f for f in fields if isinstance(kw.get(f), bool)]:
-                kw[field] = str(kw[field]).lower()
-            return func(*args, **kw)
-        wrapper.__doc__ = "{0}\nBooleans: {1}".format(func.__doc__,
-                                                      ', '.join(fields))
-        return add_attrs_from(func, to=wrapper)
-    return decorator
-
-
-def api_action(section, quota, restore, *api):
-
-    def decorator(func, quota=int(quota), restore=float(restore)):
-        version, accesskey, path = api_version_path[section]
-        action = ''.join(api or map(str.capitalize, func.__name__.split('_')))
-
-        def wrapper(self, *args, **kw):
-            kw.setdefault(accesskey, getattr(self, accesskey, None))
-            if kw[accesskey] is None:
-                message = "{0} requires {1} argument. Set the " \
-                          "MWSConnection.{2} attribute?" \
-                          "".format(action, accesskey, accesskey)
-                raise KeyError(message)
-            kw['Action'] = action
-            kw['Version'] = version
-            response = self._response_factory(action, connection=self)
-            request = dict(path=path, quota=quota, restore=restore)
-            return func(self, request, response, *args, **kw)
-        for attr in decorated_attrs:
-            setattr(wrapper, attr, locals().get(attr))
-        wrapper.__doc__ = "MWS {0}/{1} API call; quota={2} restore={3:.2f}\n" \
-                          "{4}".format(action, version, quota, restore,
-                                       func.__doc__)
-        api_call_map[action] = func.__name__
-        return wrapper
-    return decorator
-
-
-class MWSConnection(AWSQueryConnection):
-
-    ResponseFactory = boto.mws.response.ResponseFactory
-    ResponseErrorFactory = boto.mws.exception.ResponseErrorFactory
-
-    def __init__(self, *args, **kw):
-        kw.setdefault('host', 'mws.amazonservices.com')
-        self._sandboxed = kw.pop('sandbox', False)
-        self.Merchant = kw.pop('Merchant', None) or kw.get('SellerId')
-        self.SellerId = kw.pop('SellerId', None) or self.Merchant
-        kw = self._setup_factories(kw.pop('factory_scopes', []), **kw)
-        super(MWSConnection, self).__init__(*args, **kw)
-
-    def _setup_factories(self, extrascopes, **kw):
-        for factory, (scope, Default) in {
-            'response_factory':
-                (boto.mws.response, self.ResponseFactory),
-            'response_error_factory':
-                (boto.mws.exception, self.ResponseErrorFactory),
-        }.items():
-            if factory in kw:
-                setattr(self, '_' + factory, kw.pop(factory))
-            else:
-                scopes = extrascopes + [scope]
-                setattr(self, '_' + factory, Default(scopes=scopes))
-        return kw
-
-    def _sandboxify(self, path):
-        if not self._sandboxed:
-            return path
-        splat = path.split('/')
-        splat[-2] += '_Sandbox'
-        return '/'.join(splat)
-
-    def _required_auth_capability(self):
-        return ['mws']
-
-    def _post_request(self, request, params, parser, body='', headers=None):
-        """Make a POST request, optionally with a content body,
-           and return the response, optionally as raw text.
-        """
-        headers = headers or {}
-        path = self._sandboxify(request['path'])
-        request = self.build_base_http_request('POST', path, None, data=body,
-                                               params=params, headers=headers,
-                                               host=self.host)
-        try:
-            response = self._mexe(request, override_num_retries=None)
-        except BotoServerError as bs:
-            raise self._response_error_factory(bs.status, bs.reason, bs.body)
-        body = response.read()
-        boto.log.debug(body)
-        if not body:
-            boto.log.error('Null body %s' % body)
-            raise self._response_error_factory(response.status,
-                                               response.reason, body)
-        if response.status != 200:
-            boto.log.error('%s %s' % (response.status, response.reason))
-            boto.log.error('%s' % body)
-            raise self._response_error_factory(response.status,
-                                               response.reason, body)
-        digest = response.getheader('Content-MD5')
-        if digest is not None:
-            assert content_md5(body) == digest
-        contenttype = response.getheader('Content-Type')
-        return self._parse_response(parser, contenttype, body)
-
-    def _parse_response(self, parser, contenttype, body):
-        if not contenttype.startswith('text/xml'):
-            return body
-        handler = XmlHandler(parser, self)
-        xml.sax.parseString(body, handler)
-        return parser
-
-    def method_for(self, name):
-        """Return the MWS API method referred to in the argument.
-           The named method can be in CamelCase or underlined_lower_case.
-           This is the complement to MWSConnection.any_call.action
-        """
-        action = '_' in name and string.capwords(name, '_') or name
-        if action in api_call_map:
-            return getattr(self, api_call_map[action])
-        return None
-
-    def iter_call(self, call, *args, **kw):
-        """Pass a call name as the first argument and a generator
-           is returned for the initial response and any continuation
-           call responses made using the NextToken.
-        """
-        method = self.method_for(call)
-        assert method, 'No call named "{0}"'.format(call)
-        return self.iter_response(method(*args, **kw))
-
-    def iter_response(self, response):
-        """Pass a call's response as the initial argument and a
-           generator is returned for the initial response and any
-           continuation call responses made using the NextToken.
-        """
-        yield response
-        more = self.method_for(response._action + 'ByNextToken')
-        while more and response._result.HasNext == 'true':
-            response = more(NextToken=response._result.NextToken)
-            yield response
-
-    @requires(['FeedType'])
-    @boolean_arguments('PurgeAndReplace')
-    @http_body('FeedContent')
-    @structured_lists('MarketplaceIdList.Id')
-    @api_action('Feeds', 15, 120)
-    def submit_feed(self, request, response, headers=None, body='', **kw):
-        """Uploads a feed for processing by Amazon MWS.
-        """
-        headers = headers or {}
-        return self._post_request(request, kw, response, body=body,
-                                  headers=headers)
-
-    @structured_lists('FeedSubmissionIdList.Id', 'FeedTypeList.Type',
-                      'FeedProcessingStatusList.Status')
-    @api_action('Feeds', 10, 45)
-    def get_feed_submission_list(self, request, response, **kw):
-        """Returns a list of all feed submissions submitted in the
-           previous 90 days.
-        """
-        return self._post_request(request, kw, response)
-
-    @requires(['NextToken'])
-    @api_action('Feeds', 0, 0)
-    def get_feed_submission_list_by_next_token(self, request, response, **kw):
-        """Returns a list of feed submissions using the NextToken parameter.
-        """
-        return self._post_request(request, kw, response)
-
-    @structured_lists('FeedTypeList.Type', 'FeedProcessingStatusList.Status')
-    @api_action('Feeds', 10, 45)
-    def get_feed_submission_count(self, request, response, **kw):
-        """Returns a count of the feeds submitted in the previous 90 days.
-        """
-        return self._post_request(request, kw, response)
-
-    @structured_lists('FeedSubmissionIdList.Id', 'FeedTypeList.Type')
-    @api_action('Feeds', 10, 45)
-    def cancel_feed_submissions(self, request, response, **kw):
-        """Cancels one or more feed submissions and returns a
-           count of the feed submissions that were canceled.
-        """
-        return self._post_request(request, kw, response)
-
-    @requires(['FeedSubmissionId'])
-    @api_action('Feeds', 15, 60)
-    def get_feed_submission_result(self, request, response, **kw):
-        """Returns the feed processing report.
-        """
-        return self._post_request(request, kw, response)
-
-    def get_service_status(self, **kw):
-        """Instruct the user on how to get service status.
-        """
-        sections = ', '.join(map(str.lower, api_version_path.keys()))
-        message = "Use {0}.get_(section)_service_status(), " \
-                  "where (section) is one of the following: " \
-                  "{1}".format(self.__class__.__name__, sections)
-        raise AttributeError(message)
-
-    @requires(['ReportType'])
-    @structured_lists('MarketplaceIdList.Id')
-    @boolean_arguments('ReportOptions=ShowSalesChannel')
-    @api_action('Reports', 15, 60)
-    def request_report(self, request, response, **kw):
-        """Creates a report request and submits the request to Amazon MWS.
-        """
-        return self._post_request(request, kw, response)
-
-    @structured_lists('ReportRequestIdList.Id', 'ReportTypeList.Type',
-                      'ReportProcessingStatusList.Status')
-    @api_action('Reports', 10, 45)
-    def get_report_request_list(self, request, response, **kw):
-        """Returns a list of report requests that you can use to get the
-           ReportRequestId for a report.
-        """
-        return self._post_request(request, kw, response)
-
-    @requires(['NextToken'])
-    @api_action('Reports', 0, 0)
-    def get_report_request_list_by_next_token(self, request, response, **kw):
-        """Returns a list of report requests using the NextToken,
-           which was supplied by a previous request to either
-           GetReportRequestListByNextToken or GetReportRequestList, where
-           the value of HasNext was true in that previous request.
-        """
-        return self._post_request(request, kw, response)
-
-    @structured_lists('ReportTypeList.Type',
-                      'ReportProcessingStatusList.Status')
-    @api_action('Reports', 10, 45)
-    def get_report_request_count(self, request, response, **kw):
-        """Returns a count of report requests that have been submitted
-           to Amazon MWS for processing.
-        """
-        return self._post_request(request, kw, response)
-
-    @api_action('Reports', 10, 45)
-    def cancel_report_requests(self, request, response, **kw):
-        """Cancel one or more report requests, returning the count of the
-           canceled report requests and the report request information.
-        """
-        return self._post_request(request, kw, response)
-
-    @boolean_arguments('Acknowledged')
-    @structured_lists('ReportRequestIdList.Id', 'ReportTypeList.Type')
-    @api_action('Reports', 10, 60)
-    def get_report_list(self, request, response, **kw):
-        """Returns a list of reports that were created in the previous
-           90 days that match the query parameters.
-        """
-        return self._post_request(request, kw, response)
-
-    @requires(['NextToken'])
-    @api_action('Reports', 0, 0)
-    def get_report_list_by_next_token(self, request, response, **kw):
-        """Returns a list of reports using the NextToken, which
-           was supplied by a previous request to either
-           GetReportListByNextToken or GetReportList, where the
-           value of HasNext was true in the previous call.
-        """
-        return self._post_request(request, kw, response)
-
-    @boolean_arguments('Acknowledged')
-    @structured_lists('ReportTypeList.Type')
-    @api_action('Reports', 10, 45)
-    def get_report_count(self, request, response, **kw):
-        """Returns a count of the reports, created in the previous 90 days,
-           with a status of _DONE_ and that are available for download.
-        """
-        return self._post_request(request, kw, response)
-
-    @requires(['ReportId'])
-    @api_action('Reports', 15, 60)
-    def get_report(self, request, response, **kw):
-        """Returns the contents of a report.
-        """
-        return self._post_request(request, kw, response)
-
-    @requires(['ReportType', 'Schedule'])
-    @api_action('Reports', 10, 45)
-    def manage_report_schedule(self, request, response, **kw):
-        """Creates, updates, or deletes a report request schedule for
-           a specified report type.
-        """
-        return self._post_request(request, kw, response)
-
-    @structured_lists('ReportTypeList.Type')
-    @api_action('Reports', 10, 45)
-    def get_report_schedule_list(self, request, response, **kw):
-        """Returns a list of order report requests that are scheduled
-           to be submitted to Amazon MWS for processing.
-        """
-        return self._post_request(request, kw, response)
-
-    @requires(['NextToken'])
-    @api_action('Reports', 0, 0)
-    def get_report_schedule_list_by_next_token(self, request, response, **kw):
-        """Returns a list of report requests using the NextToken,
-           which was supplied by a previous request to either
-           GetReportScheduleListByNextToken or GetReportScheduleList,
-           where the value of HasNext was true in that previous request.
-        """
-        return self._post_request(request, kw, response)
-
-    @structured_lists('ReportTypeList.Type')
-    @api_action('Reports', 10, 45)
-    def get_report_schedule_count(self, request, response, **kw):
-        """Returns a count of order report requests that are scheduled
-           to be submitted to Amazon MWS.
-        """
-        return self._post_request(request, kw, response)
-
-    @requires(['ReportIdList'])
-    @boolean_arguments('Acknowledged')
-    @structured_lists('ReportIdList.Id')
-    @api_action('Reports', 10, 45)
-    def update_report_acknowledgements(self, request, response, **kw):
-        """Updates the acknowledged status of one or more reports.
-        """
-        return self._post_request(request, kw, response)
-
-    @requires(['ShipFromAddress', 'InboundShipmentPlanRequestItems'])
-    @structured_objects('ShipFromAddress', 'InboundShipmentPlanRequestItems')
-    @api_action('Inbound', 30, 0.5)
-    def create_inbound_shipment_plan(self, request, response, **kw):
-        """Returns the information required to create an inbound shipment.
-        """
-        return self._post_request(request, kw, response)
-
-    @requires(['ShipmentId', 'InboundShipmentHeader', 'InboundShipmentItems'])
-    @structured_objects('InboundShipmentHeader', 'InboundShipmentItems')
-    @api_action('Inbound', 30, 0.5)
-    def create_inbound_shipment(self, request, response, **kw):
-        """Creates an inbound shipment.
-        """
-        return self._post_request(request, kw, response)
-
-    @requires(['ShipmentId'])
-    @structured_objects('InboundShipmentHeader', 'InboundShipmentItems')
-    @api_action('Inbound', 30, 0.5)
-    def update_inbound_shipment(self, request, response, **kw):
-        """Updates an existing inbound shipment.  Amazon documentation
-           is ambiguous as to whether the InboundShipmentHeader and
-           InboundShipmentItems arguments are required.
-        """
-        return self._post_request(request, kw, response)
-
-    @requires_some_of('ShipmentIdList', 'ShipmentStatusList')
-    @structured_lists('ShipmentIdList.Id', 'ShipmentStatusList.Status')
-    @api_action('Inbound', 30, 0.5)
-    def list_inbound_shipments(self, request, response, **kw):
-        """Returns a list of inbound shipments based on criteria that
-           you specify.
-        """
-        return self._post_request(request, kw, response)
-
-    @requires(['NextToken'])
-    @api_action('Inbound', 30, 0.5)
-    def list_inbound_shipments_by_next_token(self, request, response, **kw):
-        """Returns the next page of inbound shipments using the NextToken
-           parameter.
-        """
-        return self._post_request(request, kw, response)
-
-    @requires(['ShipmentId'], ['LastUpdatedAfter', 'LastUpdatedBefore'])
-    @api_action('Inbound', 30, 0.5)
-    def list_inbound_shipment_items(self, request, response, **kw):
-        """Returns a list of items in a specified inbound shipment, or a
-           list of items that were updated within a specified time frame.
-        """
-        return self._post_request(request, kw, response)
-
-    @requires(['NextToken'])
-    @api_action('Inbound', 30, 0.5)
-    def list_inbound_shipment_items_by_next_token(self, request, response, **kw):
-        """Returns the next page of inbound shipment items using the
-           NextToken parameter.
-        """
-        return self._post_request(request, kw, response)
-
-    @api_action('Inbound', 2, 300, 'GetServiceStatus')
-    def get_inbound_service_status(self, request, response, **kw):
-        """Returns the operational status of the Fulfillment Inbound
-           Shipment API section.
-        """
-        return self._post_request(request, kw, response)
-
-    @requires(['SellerSkus'], ['QueryStartDateTime'])
-    @structured_lists('SellerSkus.member')
-    @api_action('Inventory', 30, 0.5)
-    def list_inventory_supply(self, request, response, **kw):
-        """Returns information about the availability of a seller's
-           inventory.
-        """
-        return self._post_request(request, kw, response)
-
-    @requires(['NextToken'])
-    @api_action('Inventory', 30, 0.5)
-    def list_inventory_supply_by_next_token(self, request, response, **kw):
-        """Returns the next page of information about the availability
-           of a seller's inventory using the NextToken parameter.
-        """
-        return self._post_request(request, kw, response)
-
-    @api_action('Inventory', 2, 300, 'GetServiceStatus')
-    def get_inventory_service_status(self, request, response, **kw):
-        """Returns the operational status of the Fulfillment Inventory
-           API section.
-        """
-        return self._post_request(request, kw, response)
-
-    @requires(['PackageNumber'])
-    @api_action('Outbound', 30, 0.5)
-    def get_package_tracking_details(self, request, response, **kw):
-        """Returns delivery tracking information for a package in
-           an outbound shipment for a Multi-Channel Fulfillment order.
-        """
-        return self._post_request(request, kw, response)
-
-    @requires(['Address', 'Items'])
-    @structured_objects('Address', 'Items')
-    @api_action('Outbound', 30, 0.5)
-    def get_fulfillment_preview(self, request, response, **kw):
-        """Returns a list of fulfillment order previews based on items
-           and shipping speed categories that you specify.
-        """
-        return self._post_request(request, kw, response)
-
-    @requires(['SellerFulfillmentOrderId', 'DisplayableOrderId',
-               'ShippingSpeedCategory',    'DisplayableOrderDateTime',
-               'DestinationAddress',       'DisplayableOrderComment',
-               'Items'])
-    @structured_objects('DestinationAddress', 'Items')
-    @api_action('Outbound', 30, 0.5)
-    def create_fulfillment_order(self, request, response, **kw):
-        """Requests that Amazon ship items from the seller's inventory
-           to a destination address.
-        """
-        return self._post_request(request, kw, response)
-
-    @requires(['SellerFulfillmentOrderId'])
-    @api_action('Outbound', 30, 0.5)
-    def get_fulfillment_order(self, request, response, **kw):
-        """Returns a fulfillment order based on a specified
-           SellerFulfillmentOrderId.
-        """
-        return self._post_request(request, kw, response)
-
-    @api_action('Outbound', 30, 0.5)
-    def list_all_fulfillment_orders(self, request, response, **kw):
-        """Returns a list of fulfillment orders fulfilled after (or
-           at) a specified date or by fulfillment method.
-        """
-        return self._post_request(request, kw, response)
-
-    @requires(['NextToken'])
-    @api_action('Outbound', 30, 0.5)
-    def list_all_fulfillment_orders_by_next_token(self, request, response, **kw):
-        """Returns the next page of inbound shipment items using the
-           NextToken parameter.
-        """
-        return self._post_request(request, kw, response)
-
-    @requires(['SellerFulfillmentOrderId'])
-    @api_action('Outbound', 30, 0.5)
-    def cancel_fulfillment_order(self, request, response, **kw):
-        """Requests that Amazon stop attempting to fulfill an existing
-           fulfillment order.
-        """
-        return self._post_request(request, kw, response)
-
-    @api_action('Outbound', 2, 300, 'GetServiceStatus')
-    def get_outbound_service_status(self, request, response, **kw):
-        """Returns the operational status of the Fulfillment Outbound
-           API section.
-        """
-        return self._post_request(request, kw, response)
-
-    @requires(['CreatedAfter'], ['LastUpdatedAfter'])
-    @requires(['MarketplaceId'])
-    @exclusive(['CreatedAfter'], ['LastUpdatedAfter'])
-    @dependent('CreatedBefore', ['CreatedAfter'])
-    @exclusive(['LastUpdatedAfter'], ['BuyerEmail'], ['SellerOrderId'])
-    @dependent('LastUpdatedBefore', ['LastUpdatedAfter'])
-    @exclusive(['CreatedAfter'], ['LastUpdatedBefore'])
-    @structured_objects('OrderTotal', 'ShippingAddress',
-                        'PaymentExecutionDetail')
-    @structured_lists('MarketplaceId.Id', 'OrderStatus.Status',
-                      'FulfillmentChannel.Channel', 'PaymentMethod.')
-    @api_action('Orders', 6, 60)
-    def list_orders(self, request, response, **kw):
-        """Returns a list of orders created or updated during a time
-           frame that you specify.
-        """
-        toggle = set(('FulfillmentChannel.Channel.1',
-                      'OrderStatus.Status.1', 'PaymentMethod.1',
-                      'LastUpdatedAfter', 'LastUpdatedBefore'))
-        for do, dont in {
-            'BuyerEmail': toggle.union(['SellerOrderId']),
-            'SellerOrderId': toggle.union(['BuyerEmail']),
-        }.items():
-            if do in kw and any(i in dont for i in kw):
-                message = "Don't include {0} when specifying " \
-                          "{1}".format(' or '.join(dont), do)
-                raise AssertionError(message)
-        return self._post_request(request, kw, response)
-
-    @requires(['NextToken'])
-    @api_action('Orders', 6, 60)
-    def list_orders_by_next_token(self, request, response, **kw):
-        """Returns the next page of orders using the NextToken value
-           that was returned by your previous request to either
-           ListOrders or ListOrdersByNextToken.
-        """
-        return self._post_request(request, kw, response)
-
-    @requires(['AmazonOrderId'])
-    @structured_lists('AmazonOrderId.Id')
-    @api_action('Orders', 6, 60)
-    def get_order(self, request, response, **kw):
-        """Returns an order for each AmazonOrderId that you specify.
-        """
-        return self._post_request(request, kw, response)
-
-    @requires(['AmazonOrderId'])
-    @api_action('Orders', 30, 2)
-    def list_order_items(self, request, response, **kw):
-        """Returns order item information for an AmazonOrderId that
-           you specify.
-        """
-        return self._post_request(request, kw, response)
-
-    @requires(['NextToken'])
-    @api_action('Orders', 30, 2)
-    def list_order_items_by_next_token(self, request, response, **kw):
-        """Returns the next page of order items using the NextToken
-           value that was returned by your previous request to either
-           ListOrderItems or ListOrderItemsByNextToken.
-        """
-        return self._post_request(request, kw, response)
-
-    @api_action('Orders', 2, 300, 'GetServiceStatus')
-    def get_orders_service_status(self, request, response, **kw):
-        """Returns the operational status of the Orders API section.
-        """
-        return self._post_request(request, kw, response)
-
-    @requires(['MarketplaceId', 'Query'])
-    @api_action('Products', 20, 20)
-    def list_matching_products(self, request, response, **kw):
-        """Returns a list of products and their attributes, ordered
-           by relevancy, based on a search query that you specify.
-        """
-        return self._post_request(request, kw, response)
-
-    @requires(['MarketplaceId', 'ASINList'])
-    @structured_lists('ASINList.ASIN')
-    @api_action('Products', 20, 20)
-    def get_matching_product(self, request, response, **kw):
-        """Returns a list of products and their attributes, based on
-           a list of ASIN values that you specify.
-        """
-        return self._post_request(request, kw, response)
-
-    @requires(['MarketplaceId', 'IdType', 'IdList'])
-    @structured_lists('IdList.Id')
-    @api_action('Products', 20, 20)
-    def get_matching_product_for_id(self, request, response, **kw):
-        """Returns a list of products and their attributes, based on
-           a list of Product IDs that you specify.
-        """
-        return self._post_request(request, kw, response)
-
-    @requires(['MarketplaceId', 'SellerSKUList'])
-    @structured_lists('SellerSKUList.SellerSKU')
-    @api_action('Products', 20, 10, 'GetCompetitivePricingForSKU')
-    def get_competitive_pricing_for_sku(self, request, response, **kw):
-        """Returns the current competitive pricing of a product,
-           based on the SellerSKUs and MarketplaceId that you specify.
-        """
-        return self._post_request(request, kw, response)
-
-    @requires(['MarketplaceId', 'ASINList'])
-    @structured_lists('ASINList.ASIN')
-    @api_action('Products', 20, 10, 'GetCompetitivePricingForASIN')
-    def get_competitive_pricing_for_asin(self, request, response, **kw):
-        """Returns the current competitive pricing of a product,
-           based on the ASINs and MarketplaceId that you specify.
-        """
-        return self._post_request(request, kw, response)
-
-    @requires(['MarketplaceId', 'SellerSKUList'])
-    @structured_lists('SellerSKUList.SellerSKU')
-    @api_action('Products', 20, 5, 'GetLowestOfferListingsForSKU')
-    def get_lowest_offer_listings_for_sku(self, request, response, **kw):
-        """Returns the lowest price offer listings for a specific
-           product by item condition and SellerSKUs.
-        """
-        return self._post_request(request, kw, response)
-
-    @requires(['MarketplaceId', 'ASINList'])
-    @structured_lists('ASINList.ASIN')
-    @api_action('Products', 20, 5, 'GetLowestOfferListingsForASIN')
-    def get_lowest_offer_listings_for_asin(self, request, response, **kw):
-        """Returns the lowest price offer listings for a specific
-           product by item condition and ASINs.
-        """
-        return self._post_request(request, kw, response)
-
-    @requires(['MarketplaceId', 'SellerSKU'])
-    @api_action('Products', 20, 20, 'GetProductCategoriesForSKU')
-    def get_product_categories_for_sku(self, request, response, **kw):
-        """Returns the product categories that a SellerSKU belongs to.
-        """
-        return self._post_request(request, kw, response)
-
-    @requires(['MarketplaceId', 'ASIN'])
-    @api_action('Products', 20, 20, 'GetProductCategoriesForASIN')
-    def get_product_categories_for_asin(self, request, response, **kw):
-        """Returns the product categories that an ASIN belongs to.
-        """
-        return self._post_request(request, kw, response)
-
-    @api_action('Products', 2, 300, 'GetServiceStatus')
-    def get_products_service_status(self, request, response, **kw):
-        """Returns the operational status of the Products API section.
-        """
-        return self._post_request(request, kw, response)
-
-    @requires(['MarketplaceId', 'SellerSKUList'])
-    @structured_lists('SellerSKUList.SellerSKU')
-    @api_action('Products', 20, 10, 'GetMyPriceForSKU')
-    def get_my_price_for_sku(self, request, response, **kw):
-        """Returns pricing information for your own offer listings, based on SellerSKU.
-        """
-        return self._post_request(request, kw, response)
-
-    @requires(['MarketplaceId', 'ASINList'])
-    @structured_lists('ASINList.ASIN')
-    @api_action('Products', 20, 10, 'GetMyPriceForASIN')
-    def get_my_price_for_asin(self, request, response, **kw):
-        """Returns pricing information for your own offer listings, based on ASIN.
-        """
-        return self._post_request(request, kw, response)
-
-    @api_action('Sellers', 15, 60)
-    def list_marketplace_participations(self, request, response, **kw):
-        """Returns a list of marketplaces that the seller submitting
-           the request can sell in, and a list of participations that
-           include seller-specific information in that marketplace.
-        """
-        return self._post_request(request, kw, response)
-
-    @requires(['NextToken'])
-    @api_action('Sellers', 15, 60)
-    def list_marketplace_participations_by_next_token(self, request, response,
-                                                      **kw):
-        """Returns the next page of marketplaces and participations
-           using the NextToken value that was returned by your
-           previous request to either ListMarketplaceParticipations
-           or ListMarketplaceParticipationsByNextToken.
-        """
-        return self._post_request(request, kw, response)
-
-    @requires(['MarketplaceId'])
-    @api_action('Recommendations', 5, 2)
-    def get_last_updated_time_for_recommendations(self, request, response,
-                                                  **kw):
-        """Checks whether there are active recommendations for each category
-           for the given marketplace, and if there are, returns the time when
-           recommendations were last updated for each category.
-        """
-        return self._post_request(request, kw, response)
-
-    @requires(['MarketplaceId'])
-    @structured_lists('CategoryQueryList.CategoryQuery')
-    @api_action('Recommendations', 5, 2)
-    def list_recommendations(self, request, response, **kw):
-        """Returns your active recommendations for a specific category or for
-           all categories for a specific marketplace.
-        """
-        return self._post_request(request, kw, response)
-
-    @requires(['NextToken'])
-    @api_action('Recommendations', 5, 2)
-    def list_recommendations_by_next_token(self, request, response, **kw):
-        """Returns the next page of recommendations using the NextToken
-           parameter.
-        """
-        return self._post_request(request, kw, response)
-
-    @api_action('Recommendations', 2, 300, 'GetServiceStatus')
-    def get_recommendations_service_status(self, request, response, **kw):
-        """Returns the operational status of the Recommendations API section.
-        """
-        return self._post_request(request, kw, response)
-
-    @api_action('CustomerInfo', 15, 12)
-    def list_customers(self, request, response, **kw):
-        """Returns a list of customer accounts based on search criteria that
-           you specify.
-        """
-        return self._post_request(request, kw, response)
-
-    @requires(['NextToken'])
-    @api_action('CustomerInfo', 50, 3)
-    def list_customers_by_next_token(self, request, response, **kw):
-        """Returns the next page of customers using the NextToken parameter.
-        """
-        return self._post_request(request, kw, response)
-
-    @requires(['CustomerIdList'])
-    @structured_lists('CustomerIdList.CustomerId')
-    @api_action('CustomerInfo', 15, 12)
-    def get_customers_for_customer_id(self, request, response, **kw):
-        """Returns a list of customer accounts based on search criteria that
-           you specify.
-        """
-        return self._post_request(request, kw, response)
-
-    @api_action('CustomerInfo', 2, 300, 'GetServiceStatus')
-    def get_customerinfo_service_status(self, request, response, **kw):
-        """Returns the operational status of the Customer Information API
-           section.
-        """
-        return self._post_request(request, kw, response)
-
-    @requires(['DateRangeStart'])
-    @api_action('CartInfo', 15, 12)
-    def list_carts(self, request, response, **kw):
-        """Returns a list of shopping carts in your Webstore that were last
-           updated during the time range that you specify.
-        """
-        return self._post_request(request, kw, response)
-
-    @requires(['NextToken'])
-    @api_action('CartInfo', 50, 3)
-    def list_carts_by_next_token(self, request, response, **kw):
-        """Returns the next page of shopping carts using the NextToken
-           parameter.
-        """
-        return self._post_request(request, kw, response)
-
-    @requires(['CartIdList'])
-    @structured_lists('CartIdList.CartId')
-    @api_action('CartInfo', 15, 12)
-    def get_carts(self, request, response, **kw):
-        """Returns shopping carts based on the CartId values that you specify.
-        """
-        return self._post_request(request, kw, response)
-
-    @api_action('CartInfo', 2, 300, 'GetServiceStatus')
-    def get_cartinfo_service_status(self, request, response, **kw):
-        """Returns the operational status of the Cart Information API section.
-        """
-        return self._post_request(request, kw, response)
-
-    @requires(['MarketplaceId', 'Destination'])
-    @structured_objects('Destination', members=True)
-    @api_action('Subscriptions', 25, 0.5)
-    def register_destination(self, request, response, **kw):
-        """Specifies a new destination where you want to receive notifications.
-        """
-        return self._post_request(request, kw, response)
-
-    @requires(['MarketplaceId', 'Destination'])
-    @structured_objects('Destination', members=True)
-    @api_action('Subscriptions', 25, 0.5)
-    def deregister_destination(self, request, response, **kw):
-        """Removes an existing destination from the list of registered
-           destinations.
-        """
-        return self._post_request(request, kw, response)
-
-    @requires(['MarketplaceId'])
-    @api_action('Subscriptions', 25, 0.5)
-    def list_registered_destinations(self, request, response, **kw):
-        """Lists all current destinations that you have registered.
-        """
-        return self._post_request(request, kw, response)
-
-    @requires(['MarketplaceId', 'Destination'])
-    @structured_objects('Destination', members=True)
-    @api_action('Subscriptions', 25, 0.5)
-    def send_test_notification_to_destination(self, request, response, **kw):
-        """Sends a test notification to an existing destination.
-        """
-        return self._post_request(request, kw, response)
-
-    @requires(['MarketplaceId', 'Subscription'])
-    @structured_objects('Subscription', members=True)
-    @api_action('Subscriptions', 25, 0.5)
-    def create_subscription(self, request, response, **kw):
-        """Creates a new subscription for the specified notification type
-           and destination.
-        """
-        return self._post_request(request, kw, response)
-
-    @requires(['MarketplaceId', 'NotificationType', 'Destination'])
-    @structured_objects('Destination', members=True)
-    @api_action('Subscriptions', 25, 0.5)
-    def get_subscription(self, request, response, **kw):
-        """Gets the subscription for the specified notification type and
-           destination.
-        """
-        return self._post_request(request, kw, response)
-
-    @requires(['MarketplaceId', 'NotificationType', 'Destination'])
-    @structured_objects('Destination', members=True)
-    @api_action('Subscriptions', 25, 0.5)
-    def delete_subscription(self, request, response, **kw):
-        """Deletes the subscription for the specified notification type and
-           destination.
-        """
-        return self._post_request(request, kw, response)
-
-    @requires(['MarketplaceId'])
-    @api_action('Subscriptions', 25, 0.5)
-    def list_subscriptions(self, request, response, **kw):
-        """Returns a list of all your current subscriptions.
-        """
-        return self._post_request(request, kw, response)
-
-    @requires(['MarketplaceId', 'Subscription'])
-    @structured_objects('Subscription', members=True)
-    @api_action('Subscriptions', 25, 0.5)
-    def update_subscription(self, request, response, **kw):
-        """Updates the subscription for the specified notification type and
-           destination.
-        """
-        return self._post_request(request, kw, response)
-
-    @api_action('Subscriptions', 2, 300, 'GetServiceStatus')
-    def get_subscriptions_service_status(self, request, response, **kw):
-        """Returns the operational status of the Subscriptions API section.
-        """
-        return self._post_request(request, kw, response)
-
-    @requires(['AmazonOrderReferenceId', 'OrderReferenceAttributes'])
-    @structured_objects('OrderReferenceAttributes')
-    @api_action('OffAmazonPayments', 10, 1)
-    def set_order_reference_details(self, request, response, **kw):
-        """Sets order reference details such as the order total and a
-           description for the order.
-        """
-        return self._post_request(request, kw, response)
-
-    @requires(['AmazonOrderReferenceId'])
-    @api_action('OffAmazonPayments', 20, 2)
-    def get_order_reference_details(self, request, response, **kw):
-        """Returns details about the Order Reference object and its current
-           state.
-        """
-        return self._post_request(request, kw, response)
-
-    @requires(['AmazonOrderReferenceId'])
-    @api_action('OffAmazonPayments', 10, 1)
-    def confirm_order_reference(self, request, response, **kw):
-        """Confirms that the order reference is free of constraints and all
-           required information has been set on the order reference.
-        """
-        return self._post_request(request, kw, response)
-
-    @requires(['AmazonOrderReferenceId'])
-    @api_action('OffAmazonPayments', 10, 1)
-    def cancel_order_reference(self, request, response, **kw):
-        """Cancel an order reference; all authorizations associated with
-           this order reference are also closed.
-        """
-        return self._post_request(request, kw, response)
-
-    @requires(['AmazonOrderReferenceId'])
-    @api_action('OffAmazonPayments', 10, 1)
-    def close_order_reference(self, request, response, **kw):
-        """Confirms that an order reference has been fulfilled (fully
-           or partially) and that you do not expect to create any new
-           authorizations on this order reference.
-        """
-        return self._post_request(request, kw, response)
-
-    @requires(['AmazonOrderReferenceId', 'AuthorizationReferenceId',
-               'AuthorizationAmount'])
-    @structured_objects('AuthorizationAmount')
-    @api_action('OffAmazonPayments', 10, 1)
-    def authorize(self, request, response, **kw):
-        """Reserves a specified amount against the payment method(s) stored in
-           the order reference.
-        """
-        return self._post_request(request, kw, response)
-
-    @requires(['AmazonAuthorizationId'])
-    @api_action('OffAmazonPayments', 20, 2)
-    def get_authorization_details(self, request, response, **kw):
-        """Returns the status of a particular authorization and the total
-           amount captured on the authorization.
-        """
-        return self._post_request(request, kw, response)
-
-    @requires(['AmazonAuthorizationId', 'CaptureReferenceId', 'CaptureAmount'])
-    @structured_objects('CaptureAmount')
-    @api_action('OffAmazonPayments', 10, 1)
-    def capture(self, request, response, **kw):
-        """Captures funds from an authorized payment instrument.
-        """
-        return self._post_request(request, kw, response)
-
-    @requires(['AmazonCaptureId'])
-    @api_action('OffAmazonPayments', 20, 2)
-    def get_capture_details(self, request, response, **kw):
-        """Returns the status of a particular capture and the total amount
-           refunded on the capture.
-        """
-        return self._post_request(request, kw, response)
-
-    @requires(['AmazonAuthorizationId'])
-    @api_action('OffAmazonPayments', 10, 1)
-    def close_authorization(self, request, response, **kw):
-        """Closes an authorization.
-        """
-        return self._post_request(request, kw, response)
-
-    @requires(['AmazonCaptureId', 'RefundReferenceId', 'RefundAmount'])
-    @structured_objects('RefundAmount')
-    @api_action('OffAmazonPayments', 10, 1)
-    def refund(self, request, response, **kw):
-        """Refunds a previously captured amount.
-        """
-        return self._post_request(request, kw, response)
-
-    @requires(['AmazonRefundId'])
-    @api_action('OffAmazonPayments', 20, 2)
-    def get_refund_details(self, request, response, **kw):
-        """Returns the status of a particular refund.
-        """
-        return self._post_request(request, kw, response)
-
-    @api_action('OffAmazonPayments', 2, 300, 'GetServiceStatus')
-    def get_offamazonpayments_service_status(self, request, response, **kw):
-        """Returns the operational status of the Off-Amazon Payments API
-           section.
-        """
-        return self._post_request(request, kw, response)