unzer 1.0.0.dev2__tar.gz → 1.0.0.dev4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. {unzer-1.0.0.dev2 → unzer-1.0.0.dev4}/PKG-INFO +1 -1
  2. {unzer-1.0.0.dev2 → unzer-1.0.0.dev4}/src/unzer/__init__.py +1 -1
  3. {unzer-1.0.0.dev2 → unzer-1.0.0.dev4}/src/unzer/client.py +5 -8
  4. {unzer-1.0.0.dev2 → unzer-1.0.0.dev4}/src/unzer/model/__init__.py +11 -10
  5. {unzer-1.0.0.dev2 → unzer-1.0.0.dev4}/src/unzer/model/address.py +0 -3
  6. {unzer-1.0.0.dev2 → unzer-1.0.0.dev4}/src/unzer/model/base.py +0 -3
  7. {unzer-1.0.0.dev2 → unzer-1.0.0.dev4}/src/unzer/model/basket.py +0 -3
  8. {unzer-1.0.0.dev2 → unzer-1.0.0.dev4}/src/unzer/model/basketItem.py +0 -3
  9. {unzer-1.0.0.dev2 → unzer-1.0.0.dev4}/src/unzer/model/customer.py +0 -3
  10. {unzer-1.0.0.dev2 → unzer-1.0.0.dev4}/src/unzer/model/error.py +1 -3
  11. {unzer-1.0.0.dev2 → unzer-1.0.0.dev4}/src/unzer/model/payment.py +22 -27
  12. unzer-1.0.0.dev4/src/unzer/model/payment_type/__init__.py +15 -0
  13. unzer-1.0.0.dev4/src/unzer/model/payment_type/abstract_paymenttype.py +53 -0
  14. {unzer-1.0.0.dev2/src/unzer/model → unzer-1.0.0.dev4/src/unzer/model/payment_type}/bancontact.py +8 -9
  15. unzer-1.0.0.dev4/src/unzer/model/payment_type/card.py +6 -0
  16. unzer-1.0.0.dev4/src/unzer/model/payment_type/ideal.py +6 -0
  17. unzer-1.0.0.dev4/src/unzer/model/payment_type/paypal.py +6 -0
  18. unzer-1.0.0.dev4/src/unzer/model/payment_type/sofort.py +6 -0
  19. {unzer-1.0.0.dev2 → unzer-1.0.0.dev4}/src/unzer/model/paymentpage.py +0 -3
  20. {unzer-1.0.0.dev2 → unzer-1.0.0.dev4}/src/unzer/model/webhook.py +0 -3
  21. {unzer-1.0.0.dev2 → unzer-1.0.0.dev4}/src/unzer/utils.py +0 -3
  22. {unzer-1.0.0.dev2 → unzer-1.0.0.dev4}/src/unzer.egg-info/PKG-INFO +1 -1
  23. {unzer-1.0.0.dev2 → unzer-1.0.0.dev4}/src/unzer.egg-info/SOURCES.txt +8 -4
  24. unzer-1.0.0.dev2/src/unzer/model/abstract_paymenttype.py +0 -40
  25. unzer-1.0.0.dev2/src/unzer/model/card.py +0 -8
  26. {unzer-1.0.0.dev2 → unzer-1.0.0.dev4}/LICENSE +0 -0
  27. {unzer-1.0.0.dev2 → unzer-1.0.0.dev4}/README.md +0 -0
  28. {unzer-1.0.0.dev2 → unzer-1.0.0.dev4}/setup.cfg +0 -0
  29. {unzer-1.0.0.dev2 → unzer-1.0.0.dev4}/setup.py +0 -0
  30. {unzer-1.0.0.dev2 → unzer-1.0.0.dev4}/src/unzer.egg-info/dependency_links.txt +0 -0
  31. {unzer-1.0.0.dev2 → unzer-1.0.0.dev4}/src/unzer.egg-info/requires.txt +0 -0
  32. {unzer-1.0.0.dev2 → unzer-1.0.0.dev4}/src/unzer.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: unzer
3
- Version: 1.0.0.dev2
3
+ Version: 1.0.0.dev4
4
4
  Summary: An unofficial python SDK for unzer.com
5
5
  Home-page: https://github.com/mausbrand/unzer-python-sdk
6
6
  Author: Sven Eberth
@@ -1,7 +1,7 @@
1
1
  __title__ = "unzer-sdk"
2
2
  __author__ = "Sven Eberth"
3
3
  __email__ = "se@mausbrand.de"
4
- __version__ = "1.0.0-dev2"
4
+ __version__ = "1.0.0-dev4"
5
5
 
