python-terminusgps 45.5.0__tar.gz → 45.6.1__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 (58) hide show
  1. {python_terminusgps-45.5.0 → python_terminusgps-45.6.1}/PKG-INFO +1 -1
  2. {python_terminusgps-45.5.0 → python_terminusgps-45.6.1}/docs/source/conf.py +1 -1
  3. {python_terminusgps-45.5.0 → python_terminusgps-45.6.1}/pyproject.toml +1 -1
  4. {python_terminusgps-45.5.0 → python_terminusgps-45.6.1}/terminusgps/authorizenet/constants.py +23 -0
  5. {python_terminusgps-45.5.0 → python_terminusgps-45.6.1}/terminusgps/authorizenet/controllers.py +7 -7
  6. {python_terminusgps-45.5.0 → python_terminusgps-45.6.1}/terminusgps/authorizenet/services.py +14 -8
  7. {python_terminusgps-45.5.0 → python_terminusgps-45.6.1}/uv.lock +1 -1
  8. {python_terminusgps-45.5.0 → python_terminusgps-45.6.1}/.github/workflows/sphinx.yml +0 -0
  9. {python_terminusgps-45.5.0 → python_terminusgps-45.6.1}/.gitignore +0 -0
  10. {python_terminusgps-45.5.0 → python_terminusgps-45.6.1}/.python-version +0 -0
  11. {python_terminusgps-45.5.0 → python_terminusgps-45.6.1}/COPYING +0 -0
  12. {python_terminusgps-45.5.0 → python_terminusgps-45.6.1}/README.md +0 -0
  13. {python_terminusgps-45.5.0 → python_terminusgps-45.6.1}/docs/Makefile +0 -0
  14. {python_terminusgps-45.5.0 → python_terminusgps-45.6.1}/docs/make.bat +0 -0
  15. {python_terminusgps-45.5.0 → python_terminusgps-45.6.1}/docs/requirements.txt +0 -0
  16. {python_terminusgps-45.5.0 → python_terminusgps-45.6.1}/docs/source/authorizenet/api.rst +0 -0
  17. {python_terminusgps-45.5.0 → python_terminusgps-45.6.1}/docs/source/authorizenet/auth.rst +0 -0
  18. {python_terminusgps-45.5.0 → python_terminusgps-45.6.1}/docs/source/authorizenet/constants.rst +0 -0
  19. {python_terminusgps-45.5.0 → python_terminusgps-45.6.1}/docs/source/authorizenet/exceptions.rst +0 -0
  20. {python_terminusgps-45.5.0 → python_terminusgps-45.6.1}/docs/source/authorizenet/index.rst +0 -0
  21. {python_terminusgps-45.5.0 → python_terminusgps-45.6.1}/docs/source/authorizenet/usage.rst +0 -0
  22. {python_terminusgps-45.5.0 → python_terminusgps-45.6.1}/docs/source/index.rst +0 -0
  23. {python_terminusgps-45.5.0 → python_terminusgps-45.6.1}/docs/source/mixins.rst +0 -0
  24. {python_terminusgps-45.5.0 → python_terminusgps-45.6.1}/docs/source/validators.rst +0 -0
  25. {python_terminusgps-45.5.0 → python_terminusgps-45.6.1}/docs/source/wialon/constants.rst +0 -0
  26. {python_terminusgps-45.5.0 → python_terminusgps-45.6.1}/docs/source/wialon/exceptions.rst +0 -0
  27. {python_terminusgps-45.5.0 → python_terminusgps-45.6.1}/docs/source/wialon/index.rst +0 -0
  28. {python_terminusgps-45.5.0 → python_terminusgps-45.6.1}/docs/source/wialon/items.rst +0 -0
  29. {python_terminusgps-45.5.0 → python_terminusgps-45.6.1}/docs/source/wialon/session.rst +0 -0
  30. {python_terminusgps-45.5.0 → python_terminusgps-45.6.1}/docs/source/wialon/usage.rst +0 -0
  31. {python_terminusgps-45.5.0 → python_terminusgps-45.6.1}/terminusgps/__init__.py +0 -0
  32. {python_terminusgps-45.5.0 → python_terminusgps-45.6.1}/terminusgps/authorizenet/__init__.py +0 -0
  33. {python_terminusgps-45.5.0 → python_terminusgps-45.6.1}/terminusgps/authorizenet/api/__init__.py +0 -0
  34. {python_terminusgps-45.5.0 → python_terminusgps-45.6.1}/terminusgps/authorizenet/api/address_profiles.py +0 -0
  35. {python_terminusgps-45.5.0 → python_terminusgps-45.6.1}/terminusgps/authorizenet/api/customer_profiles.py +0 -0
  36. {python_terminusgps-45.5.0 → python_terminusgps-45.6.1}/terminusgps/authorizenet/api/payment_profiles.py +0 -0
  37. {python_terminusgps-45.5.0 → python_terminusgps-45.6.1}/terminusgps/authorizenet/api/subscriptions.py +0 -0
  38. {python_terminusgps-45.5.0 → python_terminusgps-45.6.1}/terminusgps/authorizenet/api/transactions.py +0 -0
  39. {python_terminusgps-45.5.0 → python_terminusgps-45.6.1}/terminusgps/authorizenet/auth.py +0 -0
  40. {python_terminusgps-45.5.0 → python_terminusgps-45.6.1}/terminusgps/default_settings.py +0 -0
  41. {python_terminusgps-45.5.0 → python_terminusgps-45.6.1}/terminusgps/mixins.py +0 -0
  42. {python_terminusgps-45.5.0 → python_terminusgps-45.6.1}/terminusgps/validators.py +0 -0
  43. {python_terminusgps-45.5.0 → python_terminusgps-45.6.1}/terminusgps/wialon/__init__.py +0 -0
  44. {python_terminusgps-45.5.0 → python_terminusgps-45.6.1}/terminusgps/wialon/constants.py +0 -0
  45. {python_terminusgps-45.5.0 → python_terminusgps-45.6.1}/terminusgps/wialon/flags.py +0 -0
  46. {python_terminusgps-45.5.0 → python_terminusgps-45.6.1}/terminusgps/wialon/items/__init__.py +0 -0
  47. {python_terminusgps-45.5.0 → python_terminusgps-45.6.1}/terminusgps/wialon/items/account.py +0 -0
  48. {python_terminusgps-45.5.0 → python_terminusgps-45.6.1}/terminusgps/wialon/items/base.py +0 -0
  49. {python_terminusgps-45.5.0 → python_terminusgps-45.6.1}/terminusgps/wialon/items/factory.py +0 -0
  50. {python_terminusgps-45.5.0 → python_terminusgps-45.6.1}/terminusgps/wialon/items/resource.py +0 -0
  51. {python_terminusgps-45.5.0 → python_terminusgps-45.6.1}/terminusgps/wialon/items/retranslator.py +0 -0
  52. {python_terminusgps-45.5.0 → python_terminusgps-45.6.1}/terminusgps/wialon/items/route.py +0 -0
  53. {python_terminusgps-45.5.0 → python_terminusgps-45.6.1}/terminusgps/wialon/items/unit.py +0 -0
  54. {python_terminusgps-45.5.0 → python_terminusgps-45.6.1}/terminusgps/wialon/items/unit_group.py +0 -0
  55. {python_terminusgps-45.5.0 → python_terminusgps-45.6.1}/terminusgps/wialon/items/user.py +0 -0
  56. {python_terminusgps-45.5.0 → python_terminusgps-45.6.1}/terminusgps/wialon/session.py +0 -0
  57. {python_terminusgps-45.5.0 → python_terminusgps-45.6.1}/terminusgps/wialon/utils.py +0 -0
  58. {python_terminusgps-45.5.0 → python_terminusgps-45.6.1}/terminusgps/wialon/validators.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-terminusgps
