prelude-python-sdk 0.8.0__tar.gz → 0.9.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 (101) hide show
  1. prelude_python_sdk-0.9.0/.release-please-manifest.json +3 -0
  2. {prelude_python_sdk-0.8.0 → prelude_python_sdk-0.9.0}/CHANGELOG.md +31 -0
  3. {prelude_python_sdk-0.8.0 → prelude_python_sdk-0.9.0}/PKG-INFO +5 -6
  4. {prelude_python_sdk-0.8.0 → prelude_python_sdk-0.9.0}/README.md +2 -2
  5. {prelude_python_sdk-0.8.0 → prelude_python_sdk-0.9.0}/api.md +22 -0
  6. {prelude_python_sdk-0.8.0 → prelude_python_sdk-0.9.0}/pyproject.toml +8 -5
  7. {prelude_python_sdk-0.8.0 → prelude_python_sdk-0.9.0}/requirements-dev.lock +1 -1
  8. {prelude_python_sdk-0.8.0 → prelude_python_sdk-0.9.0}/requirements.lock +1 -1
  9. {prelude_python_sdk-0.8.0 → prelude_python_sdk-0.9.0}/src/prelude_python_sdk/_client.py +17 -1
  10. {prelude_python_sdk-0.8.0 → prelude_python_sdk-0.9.0}/src/prelude_python_sdk/_models.py +37 -15
  11. {prelude_python_sdk-0.8.0 → prelude_python_sdk-0.9.0}/src/prelude_python_sdk/_streaming.py +4 -6
  12. {prelude_python_sdk-0.8.0 → prelude_python_sdk-0.9.0}/src/prelude_python_sdk/_utils/_sync.py +3 -31
  13. {prelude_python_sdk-0.8.0 → prelude_python_sdk-0.9.0}/src/prelude_python_sdk/_utils/_utils.py +1 -1
  14. {prelude_python_sdk-0.8.0 → prelude_python_sdk-0.9.0}/src/prelude_python_sdk/_version.py +1 -1
  15. {prelude_python_sdk-0.8.0 → prelude_python_sdk-0.9.0}/src/prelude_python_sdk/resources/__init__.py +14 -0
  16. {prelude_python_sdk-0.8.0 → prelude_python_sdk-0.9.0}/src/prelude_python_sdk/resources/transactional.py +52 -12
  17. prelude_python_sdk-0.9.0/src/prelude_python_sdk/resources/verification_management.py +535 -0
  18. {prelude_python_sdk-0.8.0 → prelude_python_sdk-0.9.0}/src/prelude_python_sdk/types/__init__.py +24 -0
  19. {prelude_python_sdk-0.8.0 → prelude_python_sdk-0.9.0}/src/prelude_python_sdk/types/transactional_send_params.py +14 -1
  20. {prelude_python_sdk-0.8.0 → prelude_python_sdk-0.9.0}/src/prelude_python_sdk/types/verification_create_params.py +9 -3
  21. prelude_python_sdk-0.9.0/src/prelude_python_sdk/types/verification_management_delete_phone_number_params.py +12 -0
  22. prelude_python_sdk-0.9.0/src/prelude_python_sdk/types/verification_management_delete_phone_number_response.py +10 -0
  23. prelude_python_sdk-0.9.0/src/prelude_python_sdk/types/verification_management_list_phone_numbers_response.py +21 -0
  24. prelude_python_sdk-0.9.0/src/prelude_python_sdk/types/verification_management_list_sender_ids_response.py +25 -0
  25. prelude_python_sdk-0.9.0/src/prelude_python_sdk/types/verification_management_set_phone_number_params.py +12 -0
  26. prelude_python_sdk-0.9.0/src/prelude_python_sdk/types/verification_management_set_phone_number_response.py +10 -0
  27. prelude_python_sdk-0.9.0/src/prelude_python_sdk/types/verification_management_submit_sender_id_params.py +12 -0
  28. prelude_python_sdk-0.9.0/src/prelude_python_sdk/types/verification_management_submit_sender_id_response.py +24 -0
  29. prelude_python_sdk-0.9.0/tests/api_resources/test_transactional.py +144 -0
  30. prelude_python_sdk-0.9.0/tests/api_resources/test_verification_management.py +356 -0
  31. {prelude_python_sdk-0.8.0 → prelude_python_sdk-0.9.0}/tests/test_client.py +198 -164
  32. {prelude_python_sdk-0.8.0 → prelude_python_sdk-0.9.0}/tests/test_models.py +4 -4
  33. prelude_python_sdk-0.8.0/.release-please-manifest.json +0 -3
  34. prelude_python_sdk-0.8.0/tests/api_resources/test_transactional.py +0 -128
  35. {prelude_python_sdk-0.8.0 → prelude_python_sdk-0.9.0}/.gitignore +0 -0
  36. {prelude_python_sdk-0.8.0 → prelude_python_sdk-0.9.0}/CONTRIBUTING.md +0 -0
  37. {prelude_python_sdk-0.8.0 → prelude_python_sdk-0.9.0}/LICENSE +0 -0
  38. {prelude_python_sdk-0.8.0 → prelude_python_sdk-0.9.0}/SECURITY.md +0 -0
  39. {prelude_python_sdk-0.8.0 → prelude_python_sdk-0.9.0}/bin/check-release-environment +0 -0
  40. {prelude_python_sdk-0.8.0 → prelude_python_sdk-0.9.0}/bin/publish-pypi +0 -0
  41. {prelude_python_sdk-0.8.0 → prelude_python_sdk-0.9.0}/examples/.keep +0 -0
  42. {prelude_python_sdk-0.8.0 → prelude_python_sdk-0.9.0}/noxfile.py +0 -0
  43. {prelude_python_sdk-0.8.0 → prelude_python_sdk-0.9.0}/release-please-config.json +0 -0
  44. {prelude_python_sdk-0.8.0 → prelude_python_sdk-0.9.0}/src/prelude/lib/.keep +0 -0
  45. {prelude_python_sdk-0.8.0 → prelude_python_sdk-0.9.0}/src/prelude_python_sdk/__init__.py +0 -0
  46. {prelude_python_sdk-0.8.0 → prelude_python_sdk-0.9.0}/src/prelude_python_sdk/_base_client.py +0 -0
  47. {prelude_python_sdk-0.8.0 → prelude_python_sdk-0.9.0}/src/prelude_python_sdk/_compat.py +0 -0
  48. {prelude_python_sdk-0.8.0 → prelude_python_sdk-0.9.0}/src/prelude_python_sdk/_constants.py +0 -0
  49. {prelude_python_sdk-0.8.0 → prelude_python_sdk-0.9.0}/src/prelude_python_sdk/_exceptions.py +0 -0
  50. {prelude_python_sdk-0.8.0 → prelude_python_sdk-0.9.0}/src/prelude_python_sdk/_files.py +0 -0
  51. {prelude_python_sdk-0.8.0 → prelude_python_sdk-0.9.0}/src/prelude_python_sdk/_qs.py +0 -0
  52. {prelude_python_sdk-0.8.0 → prelude_python_sdk-0.9.0}/src/prelude_python_sdk/_resource.py +0 -0
  53. {prelude_python_sdk-0.8.0 → prelude_python_sdk-0.9.0}/src/prelude_python_sdk/_response.py +0 -0
  54. {prelude_python_sdk-0.8.0 → prelude_python_sdk-0.9.0}/src/prelude_python_sdk/_types.py +0 -0
  55. {prelude_python_sdk-0.8.0 → prelude_python_sdk-0.9.0}/src/prelude_python_sdk/_utils/__init__.py +0 -0
  56. {prelude_python_sdk-0.8.0 → prelude_python_sdk-0.9.0}/src/prelude_python_sdk/_utils/_compat.py +0 -0
  57. {prelude_python_sdk-0.8.0 → prelude_python_sdk-0.9.0}/src/prelude_python_sdk/_utils/_datetime_parse.py +0 -0
  58. {prelude_python_sdk-0.8.0 → prelude_python_sdk-0.9.0}/src/prelude_python_sdk/_utils/_logs.py +0 -0
  59. {prelude_python_sdk-0.8.0 → prelude_python_sdk-0.9.0}/src/prelude_python_sdk/_utils/_proxy.py +0 -0
  60. {prelude_python_sdk-0.8.0 → prelude_python_sdk-0.9.0}/src/prelude_python_sdk/_utils/_reflection.py +0 -0
  61. {prelude_python_sdk-0.8.0 → prelude_python_sdk-0.9.0}/src/prelude_python_sdk/_utils/_resources_proxy.py +0 -0
  62. {prelude_python_sdk-0.8.0 → prelude_python_sdk-0.9.0}/src/prelude_python_sdk/_utils/_streams.py +0 -0
  63. {prelude_python_sdk-0.8.0 → prelude_python_sdk-0.9.0}/src/prelude_python_sdk/_utils/_transform.py +0 -0
  64. {prelude_python_sdk-0.8.0 → prelude_python_sdk-0.9.0}/src/prelude_python_sdk/_utils/_typing.py +0 -0
  65. {prelude_python_sdk-0.8.0 → prelude_python_sdk-0.9.0}/src/prelude_python_sdk/lib/.keep +0 -0
  66. {prelude_python_sdk-0.8.0 → prelude_python_sdk-0.9.0}/src/prelude_python_sdk/py.typed +0 -0
  67. {prelude_python_sdk-0.8.0 → prelude_python_sdk-0.9.0}/src/prelude_python_sdk/resources/lookup.py +0 -0
  68. {prelude_python_sdk-0.8.0 → prelude_python_sdk-0.9.0}/src/prelude_python_sdk/resources/verification.py +0 -0
  69. {prelude_python_sdk-0.8.0 → prelude_python_sdk-0.9.0}/src/prelude_python_sdk/resources/watch.py +0 -0
  70. {prelude_python_sdk-0.8.0 → prelude_python_sdk-0.9.0}/src/prelude_python_sdk/types/lookup_lookup_params.py +0 -0
  71. {prelude_python_sdk-0.8.0 → prelude_python_sdk-0.9.0}/src/prelude_python_sdk/types/lookup_lookup_response.py +0 -0
  72. {prelude_python_sdk-0.8.0 → prelude_python_sdk-0.9.0}/src/prelude_python_sdk/types/transactional_send_response.py +0 -0
  73. {prelude_python_sdk-0.8.0 → prelude_python_sdk-0.9.0}/src/prelude_python_sdk/types/verification_check_params.py +0 -0
  74. {prelude_python_sdk-0.8.0 → prelude_python_sdk-0.9.0}/src/prelude_python_sdk/types/verification_check_response.py +0 -0
  75. {prelude_python_sdk-0.8.0 → prelude_python_sdk-0.9.0}/src/prelude_python_sdk/types/verification_create_response.py +0 -0
  76. {prelude_python_sdk-0.8.0 → prelude_python_sdk-0.9.0}/src/prelude_python_sdk/types/watch_predict_params.py +0 -0
  77. {prelude_python_sdk-0.8.0 → prelude_python_sdk-0.9.0}/src/prelude_python_sdk/types/watch_predict_response.py +0 -0
  78. {prelude_python_sdk-0.8.0 → prelude_python_sdk-0.9.0}/src/prelude_python_sdk/types/watch_send_events_params.py +0 -0
  79. {prelude_python_sdk-0.8.0 → prelude_python_sdk-0.9.0}/src/prelude_python_sdk/types/watch_send_events_response.py +0 -0
  80. {prelude_python_sdk-0.8.0 → prelude_python_sdk-0.9.0}/src/prelude_python_sdk/types/watch_send_feedbacks_params.py +0 -0
  81. {prelude_python_sdk-0.8.0 → prelude_python_sdk-0.9.0}/src/prelude_python_sdk/types/watch_send_feedbacks_response.py +0 -0
  82. {prelude_python_sdk-0.8.0 → prelude_python_sdk-0.9.0}/src/prelude_sdk/lib/.keep +0 -0
  83. {prelude_python_sdk-0.8.0 → prelude_python_sdk-0.9.0}/tests/__init__.py +0 -0
  84. {prelude_python_sdk-0.8.0 → prelude_python_sdk-0.9.0}/tests/api_resources/__init__.py +0 -0
  85. {prelude_python_sdk-0.8.0 → prelude_python_sdk-0.9.0}/tests/api_resources/test_lookup.py +0 -0
  86. {prelude_python_sdk-0.8.0 → prelude_python_sdk-0.9.0}/tests/api_resources/test_verification.py +0 -0
  87. {prelude_python_sdk-0.8.0 → prelude_python_sdk-0.9.0}/tests/api_resources/test_watch.py +0 -0
  88. {prelude_python_sdk-0.8.0 → prelude_python_sdk-0.9.0}/tests/conftest.py +0 -0
  89. {prelude_python_sdk-0.8.0 → prelude_python_sdk-0.9.0}/tests/sample_file.txt +0 -0
  90. {prelude_python_sdk-0.8.0 → prelude_python_sdk-0.9.0}/tests/test_deepcopy.py +0 -0
  91. {prelude_python_sdk-0.8.0 → prelude_python_sdk-0.9.0}/tests/test_extract_files.py +0 -0
  92. {prelude_python_sdk-0.8.0 → prelude_python_sdk-0.9.0}/tests/test_files.py +0 -0
  93. {prelude_python_sdk-0.8.0 → prelude_python_sdk-0.9.0}/tests/test_qs.py +0 -0
  94. {prelude_python_sdk-0.8.0 → prelude_python_sdk-0.9.0}/tests/test_required_args.py +0 -0
  95. {prelude_python_sdk-0.8.0 → prelude_python_sdk-0.9.0}/tests/test_response.py +0 -0
  96. {prelude_python_sdk-0.8.0 → prelude_python_sdk-0.9.0}/tests/test_streaming.py +0 -0
  97. {prelude_python_sdk-0.8.0 → prelude_python_sdk-0.9.0}/tests/test_transform.py +0 -0
  98. {prelude_python_sdk-0.8.0 → prelude_python_sdk-0.9.0}/tests/test_utils/test_datetime_parse.py +0 -0
  99. {prelude_python_sdk-0.8.0 → prelude_python_sdk-0.9.0}/tests/test_utils/test_proxy.py +0 -0
  100. {prelude_python_sdk-0.8.0 → prelude_python_sdk-0.9.0}/tests/test_utils/test_typing.py +0 -0
  101. {prelude_python_sdk-0.8.0 → prelude_python_sdk-0.9.0}/tests/utils.py +0 -0
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "0.9.0"
3
+ }
@@ -1,5 +1,36 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.9.0 (2025-11-17)
4
+
5
+ Full Changelog: [v0.8.0...v0.9.0](https://github.com/prelude-so/python-sdk/compare/v0.8.0...v0.9.0)
6
+
7
+ ### Features
8
+
9
+ * **api:** api update ([3414954](https://github.com/prelude-so/python-sdk/commit/34149545030f8a0219599164bab754301c21285e))
10
+ * **api:** api update ([f289389](https://github.com/prelude-so/python-sdk/commit/f2893896abbacda022acaea5dbac3fc14ee638d3))
11
+ * **api:** api update ([fcdc79a](https://github.com/prelude-so/python-sdk/commit/fcdc79ad8d26841bf8b9dcd0e4a716505bd1c7cd))
12
+ * **api:** api update ([9e82750](https://github.com/prelude-so/python-sdk/commit/9e82750ffb0e301d23b4c8cc20c28a84c56cfa3d))
13
+ * **api:** api update ([940dceb](https://github.com/prelude-so/python-sdk/commit/940dceb4f55eccf2162fa151a5012f27e11c8485))
14
+ * **api:** api update ([0e92885](https://github.com/prelude-so/python-sdk/commit/0e928852bb97c2e977d94412941c8686b5a72669))
15
+ * **api:** expose phone numbers management methods ([3c57a24](https://github.com/prelude-so/python-sdk/commit/3c57a2433505592c885a96e9e73bc9ae2183dcf2))
16
+ * **api:** expose verification management methods ([59e97e4](https://github.com/prelude-so/python-sdk/commit/59e97e4b132c88b2eb8f5e47244770031af22140))
17
+
18
+
19
+ ### Bug Fixes
20
+
21
+ * **client:** close streams without requiring full consumption ([360d52e](https://github.com/prelude-so/python-sdk/commit/360d52eaeb107732ea05ea4518ef67705ecf104f))
22
+ * compat with Python 3.14 ([a40568f](https://github.com/prelude-so/python-sdk/commit/a40568f91c470c7d1897f620f56000878badf233))
23
+ * **compat:** update signatures of `model_dump` and `model_dump_json` for Pydantic v1 ([3474a0e](https://github.com/prelude-so/python-sdk/commit/3474a0e1503c2cd5be8b901bb8ef1bcc95946291))
24
+
25
+
26
+ ### Chores
27
+
28
+ * bump `httpx-aiohttp` version to 0.1.9 ([cf5a356](https://github.com/prelude-so/python-sdk/commit/cf5a356cb8edec1d9cd65a8f1d5af9a365292aef))
29
+ * **internal/tests:** avoid race condition with implicit client cleanup ([d7f113f](https://github.com/prelude-so/python-sdk/commit/d7f113ffb3a50b17fc0a6372fea9cfc2902b6abe))
30
+ * **internal:** detect missing future annotations with ruff ([33710d4](https://github.com/prelude-so/python-sdk/commit/33710d44b323f16c98c3745830c7f50db2954b7d))
31
+ * **internal:** grammar fix (it's -> its) ([a31bbfc](https://github.com/prelude-so/python-sdk/commit/a31bbfcb46c5dd2ced3232747c7178605a3c1aec))
32
+ * **package:** drop Python 3.8 support ([7e22988](https://github.com/prelude-so/python-sdk/commit/7e229880df05461baa7f49a55eded4aae9559a2a))
33
+
3
34
  ## 0.8.0 (2025-09-25)
4
35
 
5
36
  Full Changelog: [v0.7.0...v0.8.0](https://github.com/prelude-so/python-sdk/compare/v0.7.0...v0.8.0)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: prelude-python-sdk
3
- Version: 0.8.0
3
+ Version: 0.9.0
4
4
  Summary: The official Python library for the Prelude API
5
5
  Project-URL: Homepage, https://github.com/prelude-so/python-sdk
6
6
  Project-URL: Repository, https://github.com/prelude-so/python-sdk
@@ -13,7 +13,6 @@ Classifier: Operating System :: Microsoft :: Windows
13
13
  Classifier: Operating System :: OS Independent
14
14
  Classifier: Operating System :: POSIX
15
15
  Classifier: Operating System :: POSIX :: Linux
16
- Classifier: Programming Language :: Python :: 3.8
17
16
  Classifier: Programming Language :: Python :: 3.9
18
17
  Classifier: Programming Language :: Python :: 3.10
19
18
  Classifier: Programming Language :: Python :: 3.11
@@ -21,7 +20,7 @@ Classifier: Programming Language :: Python :: 3.12
21
20
  Classifier: Programming Language :: Python :: 3.13
22
21
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
23
22
  Classifier: Typing :: Typed
24
- Requires-Python: >=3.8
23
+ Requires-Python: >=3.9
25
24
  Requires-Dist: anyio<5,>=3.5.0
26
25
  Requires-Dist: distro<2,>=1.7.0
27
26
  Requires-Dist: httpx<1,>=0.23.0
@@ -30,7 +29,7 @@ Requires-Dist: sniffio
30
29
  Requires-Dist: typing-extensions<5,>=4.10
31
30
  Provides-Extra: aiohttp
32
31
  Requires-Dist: aiohttp; extra == 'aiohttp'
33
- Requires-Dist: httpx-aiohttp>=0.1.8; extra == 'aiohttp'
32
+ Requires-Dist: httpx-aiohttp>=0.1.9; extra == 'aiohttp'
34
33
  Description-Content-Type: text/markdown
35
34
 
36
35
  # Prelude Python API library
@@ -38,7 +37,7 @@ Description-Content-Type: text/markdown
38
37
  <!-- prettier-ignore -->
39
38
  [![PyPI version](https://img.shields.io/pypi/v/prelude-python-sdk.svg?label=pypi%20(stable))](https://pypi.org/project/prelude-python-sdk/)
40
39
 
41
- The Prelude Python library provides convenient access to the Prelude REST API from any Python 3.8+
40
+ The Prelude Python library provides convenient access to the Prelude REST API from any Python 3.9+
42
41
  application. The library includes type definitions for all request params and response fields,
43
42
  and offers both synchronous and asynchronous clients powered by [httpx](https://github.com/encode/httpx).
44
43
 
@@ -449,7 +448,7 @@ print(prelude_python_sdk.__version__)
449
448
 
450
449
  ## Requirements
451
450
 
452
- Python 3.8 or higher.
451
+ Python 3.9 or higher.
453
452
 
454
453
  ## Contributing
455
454
 
@@ -3,7 +3,7 @@
3
3
  <!-- prettier-ignore -->
4
4
  [![PyPI version](https://img.shields.io/pypi/v/prelude-python-sdk.svg?label=pypi%20(stable))](https://pypi.org/project/prelude-python-sdk/)
5
5
 
6
- The Prelude Python library provides convenient access to the Prelude REST API from any Python 3.8+
6
+ The Prelude Python library provides convenient access to the Prelude REST API from any Python 3.9+
7
7
  application. The library includes type definitions for all request params and response fields,
8
8
  and offers both synchronous and asynchronous clients powered by [httpx](https://github.com/encode/httpx).
9
9
 
@@ -414,7 +414,7 @@ print(prelude_python_sdk.__version__)
414
414
 
415
415
  ## Requirements
416
416
 
417
- Python 3.8 or higher.
417
+ Python 3.9 or higher.
418
418
 
419
419
  ## Contributing
420
420
 
@@ -35,6 +35,28 @@ Methods:
35
35
  - <code title="post /v2/verification">client.verification.<a href="./src/prelude_python_sdk/resources/verification.py">create</a>(\*\*<a href="src/prelude_python_sdk/types/verification_create_params.py">params</a>) -> <a href="./src/prelude_python_sdk/types/verification_create_response.py">VerificationCreateResponse</a></code>
36
36
  - <code title="post /v2/verification/check">client.verification.<a href="./src/prelude_python_sdk/resources/verification.py">check</a>(\*\*<a href="src/prelude_python_sdk/types/verification_check_params.py">params</a>) -> <a href="./src/prelude_python_sdk/types/verification_check_response.py">VerificationCheckResponse</a></code>
37
37
 
38
+ # VerificationManagement
39
+
40
+ Types:
41
+
42
+ ```python
43
+ from prelude_python_sdk.types import (
44
+ VerificationManagementDeletePhoneNumberResponse,
45
+ VerificationManagementListPhoneNumbersResponse,
46
+ VerificationManagementListSenderIDsResponse,
47
+ VerificationManagementSetPhoneNumberResponse,
48
+ VerificationManagementSubmitSenderIDResponse,
49
+ )
50
+ ```
51
+
52
+ Methods:
53
+
54
+ - <code title="delete /v2/verification/management/phone-numbers/{action}">client.verification_management.<a href="./src/prelude_python_sdk/resources/verification_management.py">delete_phone_number</a>(action, \*\*<a href="src/prelude_python_sdk/types/verification_management_delete_phone_number_params.py">params</a>) -> <a href="./src/prelude_python_sdk/types/verification_management_delete_phone_number_response.py">VerificationManagementDeletePhoneNumberResponse</a></code>
55
+ - <code title="get /v2/verification/management/phone-numbers/{action}">client.verification_management.<a href="./src/prelude_python_sdk/resources/verification_management.py">list_phone_numbers</a>(action) -> <a href="./src/prelude_python_sdk/types/verification_management_list_phone_numbers_response.py">VerificationManagementListPhoneNumbersResponse</a></code>
56
+ - <code title="get /v2/verification/management/sender-id">client.verification_management.<a href="./src/prelude_python_sdk/resources/verification_management.py">list_sender_ids</a>() -> <a href="./src/prelude_python_sdk/types/verification_management_list_sender_ids_response.py">VerificationManagementListSenderIDsResponse</a></code>
57
+ - <code title="post /v2/verification/management/phone-numbers/{action}">client.verification_management.<a href="./src/prelude_python_sdk/resources/verification_management.py">set_phone_number</a>(action, \*\*<a href="src/prelude_python_sdk/types/verification_management_set_phone_number_params.py">params</a>) -> <a href="./src/prelude_python_sdk/types/verification_management_set_phone_number_response.py">VerificationManagementSetPhoneNumberResponse</a></code>
58
+ - <code title="post /v2/verification/management/sender-id">client.verification_management.<a href="./src/prelude_python_sdk/resources/verification_management.py">submit_sender_id</a>(\*\*<a href="src/prelude_python_sdk/types/verification_management_submit_sender_id_params.py">params</a>) -> <a href="./src/prelude_python_sdk/types/verification_management_submit_sender_id_response.py">VerificationManagementSubmitSenderIDResponse</a></code>
59
+
38
60
  # Watch
39
61
 
40
62
  Types:
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "prelude-python-sdk"
3
- version = "0.8.0"
3
+ version = "0.9.0"
4
4
  description = "The official Python library for the Prelude API"
5
5
  dynamic = ["readme"]
6
6
  license = "Apache-2.0"
@@ -15,11 +15,10 @@ dependencies = [
15
15
  "distro>=1.7.0, <2",
16
16
  "sniffio",
17
17
  ]
18
- requires-python = ">= 3.8"
18
+ requires-python = ">= 3.9"
19
19
  classifiers = [
20
20
  "Typing :: Typed",
21
21
  "Intended Audience :: Developers",
22
- "Programming Language :: Python :: 3.8",
23
22
  "Programming Language :: Python :: 3.9",
24
23
  "Programming Language :: Python :: 3.10",
25
24
  "Programming Language :: Python :: 3.11",
@@ -39,7 +38,7 @@ Homepage = "https://github.com/prelude-so/python-sdk"
39
38
  Repository = "https://github.com/prelude-so/python-sdk"
40
39
 
41
40
  [project.optional-dependencies]
42
- aiohttp = ["aiohttp", "httpx_aiohttp>=0.1.8"]
41
+ aiohttp = ["aiohttp", "httpx_aiohttp>=0.1.9"]
43
42
 
44
43
  [tool.rye]
45
44
  managed = true
@@ -141,7 +140,7 @@ filterwarnings = [
141
140
  # there are a couple of flags that are still disabled by
142
141
  # default in strict mode as they are experimental and niche.
143
142
  typeCheckingMode = "strict"
144
- pythonVersion = "3.8"
143
+ pythonVersion = "3.9"
145
144
 
146
145
  exclude = [
147
146
  "_dev",
@@ -224,6 +223,8 @@ select = [
224
223
  "B",
225
224
  # remove unused imports
226
225
  "F401",
226
+ # check for missing future annotations
227
+ "FA102",
227
228
  # bare except statements
228
229
  "E722",
229
230
  # unused arguments
@@ -246,6 +247,8 @@ unfixable = [
246
247
  "T203",
247
248
  ]
248
249
 
250
+ extend-safe-fixes = ["FA102"]
251
+
249
252
  [tool.ruff.lint.flake8-tidy-imports.banned-api]
250
253
  "functools.lru_cache".msg = "This function does not retain type information for the wrapped function's arguments; The `lru_cache` function from `_utils` should be used instead"
251
254
 
@@ -56,7 +56,7 @@ httpx==0.28.1
56
56
  # via httpx-aiohttp
57
57
  # via prelude-python-sdk
58
58
  # via respx
59
- httpx-aiohttp==0.1.8
59
+ httpx-aiohttp==0.1.9
60
60
  # via prelude-python-sdk
61
61
  idna==3.4
62
62
  # via anyio
@@ -43,7 +43,7 @@ httpcore==1.0.9
43
43
  httpx==0.28.1
44
44
  # via httpx-aiohttp
45
45
  # via prelude-python-sdk
46
- httpx-aiohttp==0.1.8
46
+ httpx-aiohttp==0.1.9
47
47
  # via prelude-python-sdk
48
48
  idna==3.4
49
49
  # via anyio
@@ -21,7 +21,7 @@ from ._types import (
21
21
  )
22
22
  from ._utils import is_given, get_async_library
23
23
  from ._version import __version__
24
- from .resources import watch, lookup, verification, transactional
24
+ from .resources import watch, lookup, verification, transactional, verification_management
25
25
  from ._streaming import Stream as Stream, AsyncStream as AsyncStream
26
26
  from ._exceptions import PreludeError, APIStatusError
27
27
  from ._base_client import (
@@ -37,6 +37,7 @@ class Prelude(SyncAPIClient):
37
37
  lookup: lookup.LookupResource
38
38
  transactional: transactional.TransactionalResource
39
39
  verification: verification.VerificationResource
40
+ verification_management: verification_management.VerificationManagementResource
40
41
  watch: watch.WatchResource
41
42
  with_raw_response: PreludeWithRawResponse
42
43
  with_streaming_response: PreludeWithStreamedResponse
@@ -98,6 +99,7 @@ class Prelude(SyncAPIClient):
98
99
  self.lookup = lookup.LookupResource(self)
99
100
  self.transactional = transactional.TransactionalResource(self)
100
101
  self.verification = verification.VerificationResource(self)
102
+ self.verification_management = verification_management.VerificationManagementResource(self)
101
103
  self.watch = watch.WatchResource(self)
102
104
  self.with_raw_response = PreludeWithRawResponse(self)
103
105
  self.with_streaming_response = PreludeWithStreamedResponse(self)
@@ -211,6 +213,7 @@ class AsyncPrelude(AsyncAPIClient):
211
213
  lookup: lookup.AsyncLookupResource
212
214
  transactional: transactional.AsyncTransactionalResource
213
215
  verification: verification.AsyncVerificationResource
216
+ verification_management: verification_management.AsyncVerificationManagementResource
214
217
  watch: watch.AsyncWatchResource
215
218
  with_raw_response: AsyncPreludeWithRawResponse
216
219
  with_streaming_response: AsyncPreludeWithStreamedResponse
@@ -272,6 +275,7 @@ class AsyncPrelude(AsyncAPIClient):
272
275
  self.lookup = lookup.AsyncLookupResource(self)
273
276
  self.transactional = transactional.AsyncTransactionalResource(self)
274
277
  self.verification = verification.AsyncVerificationResource(self)
278
+ self.verification_management = verification_management.AsyncVerificationManagementResource(self)
275
279
  self.watch = watch.AsyncWatchResource(self)
276
280
  self.with_raw_response = AsyncPreludeWithRawResponse(self)
277
281
  self.with_streaming_response = AsyncPreludeWithStreamedResponse(self)
@@ -386,6 +390,9 @@ class PreludeWithRawResponse:
386
390
  self.lookup = lookup.LookupResourceWithRawResponse(client.lookup)
387
391
  self.transactional = transactional.TransactionalResourceWithRawResponse(client.transactional)
388
392
  self.verification = verification.VerificationResourceWithRawResponse(client.verification)
393
+ self.verification_management = verification_management.VerificationManagementResourceWithRawResponse(
394
+ client.verification_management
395
+ )
389
396
  self.watch = watch.WatchResourceWithRawResponse(client.watch)
390
397
 
391
398
 
@@ -394,6 +401,9 @@ class AsyncPreludeWithRawResponse:
394
401
  self.lookup = lookup.AsyncLookupResourceWithRawResponse(client.lookup)
395
402
  self.transactional = transactional.AsyncTransactionalResourceWithRawResponse(client.transactional)
396
403
  self.verification = verification.AsyncVerificationResourceWithRawResponse(client.verification)
404
+ self.verification_management = verification_management.AsyncVerificationManagementResourceWithRawResponse(
405
+ client.verification_management
406
+ )
397
407
  self.watch = watch.AsyncWatchResourceWithRawResponse(client.watch)
398
408
 
399
409
 
@@ -402,6 +412,9 @@ class PreludeWithStreamedResponse:
402
412
  self.lookup = lookup.LookupResourceWithStreamingResponse(client.lookup)
403
413
  self.transactional = transactional.TransactionalResourceWithStreamingResponse(client.transactional)
404
414
  self.verification = verification.VerificationResourceWithStreamingResponse(client.verification)
415
+ self.verification_management = verification_management.VerificationManagementResourceWithStreamingResponse(
416
+ client.verification_management
417
+ )
405
418
  self.watch = watch.WatchResourceWithStreamingResponse(client.watch)
406
419
 
407
420
 
@@ -410,6 +423,9 @@ class AsyncPreludeWithStreamedResponse:
410
423
  self.lookup = lookup.AsyncLookupResourceWithStreamingResponse(client.lookup)
411
424
  self.transactional = transactional.AsyncTransactionalResourceWithStreamingResponse(client.transactional)
412
425
  self.verification = verification.AsyncVerificationResourceWithStreamingResponse(client.verification)
426
+ self.verification_management = verification_management.AsyncVerificationManagementResourceWithStreamingResponse(
427
+ client.verification_management
428
+ )
413
429
  self.watch = watch.AsyncWatchResourceWithStreamingResponse(client.watch)
414
430
 
415
431
 
@@ -2,6 +2,7 @@ from __future__ import annotations
2
2
 
3
3
  import os
4
4
  import inspect
5
+ import weakref
5
6
  from typing import TYPE_CHECKING, Any, Type, Union, Generic, TypeVar, Callable, Optional, cast
6
7
  from datetime import date, datetime
7
8
  from typing_extensions import (
@@ -256,15 +257,16 @@ class BaseModel(pydantic.BaseModel):
256
257
  mode: Literal["json", "python"] | str = "python",
257
258
  include: IncEx | None = None,
258
259
  exclude: IncEx | None = None,
260
+ context: Any | None = None,
259
261
  by_alias: bool | None = None,
260
262
  exclude_unset: bool = False,
261
263
  exclude_defaults: bool = False,
262
264
  exclude_none: bool = False,
265
+ exclude_computed_fields: bool = False,
263
266
  round_trip: bool = False,
264
267
  warnings: bool | Literal["none", "warn", "error"] = True,
265
- context: dict[str, Any] | None = None,
266
- serialize_as_any: bool = False,
267
268
  fallback: Callable[[Any], Any] | None = None,
269
+ serialize_as_any: bool = False,
268
270
  ) -> dict[str, Any]:
269
271
  """Usage docs: https://docs.pydantic.dev/2.4/concepts/serialization/#modelmodel_dump
270
272
 
@@ -272,16 +274,24 @@ class BaseModel(pydantic.BaseModel):
272
274
 
273
275
  Args:
274
276
  mode: The mode in which `to_python` should run.
275
- If mode is 'json', the dictionary will only contain JSON serializable types.
276
- If mode is 'python', the dictionary may contain any Python objects.
277
- include: A list of fields to include in the output.
278
- exclude: A list of fields to exclude from the output.
277
+ If mode is 'json', the output will only contain JSON serializable types.
278
+ If mode is 'python', the output may contain non-JSON-serializable Python objects.
279
+ include: A set of fields to include in the output.
280
+ exclude: A set of fields to exclude from the output.
281
+ context: Additional context to pass to the serializer.
279
282
  by_alias: Whether to use the field's alias in the dictionary key if defined.
280
- exclude_unset: Whether to exclude fields that are unset or None from the output.
281
- exclude_defaults: Whether to exclude fields that are set to their default value from the output.
282
- exclude_none: Whether to exclude fields that have a value of `None` from the output.
283
- round_trip: Whether to enable serialization and deserialization round-trip support.
284
- warnings: Whether to log warnings when invalid fields are encountered.
283
+ exclude_unset: Whether to exclude fields that have not been explicitly set.
284
+ exclude_defaults: Whether to exclude fields that are set to their default value.
285
+ exclude_none: Whether to exclude fields that have a value of `None`.
286
+ exclude_computed_fields: Whether to exclude computed fields.
287
+ While this can be useful for round-tripping, it is usually recommended to use the dedicated
288
+ `round_trip` parameter instead.
289
+ round_trip: If True, dumped values should be valid as input for non-idempotent types such as Json[T].
290
+ warnings: How to handle serialization errors. False/"none" ignores them, True/"warn" logs errors,
291
+ "error" raises a [`PydanticSerializationError`][pydantic_core.PydanticSerializationError].
292
+ fallback: A function to call when an unknown value is encountered. If not provided,
293
+ a [`PydanticSerializationError`][pydantic_core.PydanticSerializationError] error is raised.
294
+ serialize_as_any: Whether to serialize fields with duck-typing serialization behavior.
285
295
 
286
296
  Returns:
287
297
  A dictionary representation of the model.
@@ -298,6 +308,8 @@ class BaseModel(pydantic.BaseModel):
298
308
  raise ValueError("serialize_as_any is only supported in Pydantic v2")
299
309
  if fallback is not None:
300
310
  raise ValueError("fallback is only supported in Pydantic v2")
311
+ if exclude_computed_fields != False:
312
+ raise ValueError("exclude_computed_fields is only supported in Pydantic v2")
301
313
  dumped = super().dict( # pyright: ignore[reportDeprecated]
302
314
  include=include,
303
315
  exclude=exclude,
@@ -314,15 +326,17 @@ class BaseModel(pydantic.BaseModel):
314
326
  self,
315
327
  *,
316
328
  indent: int | None = None,
329
+ ensure_ascii: bool = False,
317
330
  include: IncEx | None = None,
318
331
  exclude: IncEx | None = None,
332
+ context: Any | None = None,
319
333
  by_alias: bool | None = None,
320
334
  exclude_unset: bool = False,
321
335
  exclude_defaults: bool = False,
322
336
  exclude_none: bool = False,
337
+ exclude_computed_fields: bool = False,
323
338
  round_trip: bool = False,
324
339
  warnings: bool | Literal["none", "warn", "error"] = True,
325
- context: dict[str, Any] | None = None,
326
340
  fallback: Callable[[Any], Any] | None = None,
327
341
  serialize_as_any: bool = False,
328
342
  ) -> str:
@@ -354,6 +368,10 @@ class BaseModel(pydantic.BaseModel):
354
368
  raise ValueError("serialize_as_any is only supported in Pydantic v2")
355
369
  if fallback is not None:
356
370
  raise ValueError("fallback is only supported in Pydantic v2")
371
+ if ensure_ascii != False:
372
+ raise ValueError("ensure_ascii is only supported in Pydantic v2")
373
+ if exclude_computed_fields != False:
374
+ raise ValueError("exclude_computed_fields is only supported in Pydantic v2")
357
375
  return super().json( # type: ignore[reportDeprecated]
358
376
  indent=indent,
359
377
  include=include,
@@ -573,6 +591,9 @@ class CachedDiscriminatorType(Protocol):
573
591
  __discriminator__: DiscriminatorDetails
574
592
 
575
593
 
594
+ DISCRIMINATOR_CACHE: weakref.WeakKeyDictionary[type, DiscriminatorDetails] = weakref.WeakKeyDictionary()
595
+
596
+
576
597
  class DiscriminatorDetails:
577
598
  field_name: str
578
599
  """The name of the discriminator field in the variant class, e.g.
@@ -615,8 +636,9 @@ class DiscriminatorDetails:
615
636
 
616
637
 
617
638
  def _build_discriminated_union_meta(*, union: type, meta_annotations: tuple[Any, ...]) -> DiscriminatorDetails | None:
618
- if isinstance(union, CachedDiscriminatorType):
619
- return union.__discriminator__
639
+ cached = DISCRIMINATOR_CACHE.get(union)
640
+ if cached is not None:
641
+ return cached
620
642
 
621
643
  discriminator_field_name: str | None = None
622
644
 
@@ -669,7 +691,7 @@ def _build_discriminated_union_meta(*, union: type, meta_annotations: tuple[Any,
669
691
  discriminator_field=discriminator_field_name,
670
692
  discriminator_alias=discriminator_alias,
671
693
  )
672
- cast(CachedDiscriminatorType, union).__discriminator__ = details
694
+ DISCRIMINATOR_CACHE.setdefault(union, details)
673
695
  return details
674
696
 
675
697
 
@@ -57,9 +57,8 @@ class Stream(Generic[_T]):
57
57
  for sse in iterator:
58
58
  yield process_data(data=sse.json(), cast_to=cast_to, response=response)
59
59
 
60
- # Ensure the entire stream is consumed
61
- for _sse in iterator:
62
- ...
60
+ # As we might not fully consume the response stream, we need to close it explicitly
61
+ response.close()
63
62
 
64
63
  def __enter__(self) -> Self:
65
64
  return self
@@ -121,9 +120,8 @@ class AsyncStream(Generic[_T]):
121
120
  async for sse in iterator:
122
121
  yield process_data(data=sse.json(), cast_to=cast_to, response=response)
123
122
 
124
- # Ensure the entire stream is consumed
125
- async for _sse in iterator:
126
- ...
123
+ # As we might not fully consume the response stream, we need to close it explicitly
124
+ await response.aclose()
127
125
 
128
126
  async def __aenter__(self) -> Self:
129
127
  return self
@@ -1,10 +1,8 @@
1
1
  from __future__ import annotations
2
2
 
3
- import sys
4
3
  import asyncio
5
4
  import functools
6
- import contextvars
7
- from typing import Any, TypeVar, Callable, Awaitable
5
+ from typing import TypeVar, Callable, Awaitable
8
6
  from typing_extensions import ParamSpec
9
7
 
10
8
  import anyio
@@ -15,34 +13,11 @@ T_Retval = TypeVar("T_Retval")
15
13
  T_ParamSpec = ParamSpec("T_ParamSpec")
16
14
 
17
15
 
18
- if sys.version_info >= (3, 9):
19
- _asyncio_to_thread = asyncio.to_thread
20
- else:
21
- # backport of https://docs.python.org/3/library/asyncio-task.html#asyncio.to_thread
22
- # for Python 3.8 support
23
- async def _asyncio_to_thread(
24
- func: Callable[T_ParamSpec, T_Retval], /, *args: T_ParamSpec.args, **kwargs: T_ParamSpec.kwargs
25
- ) -> Any:
26
- """Asynchronously run function *func* in a separate thread.
27
-
28
- Any *args and **kwargs supplied for this function are directly passed
29
- to *func*. Also, the current :class:`contextvars.Context` is propagated,
30
- allowing context variables from the main thread to be accessed in the
31
- separate thread.
32
-
33
- Returns a coroutine that can be awaited to get the eventual result of *func*.
34
- """
35
- loop = asyncio.events.get_running_loop()
36
- ctx = contextvars.copy_context()
37
- func_call = functools.partial(ctx.run, func, *args, **kwargs)
38
- return await loop.run_in_executor(None, func_call)
39
-
40
-
41
16
  async def to_thread(
42
17
  func: Callable[T_ParamSpec, T_Retval], /, *args: T_ParamSpec.args, **kwargs: T_ParamSpec.kwargs
43
18
  ) -> T_Retval:
44
19
  if sniffio.current_async_library() == "asyncio":
45
- return await _asyncio_to_thread(func, *args, **kwargs)
20
+ return await asyncio.to_thread(func, *args, **kwargs)
46
21
 
47
22
  return await anyio.to_thread.run_sync(
48
23
  functools.partial(func, *args, **kwargs),
@@ -53,10 +28,7 @@ async def to_thread(
53
28
  def asyncify(function: Callable[T_ParamSpec, T_Retval]) -> Callable[T_ParamSpec, Awaitable[T_Retval]]:
54
29
  """
55
30
  Take a blocking function and create an async one that receives the same
56
- positional and keyword arguments. For python version 3.9 and above, it uses
57
- asyncio.to_thread to run the function in a separate thread. For python version
58
- 3.8, it uses locally defined copy of the asyncio.to_thread function which was
59
- introduced in python 3.9.
31
+ positional and keyword arguments.
60
32
 
61
33
  Usage:
62
34
 
@@ -133,7 +133,7 @@ def is_given(obj: _T | NotGiven | Omit) -> TypeGuard[_T]:
133
133
  # Type safe methods for narrowing types with TypeVars.
134
134
  # The default narrowing for isinstance(obj, dict) is dict[unknown, unknown],
135
135
  # however this cause Pyright to rightfully report errors. As we know we don't
136
- # care about the contained types we can safely use `object` in it's place.
136
+ # care about the contained types we can safely use `object` in its place.
137
137
  #
138
138
  # There are two separate functions defined, `is_*` and `is_*_t` for different use cases.
139
139
  # `is_*` is for when you're dealing with an unknown input
@@ -1,4 +1,4 @@
1
1
  # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
2
 
3
3
  __title__ = "prelude_python_sdk"
4
- __version__ = "0.8.0" # x-release-please-version
4
+ __version__ = "0.9.0" # x-release-please-version
@@ -32,6 +32,14 @@ from .transactional import (
32
32
  TransactionalResourceWithStreamingResponse,
33
33
  AsyncTransactionalResourceWithStreamingResponse,
34
34
  )
35
+ from .verification_management import (
36
+ VerificationManagementResource,
37
+ AsyncVerificationManagementResource,
38
+ VerificationManagementResourceWithRawResponse,
39
+ AsyncVerificationManagementResourceWithRawResponse,
40
+ VerificationManagementResourceWithStreamingResponse,
41
+ AsyncVerificationManagementResourceWithStreamingResponse,
42
+ )
35
43
 
36
44
  __all__ = [
37
45
  "LookupResource",
@@ -52,6 +60,12 @@ __all__ = [
52
60
  "AsyncVerificationResourceWithRawResponse",
53
61
  "VerificationResourceWithStreamingResponse",
54
62
  "AsyncVerificationResourceWithStreamingResponse",
63
+ "VerificationManagementResource",
64
+ "AsyncVerificationManagementResource",
65
+ "VerificationManagementResourceWithRawResponse",
66
+ "AsyncVerificationManagementResourceWithRawResponse",
67
+ "VerificationManagementResourceWithStreamingResponse",
68
+ "AsyncVerificationManagementResourceWithStreamingResponse",
55
69
  "WatchResource",
56
70
  "AsyncWatchResource",
57
71
  "WatchResourceWithRawResponse",