6
6
  from .client import UnzerClient
7
7
  from .model import *
@@ -1,15 +1,12 @@
1
- __author__ = "Sven Eberth"
2
- __email__ = "se@mausbrand.de"
3
-
4
1
  import logging
5
2
  import time
6
3
  from types import NoneType
7
4
 
8
5
  import requests
9
6
  from urllib3.exceptions import TimeoutError
7
+
10
8
  from . import __version__
11
9
  from .model import *
12
- from .model.abstract_paymenttype import PaymentType
13
10
  from .model.basket import Basket
14
11
  from .model.payment import PaymentGetResponse, PaymentRequest, PaymentResponse
15
12
  from .model.paymentpage import PaymentPage, PaymentPageResponse
@@ -25,10 +22,10 @@ class UnzerClient:
25
22
 
26
23
  def __init__(
27
24
  self,
28
- private_key:str,
29
- public_key:str,
30
- sandbox:bool=False,
31
- language:str="en",
25
+ private_key: str,
26
+ public_key: str,
27
+ sandbox: bool = False,
28
+ language: str = "en",
32
29
  ):
33
30
  super(UnzerClient, self).__init__()
34
31
  self.private_key = private_key
@@ -1,25 +1,18 @@
1
- __author__ = "Sven Eberth"
2
- __email__ = "se@mausbrand.de"
3
-
4
- from .abstract_paymenttype import PaymentType
5
1
  from .address import Address
6
- from .bancontact import Bancontact
7
- from .base import BaseModel
8
2
  from .basket import Basket
9
3
  from .basketItem import BasketItem
10
- from .card import Card
11
4
  from .customer import Customer
12
5
  from .error import Error, ErrorResponse
13
- from .payment import PaymentGetResponse, PaymentRequest, PaymentResponse, PaymentTransaction
6
+ from .payment import PaymentGetResponse, PaymentRequest, PaymentResponse, \
7
+ PaymentTransaction, PaymentTypes
8
+ from .payment_type import *
14
9
  from .paymentpage import PaymentPage, PaymentPageResponse
15
10
  from .webhook import Webhook
16
11
 