3
- Version: 45.5.0
3
+ Version: 45.6.1
4
4
  Summary: Provides abstractions/utilities for working with Wialon API, Authorize.NET API, AWS API, and more.
5
5
  Project-URL: Documentation, https://terminusgps.github.io/python-terminusgps
6
6
  Project-URL: Repository, https://github.com/terminusgps/python-terminusgps
@@ -12,7 +12,7 @@ sys.path.insert(0, os.path.abspath("../../"))
12
12
  project = "python-terminusgps"
13
13
  copyright = "2025, Terminus GPS, LLC"
14
14
  author = "Terminus GPS, LLC"
15
- release = "45.5.0"
15
+ release = "45.6.1"
16
16
 
17
17
  # -- General configuration ---------------------------------------------------
18
18
  # https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "python-terminusgps"
3
- version = "45.5.0"
3
+ version = "45.6.1"
4
4
  description = "Provides abstractions/utilities for working with Wialon API, Authorize.NET API, AWS API, and more."
5
5
  readme = "README.md"
6
6
  authors = [ {name = "Blake Nall", email = "blake@terminusgps.com" } ]
@@ -4,6 +4,29 @@ from django.db import models
4
4
  from django.utils.translation import gettext_lazy as _
5
5
 
6
6
 
7
+ class CurrencyCode(models.TextChoices):
8
+ USD = "USD", _("United States Dollar")
9
+ """US dollar."""
10
+ CAD = "CAD", _("Canadian Dollar")
11
+ """Canadian dollar."""
12
+ GBP = "GBP", _("Great British Pound")
13
+ """Great British pound."""
14
+ DKK = "DKK", _("Danish Krone")
15
+ """Danish krone."""
16
+ NOK = "NOK", _("Norwegian Krone")
17
+ """Norwegian krone."""
18
+ PLN = "PLN", _("Polish Złoty")
19
+ """Polish zloty."""
20
+ SEK = "SEK", _("Swedish Krona")
21
+ """Swedish krona."""
22
+ EUR = "EUR", _("Euro")
23
+ """Euro."""
24
+ AUD = "AUD", _("Australian Dollar")
25
+ """Australian dollar."""
26
+ NZD = "NZD", _("New Zealand Dollar")
27
+ """New Zealand dollar."""
28
+
29
+
7
30
  class SubscriptionStatus(models.TextChoices):
