python-terminusgps 33.3.0__tar.gz → 33.5.0__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 (310) hide show
  1. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/PKG-INFO +2 -1
  2. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/pyproject.toml +2 -1
  3. python_terminusgps-33.5.0/terminusgps/aws/notifier.py +49 -0
  4. python_terminusgps-33.5.0/terminusgps/django/validators.py +93 -0
  5. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/uv.lock +81 -10
  6. python_terminusgps-33.3.0/terminusgps/aws/connect.py +0 -21
  7. python_terminusgps-33.3.0/terminusgps/twilio/tests/test_caller.py +0 -0
  8. python_terminusgps-33.3.0/terminusgps/twilio/tests/test_validators.py +0 -40
  9. python_terminusgps-33.3.0/terminusgps/twilio/validators.py +0 -31
  10. python_terminusgps-33.3.0/terminusgps/wialon/tests/__init__.py +0 -0
  11. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/.gitignore +0 -0
  12. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/COPYING +0 -0
  13. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/README.md +0 -0
  14. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/Makefile +0 -0
  15. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/coverage/c.txt +0 -0
  16. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/coverage/python.txt +0 -0
  17. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/coverage/undoc.pickle +0 -0
  18. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/doctrees/authorizenet/auth.doctree +0 -0
  19. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/doctrees/authorizenet/constants.doctree +0 -0
  20. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/doctrees/authorizenet/controllers.doctree +0 -0
  21. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/doctrees/authorizenet/examples.doctree +0 -0
  22. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/doctrees/authorizenet/index.doctree +0 -0
  23. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/doctrees/authorizenet/profiles.doctree +0 -0
  24. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/doctrees/authorizenet/subscriptions.doctree +0 -0
  25. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/doctrees/authorizenet/utils.doctree +0 -0
  26. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/doctrees/aws/index.doctree +0 -0
  27. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/doctrees/aws/secrets.doctree +0 -0
  28. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/doctrees/aws/utils.doctree +0 -0
  29. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/doctrees/django/forms.doctree +0 -0
  30. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/doctrees/django/index.doctree +0 -0
  31. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/doctrees/django/mixins.doctree +0 -0
  32. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/doctrees/django/settings.doctree +0 -0
  33. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/doctrees/environment.pickle +0 -0
  34. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/doctrees/index.doctree +0 -0
  35. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/doctrees/mixins.doctree +0 -0
  36. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/doctrees/settings.doctree +0 -0
  37. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/doctrees/twilio/caller.doctree +0 -0
  38. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/doctrees/twilio/examples.doctree +0 -0
  39. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/doctrees/twilio/index.doctree +0 -0
  40. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/doctrees/twilio/settings.doctree +0 -0
  41. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/doctrees/validators.doctree +0 -0
  42. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/doctrees/wialon/constants.doctree +0 -0
  43. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/doctrees/wialon/errors.doctree +0 -0
  44. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/doctrees/wialon/examples.doctree +0 -0
  45. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/doctrees/wialon/flags.doctree +0 -0
  46. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/doctrees/wialon/index.doctree +0 -0
  47. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/doctrees/wialon/items.doctree +0 -0
  48. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/doctrees/wialon/session.doctree +0 -0
  49. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/doctrees/wialon/settings.doctree +0 -0
  50. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/doctrees/wialon/utils.doctree +0 -0
  51. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_modules/index.html +0 -0
  52. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_modules/terminusgps/authorizenet/auth.html +0 -0
  53. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_modules/terminusgps/authorizenet/constants.html +0 -0
  54. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_modules/terminusgps/authorizenet/controllers.html +0 -0
  55. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_modules/terminusgps/authorizenet/errors.html +0 -0
  56. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_modules/terminusgps/authorizenet/profiles/addresses.html +0 -0
  57. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_modules/terminusgps/authorizenet/profiles/base.html +0 -0
  58. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_modules/terminusgps/authorizenet/profiles/customers.html +0 -0
  59. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_modules/terminusgps/authorizenet/profiles/payments.html +0 -0
  60. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_modules/terminusgps/authorizenet/profiles/subscriptions.html +0 -0
  61. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_modules/terminusgps/authorizenet/subscriptions/subscriptions.html +0 -0
  62. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_modules/terminusgps/authorizenet/utils.html +0 -0
  63. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_modules/terminusgps/aws/secrets.html +0 -0
  64. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_modules/terminusgps/django/forms/fields.html +0 -0
  65. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_modules/terminusgps/django/forms/widgets.html +0 -0
  66. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_modules/terminusgps/django/forms.html +0 -0
  67. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_modules/terminusgps/django/mixins.html +0 -0
  68. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_modules/terminusgps/mixins.html +0 -0
  69. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_modules/terminusgps/twilio/caller.html +0 -0
  70. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_modules/terminusgps/wialon/constants.html +0 -0
  71. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_modules/terminusgps/wialon/flags.html +0 -0
  72. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_modules/terminusgps/wialon/items/base.html +0 -0
  73. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_modules/terminusgps/wialon/items/geofence.html +0 -0
  74. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_modules/terminusgps/wialon/items/notification.html +0 -0
  75. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_modules/terminusgps/wialon/items/resource.html +0 -0
  76. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_modules/terminusgps/wialon/items/retranslator.html +0 -0
  77. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_modules/terminusgps/wialon/items/route.html +0 -0
  78. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_modules/terminusgps/wialon/items/unit.html +0 -0
  79. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_modules/terminusgps/wialon/items/unit_group.html +0 -0
  80. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_modules/terminusgps/wialon/items/user.html +0 -0
  81. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_modules/terminusgps/wialon/session.html +0 -0
  82. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_modules/terminusgps/wialon/utils.html +0 -0
  83. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_modules/wialon/api.html +0 -0
  84. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_sources/authorizenet/auth.rst.txt +0 -0
  85. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_sources/authorizenet/constants.rst.txt +0 -0
  86. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_sources/authorizenet/controllers.rst.txt +0 -0
  87. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_sources/authorizenet/examples.rst.txt +0 -0
  88. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_sources/authorizenet/index.rst.txt +0 -0
  89. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_sources/authorizenet/profiles.rst.txt +0 -0
  90. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_sources/authorizenet/subscriptions.rst.txt +0 -0
  91. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_sources/authorizenet/utils.rst.txt +0 -0
  92. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_sources/aws/index.rst.txt +0 -0
  93. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_sources/aws/secrets.rst.txt +0 -0
  94. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_sources/aws/utils.rst.txt +0 -0
  95. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_sources/django/forms.rst.txt +0 -0
  96. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_sources/django/index.rst.txt +0 -0
  97. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_sources/django/mixins.rst.txt +0 -0
  98. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_sources/django/settings.rst.txt +0 -0
  99. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_sources/index.rst.txt +0 -0
  100. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_sources/mixins.rst.txt +0 -0
  101. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_sources/settings.rst.txt +0 -0
  102. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_sources/twilio/caller.rst.txt +0 -0
  103. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_sources/twilio/examples.rst.txt +0 -0
  104. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_sources/twilio/index.rst.txt +0 -0
  105. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_sources/twilio/settings.rst.txt +0 -0
  106. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_sources/validators.rst.txt +0 -0
  107. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_sources/wialon/constants.rst.txt +0 -0
  108. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_sources/wialon/errors.rst.txt +0 -0
  109. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_sources/wialon/examples.rst.txt +0 -0
  110. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_sources/wialon/flags.rst.txt +0 -0
  111. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_sources/wialon/index.rst.txt +0 -0
  112. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_sources/wialon/items.rst.txt +0 -0
  113. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_sources/wialon/session.rst.txt +0 -0
  114. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_sources/wialon/settings.rst.txt +0 -0
  115. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_sources/wialon/utils.rst.txt +0 -0
  116. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_static/0fc70aa4dfe4d16d7073.woff +0 -0
  117. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_static/583e3f428bf2362b546d.woff +0 -0
  118. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_static/5be6ec379613f10aea3f.woff +0 -0
  119. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_static/76c1862325ea6f70eeff.woff2 +0 -0
  120. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_static/83710c128240451d95af.woff +0 -0
  121. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_static/_sphinx_javascript_frameworks_compat.js +0 -0
  122. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_static/a63d39a1c104a2b3e87e.woff2 +0 -0
  123. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_static/autoclasstoc.css +0 -0
  124. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_static/awesome-docsearch.css +0 -0
  125. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_static/awesome-docsearch.js +0 -0
  126. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_static/awesome-sphinx-design.css +0 -0
  127. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_static/awesome-sphinx-design.js +0 -0
  128. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_static/b659956119f91f2342bc.woff2 +0 -0
  129. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_static/basic.css +0 -0
  130. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_static/bb50084be2b43ba7b98c.woff2 +0 -0
  131. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_static/ce1e40901d7a0d88d483.woff2 +0 -0
  132. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_static/css/badge_only.css +0 -0
  133. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_static/css/fonts/Roboto-Slab-Bold.woff +0 -0
  134. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_static/css/fonts/Roboto-Slab-Bold.woff2 +0 -0
  135. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_static/css/fonts/Roboto-Slab-Regular.woff +0 -0
  136. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_static/css/fonts/Roboto-Slab-Regular.woff2 +0 -0
  137. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_static/css/fonts/fontawesome-webfont.eot +0 -0
  138. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_static/css/fonts/fontawesome-webfont.svg +0 -0
  139. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_static/css/fonts/fontawesome-webfont.ttf +0 -0
  140. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_static/css/fonts/fontawesome-webfont.woff +0 -0
  141. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_static/css/fonts/fontawesome-webfont.woff2 +0 -0
  142. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_static/css/fonts/lato-bold-italic.woff +0 -0
  143. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_static/css/fonts/lato-bold-italic.woff2 +0 -0
  144. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_static/css/fonts/lato-bold.woff +0 -0
  145. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_static/css/fonts/lato-bold.woff2 +0 -0
  146. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_static/css/fonts/lato-normal-italic.woff +0 -0
  147. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_static/css/fonts/lato-normal-italic.woff2 +0 -0
  148. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_static/css/fonts/lato-normal.woff +0 -0
  149. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_static/css/fonts/lato-normal.woff2 +0 -0
  150. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_static/css/theme.css +0 -0
  151. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_static/d04352f240062b100fba.woff2 +0 -0
  152. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_static/doctools.js +0 -0
  153. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_static/documentation_options.js +0 -0
  154. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_static/f1cdf5c21de970ee0592.woff +0 -0
  155. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_static/fd994e8d90d9cab651b0.woff +0 -0
  156. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_static/file.png +0 -0
  157. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_static/fonts/Lato/lato-bold.eot +0 -0
  158. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_static/fonts/Lato/lato-bold.ttf +0 -0
  159. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_static/fonts/Lato/lato-bold.woff +0 -0
  160. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_static/fonts/Lato/lato-bold.woff2 +0 -0
  161. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_static/fonts/Lato/lato-bolditalic.eot +0 -0
  162. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_static/fonts/Lato/lato-bolditalic.ttf +0 -0
  163. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_static/fonts/Lato/lato-bolditalic.woff +0 -0
  164. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_static/fonts/Lato/lato-bolditalic.woff2 +0 -0
  165. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_static/fonts/Lato/lato-italic.eot +0 -0
  166. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_static/fonts/Lato/lato-italic.ttf +0 -0
  167. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_static/fonts/Lato/lato-italic.woff +0 -0
  168. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_static/fonts/Lato/lato-italic.woff2 +0 -0
  169. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_static/fonts/Lato/lato-regular.eot +0 -0
  170. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_static/fonts/Lato/lato-regular.ttf +0 -0
  171. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_static/fonts/Lato/lato-regular.woff +0 -0
  172. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_static/fonts/Lato/lato-regular.woff2 +0 -0
  173. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot +0 -0
  174. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf +0 -0
  175. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff +0 -0
  176. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 +0 -0
  177. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot +0 -0
  178. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf +0 -0
  179. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff +0 -0
  180. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 +0 -0
  181. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_static/jquery.js +0 -0
  182. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_static/js/badge_only.js +0 -0
  183. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_static/js/theme.js +0 -0
  184. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_static/js/versions.js +0 -0
  185. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_static/language_data.js +0 -0
  186. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_static/minus.png +0 -0
  187. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_static/plus.png +0 -0
  188. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_static/pygments.css +0 -0
  189. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_static/searchtools.js +0 -0
  190. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_static/sphinx_highlight.js +0 -0
  191. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_static/theme.css +0 -0
  192. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_static/theme.js +0 -0
  193. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/_static/theme.js.LICENSE.txt +0 -0
  194. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/authorizenet/auth.html +0 -0
  195. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/authorizenet/constants.html +0 -0
  196. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/authorizenet/controllers.html +0 -0
  197. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/authorizenet/examples.html +0 -0
  198. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/authorizenet/index.html +0 -0
  199. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/authorizenet/profiles.html +0 -0
  200. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/authorizenet/subscriptions.html +0 -0
  201. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/authorizenet/utils.html +0 -0
  202. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/aws/index.html +0 -0
  203. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/aws/secrets.html +0 -0
  204. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/aws/utils.html +0 -0
  205. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/django/forms.html +0 -0
  206. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/django/index.html +0 -0
  207. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/django/mixins.html +0 -0
  208. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/django/settings.html +0 -0
  209. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/genindex.html +0 -0
  210. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/index.html +0 -0
  211. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/mixins.html +0 -0
  212. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/objects.inv +0 -0
  213. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/py-modindex.html +0 -0
  214. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/search.html +0 -0
  215. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/searchindex.js +0 -0
  216. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/settings.html +0 -0
  217. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/twilio/caller.html +0 -0
  218. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/twilio/examples.html +0 -0
  219. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/twilio/index.html +0 -0
  220. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/twilio/settings.html +0 -0
  221. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/validators.html +0 -0
  222. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/wialon/constants.html +0 -0
  223. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/wialon/errors.html +0 -0
  224. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/wialon/examples.html +0 -0
  225. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/wialon/flags.html +0 -0
  226. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/wialon/index.html +0 -0
  227. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/wialon/items.html +0 -0
  228. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/wialon/session.html +0 -0
  229. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/wialon/settings.html +0 -0
  230. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/html/wialon/utils.html +0 -0
  231. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/linkcheck/output.json +0 -0
  232. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/build/linkcheck/output.txt +0 -0
  233. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/make.bat +0 -0
  234. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/source/authorizenet/auth.rst +0 -0
  235. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/source/authorizenet/constants.rst +0 -0
  236. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/source/authorizenet/controllers.rst +0 -0
  237. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/source/authorizenet/examples.rst +0 -0
  238. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/source/authorizenet/index.rst +0 -0
  239. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/source/authorizenet/profiles.rst +0 -0
  240. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/source/authorizenet/utils.rst +0 -0
  241. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/source/aws/index.rst +0 -0
  242. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/source/aws/secrets.rst +0 -0
  243. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/source/aws/utils.rst +0 -0
  244. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/source/conf.py +0 -0
  245. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/source/django/forms.rst +0 -0
  246. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/source/django/index.rst +0 -0
  247. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/source/django/mixins.rst +0 -0
  248. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/source/django/settings.rst +0 -0
  249. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/source/index.rst +0 -0
  250. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/source/twilio/caller.rst +0 -0
  251. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/source/twilio/examples.rst +0 -0
  252. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/source/twilio/index.rst +0 -0
  253. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/source/wialon/constants.rst +0 -0
  254. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/source/wialon/errors.rst +0 -0
  255. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/source/wialon/examples.rst +0 -0
  256. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/source/wialon/flags.rst +0 -0
  257. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/source/wialon/index.rst +0 -0
  258. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/source/wialon/items.rst +0 -0
  259. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/source/wialon/session.rst +0 -0
  260. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/docs/source/wialon/utils.rst +0 -0
  261. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/terminusgps/__init__.py +0 -0
  262. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/terminusgps/authorizenet/__init__.py +0 -0
  263. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/terminusgps/authorizenet/auth.py +0 -0
  264. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/terminusgps/authorizenet/constants.py +0 -0
  265. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/terminusgps/authorizenet/controllers.py +0 -0
  266. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/terminusgps/authorizenet/profiles/__init__.py +0 -0
  267. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/terminusgps/authorizenet/profiles/addresses.py +0 -0
  268. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/terminusgps/authorizenet/profiles/base.py +0 -0
  269. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/terminusgps/authorizenet/profiles/customers.py +0 -0
  270. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/terminusgps/authorizenet/profiles/payments.py +0 -0
  271. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/terminusgps/authorizenet/profiles/subscriptions.py +0 -0
  272. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/terminusgps/authorizenet/tests/__init__.py +0 -0
  273. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/terminusgps/authorizenet/tests/test_auth.py +0 -0
  274. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/terminusgps/authorizenet/tests/test_profiles.py +0 -0
  275. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/terminusgps/authorizenet/tests/test_utils.py +0 -0
  276. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/terminusgps/authorizenet/utils.py +0 -0
  277. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/terminusgps/aws/__init__.py +0 -0
  278. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/terminusgps/aws/secrets.py +0 -0
  279. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/terminusgps/aws/utils.py +0 -0
  280. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/terminusgps/django/__init__.py +0 -0
  281. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/terminusgps/django/forms/__init__.py +0 -0
  282. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/terminusgps/django/forms/fields.py +0 -0
  283. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/terminusgps/django/forms/forms.py +0 -0
  284. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/terminusgps/django/forms/widgets.py +0 -0
  285. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/terminusgps/django/mixins.py +0 -0
  286. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/terminusgps/django/settings.py +0 -0
  287. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/terminusgps/django/tests/test_forms.py +0 -0
  288. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/terminusgps/django/tests/test_mixins.py +0 -0
  289. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/terminusgps/django/tests/test_utils.py +0 -0
  290. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/terminusgps/django/utils.py +0 -0
  291. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/terminusgps/twilio/__init__.py +0 -0
  292. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/terminusgps/twilio/caller.py +0 -0
  293. {python_terminusgps-33.3.0/terminusgps/twilio/tests → python_terminusgps-33.5.0/terminusgps/wialon}/__init__.py +0 -0
  294. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/terminusgps/wialon/constants.py +0 -0
  295. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/terminusgps/wialon/flags.py +0 -0
  296. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/terminusgps/wialon/items/__init__.py +0 -0
  297. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/terminusgps/wialon/items/base.py +0 -0
  298. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/terminusgps/wialon/items/resource.py +0 -0
  299. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/terminusgps/wialon/items/retranslator.py +0 -0
  300. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/terminusgps/wialon/items/route.py +0 -0
  301. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/terminusgps/wialon/items/unit.py +0 -0
  302. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/terminusgps/wialon/items/unit_group.py +0 -0
  303. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/terminusgps/wialon/items/user.py +0 -0
  304. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/terminusgps/wialon/session.py +0 -0
  305. {python_terminusgps-33.3.0/terminusgps/wialon → python_terminusgps-33.5.0/terminusgps/wialon/tests}/__init__.py +0 -0
  306. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/terminusgps/wialon/tests/test_items.py +0 -0
  307. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/terminusgps/wialon/tests/test_session.py +0 -0
  308. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/terminusgps/wialon/tests/test_utils.py +0 -0
  309. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/terminusgps/wialon/utils.py +0 -0
  310. {python_terminusgps-33.3.0 → python_terminusgps-33.5.0}/terminusgps/wialon/validators.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-terminusgps
