diff env/lib/python3.7/site-packages/boto/mws/response.py @ 0:26e78fe6e8c4 draft

"planemo upload commit c699937486c35866861690329de38ec1a5d9f783"
author shellac
date Sat, 02 May 2020 07:14:21 -0400
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/env/lib/python3.7/site-packages/boto/mws/response.py	Sat May 02 07:14:21 2020 -0400
@@ -0,0 +1,787 @@
+# 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.
+from decimal import Decimal
+from boto.compat import filter, map
+
+
+class ComplexType(dict):
+    _value = 'Value'
+
+    def __repr__(self):
+        return '{0}{1}'.format(getattr(self, self._value, None), self.copy())
+
+    def __str__(self):
+        return str(getattr(self, self._value, ''))
+
+
+class DeclarativeType(object):
+    def __init__(self, _hint=None, **kw):
+        self._value = None
+        if _hint is not None:
+            self._hint = _hint
+            return
+
+        class JITResponse(ResponseElement):
+            pass
+        self._hint = JITResponse
+        self._hint.__name__ = 'JIT_{0}/{1}'.format(self.__class__.__name__,
+                                                   hex(id(self._hint))[2:])
+        for name, value in kw.items():
+            setattr(self._hint, name, value)
+
+    def __repr__(self):
+        parent = getattr(self, '_parent', None)
+        return '<{0}_{1}/{2}_{3}>'.format(self.__class__.__name__,
+                                          parent and parent._name or '?',
+                                          getattr(self, '_name', '?'),
+                                          hex(id(self.__class__)))
+
+    def setup(self, parent, name, *args, **kw):
+        self._parent = parent
+        self._name = name
+        self._clone = self.__class__(_hint=self._hint)
+        self._clone._parent = parent
+        self._clone._name = name
+        setattr(self._parent, self._name, self._clone)
+
+    def start(self, *args, **kw):
+        raise NotImplementedError
+
+    def end(self, *args, **kw):
+        raise NotImplementedError
+
+    def teardown(self, *args, **kw):
+        setattr(self._parent, self._name, self._value)
+
+
+class Element(DeclarativeType):
+    def start(self, *args, **kw):
+        self._value = self._hint(parent=self._parent, **kw)
+        return self._value
+
+    def end(self, *args, **kw):
+        pass
+
+
+class SimpleList(DeclarativeType):
+    def __init__(self, *args, **kw):
+        super(SimpleList, self).__init__(*args, **kw)
+        self._value = []
+
+    def start(self, *args, **kw):
+        return None
+
+    def end(self, name, value, *args, **kw):
+        self._value.append(value)
+
+
+class ElementList(SimpleList):
+    def start(self, *args, **kw):
+        value = self._hint(parent=self._parent, **kw)
+        self._value.append(value)
+        return value
+
+    def end(self, *args, **kw):
+        pass
+
+
+class MemberList(Element):
+    def __init__(self, _member=None, _hint=None, *args, **kw):
+        message = 'Invalid `member` specification in {0}'.format(self.__class__.__name__)
+        assert 'member' not in kw, message
+        if _member is None:
+            if _hint is None:
+                super(MemberList, self).__init__(*args, member=ElementList(**kw))
+            else:
+                super(MemberList, self).__init__(_hint=_hint)
+        else:
+            if _hint is None:
+                if issubclass(_member, DeclarativeType):
+                    member = _member(**kw)
+                else:
+                    member = ElementList(_member, **kw)
+                super(MemberList, self).__init__(*args, member=member)
+            else:
+                message = 'Nonsensical {0} hint {1!r}'.format(self.__class__.__name__,
+                                                              _hint)
+                raise AssertionError(message)
+
+    def teardown(self, *args, **kw):
+        if self._value is None:
+            self._value = []
+        else:
+            if isinstance(self._value.member, DeclarativeType):
+                self._value.member = []
+            self._value = self._value.member
+        super(MemberList, self).teardown(*args, **kw)
+
+
+class ResponseFactory(object):
+    def __init__(self, scopes=None):
+        self.scopes = [] if scopes is None else scopes
+
+    def element_factory(self, name, parent):
+        class DynamicElement(parent):
+            _name = name
+        setattr(DynamicElement, '__name__', str(name))
+        return DynamicElement
+
+    def search_scopes(self, key):
+        for scope in self.scopes:
+            if hasattr(scope, key):
+                return getattr(scope, key)
+            if hasattr(scope, '__getitem__'):
+                if key in scope:
+                    return scope[key]
+
+    def find_element(self, action, suffix, parent):
+        element = self.search_scopes(action + suffix)
+        if element is not None:
+            return element
+        if action.endswith('ByNextToken'):
+            element = self.search_scopes(action[:-len('ByNextToken')] + suffix)
+            if element is not None:
+                return self.element_factory(action + suffix, element)
+        return self.element_factory(action + suffix, parent)
+
+    def __call__(self, action, connection=None):
+        response = self.find_element(action, 'Response', Response)
+        if not hasattr(response, action + 'Result'):
+            result = self.find_element(action, 'Result', ResponseElement)
+            setattr(response, action + 'Result', Element(result))
+        return response(connection=connection)
+
+
+def strip_namespace(func):
+    def wrapper(self, name, *args, **kw):
+        if self._namespace is not None:
+            if name.startswith(self._namespace + ':'):
+                name = name[len(self._namespace + ':'):]
+        return func(self, name, *args, **kw)
+    return wrapper
+
+
+class ResponseElement(dict):
+    _override = {}
+    _name = None
+    _namespace = None
+
+    def __init__(self, connection=None, name=None, parent=None, attrs=None):
+        if parent is not None and self._namespace is None:
+            self._namespace = parent._namespace
+        if connection is not None:
+            self._connection = connection
+        self._name = name or self._name or self.__class__.__name__
+        self._declared('setup', attrs=attrs)
+        dict.__init__(self, attrs and attrs.copy() or {})
+
+    def _declared(self, op, **kw):
+        def inherit(obj):
+            result = {}
+            for cls in getattr(obj, '__bases__', ()):
+                result.update(inherit(cls))
+            result.update(obj.__dict__)
+            return result
+
+        scope = inherit(self.__class__)
+        scope.update(self.__dict__)
+        declared = lambda attr: isinstance(attr[1], DeclarativeType)
+        for name, node in filter(declared, scope.items()):
+            getattr(node, op)(self, name, parentname=self._name, **kw)
+
+    @property
+    def connection(self):
+        return self._connection
+
+    def __repr__(self):
+        render = lambda pair: '{0!s}: {1!r}'.format(*pair)
+        do_show = lambda pair: not pair[0].startswith('_')
+        attrs = filter(do_show, self.__dict__.items())
+        name = self.__class__.__name__
+        if name.startswith('JIT_'):
+            name = '^{0}^'.format(self._name or '')
+        return '{0}{1!r}({2})'.format(
+            name, self.copy(), ', '.join(map(render, attrs)))
+
+    def _type_for(self, name, attrs):
+        return self._override.get(name, globals().get(name, ResponseElement))
+
+    @strip_namespace
+    def startElement(self, name, attrs, connection):
+        attribute = getattr(self, name, None)
+        if isinstance(attribute, DeclarativeType):
+            return attribute.start(name=name, attrs=attrs,
+                                   connection=connection)
+        elif attrs.getLength():
+            setattr(self, name, ComplexType(attrs.copy()))
+        else:
+            return None
+
+    @strip_namespace
+    def endElement(self, name, value, connection):
+        attribute = getattr(self, name, None)
+        if name == self._name:
+            self._declared('teardown')
+        elif isinstance(attribute, DeclarativeType):
+            attribute.end(name=name, value=value, connection=connection)
+        elif isinstance(attribute, ComplexType):
+            setattr(attribute, attribute._value, value)
+        else:
+            setattr(self, name, value)
+
+
+class Response(ResponseElement):
+    ResponseMetadata = Element()
+
+    @strip_namespace
+    def startElement(self, name, attrs, connection):
+        if name == self._name:
+            self.update(attrs)
+        else:
+            return super(Response, self).startElement(name, attrs, connection)
+
+    @property
+    def _result(self):
+        return getattr(self, self._action + 'Result', None)
+
+    @property
+    def _action(self):
+        return (self._name or self.__class__.__name__)[:-len('Response')]
+
+
+class ResponseResultList(Response):
+    _ResultClass = ResponseElement
+
+    def __init__(self, *args, **kw):
+        setattr(self, self._action + 'Result', ElementList(self._ResultClass))
+        super(ResponseResultList, self).__init__(*args, **kw)
+
+
+class FeedSubmissionInfo(ResponseElement):
+    pass
+
+
+class SubmitFeedResult(ResponseElement):
+    FeedSubmissionInfo = Element(FeedSubmissionInfo)
+
+
+class GetFeedSubmissionListResult(ResponseElement):
+    FeedSubmissionInfo = ElementList(FeedSubmissionInfo)
+
+
+class GetFeedSubmissionCountResult(ResponseElement):
+    pass
+
+
+class CancelFeedSubmissionsResult(GetFeedSubmissionListResult):
+    pass
+
+
+class GetServiceStatusResult(ResponseElement):
+    Messages = Element(Messages=ElementList())
+
+
+class ReportRequestInfo(ResponseElement):
+    pass
+
+
+class RequestReportResult(ResponseElement):
+    ReportRequestInfo = Element()
+
+
+class GetReportRequestListResult(RequestReportResult):
+    ReportRequestInfo = ElementList()
+
+
+class CancelReportRequestsResult(RequestReportResult):
+    pass
+
+
+class GetReportListResult(ResponseElement):
+    ReportInfo = ElementList()
+
+
+class ManageReportScheduleResult(ResponseElement):
+    ReportSchedule = Element()
+
+
+class GetReportScheduleListResult(ManageReportScheduleResult):
+    pass
+
+
+class UpdateReportAcknowledgementsResult(GetReportListResult):
+    pass
+
+
+class CreateInboundShipmentPlanResult(ResponseElement):
+    InboundShipmentPlans = MemberList(ShipToAddress=Element(),
+                                      Items=MemberList())
+
+
+class ListInboundShipmentsResult(ResponseElement):
+    ShipmentData = MemberList(ShipFromAddress=Element())
+
+
+class ListInboundShipmentItemsResult(ResponseElement):
+    ItemData = MemberList()
+
+
+class ListInventorySupplyResult(ResponseElement):
+    InventorySupplyList = MemberList(
+        EarliestAvailability=Element(),
+        SupplyDetail=MemberList(
+            EarliestAvailableToPick=Element(),
+            LatestAvailableToPick=Element(),
+        )
+    )
+
+
+class ComplexAmount(ResponseElement):
+    _amount = 'Value'
+
+    def __repr__(self):
+        return '{0} {1}'.format(self.CurrencyCode, getattr(self, self._amount))
+
+    def __float__(self):
+        return float(getattr(self, self._amount))
+
+    def __str__(self):
+        return str(getattr(self, self._amount))
+
+    @strip_namespace
+    def startElement(self, name, attrs, connection):
+        if name not in ('CurrencyCode', self._amount):
+            message = 'Unrecognized tag {0} in ComplexAmount'.format(name)
+            raise AssertionError(message)
+        return super(ComplexAmount, self).startElement(name, attrs, connection)
+
+    @strip_namespace
+    def endElement(self, name, value, connection):
+        if name == self._amount:
+            value = Decimal(value)
+        super(ComplexAmount, self).endElement(name, value, connection)
+
+
+class ComplexMoney(ComplexAmount):
+    _amount = 'Amount'
+
+
+class ComplexWeight(ResponseElement):
+    def __repr__(self):
+        return '{0} {1}'.format(self.Value, self.Unit)
+
+    def __float__(self):
+        return float(self.Value)
+
+    def __str__(self):
+        return str(self.Value)
+
+    @strip_namespace
+    def startElement(self, name, attrs, connection):
+        if name not in ('Unit', 'Value'):
+            message = 'Unrecognized tag {0} in ComplexWeight'.format(name)
+            raise AssertionError(message)
+        return super(ComplexWeight, self).startElement(name, attrs, connection)
+
+    @strip_namespace
+    def endElement(self, name, value, connection):
+        if name == 'Value':
+            value = Decimal(value)
+        super(ComplexWeight, self).endElement(name, value, connection)
+
+
+class Dimension(ComplexType):
+    _value = 'Value'
+
+
+class ComplexDimensions(ResponseElement):
+    _dimensions = ('Height', 'Length', 'Width', 'Weight')
+
+    def __repr__(self):
+        values = [getattr(self, key, None) for key in self._dimensions]
+        values = filter(None, values)
+        return 'x'.join(map('{0.Value:0.2f}{0[Units]}'.format, values))
+
+    @strip_namespace
+    def startElement(self, name, attrs, connection):
+        if name not in self._dimensions:
+            message = 'Unrecognized tag {0} in ComplexDimensions'.format(name)
+            raise AssertionError(message)
+        setattr(self, name, Dimension(attrs.copy()))
+
+    @strip_namespace
+    def endElement(self, name, value, connection):
+        if name in self._dimensions:
+            value = Decimal(value or '0')
+        ResponseElement.endElement(self, name, value, connection)
+
+
+class FulfillmentPreviewItem(ResponseElement):
+    EstimatedShippingWeight = Element(ComplexWeight)
+
+
+class FulfillmentPreview(ResponseElement):
+    EstimatedShippingWeight = Element(ComplexWeight)
+    EstimatedFees = MemberList(Amount=Element(ComplexAmount))
+    UnfulfillablePreviewItems = MemberList(FulfillmentPreviewItem)
+    FulfillmentPreviewShipments = MemberList(
+        FulfillmentPreviewItems=MemberList(FulfillmentPreviewItem),
+    )
+
+
+class GetFulfillmentPreviewResult(ResponseElement):
+    FulfillmentPreviews = MemberList(FulfillmentPreview)
+
+
+class FulfillmentOrder(ResponseElement):
+    DestinationAddress = Element()
+    NotificationEmailList = MemberList(SimpleList)
+
+
+class GetFulfillmentOrderResult(ResponseElement):
+    FulfillmentOrder = Element(FulfillmentOrder)
+    FulfillmentShipment = MemberList(
+        FulfillmentShipmentItem=MemberList(),
+        FulfillmentShipmentPackage=MemberList(),
+    )
+    FulfillmentOrderItem = MemberList()
+
+
+class ListAllFulfillmentOrdersResult(ResponseElement):
+    FulfillmentOrders = MemberList(FulfillmentOrder)
+
+
+class GetPackageTrackingDetailsResult(ResponseElement):
+    ShipToAddress = Element()
+    TrackingEvents = MemberList(EventAddress=Element())
+
+
+class Image(ResponseElement):
+    pass
+
+
+class AttributeSet(ResponseElement):
+    ItemDimensions = Element(ComplexDimensions)
+    ListPrice = Element(ComplexMoney)
+    PackageDimensions = Element(ComplexDimensions)
+    SmallImage = Element(Image)
+
+
+class ItemAttributes(AttributeSet):
+    Languages = Element(Language=ElementList())
+
+    def __init__(self, *args, **kw):
+        names = ('Actor', 'Artist', 'Author', 'Creator', 'Director',
+                 'Feature', 'Format', 'GemType', 'MaterialType',
+                 'MediaType', 'OperatingSystem', 'Platform')
+        for name in names:
+            setattr(self, name, SimpleList())
+        super(ItemAttributes, self).__init__(*args, **kw)
+
+
+class VariationRelationship(ResponseElement):
+    Identifiers = Element(MarketplaceASIN=Element(),
+                          SKUIdentifier=Element())
+    GemType = SimpleList()
+    MaterialType = SimpleList()
+    OperatingSystem = SimpleList()
+
+
+class Price(ResponseElement):
+    LandedPrice = Element(ComplexMoney)
+    ListingPrice = Element(ComplexMoney)
+    Shipping = Element(ComplexMoney)
+
+
+class CompetitivePrice(ResponseElement):
+    Price = Element(Price)
+
+
+class CompetitivePriceList(ResponseElement):
+    CompetitivePrice = ElementList(CompetitivePrice)
+
+
+class CompetitivePricing(ResponseElement):
+    CompetitivePrices = Element(CompetitivePriceList)
+    NumberOfOfferListings = SimpleList()
+    TradeInValue = Element(ComplexMoney)
+
+
+class SalesRank(ResponseElement):
+    pass
+
+
+class LowestOfferListing(ResponseElement):
+    Qualifiers = Element(ShippingTime=Element())
+    Price = Element(Price)
+
+
+class Offer(ResponseElement):
+    BuyingPrice = Element(Price)
+    RegularPrice = Element(ComplexMoney)
+
+
+class Product(ResponseElement):
+    _namespace = 'ns2'
+    Identifiers = Element(MarketplaceASIN=Element(),
+                          SKUIdentifier=Element())
+    AttributeSets = Element(
+        ItemAttributes=ElementList(ItemAttributes),
+    )
+    Relationships = Element(
+        VariationParent=ElementList(VariationRelationship),
+    )
+    CompetitivePricing = ElementList(CompetitivePricing)
+    SalesRankings = Element(
+        SalesRank=ElementList(SalesRank),
+    )
+    LowestOfferListings = Element(
+        LowestOfferListing=ElementList(LowestOfferListing),
+    )
+    Offers = Element(
+        Offer=ElementList(Offer),
+    )
+
+
+class ListMatchingProductsResult(ResponseElement):
+    Products = Element(Product=ElementList(Product))
+
+
+class ProductsBulkOperationResult(ResponseElement):
+    Product = Element(Product)
+    Error = Element()
+
+
+class ProductsBulkOperationResponse(ResponseResultList):
+    _ResultClass = ProductsBulkOperationResult
+
+
+class GetMatchingProductResponse(ProductsBulkOperationResponse):
+    pass
+
+
+class GetMatchingProductForIdResult(ListMatchingProductsResult):
+    pass
+
+
+class GetMatchingProductForIdResponse(ResponseResultList):
+    _ResultClass = GetMatchingProductForIdResult
+
+
+class GetCompetitivePricingForSKUResponse(ProductsBulkOperationResponse):
+    pass
+
+
+class GetCompetitivePricingForASINResponse(ProductsBulkOperationResponse):
+    pass
+
+
+class GetLowestOfferListingsForSKUResponse(ProductsBulkOperationResponse):
+    pass
+
+
+class GetLowestOfferListingsForASINResponse(ProductsBulkOperationResponse):
+    pass
+
+
+class GetMyPriceForSKUResponse(ProductsBulkOperationResponse):
+    pass
+
+
+class GetMyPriceForASINResponse(ProductsBulkOperationResponse):
+    pass
+
+
+class ProductCategory(ResponseElement):
+
+    def __init__(self, *args, **kw):
+        setattr(self, 'Parent', Element(ProductCategory))
+        super(ProductCategory, self).__init__(*args, **kw)
+
+
+class GetProductCategoriesResult(ResponseElement):
+    Self = ElementList(ProductCategory)
+
+
+class GetProductCategoriesForSKUResult(GetProductCategoriesResult):
+    pass
+
+
+class GetProductCategoriesForASINResult(GetProductCategoriesResult):
+    pass
+
+
+class Order(ResponseElement):
+    OrderTotal = Element(ComplexMoney)
+    ShippingAddress = Element()
+    PaymentExecutionDetail = Element(
+        PaymentExecutionDetailItem=ElementList(
+            PaymentExecutionDetailItem=Element(
+                Payment=Element(ComplexMoney)
+            )
+        )
+    )
+
+
+class ListOrdersResult(ResponseElement):
+    Orders = Element(Order=ElementList(Order))
+
+
+class GetOrderResult(ListOrdersResult):
+    pass
+
+
+class OrderItem(ResponseElement):
+    ItemPrice = Element(ComplexMoney)
+    ShippingPrice = Element(ComplexMoney)
+    GiftWrapPrice = Element(ComplexMoney)
+    ItemTax = Element(ComplexMoney)
+    ShippingTax = Element(ComplexMoney)
+    GiftWrapTax = Element(ComplexMoney)
+    ShippingDiscount = Element(ComplexMoney)
+    PromotionDiscount = Element(ComplexMoney)
+    PromotionIds = SimpleList()
+    CODFee = Element(ComplexMoney)
+    CODFeeDiscount = Element(ComplexMoney)
+
+
+class ListOrderItemsResult(ResponseElement):
+    OrderItems = Element(OrderItem=ElementList(OrderItem))
+
+
+class ListMarketplaceParticipationsResult(ResponseElement):
+    ListParticipations = Element(Participation=ElementList())
+    ListMarketplaces = Element(Marketplace=ElementList())
+
+
+class ListRecommendationsResult(ResponseElement):
+    ListingQualityRecommendations = MemberList(ItemIdentifier=Element())
+
+
+class Customer(ResponseElement):
+    PrimaryContactInfo = Element()
+    ShippingAddressList = Element(ShippingAddress=ElementList())
+    AssociatedMarketplaces = Element(MarketplaceDomain=ElementList())
+
+
+class ListCustomersResult(ResponseElement):
+    CustomerList = Element(Customer=ElementList(Customer))
+
+
+class GetCustomersForCustomerIdResult(ListCustomersResult):
+    pass
+
+
+class CartItem(ResponseElement):
+    CurrentPrice = Element(ComplexMoney)
+    SalePrice = Element(ComplexMoney)
+
+
+class Cart(ResponseElement):
+    ActiveCartItemList = Element(CartItem=ElementList(CartItem))
+    SavedCartItemList = Element(CartItem=ElementList(CartItem))
+
+
+class ListCartsResult(ResponseElement):
+    CartList = Element(Cart=ElementList(Cart))
+
+
+class GetCartsResult(ListCartsResult):
+    pass
+
+
+class Destination(ResponseElement):
+    AttributeList = MemberList()
+
+
+class ListRegisteredDestinationsResult(ResponseElement):
+    DestinationList = MemberList(Destination)
+
+
+class Subscription(ResponseElement):
+    Destination = Element(Destination)
+
+
+class GetSubscriptionResult(ResponseElement):
+    Subscription = Element(Subscription)
+
+
+class ListSubscriptionsResult(ResponseElement):
+    SubscriptionList = MemberList(Subscription)
+
+
+class OrderReferenceDetails(ResponseElement):
+    Buyer = Element()
+    OrderTotal = Element(ComplexMoney)
+    Destination = Element(PhysicalDestination=Element())
+    SellerOrderAttributes = Element()
+    OrderReferenceStatus = Element()
+    Constraints = ElementList()
+
+
+class SetOrderReferenceDetailsResult(ResponseElement):
+    OrderReferenceDetails = Element(OrderReferenceDetails)
+
+
+class GetOrderReferenceDetailsResult(SetOrderReferenceDetailsResult):
+    pass
+
+
+class AuthorizationDetails(ResponseElement):
+    AuthorizationAmount = Element(ComplexMoney)
+    CapturedAmount = Element(ComplexMoney)
+    AuthorizationFee = Element(ComplexMoney)
+    AuthorizationStatus = Element()
+
+
+class AuthorizeResult(ResponseElement):
+    AuthorizationDetails = Element(AuthorizationDetails)
+
+
+class GetAuthorizationDetailsResult(AuthorizeResult):
+    pass
+
+
+class CaptureDetails(ResponseElement):
+    CaptureAmount = Element(ComplexMoney)
+    RefundedAmount = Element(ComplexMoney)
+    CaptureFee = Element(ComplexMoney)
+    CaptureStatus = Element()
+
+
+class CaptureResult(ResponseElement):
+    CaptureDetails = Element(CaptureDetails)
+
+
+class GetCaptureDetailsResult(CaptureResult):
+    pass
+
+
+class RefundDetails(ResponseElement):
+    RefundAmount = Element(ComplexMoney)
+    FeeRefunded = Element(ComplexMoney)
+    RefundStatus = Element()
+
+
+class RefundResult(ResponseElement):
+    RefundDetails = Element(RefundDetails)
+
+
+class GetRefundDetails(RefundResult):
+    pass