8
31
  """An Authorizenet subscription status."""
9
32
 
@@ -4,7 +4,7 @@ from lxml.objectify import ObjectifiedElement
4
4
 
5
5
  def execute_controller(
6
6
  controller: APIOperationBase, environment: str
7
- ) -> ObjectifiedElement | None:
7
+ ) -> ObjectifiedElement:
8
8
  """
9
9
  Executes an Authorizenet API controller and returns its response.
10
10
 
@@ -15,19 +15,19 @@ def execute_controller(
15
15
  :param merchant_auth: Authorizenet merchant authentication element.
16
16
  :type merchant_auth: ~authorizenet.apicontractsv1.merchantAuthenticationType
17
17
  :raises AuthorizenetControllerExecutionError: If the API call fails.
18
- :returns: An Authorizenet API response, if any.
19
- :rtype: ~lxml.objectify.ObjectifiedElement | None
18
+ :returns: An Authorizenet API response.
19
+ :rtype: ~lxml.objectify.ObjectifiedElement
20
20
 
21
21
  """
22
22
  controller.setenvironment(environment)
23
23
  controller.execute()
24
- response = controller.getresponse()
24
+ response: ObjectifiedElement | None = controller.getresponse()
25
25
 
26
26
  if response is None:
27
27
  raise AuthorizenetControllerExecutionError(
28
28
  message="Authorizenet controller response didn't exist.", code="1"
29
29
  )
30
- if response is not None and response.messages.resultCode != "Ok":
30
+ elif response is not None and response.messages.resultCode != "Ok":
31
31
  raise AuthorizenetControllerExecutionError(
32
32
  message=response.messages.message[0]["text"].text,
33
33
  code=response.messages.message[0]["code"].text,
@@ -40,8 +40,8 @@ class AuthorizenetControllerExecutionError(Exception):
40
40
 
41
41
  def __init__(self, message: str, code: str, *args, **kwargs) -> None:
42
42
  super().__init__(message, *args, **kwargs)
43
- self._message = message
44
- self._code = code
43
+ self._message: str = message
44
+ self._code: str = code
45
45
 
46
46
  def __str__(self) -> str:
47
47
  return f"{self.code}: {self.message}"
@@ -1,4 +1,3 @@
1
- from abc import ABC
2
1
  from functools import cached_property
3
2
  from typing import Callable
4
3
 
@@ -8,11 +7,14 @@ from django.core.exceptions import ImproperlyConfigured
8
7
  from lxml.objectify import ObjectifiedElement
9
8
 
10
9
  from .auth import get_environment, get_merchant_auth, get_validation_mode
11
- from .controllers import execute_controller
10
+ from .controllers import (
11
+ AuthorizenetControllerExecutionError,
12
+ execute_controller,
13
+ )
12
14
 
13
15
 
14
- class AuthorizenetService(ABC):
15
- """Base class for services that interact with the Authorizenet API."""
16
+ class AuthorizenetService:
17
+ """A service for safely interacting with the Authorizenet API."""
16
18
 
17
19
  REQUIRED_SETTINGS = (
18
20
  "MERCHANT_AUTH_ENVIRONMENT",
@@ -27,7 +29,7 @@ class AuthorizenetService(ABC):
27
29
  if not hasattr(settings, setting):
28
30
  raise ImproperlyConfigured(f"'{setting}' setting is required.")
29
31
 
30
- def call_api(self, func: Callable, *args, **kwargs) -> ObjectifiedElement:
32
+ def request(self, func: Callable, *args, **kwargs) -> ObjectifiedElement:
31
33
  """
32
34
  Calls the Authorizenet API function with arguments and returns the result.
33
35
 
@@ -40,9 +42,13 @@ class AuthorizenetService(ABC):
40
42
  :rtype: ~lxml.objectify.ObjectifiedElement
41
43
 
42
44
  """
43
- request, controller_cls = func(*args, **kwargs)
44
- request.merchantAuthentication = self.merchantAuthentication
45
- return execute_controller(controller_cls(request), self.environment)
45
+ try:
46
+ request, controller_cls = func(*args, **kwargs)
47
+ request.merchantAuthentication = self.merchantAuthentication
48
+ controller = controller_cls(request)
49
+ return execute_controller(controller, self.environment)
50
+ except AuthorizenetControllerExecutionError:
51
+ raise
46
52
 
47
53
  @cached_property
48
54
  def merchantAuthentication(self) -> merchantAuthenticationType:
@@ -298,7 +298,7 @@ wheels = [
298
298
 
299
299
  [[package]]
300
300
  name = "python-terminusgps"
301
- version = "45.5.0"
301
+ version = "45.6.1"
302
302
  source = { editable = "." }
303
303
  dependencies = [
304
304
  { name = "authorizenet" },