PageRenderTime 48ms CodeModel.GetById 24ms RepoModel.GetById 1ms app.codeStats 0ms

/boto-2.5.2/boto/fps/response.py

#
Python | 175 lines | 130 code | 43 blank | 2 comment | 20 complexity | 2bb9c3ac32f1de8c78c3a0a4a1b0926e MD5 | raw file
  1. from decimal import Decimal
  2. def ResponseFactory(action):
  3. class FPSResponse(Response):
  4. _action = action
  5. _Result = globals().get(action + 'Result', ResponseElement)
  6. # due to nodes receiving their closing tags
  7. def endElement(self, name, value, connection):
  8. if name != action + 'Response':
  9. Response.endElement(self, name, value, connection)
  10. return FPSResponse
  11. class ResponseElement(object):
  12. def __init__(self, connection=None, name=None):
  13. if connection is not None:
  14. self._connection = connection
  15. self._name = name or self.__class__.__name__
  16. @property
  17. def connection(self):
  18. return self._connection
  19. def __repr__(self):
  20. render = lambda pair: '{!s}: {!r}'.format(*pair)
  21. do_show = lambda pair: not pair[0].startswith('_')
  22. attrs = filter(do_show, self.__dict__.items())
  23. return '{0}({1})'.format(self.__class__.__name__,
  24. ', '.join(map(render, attrs)))
  25. def startElement(self, name, attrs, connection):
  26. return None
  27. # due to nodes receiving their closing tags
  28. def endElement(self, name, value, connection):
  29. if name != self._name:
  30. setattr(self, name, value)
  31. class Response(ResponseElement):
  32. _action = 'Undefined'
  33. def startElement(self, name, attrs, connection):
  34. if name == 'ResponseMetadata':
  35. setattr(self, name, ResponseElement(name=name))
  36. elif name == self._action + 'Result':
  37. setattr(self, name, self._Result(name=name))
  38. else:
  39. return ResponseElement.startElement(self, name, attrs, connection)
  40. return getattr(self, name)
  41. class ComplexAmount(ResponseElement):
  42. def __repr__(self):
  43. return '{0} {1}'.format(self.CurrencyCode, self.Value)
  44. def __float__(self):
  45. return float(self.Value)
  46. def __str__(self):
  47. return str(self.Value)
  48. def startElement(self, name, attrs, connection):
  49. if name not in ('CurrencyCode', 'Value'):
  50. message = 'Unrecognized tag {0} in ComplexAmount'.format(name)
  51. raise AssertionError(message)
  52. return ResponseElement.startElement(self, name, attrs, connection)
  53. def endElement(self, name, value, connection):
  54. if name == 'Value':
  55. value = Decimal(value)
  56. ResponseElement.endElement(self, name, value, connection)
  57. class AmountCollection(ResponseElement):
  58. def startElement(self, name, attrs, connection):
  59. setattr(self, name, ComplexAmount(name=name))
  60. return getattr(self, name)
  61. class AccountBalance(AmountCollection):
  62. def startElement(self, name, attrs, connection):
  63. if name == 'AvailableBalances':
  64. setattr(self, name, AmountCollection(name=name))
  65. return getattr(self, name)
  66. return AmountCollection.startElement(self, name, attrs, connection)
  67. class GetAccountBalanceResult(ResponseElement):
  68. def startElement(self, name, attrs, connection):
  69. if name == 'AccountBalance':
  70. setattr(self, name, AccountBalance(name=name))
  71. return getattr(self, name)
  72. return Response.startElement(self, name, attrs, connection)
  73. class GetTotalPrepaidLiabilityResult(ResponseElement):
  74. def startElement(self, name, attrs, connection):
  75. if name == 'OutstandingPrepaidLiability':
  76. setattr(self, name, AmountCollection(name=name))
  77. return getattr(self, name)
  78. return Response.startElement(self, name, attrs, connection)
  79. class GetPrepaidBalanceResult(ResponseElement):
  80. def startElement(self, name, attrs, connection):
  81. if name == 'PrepaidBalance':
  82. setattr(self, name, AmountCollection(name=name))
  83. return getattr(self, name)
  84. return Response.startElement(self, name, attrs, connection)
  85. class GetOutstandingDebtBalanceResult(ResponseElement):
  86. def startElement(self, name, attrs, connection):
  87. if name == 'OutstandingDebt':
  88. setattr(self, name, AmountCollection(name=name))
  89. return getattr(self, name)
  90. return Response.startElement(self, name, attrs, connection)
  91. class TransactionPart(ResponseElement):
  92. def startElement(self, name, attrs, connection):
  93. if name == 'FeesPaid':
  94. setattr(self, name, ComplexAmount(name=name))
  95. return getattr(self, name)
  96. return ResponseElement.startElement(self, name, attrs, connection)
  97. class Transaction(ResponseElement):
  98. def __init__(self, *args, **kw):
  99. self.TransactionPart = []
  100. ResponseElement.__init__(self, *args, **kw)
  101. def startElement(self, name, attrs, connection):
  102. if name == 'TransactionPart':
  103. getattr(self, name).append(TransactionPart(name=name))
  104. return getattr(self, name)[-1]
  105. if name in ('TransactionAmount', 'FPSFees', 'Balance'):
  106. setattr(self, name, ComplexAmount(name=name))
  107. return getattr(self, name)
  108. return ResponseElement.startElement(self, name, attrs, connection)
  109. class GetAccountActivityResult(ResponseElement):
  110. def __init__(self, *args, **kw):
  111. self.Transaction = []
  112. ResponseElement.__init__(self, *args, **kw)
  113. def startElement(self, name, attrs, connection):
  114. if name == 'Transaction':
  115. getattr(self, name).append(Transaction(name=name))
  116. return getattr(self, name)[-1]
  117. return ResponseElement.startElement(self, name, attrs, connection)
  118. class GetTransactionResult(ResponseElement):
  119. def startElement(self, name, attrs, connection):
  120. if name == 'Transaction':
  121. setattr(self, name, Transaction(name=name))
  122. return getattr(self, name)
  123. return ResponseElement.startElement(self, name, attrs, connection)
  124. class GetTokensResult(ResponseElement):
  125. def __init__(self, *args, **kw):
  126. self.Token = []
  127. ResponseElement.__init__(self, *args, **kw)
  128. def startElement(self, name, attrs, connection):
  129. if name == 'Token':
  130. getattr(self, name).append(ResponseElement(name=name))
  131. return getattr(self, name)[-1]
  132. return ResponseElement.startElement(self, name, attrs, connection)