prelude-python-sdk 0.9.0__tar.gz → 0.10.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 (114) hide show
  1. prelude_python_sdk-0.10.0/.release-please-manifest.json +3 -0
  2. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/CHANGELOG.md +21 -0
  3. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/PKG-INFO +4 -2
  4. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/README.md +2 -1
  5. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/api.md +26 -0
  6. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/pyproject.toml +11 -8
  7. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/requirements-dev.lock +62 -50
  8. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/requirements.lock +20 -19
  9. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/src/prelude_python_sdk/_client.py +9 -1
  10. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/src/prelude_python_sdk/_streaming.py +12 -10
  11. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/src/prelude_python_sdk/_version.py +1 -1
  12. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/src/prelude_python_sdk/resources/__init__.py +14 -0
  13. prelude_python_sdk-0.10.0/src/prelude_python_sdk/resources/notify.py +975 -0
  14. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/src/prelude_python_sdk/types/__init__.py +28 -0
  15. prelude_python_sdk-0.10.0/src/prelude_python_sdk/types/notify_get_subscription_config_response.py +53 -0
  16. prelude_python_sdk-0.10.0/src/prelude_python_sdk/types/notify_get_subscription_phone_number_response.py +39 -0
  17. prelude_python_sdk-0.10.0/src/prelude_python_sdk/types/notify_list_subscription_configs_params.py +15 -0
  18. prelude_python_sdk-0.10.0/src/prelude_python_sdk/types/notify_list_subscription_configs_response.py +64 -0
  19. prelude_python_sdk-0.10.0/src/prelude_python_sdk/types/notify_list_subscription_phone_number_events_params.py +17 -0
  20. prelude_python_sdk-0.10.0/src/prelude_python_sdk/types/notify_list_subscription_phone_number_events_response.py +50 -0
  21. prelude_python_sdk-0.10.0/src/prelude_python_sdk/types/notify_list_subscription_phone_numbers_params.py +18 -0
  22. prelude_python_sdk-0.10.0/src/prelude_python_sdk/types/notify_list_subscription_phone_numbers_response.py +50 -0
  23. prelude_python_sdk-0.10.0/src/prelude_python_sdk/types/notify_send_batch_params.py +50 -0
  24. prelude_python_sdk-0.10.0/src/prelude_python_sdk/types/notify_send_batch_response.py +84 -0
  25. prelude_python_sdk-0.10.0/src/prelude_python_sdk/types/notify_send_params.py +63 -0
  26. prelude_python_sdk-0.10.0/src/prelude_python_sdk/types/notify_send_response.py +46 -0
  27. prelude_python_sdk-0.10.0/tests/api_resources/test_notify.py +705 -0
  28. prelude_python_sdk-0.9.0/.release-please-manifest.json +0 -3
  29. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/.gitignore +0 -0
  30. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/CONTRIBUTING.md +0 -0
  31. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/LICENSE +0 -0
  32. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/SECURITY.md +0 -0
  33. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/bin/check-release-environment +0 -0
  34. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/bin/publish-pypi +0 -0
  35. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/examples/.keep +0 -0
  36. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/noxfile.py +0 -0
  37. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/release-please-config.json +0 -0
  38. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/src/prelude/lib/.keep +0 -0
  39. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/src/prelude_python_sdk/__init__.py +0 -0
  40. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/src/prelude_python_sdk/_base_client.py +0 -0
  41. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/src/prelude_python_sdk/_compat.py +0 -0
  42. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/src/prelude_python_sdk/_constants.py +0 -0
  43. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/src/prelude_python_sdk/_exceptions.py +0 -0
  44. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/src/prelude_python_sdk/_files.py +0 -0
  45. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/src/prelude_python_sdk/_models.py +0 -0
  46. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/src/prelude_python_sdk/_qs.py +0 -0
  47. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/src/prelude_python_sdk/_resource.py +0 -0
  48. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/src/prelude_python_sdk/_response.py +0 -0
  49. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/src/prelude_python_sdk/_types.py +0 -0
  50. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/src/prelude_python_sdk/_utils/__init__.py +0 -0
  51. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/src/prelude_python_sdk/_utils/_compat.py +0 -0
  52. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/src/prelude_python_sdk/_utils/_datetime_parse.py +0 -0
  53. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/src/prelude_python_sdk/_utils/_logs.py +0 -0
  54. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/src/prelude_python_sdk/_utils/_proxy.py +0 -0
  55. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/src/prelude_python_sdk/_utils/_reflection.py +0 -0
  56. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/src/prelude_python_sdk/_utils/_resources_proxy.py +0 -0
  57. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/src/prelude_python_sdk/_utils/_streams.py +0 -0
  58. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/src/prelude_python_sdk/_utils/_sync.py +0 -0
  59. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/src/prelude_python_sdk/_utils/_transform.py +0 -0
  60. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/src/prelude_python_sdk/_utils/_typing.py +0 -0
  61. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/src/prelude_python_sdk/_utils/_utils.py +0 -0
  62. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/src/prelude_python_sdk/lib/.keep +0 -0
  63. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/src/prelude_python_sdk/py.typed +0 -0
  64. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/src/prelude_python_sdk/resources/lookup.py +0 -0
  65. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/src/prelude_python_sdk/resources/transactional.py +0 -0
  66. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/src/prelude_python_sdk/resources/verification.py +0 -0
  67. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/src/prelude_python_sdk/resources/verification_management.py +0 -0
  68. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/src/prelude_python_sdk/resources/watch.py +0 -0
  69. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/src/prelude_python_sdk/types/lookup_lookup_params.py +0 -0
  70. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/src/prelude_python_sdk/types/lookup_lookup_response.py +0 -0
  71. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/src/prelude_python_sdk/types/transactional_send_params.py +0 -0
  72. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/src/prelude_python_sdk/types/transactional_send_response.py +0 -0
  73. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/src/prelude_python_sdk/types/verification_check_params.py +0 -0
  74. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/src/prelude_python_sdk/types/verification_check_response.py +0 -0
  75. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/src/prelude_python_sdk/types/verification_create_params.py +0 -0
  76. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/src/prelude_python_sdk/types/verification_create_response.py +0 -0
  77. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/src/prelude_python_sdk/types/verification_management_delete_phone_number_params.py +0 -0
  78. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/src/prelude_python_sdk/types/verification_management_delete_phone_number_response.py +0 -0
  79. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/src/prelude_python_sdk/types/verification_management_list_phone_numbers_response.py +0 -0
  80. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/src/prelude_python_sdk/types/verification_management_list_sender_ids_response.py +0 -0
  81. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/src/prelude_python_sdk/types/verification_management_set_phone_number_params.py +0 -0
  82. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/src/prelude_python_sdk/types/verification_management_set_phone_number_response.py +0 -0
  83. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/src/prelude_python_sdk/types/verification_management_submit_sender_id_params.py +0 -0
  84. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/src/prelude_python_sdk/types/verification_management_submit_sender_id_response.py +0 -0
  85. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/src/prelude_python_sdk/types/watch_predict_params.py +0 -0
  86. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/src/prelude_python_sdk/types/watch_predict_response.py +0 -0
  87. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/src/prelude_python_sdk/types/watch_send_events_params.py +0 -0
  88. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/src/prelude_python_sdk/types/watch_send_events_response.py +0 -0
  89. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/src/prelude_python_sdk/types/watch_send_feedbacks_params.py +0 -0
  90. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/src/prelude_python_sdk/types/watch_send_feedbacks_response.py +0 -0
  91. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/src/prelude_sdk/lib/.keep +0 -0
  92. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/tests/__init__.py +0 -0
  93. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/tests/api_resources/__init__.py +0 -0
  94. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/tests/api_resources/test_lookup.py +0 -0
  95. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/tests/api_resources/test_transactional.py +0 -0
  96. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/tests/api_resources/test_verification.py +0 -0
  97. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/tests/api_resources/test_verification_management.py +0 -0
  98. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/tests/api_resources/test_watch.py +0 -0
  99. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/tests/conftest.py +0 -0
  100. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/tests/sample_file.txt +0 -0
  101. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/tests/test_client.py +0 -0
  102. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/tests/test_deepcopy.py +0 -0
  103. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/tests/test_extract_files.py +0 -0
  104. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/tests/test_files.py +0 -0
  105. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/tests/test_models.py +0 -0
  106. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/tests/test_qs.py +0 -0
  107. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/tests/test_required_args.py +0 -0
  108. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/tests/test_response.py +0 -0
  109. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/tests/test_streaming.py +0 -0
  110. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/tests/test_transform.py +0 -0
  111. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/tests/test_utils/test_datetime_parse.py +0 -0
  112. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/tests/test_utils/test_proxy.py +0 -0
  113. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/tests/test_utils/test_typing.py +0 -0
  114. {prelude_python_sdk-0.9.0 → prelude_python_sdk-0.10.0}/tests/utils.py +0 -0
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "0.10.0"
3
+ }
@@ -1,5 +1,26 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.10.0 (2025-12-05)
4
+
5
+ Full Changelog: [v0.9.0...v0.10.0](https://github.com/prelude-so/python-sdk/compare/v0.9.0...v0.10.0)
6
+
7
+ ### Features
8
+
9
+ * **api:** add Notify API methods ([c7a7b20](https://github.com/prelude-so/python-sdk/commit/c7a7b20977b74d76362e4aad805be06b7618f652))
10
+
11
+
12
+ ### Bug Fixes
13
+
14
+ * ensure streams are always closed ([b16816e](https://github.com/prelude-so/python-sdk/commit/b16816e137cdbe2814625782094d929f0c98705c))
15
+
16
+
17
+ ### Chores
18
+
19
+ * **deps:** mypy 1.18.1 has a regression, pin to 1.17 ([e2e5272](https://github.com/prelude-so/python-sdk/commit/e2e5272322db24cc9faa0b7176cefcc81e3daf48))
20
+ * **docs:** use environment variables for authentication in code snippets ([1d08cda](https://github.com/prelude-so/python-sdk/commit/1d08cda0dfca3a9e0adb3f548f6a4275bfc44efa))
21
+ * **internal:** codegen related update ([469e780](https://github.com/prelude-so/python-sdk/commit/469e7805bc68624a0768e1403c1fc637b256a698))
22
+ * update lockfile ([2ff2aee](https://github.com/prelude-so/python-sdk/commit/2ff2aee46c7b89093cdcd43dd293e9dc6f101ada))
23
+
3
24
  ## 0.9.0 (2025-11-17)
4
25
 
5
26
  Full Changelog: [v0.8.0...v0.9.0](https://github.com/prelude-so/python-sdk/compare/v0.8.0...v0.9.0)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: prelude-python-sdk
3
- Version: 0.9.0
3
+ Version: 0.10.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
@@ -18,6 +18,7 @@ Classifier: Programming Language :: Python :: 3.10
18
18
  Classifier: Programming Language :: Python :: 3.11
19
19
  Classifier: Programming Language :: Python :: 3.12
20
20
  Classifier: Programming Language :: Python :: 3.13
21
+ Classifier: Programming Language :: Python :: 3.14
21
22
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
22
23
  Classifier: Typing :: Typed
23
24
  Requires-Python: >=3.9
@@ -123,6 +124,7 @@ pip install prelude-python-sdk[aiohttp]
123
124
  Then you can enable it by instantiating the client with `http_client=DefaultAioHttpClient()`:
124
125
 
125
126
  ```python
127
+ import os
126
128
  import asyncio
127
129
  from prelude_python_sdk import DefaultAioHttpClient
128
130
  from prelude_python_sdk import AsyncPrelude
@@ -130,7 +132,7 @@ from prelude_python_sdk import AsyncPrelude
130
132
 
131
133
  async def main() -> None:
132
134
  async with AsyncPrelude(
133
- api_token="My API Token",
135
+ api_token=os.environ.get("API_TOKEN"), # This is the default and can be omitted
134
136
  http_client=DefaultAioHttpClient(),
135
137
  ) as client:
136
138
  verification = await client.verification.create(
@@ -89,6 +89,7 @@ pip install prelude-python-sdk[aiohttp]
89
89
  Then you can enable it by instantiating the client with `http_client=DefaultAioHttpClient()`:
90
90
 
91
91
  ```python
92
+ import os
92
93
  import asyncio
93
94
  from prelude_python_sdk import DefaultAioHttpClient
94
95
  from prelude_python_sdk import AsyncPrelude
@@ -96,7 +97,7 @@ from prelude_python_sdk import AsyncPrelude
96
97
 
97
98
  async def main() -> None:
98
99
  async with AsyncPrelude(
99
- api_token="My API Token",
100
+ api_token=os.environ.get("API_TOKEN"), # This is the default and can be omitted
100
101
  http_client=DefaultAioHttpClient(),
101
102
  ) as client:
102
103
  verification = await client.verification.create(
@@ -10,6 +10,32 @@ Methods:
10
10
 
11
11
  - <code title="get /v2/lookup/{phone_number}">client.lookup.<a href="./src/prelude_python_sdk/resources/lookup.py">lookup</a>(phone_number, \*\*<a href="src/prelude_python_sdk/types/lookup_lookup_params.py">params</a>) -> <a href="./src/prelude_python_sdk/types/lookup_lookup_response.py">LookupLookupResponse</a></code>
12
12
 
13
+ # Notify
14
+
15
+ Types:
16
+
17
+ ```python
18
+ from prelude_python_sdk.types import (
19
+ NotifyGetSubscriptionConfigResponse,
20
+ NotifyGetSubscriptionPhoneNumberResponse,
21
+ NotifyListSubscriptionConfigsResponse,
22
+ NotifyListSubscriptionPhoneNumberEventsResponse,
23
+ NotifyListSubscriptionPhoneNumbersResponse,
24
+ NotifySendResponse,
25
+ NotifySendBatchResponse,
26
+ )
27
+ ```
28
+
29
+ Methods:
30
+
31
+ - <code title="get /v2/notify/management/subscriptions/{config_id}">client.notify.<a href="./src/prelude_python_sdk/resources/notify.py">get_subscription_config</a>(config_id) -> <a href="./src/prelude_python_sdk/types/notify_get_subscription_config_response.py">NotifyGetSubscriptionConfigResponse</a></code>
32
+ - <code title="get /v2/notify/management/subscriptions/{config_id}/phone_numbers/{phone_number}">client.notify.<a href="./src/prelude_python_sdk/resources/notify.py">get_subscription_phone_number</a>(phone_number, \*, config_id) -> <a href="./src/prelude_python_sdk/types/notify_get_subscription_phone_number_response.py">NotifyGetSubscriptionPhoneNumberResponse</a></code>
33
+ - <code title="get /v2/notify/management/subscriptions">client.notify.<a href="./src/prelude_python_sdk/resources/notify.py">list_subscription_configs</a>(\*\*<a href="src/prelude_python_sdk/types/notify_list_subscription_configs_params.py">params</a>) -> <a href="./src/prelude_python_sdk/types/notify_list_subscription_configs_response.py">NotifyListSubscriptionConfigsResponse</a></code>
34
+ - <code title="get /v2/notify/management/subscriptions/{config_id}/phone_numbers/{phone_number}/events">client.notify.<a href="./src/prelude_python_sdk/resources/notify.py">list_subscription_phone_number_events</a>(phone_number, \*, config_id, \*\*<a href="src/prelude_python_sdk/types/notify_list_subscription_phone_number_events_params.py">params</a>) -> <a href="./src/prelude_python_sdk/types/notify_list_subscription_phone_number_events_response.py">NotifyListSubscriptionPhoneNumberEventsResponse</a></code>
35
+ - <code title="get /v2/notify/management/subscriptions/{config_id}/phone_numbers">client.notify.<a href="./src/prelude_python_sdk/resources/notify.py">list_subscription_phone_numbers</a>(config_id, \*\*<a href="src/prelude_python_sdk/types/notify_list_subscription_phone_numbers_params.py">params</a>) -> <a href="./src/prelude_python_sdk/types/notify_list_subscription_phone_numbers_response.py">NotifyListSubscriptionPhoneNumbersResponse</a></code>
36
+ - <code title="post /v2/notify">client.notify.<a href="./src/prelude_python_sdk/resources/notify.py">send</a>(\*\*<a href="src/prelude_python_sdk/types/notify_send_params.py">params</a>) -> <a href="./src/prelude_python_sdk/types/notify_send_response.py">NotifySendResponse</a></code>
37
+ - <code title="post /v2/notify/batch">client.notify.<a href="./src/prelude_python_sdk/resources/notify.py">send_batch</a>(\*\*<a href="src/prelude_python_sdk/types/notify_send_batch_params.py">params</a>) -> <a href="./src/prelude_python_sdk/types/notify_send_batch_response.py">NotifySendBatchResponse</a></code>
38
+
13
39
  # Transactional
14
40
 
15
41
  Types:
@@ -1,20 +1,22 @@
1
1
  [project]
2
2
  name = "prelude-python-sdk"
3
- version = "0.9.0"
3
+ version = "0.10.0"
4
4
  description = "The official Python library for the Prelude API"
5
5
  dynamic = ["readme"]
6
6
  license = "Apache-2.0"
7
7
  authors = [
8
8
  { name = "Prelude", email = "hello@prelude.so" },
9
9
  ]
10
+
10
11
  dependencies = [
11
- "httpx>=0.23.0, <1",
12
- "pydantic>=1.9.0, <3",
13
- "typing-extensions>=4.10, <5",
14
- "anyio>=3.5.0, <5",
15
- "distro>=1.7.0, <2",
16
- "sniffio",
12
+ "httpx>=0.23.0, <1",
13
+ "pydantic>=1.9.0, <3",
14
+ "typing-extensions>=4.10, <5",
15
+ "anyio>=3.5.0, <5",
16
+ "distro>=1.7.0, <2",
17
+ "sniffio",
17
18
  ]
19
+
18
20
  requires-python = ">= 3.9"
19
21
  classifiers = [
20
22
  "Typing :: Typed",
@@ -24,6 +26,7 @@ classifiers = [
24
26
  "Programming Language :: Python :: 3.11",
25
27
  "Programming Language :: Python :: 3.12",
26
28
  "Programming Language :: Python :: 3.13",
29
+ "Programming Language :: Python :: 3.14",
27
30
  "Operating System :: OS Independent",
28
31
  "Operating System :: POSIX",
29
32
  "Operating System :: MacOS",
@@ -45,7 +48,7 @@ managed = true
45
48
  # version pins are in requirements-dev.lock
46
49
  dev-dependencies = [
47
50
  "pyright==1.1.399",
48
- "mypy",
51
+ "mypy==1.17",
49
52
  "respx",
50
53
  "pytest",
51
54
  "pytest-asyncio",
@@ -12,40 +12,45 @@
12
12
  -e file:.
13
13
  aiohappyeyeballs==2.6.1
14
14
  # via aiohttp
15
- aiohttp==3.12.8
15
+ aiohttp==3.13.2
16
16
  # via httpx-aiohttp
17
17
  # via prelude-python-sdk
18
- aiosignal==1.3.2
18
+ aiosignal==1.4.0
19
19
  # via aiohttp
20
- annotated-types==0.6.0
20
+ annotated-types==0.7.0
21
21
  # via pydantic
22
- anyio==4.4.0
22
+ anyio==4.12.0
23
23
  # via httpx
24
24
  # via prelude-python-sdk
25
- argcomplete==3.1.2
25
+ argcomplete==3.6.3
26
26
  # via nox
27
27
  async-timeout==5.0.1
28
28
  # via aiohttp
29
- attrs==25.3.0
29
+ attrs==25.4.0
30
30
  # via aiohttp
31
- certifi==2023.7.22
31
+ # via nox
32
+ backports-asyncio-runner==1.2.0
33
+ # via pytest-asyncio
34
+ certifi==2025.11.12
32
35
  # via httpcore
33
36
  # via httpx
34
- colorlog==6.7.0
37
+ colorlog==6.10.1
38
+ # via nox
39
+ dependency-groups==1.3.1
35
40
  # via nox
36
- dirty-equals==0.6.0
37
- distlib==0.3.7
41
+ dirty-equals==0.11
42
+ distlib==0.4.0
38
43
  # via virtualenv
39
- distro==1.8.0
44
+ distro==1.9.0
40
45
  # via prelude-python-sdk
41
- exceptiongroup==1.2.2
46
+ exceptiongroup==1.3.1
42
47
  # via anyio
43
48
  # via pytest
44
- execnet==2.1.1
49
+ execnet==2.1.2
45
50
  # via pytest-xdist
46
- filelock==3.12.4
51
+ filelock==3.19.1
47
52
  # via virtualenv
48
- frozenlist==1.6.2
53
+ frozenlist==1.8.0
49
54
  # via aiohttp
50
55
  # via aiosignal
51
56
  h11==0.16.0
@@ -58,80 +63,87 @@ httpx==0.28.1
58
63
  # via respx
59
64
  httpx-aiohttp==0.1.9
60
65
  # via prelude-python-sdk
61
- idna==3.4
66
+ humanize==4.13.0
67
+ # via nox
68
+ idna==3.11
62
69
  # via anyio
63
70
  # via httpx
64
71
  # via yarl
65
- importlib-metadata==7.0.0
66
- iniconfig==2.0.0
72
+ importlib-metadata==8.7.0
73
+ iniconfig==2.1.0
67
74
  # via pytest
68
75
  markdown-it-py==3.0.0
69
76
  # via rich
70
77
  mdurl==0.1.2
71
78
  # via markdown-it-py
72
- multidict==6.4.4
79
+ multidict==6.7.0
73
80
  # via aiohttp
74
81
  # via yarl
75
- mypy==1.14.1
76
- mypy-extensions==1.0.0
82
+ mypy==1.17.0
83
+ mypy-extensions==1.1.0
77
84
  # via mypy
78
- nodeenv==1.8.0
85
+ nodeenv==1.9.1
79
86
  # via pyright
80
- nox==2023.4.22
81
- packaging==23.2
87
+ nox==2025.11.12
88
+ packaging==25.0
89
+ # via dependency-groups
82
90
  # via nox
83
91
  # via pytest
84
- platformdirs==3.11.0
92
+ pathspec==0.12.1
93
+ # via mypy
94
+ platformdirs==4.4.0
85
95
  # via virtualenv
86
- pluggy==1.5.0
96
+ pluggy==1.6.0
87
97
  # via pytest
88
- propcache==0.3.1
98
+ propcache==0.4.1
89
99
  # via aiohttp
90
100
  # via yarl
91
- pydantic==2.11.9
101
+ pydantic==2.12.5
92
102
  # via prelude-python-sdk
93
- pydantic-core==2.33.2
103
+ pydantic-core==2.41.5
94
104
  # via pydantic
95
- pygments==2.18.0
105
+ pygments==2.19.2
106
+ # via pytest
96
107
  # via rich
97
108
  pyright==1.1.399
98
- pytest==8.3.3
109
+ pytest==8.4.2
99
110
  # via pytest-asyncio
100
111
  # via pytest-xdist
101
- pytest-asyncio==0.24.0
102
- pytest-xdist==3.7.0
103
- python-dateutil==2.8.2
112
+ pytest-asyncio==1.2.0
113
+ pytest-xdist==3.8.0
114
+ python-dateutil==2.9.0.post0
104
115
  # via time-machine
105
- pytz==2023.3.post1
106
- # via dirty-equals
107
116
  respx==0.22.0
108
- rich==13.7.1
109
- ruff==0.9.4
110
- setuptools==68.2.2
111
- # via nodeenv
112
- six==1.16.0
117
+ rich==14.2.0
118
+ ruff==0.14.7
119
+ six==1.17.0
113
120
  # via python-dateutil
114
- sniffio==1.3.0
115
- # via anyio
121
+ sniffio==1.3.1
116
122
  # via prelude-python-sdk
117
- time-machine==2.9.0
118
- tomli==2.0.2
123
+ time-machine==2.19.0
124
+ tomli==2.3.0
125
+ # via dependency-groups
119
126
  # via mypy
127
+ # via nox
120
128
  # via pytest
121
- typing-extensions==4.12.2
129
+ typing-extensions==4.15.0
130
+ # via aiosignal
122
131
  # via anyio
132
+ # via exceptiongroup
123
133
  # via multidict
124
134
  # via mypy
125
135
  # via prelude-python-sdk
126
136
  # via pydantic
127
137
  # via pydantic-core
128
138
  # via pyright
139
+ # via pytest-asyncio
129
140
  # via typing-inspection
130
- typing-inspection==0.4.1
141
+ # via virtualenv
142
+ typing-inspection==0.4.2
131
143
  # via pydantic
132
- virtualenv==20.24.5
144
+ virtualenv==20.35.4
133
145
  # via nox
134
- yarl==1.20.0
146
+ yarl==1.22.0
135
147
  # via aiohttp
136
- zipp==3.17.0
148
+ zipp==3.23.0
137
149
  # via importlib-metadata
@@ -12,28 +12,28 @@
12
12
  -e file:.
13
13
  aiohappyeyeballs==2.6.1
14
14
  # via aiohttp
15
- aiohttp==3.12.8
15
+ aiohttp==3.13.2
16
16
  # via httpx-aiohttp
17
17
  # via prelude-python-sdk
18
- aiosignal==1.3.2
18
+ aiosignal==1.4.0
19
19
  # via aiohttp
20
- annotated-types==0.6.0
20
+ annotated-types==0.7.0
21
21
  # via pydantic
22
- anyio==4.4.0
22
+ anyio==4.12.0
23
23
  # via httpx
24
24
  # via prelude-python-sdk
25
25
  async-timeout==5.0.1
26
26
  # via aiohttp
27
- attrs==25.3.0
27
+ attrs==25.4.0
28
28
  # via aiohttp
29
- certifi==2023.7.22
29
+ certifi==2025.11.12
30
30
  # via httpcore
31
31
  # via httpx
32
- distro==1.8.0
32
+ distro==1.9.0
33
33
  # via prelude-python-sdk
34
- exceptiongroup==1.2.2
34
+ exceptiongroup==1.3.1
35
35
  # via anyio
36
- frozenlist==1.6.2
36
+ frozenlist==1.8.0
37
37
  # via aiohttp
38
38
  # via aiosignal
39
39
  h11==0.16.0
@@ -45,31 +45,32 @@ httpx==0.28.1
45
45
  # via prelude-python-sdk
46
46
  httpx-aiohttp==0.1.9
47
47
  # via prelude-python-sdk
48
- idna==3.4
48
+ idna==3.11
49
49
  # via anyio
50
50
  # via httpx
51
51
  # via yarl
52
- multidict==6.4.4
52
+ multidict==6.7.0
53
53
  # via aiohttp
54
54
  # via yarl
55
- propcache==0.3.1
55
+ propcache==0.4.1
56
56
  # via aiohttp
57
57
  # via yarl
58
- pydantic==2.11.9
58
+ pydantic==2.12.5
59
59
  # via prelude-python-sdk
60
- pydantic-core==2.33.2
60
+ pydantic-core==2.41.5
61
61
  # via pydantic
62
- sniffio==1.3.0
63
- # via anyio
62
+ sniffio==1.3.1
64
63
  # via prelude-python-sdk
65
- typing-extensions==4.12.2
64
+ typing-extensions==4.15.0
65
+ # via aiosignal
66
66
  # via anyio
67
+ # via exceptiongroup
67
68
  # via multidict
68
69
  # via prelude-python-sdk
69
70
  # via pydantic
70
71
  # via pydantic-core
71
72
  # via typing-inspection
72
- typing-inspection==0.4.1
73
+ typing-inspection==0.4.2
73
74
  # via pydantic
74
- yarl==1.20.0
75
+ yarl==1.22.0
75
76
  # via aiohttp
@@ -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, verification_management
24
+ from .resources import watch, lookup, notify, 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 (
@@ -35,6 +35,7 @@ __all__ = ["Timeout", "Transport", "ProxiesTypes", "RequestOptions", "Prelude",
35
35
 
36
36
  class Prelude(SyncAPIClient):
37
37
  lookup: lookup.LookupResource
38
+ notify: notify.NotifyResource
38
39
  transactional: transactional.TransactionalResource
39
40
  verification: verification.VerificationResource
40
41
  verification_management: verification_management.VerificationManagementResource
@@ -97,6 +98,7 @@ class Prelude(SyncAPIClient):
97
98
  )
98
99
 
99
100
  self.lookup = lookup.LookupResource(self)
101
+ self.notify = notify.NotifyResource(self)
100
102
  self.transactional = transactional.TransactionalResource(self)
101
103
  self.verification = verification.VerificationResource(self)
102
104
  self.verification_management = verification_management.VerificationManagementResource(self)
@@ -211,6 +213,7 @@ class Prelude(SyncAPIClient):
211
213
 
212
214
  class AsyncPrelude(AsyncAPIClient):
213
215
  lookup: lookup.AsyncLookupResource
216
+ notify: notify.AsyncNotifyResource
214
217
  transactional: transactional.AsyncTransactionalResource
215
218
  verification: verification.AsyncVerificationResource
216
219
  verification_management: verification_management.AsyncVerificationManagementResource
@@ -273,6 +276,7 @@ class AsyncPrelude(AsyncAPIClient):
273
276
  )
274
277
 
275
278
  self.lookup = lookup.AsyncLookupResource(self)
279
+ self.notify = notify.AsyncNotifyResource(self)
276
280
  self.transactional = transactional.AsyncTransactionalResource(self)
277
281
  self.verification = verification.AsyncVerificationResource(self)
278
282
  self.verification_management = verification_management.AsyncVerificationManagementResource(self)
@@ -388,6 +392,7 @@ class AsyncPrelude(AsyncAPIClient):
388
392
  class PreludeWithRawResponse:
389
393
  def __init__(self, client: Prelude) -> None:
390
394
  self.lookup = lookup.LookupResourceWithRawResponse(client.lookup)
395
+ self.notify = notify.NotifyResourceWithRawResponse(client.notify)
391
396
  self.transactional = transactional.TransactionalResourceWithRawResponse(client.transactional)
392
397
  self.verification = verification.VerificationResourceWithRawResponse(client.verification)
393
398
  self.verification_management = verification_management.VerificationManagementResourceWithRawResponse(
@@ -399,6 +404,7 @@ class PreludeWithRawResponse:
399
404
  class AsyncPreludeWithRawResponse:
400
405
  def __init__(self, client: AsyncPrelude) -> None:
401
406
  self.lookup = lookup.AsyncLookupResourceWithRawResponse(client.lookup)
407
+ self.notify = notify.AsyncNotifyResourceWithRawResponse(client.notify)
402
408
  self.transactional = transactional.AsyncTransactionalResourceWithRawResponse(client.transactional)
403
409
  self.verification = verification.AsyncVerificationResourceWithRawResponse(client.verification)
404
410
  self.verification_management = verification_management.AsyncVerificationManagementResourceWithRawResponse(
@@ -410,6 +416,7 @@ class AsyncPreludeWithRawResponse:
410
416
  class PreludeWithStreamedResponse:
411
417
  def __init__(self, client: Prelude) -> None:
412
418
  self.lookup = lookup.LookupResourceWithStreamingResponse(client.lookup)
419
+ self.notify = notify.NotifyResourceWithStreamingResponse(client.notify)
413
420
  self.transactional = transactional.TransactionalResourceWithStreamingResponse(client.transactional)
414
421
  self.verification = verification.VerificationResourceWithStreamingResponse(client.verification)
415
422
  self.verification_management = verification_management.VerificationManagementResourceWithStreamingResponse(
@@ -421,6 +428,7 @@ class PreludeWithStreamedResponse:
421
428
  class AsyncPreludeWithStreamedResponse:
422
429
  def __init__(self, client: AsyncPrelude) -> None:
423
430
  self.lookup = lookup.AsyncLookupResourceWithStreamingResponse(client.lookup)
431
+ self.notify = notify.AsyncNotifyResourceWithStreamingResponse(client.notify)
424
432
  self.transactional = transactional.AsyncTransactionalResourceWithStreamingResponse(client.transactional)
425
433
  self.verification = verification.AsyncVerificationResourceWithStreamingResponse(client.verification)
426
434
  self.verification_management = verification_management.AsyncVerificationManagementResourceWithStreamingResponse(
@@ -54,11 +54,12 @@ class Stream(Generic[_T]):
54
54
  process_data = self._client._process_response_data
55
55
  iterator = self._iter_events()
56
56
 
57
- for sse in iterator:
58
- yield process_data(data=sse.json(), cast_to=cast_to, response=response)
59
-
60
- # As we might not fully consume the response stream, we need to close it explicitly
61
- response.close()
57
+ try:
58
+ for sse in iterator:
59
+ yield process_data(data=sse.json(), cast_to=cast_to, response=response)
60
+ finally:
61
+ # Ensure the response is closed even if the consumer doesn't read all data
62
+ response.close()
62
63
 
63
64
  def __enter__(self) -> Self:
64
65
  return self
@@ -117,11 +118,12 @@ class AsyncStream(Generic[_T]):
117
118
  process_data = self._client._process_response_data
118
119
  iterator = self._iter_events()
119
120
 
120
- async for sse in iterator:
121
- yield process_data(data=sse.json(), cast_to=cast_to, response=response)
122
-
123
- # As we might not fully consume the response stream, we need to close it explicitly
124
- await response.aclose()
121
+ try:
122
+ async for sse in iterator:
123
+ yield process_data(data=sse.json(), cast_to=cast_to, response=response)
124
+ finally:
125
+ # Ensure the response is closed even if the consumer doesn't read all data
126
+ await response.aclose()
125
127
 
126
128
  async def __aenter__(self) -> Self:
127
129
  return self
@@ -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.9.0" # x-release-please-version
4
+ __version__ = "0.10.0" # x-release-please-version
@@ -16,6 +16,14 @@ from .lookup import (
16
16
  LookupResourceWithStreamingResponse,
17
17
  AsyncLookupResourceWithStreamingResponse,
18
18
  )
19
+ from .notify import (
20
+ NotifyResource,
21
+ AsyncNotifyResource,
22
+ NotifyResourceWithRawResponse,
23
+ AsyncNotifyResourceWithRawResponse,
24
+ NotifyResourceWithStreamingResponse,
25
+ AsyncNotifyResourceWithStreamingResponse,
26
+ )
19
27
  from .verification import (
20
28
  VerificationResource,
21
29
  AsyncVerificationResource,
@@ -48,6 +56,12 @@ __all__ = [
48
56
  "AsyncLookupResourceWithRawResponse",
49
57
  "LookupResourceWithStreamingResponse",
50
58
  "AsyncLookupResourceWithStreamingResponse",
59
+ "NotifyResource",
60
+ "AsyncNotifyResource",
61
+ "NotifyResourceWithRawResponse",
62
+ "AsyncNotifyResourceWithRawResponse",
63
+ "NotifyResourceWithStreamingResponse",
64
+ "AsyncNotifyResourceWithStreamingResponse",
51
65
  "TransactionalResource",
52
66
  "AsyncTransactionalResource",
53
67
  "TransactionalResourceWithRawResponse",