python-terminusgps 35.0.0__tar.gz → 35.1.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 (327) hide show
  1. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/PKG-INFO +1 -1
  2. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/source/aws/index.rst +0 -1
  3. python_terminusgps-35.1.0/docs/source/aws/notifications.rst +7 -0
  4. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/pyproject.toml +1 -1
  5. python_terminusgps-35.1.0/terminusgps/aws/notifications.py +197 -0
  6. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/uv.lock +4 -4
  7. python_terminusgps-35.0.0/docs/source/aws/notifications.rst +0 -50
  8. python_terminusgps-35.0.0/docs/source/aws/speech.rst +0 -25
  9. python_terminusgps-35.0.0/terminusgps/aws/notifications.py +0 -311
  10. python_terminusgps-35.0.0/terminusgps/aws/speech.py +0 -146
  11. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/.gitignore +0 -0
  12. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/COPYING +0 -0
  13. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/README.md +0 -0
  14. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/Makefile +0 -0
  15. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/coverage/c.txt +0 -0
  16. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/coverage/python.txt +0 -0
  17. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/coverage/undoc.pickle +0 -0
  18. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/doctrees/authorizenet/auth.doctree +0 -0
  19. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/doctrees/authorizenet/constants.doctree +0 -0
  20. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/doctrees/authorizenet/controllers.doctree +0 -0
  21. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/doctrees/authorizenet/examples.doctree +0 -0
  22. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/doctrees/authorizenet/index.doctree +0 -0
  23. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/doctrees/authorizenet/profiles.doctree +0 -0
  24. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/doctrees/authorizenet/subscriptions.doctree +0 -0
  25. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/doctrees/authorizenet/utils.doctree +0 -0
  26. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/doctrees/aws/index.doctree +0 -0
  27. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/doctrees/aws/notifications.doctree +0 -0
  28. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/doctrees/aws/secrets.doctree +0 -0
  29. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/doctrees/aws/speech.doctree +0 -0
  30. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/doctrees/aws/utils.doctree +0 -0
  31. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/doctrees/django/forms.doctree +0 -0
  32. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/doctrees/django/index.doctree +0 -0
  33. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/doctrees/django/mixins.doctree +0 -0
  34. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/doctrees/django/settings.doctree +0 -0
  35. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/doctrees/django/validators.doctree +0 -0
  36. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/doctrees/environment.pickle +0 -0
  37. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/doctrees/index.doctree +0 -0
  38. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/doctrees/mixins.doctree +0 -0
  39. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/doctrees/settings.doctree +0 -0
  40. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/doctrees/twilio/caller.doctree +0 -0
  41. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/doctrees/twilio/examples.doctree +0 -0
  42. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/doctrees/twilio/index.doctree +0 -0
  43. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/doctrees/twilio/settings.doctree +0 -0
  44. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/doctrees/validators.doctree +0 -0
  45. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/doctrees/wialon/constants.doctree +0 -0
  46. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/doctrees/wialon/errors.doctree +0 -0
  47. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/doctrees/wialon/examples.doctree +0 -0
  48. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/doctrees/wialon/flags.doctree +0 -0
  49. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/doctrees/wialon/index.doctree +0 -0
  50. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/doctrees/wialon/items.doctree +0 -0
  51. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/doctrees/wialon/session.doctree +0 -0
  52. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/doctrees/wialon/settings.doctree +0 -0
  53. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/doctrees/wialon/utils.doctree +0 -0
  54. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_modules/index.html +0 -0
  55. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_modules/terminusgps/authorizenet/auth.html +0 -0
  56. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_modules/terminusgps/authorizenet/constants.html +0 -0
  57. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_modules/terminusgps/authorizenet/controllers.html +0 -0
  58. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_modules/terminusgps/authorizenet/errors.html +0 -0
  59. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_modules/terminusgps/authorizenet/profiles/addresses.html +0 -0
  60. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_modules/terminusgps/authorizenet/profiles/base.html +0 -0
  61. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_modules/terminusgps/authorizenet/profiles/customers.html +0 -0
  62. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_modules/terminusgps/authorizenet/profiles/payments.html +0 -0
  63. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_modules/terminusgps/authorizenet/profiles/subscriptions.html +0 -0
  64. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_modules/terminusgps/authorizenet/subscriptions/subscriptions.html +0 -0
  65. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_modules/terminusgps/authorizenet/utils.html +0 -0
  66. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_modules/terminusgps/aws/notifications.html +0 -0
  67. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_modules/terminusgps/aws/secrets.html +0 -0
  68. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_modules/terminusgps/aws/speech.html +0 -0
  69. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_modules/terminusgps/django/forms/fields.html +0 -0
  70. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_modules/terminusgps/django/forms/widgets.html +0 -0
  71. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_modules/terminusgps/django/forms.html +0 -0
  72. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_modules/terminusgps/django/mixins.html +0 -0
  73. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_modules/terminusgps/django/validators.html +0 -0
  74. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_modules/terminusgps/mixins.html +0 -0
  75. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_modules/terminusgps/twilio/caller.html +0 -0
  76. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_modules/terminusgps/wialon/constants.html +0 -0
  77. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_modules/terminusgps/wialon/flags.html +0 -0
  78. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_modules/terminusgps/wialon/items/base.html +0 -0
  79. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_modules/terminusgps/wialon/items/geofence.html +0 -0
  80. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_modules/terminusgps/wialon/items/notification.html +0 -0
  81. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_modules/terminusgps/wialon/items/resource.html +0 -0
  82. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_modules/terminusgps/wialon/items/retranslator.html +0 -0
  83. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_modules/terminusgps/wialon/items/route.html +0 -0
  84. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_modules/terminusgps/wialon/items/unit.html +0 -0
  85. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_modules/terminusgps/wialon/items/unit_group.html +0 -0
  86. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_modules/terminusgps/wialon/items/user.html +0 -0
  87. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_modules/terminusgps/wialon/session.html +0 -0
  88. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_modules/terminusgps/wialon/utils.html +0 -0
  89. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_modules/wialon/api.html +0 -0
  90. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_sources/authorizenet/auth.rst.txt +0 -0
  91. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_sources/authorizenet/constants.rst.txt +0 -0
  92. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_sources/authorizenet/controllers.rst.txt +0 -0
  93. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_sources/authorizenet/examples.rst.txt +0 -0
  94. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_sources/authorizenet/index.rst.txt +0 -0
  95. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_sources/authorizenet/profiles.rst.txt +0 -0
  96. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_sources/authorizenet/subscriptions.rst.txt +0 -0
  97. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_sources/authorizenet/utils.rst.txt +0 -0
  98. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_sources/aws/index.rst.txt +0 -0
  99. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_sources/aws/notifications.rst.txt +0 -0
  100. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_sources/aws/secrets.rst.txt +0 -0
  101. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_sources/aws/speech.rst.txt +0 -0
  102. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_sources/aws/utils.rst.txt +0 -0
  103. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_sources/django/forms.rst.txt +0 -0
  104. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_sources/django/index.rst.txt +0 -0
  105. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_sources/django/mixins.rst.txt +0 -0
  106. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_sources/django/settings.rst.txt +0 -0
  107. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_sources/django/validators.rst.txt +0 -0
  108. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_sources/index.rst.txt +0 -0
  109. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_sources/mixins.rst.txt +0 -0
  110. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_sources/settings.rst.txt +0 -0
  111. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_sources/twilio/caller.rst.txt +0 -0
  112. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_sources/twilio/examples.rst.txt +0 -0
  113. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_sources/twilio/index.rst.txt +0 -0
  114. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_sources/twilio/settings.rst.txt +0 -0
  115. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_sources/validators.rst.txt +0 -0
  116. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_sources/wialon/constants.rst.txt +0 -0
  117. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_sources/wialon/errors.rst.txt +0 -0
  118. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_sources/wialon/examples.rst.txt +0 -0
  119. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_sources/wialon/flags.rst.txt +0 -0
  120. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_sources/wialon/index.rst.txt +0 -0
  121. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_sources/wialon/items.rst.txt +0 -0
  122. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_sources/wialon/session.rst.txt +0 -0
  123. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_sources/wialon/settings.rst.txt +0 -0
  124. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_sources/wialon/utils.rst.txt +0 -0
  125. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_static/0fc70aa4dfe4d16d7073.woff +0 -0
  126. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_static/583e3f428bf2362b546d.woff +0 -0
  127. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_static/5be6ec379613f10aea3f.woff +0 -0
  128. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_static/76c1862325ea6f70eeff.woff2 +0 -0
  129. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_static/83710c128240451d95af.woff +0 -0
  130. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_static/_sphinx_javascript_frameworks_compat.js +0 -0
  131. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_static/a63d39a1c104a2b3e87e.woff2 +0 -0
  132. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_static/autoclasstoc.css +0 -0
  133. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_static/awesome-docsearch.css +0 -0
  134. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_static/awesome-docsearch.js +0 -0
  135. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_static/awesome-sphinx-design.css +0 -0
  136. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_static/awesome-sphinx-design.js +0 -0
  137. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_static/b659956119f91f2342bc.woff2 +0 -0
  138. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_static/basic.css +0 -0
  139. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_static/bb50084be2b43ba7b98c.woff2 +0 -0
  140. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_static/ce1e40901d7a0d88d483.woff2 +0 -0
  141. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_static/css/badge_only.css +0 -0
  142. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_static/css/fonts/Roboto-Slab-Bold.woff +0 -0
  143. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_static/css/fonts/Roboto-Slab-Bold.woff2 +0 -0
  144. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_static/css/fonts/Roboto-Slab-Regular.woff +0 -0
  145. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_static/css/fonts/Roboto-Slab-Regular.woff2 +0 -0
  146. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_static/css/fonts/fontawesome-webfont.eot +0 -0
  147. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_static/css/fonts/fontawesome-webfont.svg +0 -0
  148. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_static/css/fonts/fontawesome-webfont.ttf +0 -0
  149. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_static/css/fonts/fontawesome-webfont.woff +0 -0
  150. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_static/css/fonts/fontawesome-webfont.woff2 +0 -0
  151. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_static/css/fonts/lato-bold-italic.woff +0 -0
  152. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_static/css/fonts/lato-bold-italic.woff2 +0 -0
  153. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_static/css/fonts/lato-bold.woff +0 -0
  154. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_static/css/fonts/lato-bold.woff2 +0 -0
  155. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_static/css/fonts/lato-normal-italic.woff +0 -0
  156. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_static/css/fonts/lato-normal-italic.woff2 +0 -0
  157. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_static/css/fonts/lato-normal.woff +0 -0
  158. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_static/css/fonts/lato-normal.woff2 +0 -0
  159. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_static/css/theme.css +0 -0
  160. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_static/d04352f240062b100fba.woff2 +0 -0
  161. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_static/doctools.js +0 -0
  162. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_static/documentation_options.js +0 -0
  163. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_static/f1cdf5c21de970ee0592.woff +0 -0
  164. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_static/fd994e8d90d9cab651b0.woff +0 -0
  165. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_static/file.png +0 -0
  166. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_static/fonts/Lato/lato-bold.eot +0 -0
  167. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_static/fonts/Lato/lato-bold.ttf +0 -0
  168. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_static/fonts/Lato/lato-bold.woff +0 -0
  169. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_static/fonts/Lato/lato-bold.woff2 +0 -0
  170. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_static/fonts/Lato/lato-bolditalic.eot +0 -0
  171. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_static/fonts/Lato/lato-bolditalic.ttf +0 -0
  172. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_static/fonts/Lato/lato-bolditalic.woff +0 -0
  173. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_static/fonts/Lato/lato-bolditalic.woff2 +0 -0
  174. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_static/fonts/Lato/lato-italic.eot +0 -0
  175. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_static/fonts/Lato/lato-italic.ttf +0 -0
  176. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_static/fonts/Lato/lato-italic.woff +0 -0
  177. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_static/fonts/Lato/lato-italic.woff2 +0 -0
  178. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_static/fonts/Lato/lato-regular.eot +0 -0
  179. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_static/fonts/Lato/lato-regular.ttf +0 -0
  180. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_static/fonts/Lato/lato-regular.woff +0 -0
  181. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_static/fonts/Lato/lato-regular.woff2 +0 -0
  182. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot +0 -0
  183. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf +0 -0
  184. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff +0 -0
  185. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 +0 -0
  186. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot +0 -0
  187. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf +0 -0
  188. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff +0 -0
  189. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 +0 -0
  190. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_static/jquery.js +0 -0
  191. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_static/js/badge_only.js +0 -0
  192. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_static/js/theme.js +0 -0
  193. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_static/js/versions.js +0 -0
  194. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_static/language_data.js +0 -0
  195. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_static/minus.png +0 -0
  196. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_static/plus.png +0 -0
  197. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_static/pygments.css +0 -0
  198. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_static/searchtools.js +0 -0
  199. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_static/sphinx_highlight.js +0 -0
  200. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_static/theme.css +0 -0
  201. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_static/theme.js +0 -0
  202. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/_static/theme.js.LICENSE.txt +0 -0
  203. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/authorizenet/auth.html +0 -0
  204. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/authorizenet/constants.html +0 -0
  205. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/authorizenet/controllers.html +0 -0
  206. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/authorizenet/examples.html +0 -0
  207. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/authorizenet/index.html +0 -0
  208. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/authorizenet/profiles.html +0 -0
  209. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/authorizenet/subscriptions.html +0 -0
  210. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/authorizenet/utils.html +0 -0
  211. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/aws/index.html +0 -0
  212. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/aws/notifications.html +0 -0
  213. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/aws/secrets.html +0 -0
  214. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/aws/speech.html +0 -0
  215. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/aws/utils.html +0 -0
  216. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/django/forms.html +0 -0
  217. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/django/index.html +0 -0
  218. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/django/mixins.html +0 -0
  219. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/django/settings.html +0 -0
  220. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/django/validators.html +0 -0
  221. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/genindex.html +0 -0
  222. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/index.html +0 -0
  223. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/mixins.html +0 -0
  224. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/objects.inv +0 -0
  225. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/py-modindex.html +0 -0
  226. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/search.html +0 -0
  227. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/searchindex.js +0 -0
  228. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/settings.html +0 -0
  229. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/twilio/caller.html +0 -0
  230. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/twilio/examples.html +0 -0
  231. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/twilio/index.html +0 -0
  232. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/twilio/settings.html +0 -0
  233. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/validators.html +0 -0
  234. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/wialon/constants.html +0 -0
  235. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/wialon/errors.html +0 -0
  236. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/wialon/examples.html +0 -0
  237. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/wialon/flags.html +0 -0
  238. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/wialon/index.html +0 -0
  239. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/wialon/items.html +0 -0
  240. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/wialon/session.html +0 -0
  241. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/wialon/settings.html +0 -0
  242. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/html/wialon/utils.html +0 -0
  243. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/linkcheck/output.json +0 -0
  244. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/build/linkcheck/output.txt +0 -0
  245. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/make.bat +0 -0
  246. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/source/authorizenet/auth.rst +0 -0
  247. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/source/authorizenet/constants.rst +0 -0
  248. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/source/authorizenet/controllers.rst +0 -0
  249. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/source/authorizenet/examples.rst +0 -0
  250. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/source/authorizenet/index.rst +0 -0
  251. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/source/authorizenet/profiles.rst +0 -0
  252. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/source/authorizenet/utils.rst +0 -0
  253. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/source/aws/secrets.rst +0 -0
  254. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/source/aws/utils.rst +0 -0
  255. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/source/conf.py +0 -0
  256. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/source/django/forms.rst +0 -0
  257. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/source/django/index.rst +0 -0
  258. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/source/django/mixins.rst +0 -0
  259. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/source/django/settings.rst +0 -0
  260. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/source/django/validators.rst +0 -0
  261. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/source/index.rst +0 -0
  262. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/source/twilio/caller.rst +0 -0
  263. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/source/twilio/examples.rst +0 -0
  264. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/source/twilio/index.rst +0 -0
  265. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/source/wialon/constants.rst +0 -0
  266. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/source/wialon/errors.rst +0 -0
  267. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/source/wialon/examples.rst +0 -0
  268. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/source/wialon/flags.rst +0 -0
  269. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/source/wialon/index.rst +0 -0
  270. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/source/wialon/items.rst +0 -0
  271. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/source/wialon/session.rst +0 -0
  272. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/docs/source/wialon/utils.rst +0 -0
  273. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/terminusgps/__init__.py +0 -0
  274. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/terminusgps/authorizenet/__init__.py +0 -0
  275. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/terminusgps/authorizenet/auth.py +0 -0
  276. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/terminusgps/authorizenet/constants.py +0 -0
  277. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/terminusgps/authorizenet/controllers.py +0 -0
  278. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/terminusgps/authorizenet/profiles/__init__.py +0 -0
  279. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/terminusgps/authorizenet/profiles/addresses.py +0 -0
  280. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/terminusgps/authorizenet/profiles/base.py +0 -0
  281. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/terminusgps/authorizenet/profiles/customers.py +0 -0
  282. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/terminusgps/authorizenet/profiles/payments.py +0 -0
  283. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/terminusgps/authorizenet/profiles/subscriptions.py +0 -0
  284. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/terminusgps/authorizenet/tests/__init__.py +0 -0
  285. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/terminusgps/authorizenet/tests/test_auth.py +0 -0
  286. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/terminusgps/authorizenet/tests/test_profiles.py +0 -0
  287. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/terminusgps/authorizenet/tests/test_utils.py +0 -0
  288. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/terminusgps/authorizenet/utils.py +0 -0
  289. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/terminusgps/aws/__init__.py +0 -0
  290. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/terminusgps/aws/secrets.py +0 -0
  291. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/terminusgps/aws/tests/__init__.py +0 -0
  292. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/terminusgps/aws/tests/test_notifications.py +0 -0
  293. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/terminusgps/aws/tests/test_secrets.py +0 -0
  294. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/terminusgps/aws/tests/test_utils.py +0 -0
  295. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/terminusgps/aws/utils.py +0 -0
  296. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/terminusgps/django/__init__.py +0 -0
  297. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/terminusgps/django/forms/__init__.py +0 -0
  298. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/terminusgps/django/forms/fields.py +0 -0
  299. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/terminusgps/django/forms/forms.py +0 -0
  300. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/terminusgps/django/forms/widgets.py +0 -0
  301. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/terminusgps/django/mixins.py +0 -0
  302. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/terminusgps/django/settings.py +0 -0
  303. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/terminusgps/django/tests/test_forms.py +0 -0
  304. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/terminusgps/django/tests/test_mixins.py +0 -0
  305. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/terminusgps/django/tests/test_utils.py +0 -0
  306. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/terminusgps/django/utils.py +0 -0
  307. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/terminusgps/django/validators.py +0 -0
  308. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/terminusgps/twilio/__init__.py +0 -0
  309. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/terminusgps/twilio/caller.py +0 -0
  310. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/terminusgps/wialon/__init__.py +0 -0
  311. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/terminusgps/wialon/constants.py +0 -0
  312. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/terminusgps/wialon/flags.py +0 -0
  313. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/terminusgps/wialon/items/__init__.py +0 -0
  314. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/terminusgps/wialon/items/base.py +0 -0
  315. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/terminusgps/wialon/items/resource.py +0 -0
  316. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/terminusgps/wialon/items/retranslator.py +0 -0
  317. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/terminusgps/wialon/items/route.py +0 -0
  318. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/terminusgps/wialon/items/unit.py +0 -0
  319. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/terminusgps/wialon/items/unit_group.py +0 -0
  320. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/terminusgps/wialon/items/user.py +0 -0
  321. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/terminusgps/wialon/session.py +0 -0
  322. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/terminusgps/wialon/tests/__init__.py +0 -0
  323. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/terminusgps/wialon/tests/test_items.py +0 -0
  324. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/terminusgps/wialon/tests/test_session.py +0 -0
  325. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/terminusgps/wialon/tests/test_utils.py +0 -0
  326. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/terminusgps/wialon/utils.py +0 -0
  327. {python_terminusgps-35.0.0 → python_terminusgps-35.1.0}/terminusgps/wialon/validators.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-terminusgps