3
- Version: 33.3.0
3
+ Version: 33.5.0
4
4
  Summary: Provides abstractions/utilities for working with Wialon API, Authorize.NET API, AWS API, and more.
5
5
  Project-URL: Documentation, https://docs.terminusgps.com
6
6
  Project-URL: Repository, https://github.com/terminusgps/python-terminusgps
@@ -12,6 +12,7 @@ Classifier: Programming Language :: Python :: 3
12
12
  Classifier: Programming Language :: Python :: 3.12
13
13
  Classifier: Programming Language :: Python :: 3.13
14
14
  Requires-Python: >=3.12
15
+ Requires-Dist: aiobotocore>=2.21.1
15
16
  Requires-Dist: argparse>=1.4.0
16
17
  Requires-Dist: authorizenet>=1.1.5
17
18
  Requires-Dist: boto3>=1.34.144
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "python-terminusgps"
3
- version = "33.3.0"
3
+ version = "33.5.0"
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" } ]
@@ -13,6 +13,7 @@ classifiers = [
13
13
  ]
14
14
  requires-python = ">=3.12"
15
15
  dependencies = [
16
+ "aiobotocore>=2.21.1",
16
17
  "argparse>=1.4.0",
17
18
  "authorizenet>=1.1.5",
18
19
  "boto3>=1.34.144",
@@ -0,0 +1,49 @@
1
+ import asyncio
2
+ import uuid
3
+ from contextlib import AsyncExitStack
4
+
5
+ from aiobotocore.session import AioSession
6
+
7
+ from terminusgps.django.validators import validate_e164_phone_number
8
+
9
+
10
+ class AWSNotifier:
11
+ def __init__(self, region: str = "us-east-1") -> None:
12
+ self._client = None
13
+ self._region = region
14
+ self._exit_stack = AsyncExitStack()
15
+
16
+ async def __aenter__(self):
17
+ session = AioSession()
18
+ self._client = await self._exit_stack.enter_async_context(
19
+ session.create_client("sns")
20
+ )
21
+
22
+ async def __aexit__(self, exc_type, exc_val, exc_tb):
23
+ await self._exit_stack.__aexit__(exc_type, exc_val, exc_tb)
24
+
25
+ async def send_sms(
26
+ self, phone_number: str, message: str, message_id: str, group_id: str
27
+ ) -> dict:
28
+ validate_e164_phone_number(phone_number)
29
+ await self._client.publish(
30
+ **{
31
+ "PhoneNumber": phone_number,
32
+ "Message": message,
33
+ "MessageDeduplicationId": message_id,
34
+ "MessageGroupId": group_id,
35
+ }
36
+ )
37
+
38
+
39
+ async def main() -> None:
40
+ notifier = AWSNotifier()
41
+ message_id = str(uuid.uuid4())
42
+ await notifier.send_sms(
43
+ "+17133049421", "This is a test message", message_id, "message-group"
44
+ )
45
+ return
46
+
47
+
48
+ if __name__ == "__main__":
49
+ asyncio.run(main())
@@ -0,0 +1,93 @@
1
+ from django.core.exceptions import ValidationError
2
+ from django.utils.translation import gettext_lazy as _
3
+
4
+ VALID_COUNTRY_CODES = ("+1", "+52")
5
+
6
+
7
+ def validate_e164_phone_number(value: str) -> None:
8
+ """Raises :py:exec:`~django.core.exceptions.ValidationError` if the value is not a valid `E.164 <https://en.wikipedia.org/wiki/E.164>`_ formatted phone number."""
9
+ if not value.startswith("+"):
10
+ raise ValidationError(
11
+ _("E.164 phone number must begin with a '+', got '%(char)s'."),
12
+ code="invalid",
13
+ params={"char": value[0]},
14
+ )
15
+ if " " in value:
16
+ raise ValidationError(
17
+ _("E.164 phone number cannot contain spaces, got '%(value)s'."),
18
+ code="invalid",
19
+ params={"value": value},
20
+ )
21
+ if "-" in value:
22
+ raise ValidationError(
23
+ _("E.164 phone number cannot contain hyphens, got '%(value)s'."),
24
+ code="invalid",
25
+ params={"value": value},
26
+ )
27
+ if len(value) < 12:
28
+ raise ValidationError(
29
+ _(
30
+ "E.164 phone number cannot be less than 12 characters in length, got %(len)s."
31
+ ),
32
+ code="invalid",
33
+ params={"len": len(value)},
34
+ )
35
+ if len(value) > 15:
36
+ raise ValidationError(
37
+ _(
38
+ "E.164 phone number cannot be greater than 15 characters in length, got %(len)s."
39
+ ),
40
+ code="invalid",
41
+ params={"len": len(value)},
42
+ )
43
+
44
+ country_code: str = value[:-10]
45
+ area_code: str = value[-10:-7]
46
+ subscriber_number: str = value[-7:]
47
+
48
+ if len(country_code) < 2 or len(country_code) > 5:
49
+ raise ValidationError(
50
+ _(
51
+ "E.164 phone number country code must be between 2 and 5 characters in length, got %(len)s."
52
+ ),
53
+ code="invalid",
54
+ params={"len": len(country_code)},
55
+ )
56
+ if country_code not in VALID_COUNTRY_CODES:
57
+ raise ValidationError(
58
+ _(
59
+ "E.164 phone number cannot contain an invalid country code, got '%(country_code)s'."
60
+ ),
61
+ code="invalid",
62
+ params={"country_code": country_code},
63
+ )
64
+ if not len(area_code) == 3:
65
+ raise ValidationError(
66
+ _(
67
+ "E.164 phone number must contain a 3-digit area code, got '%(area_code)s'."
68
+ ),
69
+ code="invalid",
70
+ params={"area_code": area_code},
71
+ )
72
+ if not area_code.isdigit():
73
+ raise ValidationError(
74
+ _("E.164 phone number must have a valid area code, got '%(area_code)s'"),
75
+ code="invalid",
76
+ params={"area_code": area_code},
77
+ )
78
+ if not len(subscriber_number) == 7:
79
+ raise ValidationError(
80
+ _(
81
+ "E.164 phone number must contain a 7-digit subscriber number, got '%(subscriber_number)s'."
82
+ ),
83
+ code="invalid",
84
+ params={"subscriber_number": subscriber_number},
85
+ )
86
+ if not subscriber_number.isdigit():
87
+ raise ValidationError(
88
+ _(
89
+ "E.164 phone number must have a valid subscriber number, got '%(subscriber_number)s'"
90
+ ),
91
+ code="invalid",
92
+ params={"subscriber_number": subscriber_number},
93
+ )
@@ -1,6 +1,24 @@
1
1
  version = 1
2
2
  requires-python = ">=3.12"
3
3
 
4
+ [[package]]
5
+ name = "aiobotocore"
6
+ version = "2.21.1"
7
+ source = { registry = "https://pypi.org/simple" }
8
+ dependencies = [
9
+ { name = "aiohttp" },
10
+ { name = "aioitertools" },
11
+ { name = "botocore" },
12
+ { name = "jmespath" },
13
+ { name = "multidict" },
14
+ { name = "python-dateutil" },
15
+ { name = "wrapt" },
16
+ ]
17
+ sdist = { url = "https://files.pythonhosted.org/packages/d2/dc/f5f872fb01ce37c09525cedc7ecfad7002ffe2a8a23f77d7d2c234399b51/aiobotocore-2.21.1.tar.gz", hash = "sha256:010357f43004413e92a9d066bb0db1f241aeb29ffed306e9197061ffc94e6577", size = 108900 }
18
+ wheels = [
19
+ { url = "https://files.pythonhosted.org/packages/95/67/026598918f92145156f2feb7957f57daefda20375cc2ac1a0692a9b8010b/aiobotocore-2.21.1-py3-none-any.whl", hash = "sha256:bd7c49a6d6f8a3d9444b0a94417c8da13813b5c7eec1c4f0ec2db7e8ce8f23e7", size = 78313 },
20
+ ]
21
+
4
22
  [[package]]
5
23
  name = "aiohappyeyeballs"
6
24
  version = "2.6.1"
@@ -71,6 +89,15 @@ wheels = [
71
89
  { url = "https://files.pythonhosted.org/packages/1a/99/84ba7273339d0f3dfa57901b846489d2e5c2cd731470167757f1935fffbd/aiohttp_retry-2.9.1-py3-none-any.whl", hash = "sha256:66d2759d1921838256a05a3f80ad7e724936f083e35be5abb5e16eed6be6dc54", size = 9981 },
72
90
  ]
73
91
 
92
+ [[package]]
93
+ name = "aioitertools"
94
+ version = "0.12.0"
95
+ source = { registry = "https://pypi.org/simple" }
96
+ sdist = { url = "https://files.pythonhosted.org/packages/06/de/38491a84ab323b47c7f86e94d2830e748780525f7a10c8600b67ead7e9ea/aioitertools-0.12.0.tar.gz", hash = "sha256:c2a9055b4fbb7705f561b9d86053e8af5d10cc845d22c32008c43490b2d8dd6b", size = 19369 }
97
+ wheels = [
98
+ { url = "https://files.pythonhosted.org/packages/85/13/58b70a580de00893223d61de8fea167877a3aed97d4a5e1405c9159ef925/aioitertools-0.12.0-py3-none-any.whl", hash = "sha256:fc1f5fac3d737354de8831cbba3eb04f79dd649d8f3afb4c5b114925e662a796", size = 24345 },
99
+ ]
100
+
74
101
  [[package]]
75
102
  name = "aiosignal"
76
103
  version = "1.3.2"
@@ -168,30 +195,30 @@ wheels = [
168
195
 
169
196
  [[package]]
170
197
  name = "boto3"
171
- version = "1.38.3"
198
+ version = "1.37.1"
172
199
  source = { registry = "https://pypi.org/simple" }
173
200
  dependencies = [
174
201
  { name = "botocore" },
175
202
  { name = "jmespath" },
176
203
  { name = "s3transfer" },
177
204
  ]
178
- sdist = { url = "https://files.pythonhosted.org/packages/61/ce/d6fbf9cdda1b40023ef60507adc1de1d7ba0786dc73ddca59f4bed487e40/boto3-1.38.3.tar.gz", hash = "sha256:655d51abcd68a40a33c52dbaa2ca73fc63c746b894e2ae22ed8ddc1912ddd93f", size = 111816 }
205
+ sdist = { url = "https://files.pythonhosted.org/packages/21/8c/c2af03daafaacea1db1823d23073facffa75818b61d376c3be77dd297ae8/boto3-1.37.1.tar.gz", hash = "sha256:96d18f7feb0c1fcb95f8837b74b6c8880e1b4e35ce5f8a8f8cb243a090c278ed", size = 111175 }
179
206
  wheels = [
180
- { url = "https://files.pythonhosted.org/packages/c1/cb/9f6cdbb1e6194064d40ce7ef04a276822aacf036dc8d03d7d156c4701290/boto3-1.38.3-py3-none-any.whl", hash = "sha256:9218f86e2164e1bddb75d435bbde4fa651aa58687213d7e3e1b50f7eb8868f66", size = 139897 },
207
+ { url = "https://files.pythonhosted.org/packages/63/ec/e722c53c9dc41e8df094587c32e19409bace8b43b5eb31fe3536ca57a38b/boto3-1.37.1-py3-none-any.whl", hash = "sha256:4320441f904435a1b85e6ecb81793192e522c737cc9ed6566014e29f0a11cb22", size = 139338 },
181
208
  ]
182
209
 
183
210
  [[package]]
184
211
  name = "botocore"
185
- version = "1.38.3"
212
+ version = "1.37.1"
186
213
  source = { registry = "https://pypi.org/simple" }
187
214
  dependencies = [
188
215
  { name = "jmespath" },
189
216
  { name = "python-dateutil" },
190
217
  { name = "urllib3" },
191
218
  ]
192
- sdist = { url = "https://files.pythonhosted.org/packages/92/ee/b47c0286ada750271897f5cc3e40b4405f1218ff392cd15df993893f0099/botocore-1.38.3.tar.gz", hash = "sha256:790f8f966201781f5fcf486d48b4492e9f734446bbf9d19ef8159d08be854243", size = 13846441 }
219
+ sdist = { url = "https://files.pythonhosted.org/packages/e5/01/3083bff25fd91193162298920cb093b9095609408416526d52b2826965b7/botocore-1.37.1.tar.gz", hash = "sha256:b194db8fb2a0ffba53568c364ae26166e7eec0445496b2ac86a6e142f3dd982f", size = 13578835 }
193
220
  wheels = [
194
- { url = "https://files.pythonhosted.org/packages/b7/d1/2b9e417b0212339f14b853aa4391b0121c11308f968798c874e74f265080/botocore-1.38.3-py3-none-any.whl", hash = "sha256:96f823240fe3704b99c17d1d1b2fd2d1679cf56d2a55b095f00255b76087cbf0", size = 13506578 },
221
+ { url = "https://files.pythonhosted.org/packages/3d/20/352b2bf99f93ba18986615841786cbd0d38f7856bd49d4e154a540f04afe/botocore-1.37.1-py3-none-any.whl", hash = "sha256:c1db1bfc5d8c6b3b6d1ca6794f605294b4264e82a7e727b88e0fef9c2b9fbb9c", size = 13359164 },
195
222
  ]
196
223
 
197
224
  [[package]]
@@ -925,9 +952,10 @@ wheels = [
925
952
 
926
953
  [[package]]
927
954
  name = "python-terminusgps"
928
- version = "33.3.0"
955
+ version = "33.5.0"
929
956
  source = { editable = "." }
930
957
  dependencies = [
958
+ { name = "aiobotocore" },
931
959
  { name = "argparse" },
932
960
  { name = "authorizenet" },
933
961
  { name = "boto3" },
@@ -950,6 +978,7 @@ dev = [
950
978
 
951
979
  [package.metadata]
952
980
  requires-dist = [
981
+ { name = "aiobotocore", specifier = ">=2.21.1" },
953
982
  { name = "argparse", specifier = ">=1.4.0" },
954
983
  { name = "authorizenet", specifier = ">=1.1.5" },
955
984
  { name = "boto3", specifier = ">=1.34.144" },
@@ -1037,14 +1066,14 @@ wheels = [
1037
1066
 
1038
1067
  [[package]]
1039
1068
  name = "s3transfer"
1040
- version = "0.12.0"
1069
+ version = "0.11.3"
1041
1070
  source = { registry = "https://pypi.org/simple" }
1042
1071
  dependencies = [
1043
1072
  { name = "botocore" },
1044
1073
  ]
1045
- sdist = { url = "https://files.pythonhosted.org/packages/fc/9e/73b14aed38ee1f62cd30ab93cd0072dec7fb01f3033d116875ae3e7b8b44/s3transfer-0.12.0.tar.gz", hash = "sha256:8ac58bc1989a3fdb7c7f3ee0918a66b160d038a147c7b5db1500930a607e9a1c", size = 149178 }
1074
+ sdist = { url = "https://files.pythonhosted.org/packages/39/24/1390172471d569e281fcfd29b92f2f73774e95972c965d14b6c802ff2352/s3transfer-0.11.3.tar.gz", hash = "sha256:edae4977e3a122445660c7c114bba949f9d191bae3b34a096f18a1c8c354527a", size = 148042 }
1046
1075
  wheels = [
1047
- { url = "https://files.pythonhosted.org/packages/89/64/d2b49620039b82688aeebd510bd62ff4cdcdb86cbf650cc72ae42c5254a3/s3transfer-0.12.0-py3-none-any.whl", hash = "sha256:35b314d7d82865756edab59f7baebc6b477189e6ab4c53050e28c1de4d9cce18", size = 84773 },
1076
+ { url = "https://files.pythonhosted.org/packages/e4/81/48c41b554a54d75d4407740abb60e3a102ae416284df04d1dbdcbe3dbf24/s3transfer-0.11.3-py3-none-any.whl", hash = "sha256:ca855bdeb885174b5ffa95b9913622459d4ad8e331fc98eb01e6d5eb6a30655d", size = 84246 },
1048
1077
  ]
1049
1078
 
1050
1079
  [[package]]
@@ -1273,6 +1302,48 @@ wheels = [
1273
1302
  { url = "https://files.pythonhosted.org/packages/e1/07/c6fe3ad3e685340704d314d765b7912993bcb8dc198f0e7a89382d37974b/win32_setctime-1.2.0-py3-none-any.whl", hash = "sha256:95d644c4e708aba81dc3704a116d8cbc974d70b3bdb8be1d150e36be6e9d1390", size = 4083 },
1274
1303
  ]
1275
1304
 
1305
+ [[package]]
1306
+ name = "wrapt"
1307
+ version = "1.17.2"
1308
+ source = { registry = "https://pypi.org/simple" }
1309
+ sdist = { url = "https://files.pythonhosted.org/packages/c3/fc/e91cc220803d7bc4db93fb02facd8461c37364151b8494762cc88b0fbcef/wrapt-1.17.2.tar.gz", hash = "sha256:41388e9d4d1522446fe79d3213196bd9e3b301a336965b9e27ca2788ebd122f3", size = 55531 }
1310
+ wheels = [
1311
+ { url = "https://files.pythonhosted.org/packages/a1/bd/ab55f849fd1f9a58ed7ea47f5559ff09741b25f00c191231f9f059c83949/wrapt-1.17.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d5e2439eecc762cd85e7bd37161d4714aa03a33c5ba884e26c81559817ca0925", size = 53799 },
1312
+ { url = "https://files.pythonhosted.org/packages/53/18/75ddc64c3f63988f5a1d7e10fb204ffe5762bc663f8023f18ecaf31a332e/wrapt-1.17.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3fc7cb4c1c744f8c05cd5f9438a3caa6ab94ce8344e952d7c45a8ed59dd88392", size = 38821 },
1313
+ { url = "https://files.pythonhosted.org/packages/48/2a/97928387d6ed1c1ebbfd4efc4133a0633546bec8481a2dd5ec961313a1c7/wrapt-1.17.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8fdbdb757d5390f7c675e558fd3186d590973244fab0c5fe63d373ade3e99d40", size = 38919 },
1314
+ { url = "https://files.pythonhosted.org/packages/73/54/3bfe5a1febbbccb7a2f77de47b989c0b85ed3a6a41614b104204a788c20e/wrapt-1.17.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bb1d0dbf99411f3d871deb6faa9aabb9d4e744d67dcaaa05399af89d847a91d", size = 88721 },
1315
+ { url = "https://files.pythonhosted.org/packages/25/cb/7262bc1b0300b4b64af50c2720ef958c2c1917525238d661c3e9a2b71b7b/wrapt-1.17.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d18a4865f46b8579d44e4fe1e2bcbc6472ad83d98e22a26c963d46e4c125ef0b", size = 80899 },
1316
+ { url = "https://files.pythonhosted.org/packages/2a/5a/04cde32b07a7431d4ed0553a76fdb7a61270e78c5fd5a603e190ac389f14/wrapt-1.17.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc570b5f14a79734437cb7b0500376b6b791153314986074486e0b0fa8d71d98", size = 89222 },
1317
+ { url = "https://files.pythonhosted.org/packages/09/28/2e45a4f4771fcfb109e244d5dbe54259e970362a311b67a965555ba65026/wrapt-1.17.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6d9187b01bebc3875bac9b087948a2bccefe464a7d8f627cf6e48b1bbae30f82", size = 86707 },
1318
+ { url = "https://files.pythonhosted.org/packages/c6/d2/dcb56bf5f32fcd4bd9aacc77b50a539abdd5b6536872413fd3f428b21bed/wrapt-1.17.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:9e8659775f1adf02eb1e6f109751268e493c73716ca5761f8acb695e52a756ae", size = 79685 },
1319
+ { url = "https://files.pythonhosted.org/packages/80/4e/eb8b353e36711347893f502ce91c770b0b0929f8f0bed2670a6856e667a9/wrapt-1.17.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e8b2816ebef96d83657b56306152a93909a83f23994f4b30ad4573b00bd11bb9", size = 87567 },
1320
+ { url = "https://files.pythonhosted.org/packages/17/27/4fe749a54e7fae6e7146f1c7d914d28ef599dacd4416566c055564080fe2/wrapt-1.17.2-cp312-cp312-win32.whl", hash = "sha256:468090021f391fe0056ad3e807e3d9034e0fd01adcd3bdfba977b6fdf4213ea9", size = 36672 },
1321
+ { url = "https://files.pythonhosted.org/packages/15/06/1dbf478ea45c03e78a6a8c4be4fdc3c3bddea5c8de8a93bc971415e47f0f/wrapt-1.17.2-cp312-cp312-win_amd64.whl", hash = "sha256:ec89ed91f2fa8e3f52ae53cd3cf640d6feff92ba90d62236a81e4e563ac0e991", size = 38865 },
1322
+ { url = "https://files.pythonhosted.org/packages/ce/b9/0ffd557a92f3b11d4c5d5e0c5e4ad057bd9eb8586615cdaf901409920b14/wrapt-1.17.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6ed6ffac43aecfe6d86ec5b74b06a5be33d5bb9243d055141e8cabb12aa08125", size = 53800 },
1323
+ { url = "https://files.pythonhosted.org/packages/c0/ef/8be90a0b7e73c32e550c73cfb2fa09db62234227ece47b0e80a05073b375/wrapt-1.17.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:35621ae4c00e056adb0009f8e86e28eb4a41a4bfa8f9bfa9fca7d343fe94f998", size = 38824 },
1324
+ { url = "https://files.pythonhosted.org/packages/36/89/0aae34c10fe524cce30fe5fc433210376bce94cf74d05b0d68344c8ba46e/wrapt-1.17.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a604bf7a053f8362d27eb9fefd2097f82600b856d5abe996d623babd067b1ab5", size = 38920 },
1325
+ { url = "https://files.pythonhosted.org/packages/3b/24/11c4510de906d77e0cfb5197f1b1445d4fec42c9a39ea853d482698ac681/wrapt-1.17.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cbabee4f083b6b4cd282f5b817a867cf0b1028c54d445b7ec7cfe6505057cf8", size = 88690 },
1326
+ { url = "https://files.pythonhosted.org/packages/71/d7/cfcf842291267bf455b3e266c0c29dcb675b5540ee8b50ba1699abf3af45/wrapt-1.17.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49703ce2ddc220df165bd2962f8e03b84c89fee2d65e1c24a7defff6f988f4d6", size = 80861 },
1327
+ { url = "https://files.pythonhosted.org/packages/d5/66/5d973e9f3e7370fd686fb47a9af3319418ed925c27d72ce16b791231576d/wrapt-1.17.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8112e52c5822fc4253f3901b676c55ddf288614dc7011634e2719718eaa187dc", size = 89174 },
1328
+ { url = "https://files.pythonhosted.org/packages/a7/d3/8e17bb70f6ae25dabc1aaf990f86824e4fd98ee9cadf197054e068500d27/wrapt-1.17.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9fee687dce376205d9a494e9c121e27183b2a3df18037f89d69bd7b35bcf59e2", size = 86721 },
1329
+ { url = "https://files.pythonhosted.org/packages/6f/54/f170dfb278fe1c30d0ff864513cff526d624ab8de3254b20abb9cffedc24/wrapt-1.17.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:18983c537e04d11cf027fbb60a1e8dfd5190e2b60cc27bc0808e653e7b218d1b", size = 79763 },
1330
+ { url = "https://files.pythonhosted.org/packages/4a/98/de07243751f1c4a9b15c76019250210dd3486ce098c3d80d5f729cba029c/wrapt-1.17.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:703919b1633412ab54bcf920ab388735832fdcb9f9a00ae49387f0fe67dad504", size = 87585 },
1331
+ { url = "https://files.pythonhosted.org/packages/f9/f0/13925f4bd6548013038cdeb11ee2cbd4e37c30f8bfd5db9e5a2a370d6e20/wrapt-1.17.2-cp313-cp313-win32.whl", hash = "sha256:abbb9e76177c35d4e8568e58650aa6926040d6a9f6f03435b7a522bf1c487f9a", size = 36676 },
1332
+ { url = "https://files.pythonhosted.org/packages/bf/ae/743f16ef8c2e3628df3ddfd652b7d4c555d12c84b53f3d8218498f4ade9b/wrapt-1.17.2-cp313-cp313-win_amd64.whl", hash = "sha256:69606d7bb691b50a4240ce6b22ebb319c1cfb164e5f6569835058196e0f3a845", size = 38871 },
1333
+ { url = "https://files.pythonhosted.org/packages/3d/bc/30f903f891a82d402ffb5fda27ec1d621cc97cb74c16fea0b6141f1d4e87/wrapt-1.17.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:4a721d3c943dae44f8e243b380cb645a709ba5bd35d3ad27bc2ed947e9c68192", size = 56312 },
1334
+ { url = "https://files.pythonhosted.org/packages/8a/04/c97273eb491b5f1c918857cd26f314b74fc9b29224521f5b83f872253725/wrapt-1.17.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:766d8bbefcb9e00c3ac3b000d9acc51f1b399513f44d77dfe0eb026ad7c9a19b", size = 40062 },
1335
+ { url = "https://files.pythonhosted.org/packages/4e/ca/3b7afa1eae3a9e7fefe499db9b96813f41828b9fdb016ee836c4c379dadb/wrapt-1.17.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e496a8ce2c256da1eb98bd15803a79bee00fc351f5dfb9ea82594a3f058309e0", size = 40155 },
1336
+ { url = "https://files.pythonhosted.org/packages/89/be/7c1baed43290775cb9030c774bc53c860db140397047cc49aedaf0a15477/wrapt-1.17.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d615e4fe22f4ad3528448c193b218e077656ca9ccb22ce2cb20db730f8d306", size = 113471 },
1337
+ { url = "https://files.pythonhosted.org/packages/32/98/4ed894cf012b6d6aae5f5cc974006bdeb92f0241775addad3f8cd6ab71c8/wrapt-1.17.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a5aaeff38654462bc4b09023918b7f21790efb807f54c000a39d41d69cf552cb", size = 101208 },
1338
+ { url = "https://files.pythonhosted.org/packages/ea/fd/0c30f2301ca94e655e5e057012e83284ce8c545df7661a78d8bfca2fac7a/wrapt-1.17.2-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a7d15bbd2bc99e92e39f49a04653062ee6085c0e18b3b7512a4f2fe91f2d681", size = 109339 },
1339
+ { url = "https://files.pythonhosted.org/packages/75/56/05d000de894c4cfcb84bcd6b1df6214297b8089a7bd324c21a4765e49b14/wrapt-1.17.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:e3890b508a23299083e065f435a492b5435eba6e304a7114d2f919d400888cc6", size = 110232 },
1340
+ { url = "https://files.pythonhosted.org/packages/53/f8/c3f6b2cf9b9277fb0813418e1503e68414cd036b3b099c823379c9575e6d/wrapt-1.17.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:8c8b293cd65ad716d13d8dd3624e42e5a19cc2a2f1acc74b30c2c13f15cb61a6", size = 100476 },
1341
+ { url = "https://files.pythonhosted.org/packages/a7/b1/0bb11e29aa5139d90b770ebbfa167267b1fc548d2302c30c8f7572851738/wrapt-1.17.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4c82b8785d98cdd9fed4cac84d765d234ed3251bd6afe34cb7ac523cb93e8b4f", size = 106377 },
1342
+ { url = "https://files.pythonhosted.org/packages/6a/e1/0122853035b40b3f333bbb25f1939fc1045e21dd518f7f0922b60c156f7c/wrapt-1.17.2-cp313-cp313t-win32.whl", hash = "sha256:13e6afb7fe71fe7485a4550a8844cc9ffbe263c0f1a1eea569bc7091d4898555", size = 37986 },
1343
+ { url = "https://files.pythonhosted.org/packages/09/5e/1655cf481e079c1f22d0cabdd4e51733679932718dc23bf2db175f329b76/wrapt-1.17.2-cp313-cp313t-win_amd64.whl", hash = "sha256:eaf675418ed6b3b31c7a989fd007fa7c3be66ce14e5c3b27336383604c9da85c", size = 40750 },
1344
+ { url = "https://files.pythonhosted.org/packages/2d/82/f56956041adef78f849db6b289b282e72b55ab8045a75abad81898c28d19/wrapt-1.17.2-py3-none-any.whl", hash = "sha256:b18f2d1533a71f069c7f82d524a52599053d4c7166e9dd374ae2136b7f40f7c8", size = 23594 },
1345
+ ]
1346
+
1276
1347
  [[package]]
1277
1348
  name = "yarl"
1278
1349
  version = "1.20.0"
@@ -1,21 +0,0 @@
1
- import datetime
2
-
3
- import jwt
4
- from django.conf import settings
5
-
6
-
7
- def get_aws_connect_jwt(widget_id: str, expires_in: int = 500) -> str:
8
- if expires_in > 600:
9
- raise ValueError(f"'expires_in' must be less than 600, got '{expires_in}'.")
10
-
11
- payload = {
12
- "sub": widget_id,
13
- "iat": datetime.datetime.utcnow(),
14
- "exp": datetime.datetime.utcnow() - datetime.timedelta(seconds=expires_in),
15
- "segmentAttributes": {"connect:Subtype": {"ValueString": "connect:Guide"}},
16
- }
17
- header = {"typ": "JWT", "alg": "HS256"}
18
- encoded_token = jwt.encode(
19
- payload, settings.CONNECT_SECRET, algorithm=header["alg"], headers=header
20
- )
21
- return encoded_token
@@ -1,40 +0,0 @@
1
- from unittest import TestCase
2
-
3
- import django
4
- from django.core.exceptions import ValidationError
5
-
6
- from terminusgps.twilio import validators
7
-
8
- django.setup()
9
-
10
-
11
- class PhoneNumberValidatorTestCase(TestCase):
12
- def setUp(self) -> None:
13
- self.validator = validators.validate_phone_number
14
-
15
- def test_phone_without_plus(self) -> None:
16
- """Fails if a phone number without a '+' leading character passes validation."""
17
- with self.assertRaises(ValidationError) as context:
18
- self.validator("15555555555")
19
- self.assertTrue(
20
- "Phone number must begin with a '+', got '15555555555'."
21
- in str(context.exception)
22
- )
23
-
24
- def test_phone_min_length(self) -> None:
25
- """Fails if a phone number of 8 characters in length passes validation."""
26
- with self.assertRaises(ValidationError) as context:
27
- self.validator("+1555555")
28
- self.assertTrue(
29
- "Phone number cannot be less than 12 characters, got 8."
30
- in str(context.exception)
31
- )
32
-
33
- def test_phone_max_length(self) -> None:
34
- """Fails if a phone number of 20 characters in length passes validation."""
35
- with self.assertRaises(ValidationError) as context:
36
- self.validator("+1555555555555555555")
37
- self.assertTrue(
38
- "Phone number cannot be greater than 19 characters, got 20."
39
- in str(context.exception)
40
- )
@@ -1,31 +0,0 @@
1
- from django.core.exceptions import ValidationError
2
- from django.utils.translation import gettext_lazy as _
3
-
4
-
5
- def validate_phone_number(value: str) -> None:
6
- min_length, max_length = 12, 19
7
-
8
- if not value.startswith("+"):
9
- raise ValidationError(
10
- _("Phone number must begin with a '+', got '%(value)s'."),
11
- code="invalid",
12
- params={"value": value},
13
- )
14
- if not value[1:].isdigit():
15
- raise ValidationError(
16
- _("Phone number must be '+' followed by a digit, got '%(value)s'"),
17
- code="invalid",
18
- params={"value": value},
19
- )
20
- if len(value) < min_length:
21
- raise ValidationError(
22
- _("Phone number cannot be less than %(min)s characters, got %(len)s."),
23
- code="invalid",
24
- params={"min": min_length, "len": len(value)},
25
- )
26
- if len(value) > max_length:
27
- raise ValidationError(
28
- _("Phone number cannot be greater than %(max)s characters, got %(len)s."),
29
- code="invalid",
30
- params={"max": max_length, "len": len(value)},
31
- )