17
12
  __all__ = [
18
13
  "Address",
19
- "Bancontact",
20
14
  "Basket",
21
15
  "BasketItem",
22
- "Card",
23
16
  "Customer",
24
17
  "Error",
25
18
  "ErrorResponse",
@@ -29,5 +22,13 @@ __all__ = [
29
22
  "PaymentRequest",
30
23
  "PaymentResponse",
31
24
  "PaymentTransaction",
25
+ "PaymentTypes",
32
26
  "Webhook",
27
+ # payment_types
28
+ "PaymentType",
29
+ "Bancontact",
30
+ "Card",
31
+ "Ideal",
32
+ "PayPal",
33
+ "Sofort",
33
34
  ]
@@ -1,6 +1,3 @@
1
- __author__ = "Sven Eberth"
2
- __email__ = "se@mausbrand.de"
3
-
4
1
  from .base import BaseModel
5
2
 
6
3
 
@@ -1,6 +1,3 @@
1
- __author__ = "Sven Eberth"
2
- __email__ = "se@mausbrand.de"
3
-
4
1
  import abc
5
2
 
6
3
 
@@ -1,6 +1,3 @@
1
- __author__ = "Sven Eberth"
2
- __email__ = "se@mausbrand.de"
3
-
4
1
  from .base import BaseModel
5
2
  from .basketItem import BasketItem
6
3
 
@@ -1,6 +1,3 @@
1
- __author__ = "Sven Eberth"
2
- __email__ = "se@mausbrand.de"
3
-
4
1
  from .base import BaseModel
5
2
 
6
3
 
@@ -1,6 +1,3 @@
1
- __author__ = "Sven Eberth"
2
- __email__ = "se@mausbrand.de"
3
-
4
1
  import datetime
5
2
 
6
3
  from .address import Address
@@ -1,6 +1,3 @@
1
- __author__ = "Sven Eberth"
2
- __email__ = "se@mausbrand.de"
3
-
4
1
  import datetime
5
2
  import logging
6
3
 
@@ -8,6 +5,7 @@ import requests
8
5
 
9
6
  logger = logging.getLogger("unzer-sdk")
10
7
 
8
+
11
9
  class Error:
12
10
  def __init__(self, code, merchantMessage, customerMessage, **kwargs):
13
11
  self.code = code
@@ -1,35 +1,29 @@
1
- __author__ = "Sven Eberth"
2
- __email__ = "se@mausbrand.de"
3
-
4
1
  import datetime
2
+ import enum
5
3
  import logging
6
4
  import re
5
+ import typing as t
7
6
  from types import NoneType
8
7
 
9
- import unzer.client
10
- from .abstract_paymenttype import PaymentType
11
8
  from .base import BaseModel
12
9
  from ..utils import parseBool, parseDateTime
13
10
 
11
+ if t.TYPE_CHECKING:
12
+ from ..client import UnzerClient
13
+
14
14
 
15
- class TransactionStatus:
15
+ class TransactionStatus(enum.Enum):
16
16
  SUCCESS = "success"
17
17
  PENDING = "pending"
18
18
  ERROR = "error"
19
19
 
20
20
 
21
- TransactionStatusInverted = {v: k for k, v in vars(TransactionStatus).items()}
22
-
23
-
24
- class Action:
21
+ class Action(enum.Enum):
25
22
  CHARGE = "charge"
26
23
  AUTHORIZE = "authorize"
27
24
 
28
25
 
29
- ActionInverted = {v: k for k, v in vars(Action).items()}
30
-
31
-
32
- class PaymentState:
26
+ class PaymentState(enum.Enum):
33
27
  PENDING = 0
34
28
  COMPLETED = 1
35
29
  CANCELED = 2
@@ -39,10 +33,7 @@ class PaymentState:
39
33
  CREATE = 6
40
34
 
41
35
 
42
- PaymentStateInverted = {v: k for k, v in vars(PaymentState).items()}
43
-
44
-
45
- class PaymentTypes:
36
+ class PaymentTypes(enum.Enum):
46
37
  CARD = "crd"
47
38
  EPS = "eps"
48
39
  GIROPAY = "gro"
@@ -72,8 +63,6 @@ class PaymentTypes:
72
63
  UNKNOWN = "unknown"
73
64
 
74
65
 
75
- PaymentTypesInverted = {v: k for k, v in vars(PaymentTypes).items()}
76
-
77
66
  paymentUrlRe = re.compile(
78
67
  r"^https://api.unzer.com/v1/"
79
68
  r"(?P<operation>[a-z]+)/(?P<paymentId>[\w-]+)" # payments/{codeOrOrderId}
@@ -105,7 +94,7 @@ class PaymentGetResponse(BaseModel):
105
94
  linkPayId=None,
106
95
  typeId=None,
107
96
 
108
- client=None,
97
+ client: "UnzerClient" = None,
109
98
 
110
99
  **kwargs
111
100
  ):
@@ -159,8 +148,9 @@ class PaymentGetResponse(BaseModel):
159
148
  """
160
149
  if transactions is None:
161
150
  transactions = []
162
- if state not in vars(PaymentState).values():
163
- raise TypeError("Invalid state %r" % state)
151
+ state = PaymentState(state)
152
+ # if state not in vars(PaymentState).values():
153
+ # raise TypeError("Invalid state %r" % state)
164
154
  if not isinstance(card3ds, (bool, NoneType)):
165
155
  raise TypeError("Invalid value %r for card3ds. Must be a boolean or None." % card3ds)
166
156
  self.paymentId = paymentId # type:str
@@ -185,7 +175,7 @@ class PaymentGetResponse(BaseModel):
185
175
  self.linkPayId = linkPayId # type: str
186
176
  self.typeId = typeId # type: str
187
177
 
188
- self._client = client # type: unzer.client.UnzerClient
178
+ self._client: "UnzerClient" = client
189
179
 
190
180
  def serialize(self):
191
181
  raise NotImplementedError("No serialisation for response models.")
@@ -227,15 +217,17 @@ class PaymentGetResponse(BaseModel):
227
217
  return transactions
228
218
 
229
219
  @staticmethod
230
- def getPaymentTypeFromTypeId(typeId):
220
+ def getPaymentTypeFromTypeId(typeId) -> PaymentTypes:
231
221
  if not typeId:
232
222
  raise ValueError("Invalid typeId %r" % typeId) # TODO: or return PaymentTypes.UNKNOWN?
233
223
  paymentType = typeId.split("-")[1].lower()
234
- if paymentType not in vars(PaymentTypes).values():
224
+ try:
225
+ paymentType = PaymentTypes(paymentType)
226
+ except ValueError:
235
227
  raise ValueError("Invalid type %r" % typeId) # TODO: or return PaymentTypes.UNKNOWN?
236
228
  return paymentType
237
229
 
238
- def charge(self, amount): # type: (float) -> PaymentResponse
230
+ def charge(self, amount: float) -> "PaymentResponse":
239
231
  req_kwargs = self.__dict__.copy()
240
232
  req_kwargs["paymentType"] = PaymentType.construct(self.paymentType)(self.typeId)
241
233
  req_kwargs["amount"] = amount
@@ -652,3 +644,6 @@ class PaymentResponseMetadata(BaseModel):
652
644
  # Nobody, really nobody starts identifier with a digit. Unzer: here you have the 3dsEci flag
653
645
  data["threeDsEci"] = data["3dsEci"] if "3dsEci" in data else None
654
646
  return cls(**data)
647
+
648
+
649
+ from unzer.model.payment_type.abstract_paymenttype import PaymentType # noqa: Avoid circular imports
@@ -0,0 +1,15 @@
1
+ from .abstract_paymenttype import PaymentType
2
+ from .bancontact import Bancontact
3
+ from .card import Card
4
+ from .ideal import Ideal
5
+ from .paypal import PayPal
6
+ from .sofort import Sofort
7
+
8
+ __all__ = [
9
+ "PaymentType",
10
+ "Bancontact",
11
+ "Card",
12
+ "Ideal",
13
+ "PayPal",
14
+ "Sofort",
15
+ ]
@@ -0,0 +1,53 @@
1
+ import abc
2
+ import logging
3
+ import typing as t
4
+
5
+ from ..base import BaseModel
6
+
7
+ if t.TYPE_CHECKING:
8
+ from .. import PaymentTypes
9
+
10
+ logger = logging.getLogger("unzer-sdk").getChild(__name__)
11
+
12
+
13
+ class PaymentType(BaseModel):
14
+ @property
15
+ @abc.abstractmethod
16
+ def method(self) -> "PaymentTypes":
17
+ """Hold the type."""
18
+ pass
19
+
20
+ def __init__(
21
+ self,
22
+ key: str = None,
23
+ **kwargs
24
+ ):
25
+ """Create a new paymentType ressource.
26
+
27
+ :param key: (optional) (original: id) ID for this payment type
28
+ """
29
+ self.key: str = key
30
+
31
+ def serialize(self) -> dict:
32
+ return {}
33
+
34
+ @classmethod
35
+ def fromDict(cls, data: dict) -> t.Self:
36
+ data = data.copy()
37
+ data["key"] = data["id"]
38
+ return cls(**data)
39
+
40
+ @classmethod
41
+ def get_subclasses(cls) -> t.Type[t.Self]:
42
+ for subclass in cls.__subclasses__():
43
+ yield from subclass.get_subclasses()
44
+ yield subclass
45
+
46
+ @classmethod
47
+ def construct(cls, method: "PaymentTypes") -> t.Type["PaymentType"]:
48
+ for subclass in PaymentType.get_subclasses():
49
+ if subclass.method == method:
50
+ return subclass
51
+ logger.warning(f"Creating not existing PaymentType for method {method} on the fly")
52
+ sub_cls = type(str(method).title(), (cls,), {"method": method})
53
+ return sub_cls # noqa
@@ -1,34 +1,33 @@
1
- __author__ = "Sven Eberth"
2
- __email__ = "se@mausbrand.de"
1
+ import typing as t
3
2
 
3
+ from unzer.model.payment import PaymentTypes
4
4
  from .abstract_paymenttype import PaymentType
5
5
 
6
6
 
7
7
  class Bancontact(PaymentType):
8
- method = "bancontact"
8
+ method = PaymentTypes.BANCONTACT
9
9
 
10
10
  REQUIRED_ATTRIBUTES = ["holder"]
11
11
 
12
12
  def __init__(
13
13
  self,
14
- holder,
14
+ holder: str,
15
15
  **kwargs
16
16
  ):
17
17
  """Create a new Bancontact paymentType ressource.
18
18
 
19
19
  :param holder: The holder name.
20
- :type holder: str
21
20
  """
22
- super(Bancontact, self).__init__(**kwargs)
23
- self.holder = holder # type: str
21
+ super().__init__(**kwargs)
22
+ self.holder: str = holder
24
23
 
25
- def serialize(self):
24
+ def serialize(self) -> dict:
26
25
  return {
27
26
  "holder": self.holder,
28
27
  }
29
28
 
30
29
  @classmethod
31
- def fromDict(cls, data):
30
+ def fromDict(cls, data: dict) -> t.Self:
32
31
  data = data.copy()
33
32
  data["key"] = data["id"]
34
33
  return cls(**data)
@@ -0,0 +1,6 @@
1
+ from unzer.model.payment import PaymentTypes
2
+ from .abstract_paymenttype import PaymentType
3
+
4
+
5
+ class Card(PaymentType):
6
+ method = PaymentTypes.CARD
@@ -0,0 +1,6 @@
1
+ from unzer.model.payment import PaymentTypes
2
+ from .abstract_paymenttype import PaymentType
3
+
4
+
5
+ class Ideal(PaymentType):
6
+ method = PaymentTypes.IDEAL
@@ -0,0 +1,6 @@
1
+ from unzer.model.payment import PaymentTypes
2
+ from .abstract_paymenttype import PaymentType
3
+
4
+
5
+ class PayPal(PaymentType):
6
+ method = PaymentTypes.PAYPAL
@@ -0,0 +1,6 @@
1
+ from unzer.model.payment import PaymentTypes
2
+ from .abstract_paymenttype import PaymentType
3
+
4
+
5
+ class Sofort(PaymentType):
6
+ method = PaymentTypes.SOFORT
@@ -1,6 +1,3 @@
1
- __author__ = "Sven Eberth"
2
- __email__ = "se@mausbrand.de"
3
-
4
1
  from .base import BaseModel
5
2
  from .payment import Action
6
3
  from ..utils import parseBool
@@ -1,6 +1,3 @@
1
- __author__ = "Sven Eberth"
2
- __email__ = "se@mausbrand.de"
3
-
4
1
  from .base import BaseModel
5
2
 
6
3
  # https://docs.unzer.com/reference/basic-integration-req/#allowlist-of-ip-addresses
@@ -1,6 +1,3 @@
1
- __author__ = "Sven Eberth"
2
- __email__ = "se@mausbrand.de"
3
-
4
1
  import datetime
5
2
 
6
3
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: unzer
3
- Version: 1.0.0.dev2
3
+ Version: 1.0.0.dev4
4
4
  Summary: An unofficial python SDK for unzer.com
5
5
  Home-page: https://github.com/mausbrand/unzer-python-sdk
6
6
  Author: Sven Eberth
@@ -11,15 +11,19 @@ src/unzer.egg-info/dependency_links.txt
11
11
  src/unzer.egg-info/requires.txt
12
12
  src/unzer.egg-info/top_level.txt
13
13
  src/unzer/model/__init__.py
14
- src/unzer/model/abstract_paymenttype.py
15
14
  src/unzer/model/address.py
16
- src/unzer/model/bancontact.py
17
15
  src/unzer/model/base.py
18
16
  src/unzer/model/basket.py
19
17
  src/unzer/model/basketItem.py
20
- src/unzer/model/card.py
21
18
  src/unzer/model/customer.py
22
19
  src/unzer/model/error.py
23
20
  src/unzer/model/payment.py
24
21
  src/unzer/model/paymentpage.py
25
- src/unzer/model/webhook.py
22
+ src/unzer/model/webhook.py
23
+ src/unzer/model/payment_type/__init__.py
24
+ src/unzer/model/payment_type/abstract_paymenttype.py
25
+ src/unzer/model/payment_type/bancontact.py
26
+ src/unzer/model/payment_type/card.py
27
+ src/unzer/model/payment_type/ideal.py
28
+ src/unzer/model/payment_type/paypal.py
29
+ src/unzer/model/payment_type/sofort.py
@@ -1,40 +0,0 @@
1
- __author__ = "Sven Eberth"
2
- __email__ = "se@mausbrand.de"
3
-
4
- import abc
5
-
6
- from .base import BaseModel
7
-
8
-
9
- class PaymentType(BaseModel):
10
- @property
11
- @abc.abstractmethod
12
- def method(self):
13
- """Hold the type as str."""
14
- pass
15
-
16
- def __init__(
17
- self,
18
- key=None,
19
- **kwargs
20
- ):
21
- """Create a new paymentType ressource.
22
-
23
- :param key: (optional) (original: id) ID for this payment type
24
- :type key: str
25
- """
26
- self.key = key # type: str
27
-
28
- def serialize(self):
29
- return {}
30
-
31
- @classmethod
32
- def fromDict(cls, data):
33
- data = data.copy()
34
- data["key"] = data["id"]
35
- return cls(**data)
36
-
37
- @classmethod
38
- def construct(cls, method):
39
- sub_cls = type(str(method).title(), (cls,), {"method": method})
40
- return sub_cls
@@ -1,8 +0,0 @@
1
- __author__ = "Sven Eberth"
2
- __email__ = "se@mausbrand.de"
3
-
4
- from .abstract_paymenttype import PaymentType
5
-
6
-
7
- class Card(PaymentType):
8
- method = "card"
File without changes
File without changes
File without changes
File without changes