3
- Version: 35.0.0
3
+ Version: 35.1.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
@@ -9,5 +9,4 @@ AWS API
9
9
 
10
10
  notifications.rst
11
11
  secrets.rst
12
- speech.rst
13
12
  utils.rst
@@ -0,0 +1,7 @@
1
+ Notifications
2
+ =============
3
+
4
+ .. autoclass:: terminusgps.aws.notifications.AsyncNotificationManager
5
+ :members:
6
+ :exclude-members: __weakref__
7
+ :autoclasstoc:
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "python-terminusgps"
3
- version = "35.0.0"
3
+ version = "35.1.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" } ]
@@ -0,0 +1,197 @@
1
+ import os
2
+ from contextlib import AsyncExitStack
3
+
4
+ from aiobotocore.session import AioSession
5
+
6
+
7
+ class AsyncNotificationManager:
8
+ """Asyncronously delivers notifications using `AWS End User Messaging <https://docs.aws.amazon.com/end-user-messaging/>`_."""
9
+
10
+ def __init__(
11
+ self,
12
+ origin_pool_arn: str | None = os.getenv("AWS_MESSAGING_ORIGIN_POOL"),
13
+ configuration_set: str | None = os.getenv("AWS_MESSAGING_CONFIGURATION"),
14
+ max_sms_price: str = "0.20",
15
+ max_voice_price: str = "0.20",
16
+ region_name: str = "us-east-1",
17
+ debug_enabled: bool = False,
18
+ ) -> None:
19
+ """
20
+ Sets attributes on the notification manager.
21
+
22
+ :param origin_pool_arn: A phone pool ARN for notification dispatch. Default is :envvar:`AWS_MESSAGING_ORIGIN_POOL`.
23
+ :type origin_pool_arn: :py:obj:`str` | :py:obj:`None`
24
+ :param configuration_set: An end-user messaging configuration set ARN. Default is :envvar:`AWS_MESSAGING_CONFIGURATION`.
25
+ :type configuration_set: :py:obj:`str` | :py:obj:`None`
26
+ :param max_sms_price: Max price to spend on a single SMS message.
27
+ :type max_sms_price: :py:obj:`str`
28
+ :param max_voice_price: Max price to spend per minute on a single voice message.
29
+ :type max_voice_price: :py:obj:`str`
30
+ :param region_name: An AWS region name used to open an AWS client.
31
+ :type region_name: :py:obj:`str`
32
+ :param debug_enabled: Whether or not to enable debug mode.
33
+ :type debug_enabled: :py:obj:`None`
34
+ :raises ValueError: If ``origin_pool_arn`` wasn't provided and :envvar:`AWS_MESSAGING_ORIGIN_POOL` wasn't set.
35
+ :raises ValueError: If ``configuration_set`` wasn't provided and :envvar:`AWS_MESSAGING_CONFIGURATION` wasn't set.
36
+ :returns: Nothing.
37
+ :rtype: :py:obj:`None`
38
+
39
+ """
40
+ if origin_pool_arn is None:
41
+ raise ValueError(f"'origin_pool_arn' is required, got '{origin_pool_arn}'.")
42
+ if configuration_set is None:
43
+ raise ValueError(
44
+ f"'configuration_set' is required, got '{configuration_set}'."
45
+ )
46
+
47
+ self._exit_stack = AsyncExitStack()
48
+ self._pinpoint_client = None
49
+ self._region_name = region_name
50
+ self._origin_pool_arn = origin_pool_arn
51
+ self._configuration_set = configuration_set
52
+ self._max_sms_price = max_sms_price
53
+ self._max_voice_price = max_voice_price
54
+ self._debug = debug_enabled
55
+
56
+ async def __aenter__(self) -> "AsyncNotificationManager":
57
+ """
58
+ Creates asyncronous clients.
59
+
60
+ :returns: The notification manager.
61
+ :rtype: :py:obj:`~terminusgps.aws.notifications.AsyncNotificationManager`
62
+
63
+ """
64
+ session = AioSession()
65
+ self._pinpoint_client = await self._exit_stack.enter_async_context(
66
+ session.create_client("pinpoint-sms-voice-v2", region_name=self.region_name)
67
+ )
68
+ return self
69
+
70
+ async def __aexit__(self, exc_type, exc_val, exc_tb) -> None:
71
+ """
72
+ Destroys asyncronous clients.
73
+
74
+ :param exc_type: Exception type.
75
+ :param exc_val: Exception value.
76
+ :param exc_tb: Exception traceback.
77
+ :returns: Nothing.
78
+ :rtype: :py:obj:`None`
79
+
80
+ """
81
+ await self._exit_stack.__aexit__(exc_type, exc_val, exc_tb)
82
+
83
+ @property
84
+ def region_name(self) -> str:
85
+ """
86
+ An AWS region name.
87
+
88
+ :type: :py:obj:`str`
89
+
90
+ """
91
+ return self._region_name
92
+
93
+ @property
94
+ def configuration_set(self) -> str:
95
+ return self._configuration_set
96
+
97
+ @property
98
+ def origin_pool(self) -> str:
99
+ return self._origin_pool_arn
100
+
101
+ @property
102
+ def max_sms_price(self) -> str:
103
+ return self._max_sms_price
104
+
105
+ @property
106
+ def max_voice_price(self) -> str:
107
+ return self._max_voice_price
108
+
109
+ @property
110
+ def debug(self) -> bool:
111
+ return self._debug
112
+
113
+ async def send_sms(
114
+ self,
115
+ phone: str,
116
+ message: str,
117
+ ttl: int = 300,
118
+ dry_run: bool = False,
119
+ feedback: bool = False,
120
+ ) -> dict:
121
+ """
122
+ Texts ``message`` to ``phone`` via sms.
123
+
124
+ :param phone: A destination phone number.
125
+ :type phone: :py:obj:`str`
126
+ :param message: A message body.
127
+ :type message: :py:obj:`str`
128
+ :param ttl: Time to live in ms. Default is ``300``.
129
+ :type ttl: :py:obj:`int`
130
+ :param dry_run: Whether or not to execute the voice message as a dry run. Default is :py:obj:`False`.
131
+ :type dry_run: :py:obj:`bool`
132
+ :param feedback: Whether or not to include message feedback in the response. Default is :py:obj:`False`.
133
+ :type feedback: :py:obj:`bool`
134
+ :raises AssertionError: If :py:attr:`_pinpoint_client` wasn't set.
135
+ :returns: A voice message response.
136
+ :rtype: :py:obj:`dict`
137
+
138
+ """
139
+ assert self._pinpoint_client, "Asyncronous client wasn't set."
140
+ return await self._pinpoint_client.send_text_message(
141
+ **{
142
+ "DestinationPhoneNumber": phone,
143
+ "OriginationIdentity": self.origin_pool,
144
+ "MessageBody": message,
145
+ "MessageType": "TRANSACTIONAL",
146
+ "ConfigurationSetName": self.configuration_set,
147
+ "MaxPrice": self.max_sms_price,
148
+ "TimeToLive": ttl,
149
+ "DryRun": dry_run or self.debug,
150
+ "MessageFeedbackEnabled": feedback,
151
+ }
152
+ )
153
+
154
+ async def send_voice(
155
+ self,
156
+ phone: str,
157
+ message: str,
158
+ ttl: int = 300,
159
+ voice_id: str = "Joanna",
160
+ dry_run: bool = False,
161
+ feedback: bool = False,
162
+ ) -> dict:
163
+ """
164
+ Calls ``phone`` and reads ``message`` aloud.
165
+
166
+ :param phone: A destination phone number.
167
+ :type phone: :py:obj:`str`
168
+ :param message: A message body.
169
+ :type message: :py:obj:`str`
170
+ :param ttl: Time to live in ms. Default is ``300``.
171
+ :type ttl: :py:obj:`int`
172
+ :param voice_id: A voice id to use for speech synthesis.
173
+ :type voice_id: :py:obj:`str`
174
+ :param dry_run: Whether or not to execute the voice message as a dry run. Default is :py:obj:`False`.
175
+ :type dry_run: :py:obj:`bool`
176
+ :param feedback: Whether or not to include message feedback in the response. Default is :py:obj:`False`.
177
+ :type feedback: :py:obj:`bool`
178
+ :raises AssertionError: If :py:attr:`_pinpoint_client` wasn't set.
179
+ :returns: A voice message response.
180
+ :rtype: :py:obj:`dict`
181
+
182
+ """
183
+ assert self._pinpoint_client, "Asyncronous client wasn't set."
184
+ return await self._pinpoint_client.send_voice_message(
185
+ **{
186
+ "DestinationPhoneNumber": phone,
187
+ "OriginationIdentity": self.origin_pool,
188
+ "MessageBody": message,
189
+ "MessageBodyTextType": "TEXT",
190
+ "VoiceId": voice_id.upper(),
191
+ "ConfigurationSetName": self.configuration_set,
192
+ "MaxPricePerMinute": self.max_voice_price,
193
+ "TimeToLive": ttl,
194
+ "DryRun": dry_run or self.debug,
195
+ "MessageFeedbackEnabled": feedback,
196
+ }
197
+ )
@@ -223,14 +223,14 @@ wheels = [
223
223
 
224
224
  [[package]]
225
225
  name = "botocore-stubs"
226
- version = "1.38.5"
226
+ version = "1.38.6"
227
227
  source = { registry = "https://pypi.org/simple" }
228
228
  dependencies = [
229
229
  { name = "types-awscrt" },
230
230
  ]
231
- sdist = { url = "https://files.pythonhosted.org/packages/b3/40/00e33666d4644b9aba4a8948ec3d21da5d8efdb2dcacef4844ba670c52c6/botocore_stubs-1.38.5.tar.gz", hash = "sha256:560e193e39f2b153b0d64bc420a7e02f8a188f3f1c667b79a94bbf2ab56addc7", size = 42311 }
231
+ sdist = { url = "https://files.pythonhosted.org/packages/72/a2/02b37b9a239598c6f5b9981408bf49b87e25e9c2f70ea3dbff898c86f4fd/botocore_stubs-1.38.6.tar.gz", hash = "sha256:56ed87b3e0870d21a968a8346129b578e1f6b70ee902d00bbb6b162c291222f4", size = 42276 }
232
232
  wheels = [
233
- { url = "https://files.pythonhosted.org/packages/78/6d/5490e8058b8c354d3e7ae82336d85ab1719dcf4ca3c8e9a8df1560b872ff/botocore_stubs-1.38.5-py3-none-any.whl", hash = "sha256:e5c3f6a7d1377b5f183848eab985bea71926df43b00e02ca36fb8a22e827af48", size = 65590 },
233
+ { url = "https://files.pythonhosted.org/packages/75/40/858b0fddb11c7c387cea3d2a68eeb3212700deccc91aa68dec671f069a49/botocore_stubs-1.38.6-py3-none-any.whl", hash = "sha256:9a17a5cc2d36120f3683ebe78c40a96281497592e07175a8bf6ee6cd01910a50", size = 65590 },
234
234
  ]
235
235
 
236
236
  [[package]]
@@ -964,7 +964,7 @@ wheels = [
964
964
 
965
965
  [[package]]
966
966
  name = "python-terminusgps"
967
- version = "35.0.0"
967
+ version = "35.1.0"
968
968
  source = { editable = "." }
969
969
  dependencies = [
970
970
  { name = "aiobotocore" },
@@ -1,50 +0,0 @@
1
- Notifications
2
- =============
3
-
4
- .. autoclass:: terminusgps.aws.notifications.AsyncNotificationManager
5
- :members:
6
- :exclude-members: __weakref__
7
- :autoclasstoc:
8
-
9
- =====
10
- Usage
11
- =====
12
-
13
- Phone numbers must be in `E.164`_ format to be passed to a :py:obj:`~terminusgps.aws.notifications.AsyncNotificationManager` method, i.e. ``"+17135555555"``.
14
-
15
- You can use :py:func:`~terminusgps.django.validators.validate_e164_phone_number` to confirm a ``to_number`` is correctly formatted.
16
-
17
- .. _E.164: https://en.wikipedia.org/wiki/E.164
18
-
19
- .. code:: python
20
-
21
- import asyncio
22
- import uuid
23
-
24
- from terminusgps.aws.notifications import AsyncNotificationManager
25
-
26
- async def main() -> None:
27
- # Manager requires a group_id
28
- group_id: str = str(uuid.uuid4())
29
- message: str = "We know where ours are... do you?"
30
- async with AsyncNotificationManager(group_id) as manager:
31
-
32
- # Send an sms to one phone number
33
- # Phone numbers must be in E.164 format
34
- to_number: str = "+17135555555"
35
- await manager.send_sms(
36
- to_number=to_number, message=message, message_id=message_id
37
- )
38
-
39
- # Send an sms to multiple phone numbers
40
- to_numbers: list[str] = ["+17135555555", "+12815555555", "+18325555555"]
41
- await manager.send_sms_batch(to_numbers=to_numbers, message=message)
42
-
43
- # Send a push notification to an AWS resource
44
- target_arn: str = "arn:aws:sns:us-east-1:555555555555:MyAWSResource"
45
- await manager.send_push(
46
- target_arn=target_arn, message=message, message_id=message_id
47
- )
48
-
49
- if __name__ == "__main__":
50
- asyncio.run(main())
@@ -1,25 +0,0 @@
1
- Speech
2
- ======
3
-
4
- .. autoclass:: terminusgps.aws.speech.AsyncSpeechSynthesisManager
5
- :members:
6
- :exclude-members: __weakref__
7
- :autoclasstoc:
8
-
9
- =====
10
- Usage
11
- =====
12
-
13
- .. code:: python
14
-
15
- import asyncio
16
-
17
- from terminusgps.aws.speech import AsyncSpeechSynthesisManager
18
-
19
- async def main() -> None:
20
- async with AsyncSpeechSynthesisManager("my-bucket-name") as manager:
21
- message: str = "This message should be read aloud and saved as a file in an S3 bucket."
22
- await manager.synthesize_speech(message)
23
-
24
- if __name__ == "__main__":
25
- asyncio.run(main())
@@ -1,311 +0,0 @@
1
- import asyncio
2
- import os
3
- import uuid
4
- from collections.abc import Sequence
5
- from contextlib import AsyncExitStack
6
-
7
- from aiobotocore.session import AioSession
8
-
9
- from terminusgps.django.validators import validate_e164_phone_number
10
-
11
-
12
- class AsyncPollyManager:
13
- def __init__(
14
- self, bucket_name: str | None = None, region_name: str = "us-east-1"
15
- ) -> None:
16
- self._exit_stack = AsyncExitStack()
17
- self._polly_client = None
18
- self._region_name = region_name
19
- self._bucket_name = bucket_name or os.getenv("AWS_POLLY_BUCKET_NAME", "")
20
-
21
- @property
22
- def region_name(self) -> str:
23
- """
24
- An AWS region name.
25
-
26
- :type: :py:obj:`str`
27
-
28
- """
29
- return self._region_name
30
-
31
- @property
32
- def bucket_name(self) -> str:
33
- """
34
- The AWS bucket that will host audio files.
35
-
36
- :type: :py:obj:`str`
37
-
38
- """
39
- return self._bucket_name
40
-
41
- async def __aenter__(self) -> "AsyncPollyManager":
42
- """
43
- Creates an asyncronous session and client.
44
-
45
- :returns: The polly manager.
46
- :rtype: :py:obj:`~terminusgps.aws.notifications.AsyncPollyManager`
47
-
48
- """
49
- session = AioSession()
50
- self._polly_client = await self._exit_stack.enter_async_context(
51
- session.create_client("polly", region_name=self.region_name)
52
- )
53
- return self
54
-
55
- async def __aexit__(self, exc_type, exc_val, exc_tb) -> None:
56
- """
57
- Destroys the asyncronous session.
58
-
59
- :param exc_type: Exception type.
60
- :param exc_val: Exception value.
61
- :param exc_tb: Exception traceback.
62
- :returns: Nothing.
63
- :rtype: :py:obj:`None`
64
-
65
- """
66
- await self._exit_stack.__aexit__(exc_type, exc_val, exc_tb)
67
-
68
- async def synthesize_speech(
69
- self,
70
- message: str,
71
- format: str = "ogg_vorbis",
72
- sample_rate: int = 22050,
73
- language_code: str = "en-US",
74
- ) -> None:
75
- """
76
- Synthesizes the message into an audio file and saves it to the S3 bucket.
77
-
78
- :param message: A message to be read aloud.
79
- :type message: :py:obj:`str`
80
- :param format: A file format. Default is ``"ogg_vorbis"``.
81
- :type format: :py:obj:`str`
82
- :param sample_rate: The audio frequency in Hz. Default is ``22050``.
83
- :type sample_rate: :py:obj:`int`
84
- :param language_code: The language to use in the synthesis. Default is ``"en-US"``.
85
- :type language_code: :py:obj:`str`
86
- :returns: Nothing.
87
- :rtype: :py:obj:`None`
88
-
89
- """
90
- await self._polly_client.start_speech_synthesis_task(
91
- **{
92
- "Engine": "standard",
93
- "LanguageCode": language_code,
94
- "OutputFormat": format,
95
- "OutputS3BucketName": self.bucket_name,
96
- "SampleRate": str(sample_rate),
97
- "Text": f"<speak>{message}</speak>",
98
- "TextType": "ssml",
99
- "VoiceId": "Joanna",
100
- }
101
- )
102
-
103
- async def synthesize_speech_batch(
104
- self,
105
- messages: Sequence[str],
106
- format: str = "ogg_vorbis",
107
- sample_rate: int = 22050,
108
- language_code: str = "en-US",
109
- ) -> None:
110
- """
111
- Synthesizes a sequence of messages into audio files and saves them to the S3 bucket.
112
-
113
- :param messages: A sequence of messages to be read aloud.
114
- :type messages: :py:obj:`Sequence`
115
- :param format: A file format. Default is ``"ogg_vorbis"``.
116
- :type format: :py:obj:`str`
117
- :param sample_rate: The audio frequency in Hz. Default is ``22050``.
118
- :type sample_rate: :py:obj:`int`
119
- :param language_code: The language to use in the synthesis. Default is ``"en-US"``.
120
- :type language_code: :py:obj:`str`
121
- :returns: Nothing.
122
- :rtype: :py:obj:`None`
123
-
124
- """
125
- await asyncio.gather(
126
- *[
127
- self.synthesize_speech(
128
- message=message,
129
- format=format,
130
- sample_rate=sample_rate,
131
- language_code=language_code,
132
- )
133
- for message in messages
134
- ]
135
- )
136
-
137
-
138
- class AsyncNotificationManager:
139
- def __init__(
140
- self, group_id: str | None = None, region_name: str = "us-east-1"
141
- ) -> None:
142
- """
143
- Sets :py:attr:`group_id` and :py:attr:`region_name`.
144
-
145
- :returns: Nothing.
146
- :rtype: :py:obj:`None`
147
-
148
- """
149
- self._exit_stack = AsyncExitStack()
150
- self._sns_client = None
151
- self._region_name = region_name
152
- self.group_id = group_id
153
-
154
- async def __aenter__(self) -> "AsyncNotificationManager":
155
- """
156
- Creates an asyncronous session and client.
157
-
158
- :returns: The notification manager.
159
- :rtype: :py:obj:`~terminusgps.aws.notifications.AsyncNotificationManager`
160
-
161
- """
162
- session = AioSession()
163
- self._sns_client = await self._exit_stack.enter_async_context(
164
- session.create_client("sns", region_name=self.region_name)
165
- )
166
- return self
167
-
168
- async def __aexit__(self, exc_type, exc_val, exc_tb) -> None:
169
- """
170
- Destroys the asyncronous session.
171
-
172
- :param exc_type: Exception type.
173
- :param exc_val: Exception value.
174
- :param exc_tb: Exception traceback.
175
- :returns: Nothing.
176
- :rtype: :py:obj:`None`
177
-
178
- """
179
- await self._exit_stack.__aexit__(exc_type, exc_val, exc_tb)
180
-
181
- @property
182
- def region_name(self) -> str:
183
- """
184
- An AWS region name.
185
-
186
- :type: :py:obj:`str`
187
-
188
- """
189
- return self._region_name
190
-
191
- @property
192
- def group_id(self) -> str:
193
- """
194
- A message group id.
195
-
196
- :type: :py:obj:`str`
197
-
198
- """
199
- return str(self._group_id)
200
-
201
- @group_id.setter
202
- def group_id(self, other: str | None) -> None:
203
- """
204
- Sets :py:attr:`group_id` to ``other``.
205
-
206
- If ``other`` isn't provided, instead set :py:attr:`group_id` to :py:func:`~uuid.uuid4`.
207
-
208
- :param other: A message group id.
209
- :type other: :py:obj:`str` | :py:obj:`None`
210
- :returns: Nothing.
211
- :rtype: :py:obj:`None`
212
-
213
- """
214
- if not other:
215
- other = str(uuid.uuid4())
216
- self._group_id = other
217
-
218
- async def send_sms(
219
- self, to_number: str, message: str, message_id: str | None = None
220
- ) -> None:
221
- """
222
- Sends an sms to ``to_number``.
223
-
224
- :param to_number: A destination phone number.
225
- :type to_number: :py:obj:`str`
226
- :param message: A message body.
227
- :type message: :py:obj:`str`
228
- :param message_id: A message deduplication id. :py:func:`~uuid.uuid4` is used if ``message_id`` was not provided.
229
- :type message_id: :py:obj:`str` | :py:obj:`None`
230
- :raises ValidationError: If ``to_number`` wasn't a valid E.164 formatted phone number.
231
- :returns: Nothing.
232
- :rtype: :py:obj:`None`
233
-
234
- """
235
- validate_e164_phone_number(to_number)
236
-
237
- if not message_id:
238
- message_id = str(uuid.uuid4())
239
-
240
- await self._sns_client.publish(
241
- **{
242
- "PhoneNumber": to_number,
243
- "Message": message,
244
- "MessageDeduplicationId": message_id,
245
- "MessageGroupId": self.group_id,
246
- }
247
- )
248
-
249
- async def send_push(
250
- self, target_arn: str, message: str, message_id: str | None = None
251
- ) -> None:
252
- """
253
- Sends a push notification to ``target_arn``.
254
-
255
- :param target_arn: An AWS resource ARN.
256
- :type target_arn: :py:obj:`str`
257
- :param message: A message body.
258
- :type message: :py:obj:`str`
259
- :param message_id: A message deduplication id. :py:func:`~uuid.uuid4` is used if ``message_id`` was not provided.
260
- :type message_id: :py:obj:`str` | :py:obj:`None`
261
- :returns: Nothing.
262
- :rtype: :py:obj:`None`
263
-
264
- """
265
- if not message_id:
266
- message_id = str(uuid.uuid4())
267
-
268
- await self._sns_client.publish(
269
- **{
270
- "TargetArn": target_arn,
271
- "Message": message,
272
- "MessageDeduplicationId": message_id,
273
- "MessageGroupId": self.group_id,
274
- }
275
- )
276
-
277
- async def send_sms_batch(self, to_numbers: Sequence[str], message: str) -> None:
278
- """
279
- Sends an sms message to each phone number in ``to_numbers``.
280
-
281
- :param to_numbers: A sequence of phone numbers.
282
- :type to_numbers: :py:obj:`~collections.abc.Sequence`
283
- :param message: A message body.
284
- :type message: :py:obj:`str`
285
- :raises ValidationError: If a ``to_number`` wasn't a valid E.164 formatted phone number.
286
- :returns: Nothing.
287
- :rtype: :py:obj:`None`
288
-
289
- """
290
- for to_number in to_numbers:
291
- validate_e164_phone_number(to_number)
292
-
293
- await asyncio.gather(
294
- *[self.send_sms(to_number=num, message=message) for num in to_numbers]
295
- )
296
-
297
- async def send_push_batch(self, target_arns: Sequence[str], message: str) -> None:
298
- """
299
- Sends a push notification to each AWS resource by ARN in ``target_arns``.
300
-
301
- :param target_arns: A sequence of AWS resource ARNs.
302
- :type target_arns: :py:obj:`~collections.abc.Sequence`
303
- :param message: A message body.
304
- :type message: :py:obj:`str`
305
- :returns: Nothing.
306
- :rtype: :py:obj:`None`
307
-
308
- """
309
- await asyncio.gather(
310
- *[self.send_push(target_arn=arn, message=message) for arn in target_arns]
311
- )