prelude-python-sdk 0.2.0__tar.gz → 0.3.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 (93) hide show
  1. prelude_python_sdk-0.3.0/.release-please-manifest.json +3 -0
  2. {prelude_python_sdk-0.2.0 → prelude_python_sdk-0.3.0}/CHANGELOG.md +31 -0
  3. {prelude_python_sdk-0.2.0 → prelude_python_sdk-0.3.0}/PKG-INFO +3 -4
  4. {prelude_python_sdk-0.2.0 → prelude_python_sdk-0.3.0}/api.md +19 -2
  5. prelude_python_sdk-0.3.0/bin/publish-pypi +6 -0
  6. {prelude_python_sdk-0.2.0 → prelude_python_sdk-0.3.0}/pyproject.toml +2 -4
  7. {prelude_python_sdk-0.2.0 → prelude_python_sdk-0.3.0}/requirements-dev.lock +1 -0
  8. {prelude_python_sdk-0.2.0 → prelude_python_sdk-0.3.0}/requirements.lock +1 -0
  9. {prelude_python_sdk-0.2.0 → prelude_python_sdk-0.3.0}/src/prelude_python_sdk/_client.py +9 -1
  10. {prelude_python_sdk-0.2.0 → prelude_python_sdk-0.3.0}/src/prelude_python_sdk/_models.py +6 -3
  11. {prelude_python_sdk-0.2.0 → prelude_python_sdk-0.3.0}/src/prelude_python_sdk/_utils/_transform.py +47 -2
  12. {prelude_python_sdk-0.2.0 → prelude_python_sdk-0.3.0}/src/prelude_python_sdk/_utils/_typing.py +2 -0
  13. {prelude_python_sdk-0.2.0 → prelude_python_sdk-0.3.0}/src/prelude_python_sdk/_version.py +1 -1
  14. {prelude_python_sdk-0.2.0 → prelude_python_sdk-0.3.0}/src/prelude_python_sdk/resources/__init__.py +14 -0
  15. prelude_python_sdk-0.3.0/src/prelude_python_sdk/resources/lookup.py +199 -0
  16. {prelude_python_sdk-0.2.0 → prelude_python_sdk-0.3.0}/src/prelude_python_sdk/resources/verification.py +20 -2
  17. {prelude_python_sdk-0.2.0 → prelude_python_sdk-0.3.0}/src/prelude_python_sdk/resources/watch.py +157 -80
  18. {prelude_python_sdk-0.2.0 → prelude_python_sdk-0.3.0}/src/prelude_python_sdk/types/__init__.py +6 -2
  19. prelude_python_sdk-0.3.0/src/prelude_python_sdk/types/lookup_lookup_params.py +17 -0
  20. prelude_python_sdk-0.3.0/src/prelude_python_sdk/types/lookup_lookup_response.py +116 -0
  21. {prelude_python_sdk-0.2.0 → prelude_python_sdk-0.3.0}/src/prelude_python_sdk/types/verification_create_params.py +15 -4
  22. prelude_python_sdk-0.3.0/src/prelude_python_sdk/types/watch_predict_params.py +77 -0
  23. prelude_python_sdk-0.3.0/src/prelude_python_sdk/types/watch_predict_response.py +21 -0
  24. prelude_python_sdk-0.3.0/src/prelude_python_sdk/types/watch_send_events_params.py +32 -0
  25. prelude_python_sdk-0.3.0/src/prelude_python_sdk/types/watch_send_events_response.py +18 -0
  26. prelude_python_sdk-0.3.0/src/prelude_python_sdk/types/watch_send_feedbacks_params.py +86 -0
  27. prelude_python_sdk-0.3.0/src/prelude_python_sdk/types/watch_send_feedbacks_response.py +18 -0
  28. prelude_python_sdk-0.3.0/tests/api_resources/test_lookup.py +114 -0
  29. {prelude_python_sdk-0.2.0 → prelude_python_sdk-0.3.0}/tests/api_resources/test_verification.py +4 -2
  30. prelude_python_sdk-0.3.0/tests/api_resources/test_watch.py +376 -0
  31. {prelude_python_sdk-0.2.0 → prelude_python_sdk-0.3.0}/tests/test_client.py +1 -1
  32. {prelude_python_sdk-0.2.0 → prelude_python_sdk-0.3.0}/tests/test_models.py +32 -0
  33. {prelude_python_sdk-0.2.0 → prelude_python_sdk-0.3.0}/tests/test_transform.py +20 -1
  34. prelude_python_sdk-0.2.0/.release-please-manifest.json +0 -3
  35. prelude_python_sdk-0.2.0/bin/publish-pypi +0 -9
  36. prelude_python_sdk-0.2.0/src/prelude_python_sdk/types/watch_feed_back_params.py +0 -38
  37. prelude_python_sdk-0.2.0/src/prelude_python_sdk/types/watch_feed_back_response.py +0 -11
  38. prelude_python_sdk-0.2.0/src/prelude_python_sdk/types/watch_predict_params.py +0 -48
  39. prelude_python_sdk-0.2.0/src/prelude_python_sdk/types/watch_predict_response.py +0 -29
  40. prelude_python_sdk-0.2.0/tests/api_resources/test_watch.py +0 -223
  41. {prelude_python_sdk-0.2.0 → prelude_python_sdk-0.3.0}/.gitignore +0 -0
  42. {prelude_python_sdk-0.2.0 → prelude_python_sdk-0.3.0}/CONTRIBUTING.md +0 -0
  43. {prelude_python_sdk-0.2.0 → prelude_python_sdk-0.3.0}/LICENSE +0 -0
  44. {prelude_python_sdk-0.2.0 → prelude_python_sdk-0.3.0}/README.md +0 -0
  45. {prelude_python_sdk-0.2.0 → prelude_python_sdk-0.3.0}/SECURITY.md +0 -0
  46. {prelude_python_sdk-0.2.0 → prelude_python_sdk-0.3.0}/bin/check-release-environment +0 -0
  47. {prelude_python_sdk-0.2.0 → prelude_python_sdk-0.3.0}/examples/.keep +0 -0
  48. {prelude_python_sdk-0.2.0 → prelude_python_sdk-0.3.0}/mypy.ini +0 -0
  49. {prelude_python_sdk-0.2.0 → prelude_python_sdk-0.3.0}/noxfile.py +0 -0
  50. {prelude_python_sdk-0.2.0 → prelude_python_sdk-0.3.0}/release-please-config.json +0 -0
  51. {prelude_python_sdk-0.2.0 → prelude_python_sdk-0.3.0}/src/prelude/lib/.keep +0 -0
  52. {prelude_python_sdk-0.2.0 → prelude_python_sdk-0.3.0}/src/prelude_python_sdk/__init__.py +0 -0
  53. {prelude_python_sdk-0.2.0 → prelude_python_sdk-0.3.0}/src/prelude_python_sdk/_base_client.py +0 -0
  54. {prelude_python_sdk-0.2.0 → prelude_python_sdk-0.3.0}/src/prelude_python_sdk/_compat.py +0 -0
  55. {prelude_python_sdk-0.2.0 → prelude_python_sdk-0.3.0}/src/prelude_python_sdk/_constants.py +0 -0
  56. {prelude_python_sdk-0.2.0 → prelude_python_sdk-0.3.0}/src/prelude_python_sdk/_exceptions.py +0 -0
  57. {prelude_python_sdk-0.2.0 → prelude_python_sdk-0.3.0}/src/prelude_python_sdk/_files.py +0 -0
  58. {prelude_python_sdk-0.2.0 → prelude_python_sdk-0.3.0}/src/prelude_python_sdk/_qs.py +0 -0
  59. {prelude_python_sdk-0.2.0 → prelude_python_sdk-0.3.0}/src/prelude_python_sdk/_resource.py +0 -0
  60. {prelude_python_sdk-0.2.0 → prelude_python_sdk-0.3.0}/src/prelude_python_sdk/_response.py +0 -0
  61. {prelude_python_sdk-0.2.0 → prelude_python_sdk-0.3.0}/src/prelude_python_sdk/_streaming.py +0 -0
  62. {prelude_python_sdk-0.2.0 → prelude_python_sdk-0.3.0}/src/prelude_python_sdk/_types.py +0 -0
  63. {prelude_python_sdk-0.2.0 → prelude_python_sdk-0.3.0}/src/prelude_python_sdk/_utils/__init__.py +0 -0
  64. {prelude_python_sdk-0.2.0 → prelude_python_sdk-0.3.0}/src/prelude_python_sdk/_utils/_logs.py +0 -0
  65. {prelude_python_sdk-0.2.0 → prelude_python_sdk-0.3.0}/src/prelude_python_sdk/_utils/_proxy.py +0 -0
  66. {prelude_python_sdk-0.2.0 → prelude_python_sdk-0.3.0}/src/prelude_python_sdk/_utils/_reflection.py +0 -0
  67. {prelude_python_sdk-0.2.0 → prelude_python_sdk-0.3.0}/src/prelude_python_sdk/_utils/_streams.py +0 -0
  68. {prelude_python_sdk-0.2.0 → prelude_python_sdk-0.3.0}/src/prelude_python_sdk/_utils/_sync.py +0 -0
  69. {prelude_python_sdk-0.2.0 → prelude_python_sdk-0.3.0}/src/prelude_python_sdk/_utils/_utils.py +0 -0
  70. {prelude_python_sdk-0.2.0 → prelude_python_sdk-0.3.0}/src/prelude_python_sdk/lib/.keep +0 -0
  71. {prelude_python_sdk-0.2.0 → prelude_python_sdk-0.3.0}/src/prelude_python_sdk/py.typed +0 -0
  72. {prelude_python_sdk-0.2.0 → prelude_python_sdk-0.3.0}/src/prelude_python_sdk/resources/transactional.py +0 -0
  73. {prelude_python_sdk-0.2.0 → prelude_python_sdk-0.3.0}/src/prelude_python_sdk/types/transactional_send_params.py +0 -0
  74. {prelude_python_sdk-0.2.0 → prelude_python_sdk-0.3.0}/src/prelude_python_sdk/types/transactional_send_response.py +0 -0
  75. {prelude_python_sdk-0.2.0 → prelude_python_sdk-0.3.0}/src/prelude_python_sdk/types/verification_check_params.py +0 -0
  76. {prelude_python_sdk-0.2.0 → prelude_python_sdk-0.3.0}/src/prelude_python_sdk/types/verification_check_response.py +0 -0
  77. {prelude_python_sdk-0.2.0 → prelude_python_sdk-0.3.0}/src/prelude_python_sdk/types/verification_create_response.py +0 -0
  78. {prelude_python_sdk-0.2.0 → prelude_python_sdk-0.3.0}/src/prelude_sdk/lib/.keep +0 -0
  79. {prelude_python_sdk-0.2.0 → prelude_python_sdk-0.3.0}/tests/__init__.py +0 -0
  80. {prelude_python_sdk-0.2.0 → prelude_python_sdk-0.3.0}/tests/api_resources/__init__.py +0 -0
  81. {prelude_python_sdk-0.2.0 → prelude_python_sdk-0.3.0}/tests/api_resources/test_transactional.py +0 -0
  82. {prelude_python_sdk-0.2.0 → prelude_python_sdk-0.3.0}/tests/conftest.py +0 -0
  83. {prelude_python_sdk-0.2.0 → prelude_python_sdk-0.3.0}/tests/sample_file.txt +0 -0
  84. {prelude_python_sdk-0.2.0 → prelude_python_sdk-0.3.0}/tests/test_deepcopy.py +0 -0
  85. {prelude_python_sdk-0.2.0 → prelude_python_sdk-0.3.0}/tests/test_extract_files.py +0 -0
  86. {prelude_python_sdk-0.2.0 → prelude_python_sdk-0.3.0}/tests/test_files.py +0 -0
  87. {prelude_python_sdk-0.2.0 → prelude_python_sdk-0.3.0}/tests/test_qs.py +0 -0
  88. {prelude_python_sdk-0.2.0 → prelude_python_sdk-0.3.0}/tests/test_required_args.py +0 -0
  89. {prelude_python_sdk-0.2.0 → prelude_python_sdk-0.3.0}/tests/test_response.py +0 -0
  90. {prelude_python_sdk-0.2.0 → prelude_python_sdk-0.3.0}/tests/test_streaming.py +0 -0
  91. {prelude_python_sdk-0.2.0 → prelude_python_sdk-0.3.0}/tests/test_utils/test_proxy.py +0 -0
  92. {prelude_python_sdk-0.2.0 → prelude_python_sdk-0.3.0}/tests/test_utils/test_typing.py +0 -0
  93. {prelude_python_sdk-0.2.0 → prelude_python_sdk-0.3.0}/tests/utils.py +0 -0
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "0.3.0"
3
+ }
@@ -1,5 +1,36 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.3.0 (2025-04-11)
4
+
5
+ Full Changelog: [v0.2.0...v0.3.0](https://github.com/prelude-so/python-sdk/compare/v0.2.0...v0.3.0)
6
+
7
+ ### Features
8
+
9
+ * **api:** update via SDK Studio ([e8db40d](https://github.com/prelude-so/python-sdk/commit/e8db40d0c6bb7ed120d01c7a5133e84611fa2dc5))
10
+ * **api:** update via SDK Studio ([2738f74](https://github.com/prelude-so/python-sdk/commit/2738f749089da145689c78aabdedf810d3329826))
11
+
12
+
13
+ ### Bug Fixes
14
+
15
+ * **ci:** ensure pip is always available ([#81](https://github.com/prelude-so/python-sdk/issues/81)) ([3496a08](https://github.com/prelude-so/python-sdk/commit/3496a088c4a51ff9755df7d5537031d2b66224b8))
16
+ * **ci:** remove publishing patch ([#82](https://github.com/prelude-so/python-sdk/issues/82)) ([00fa879](https://github.com/prelude-so/python-sdk/commit/00fa8799dc14bc3d2dae941485f2e3a24bfb2bf3))
17
+ * **perf:** optimize some hot paths ([6203988](https://github.com/prelude-so/python-sdk/commit/6203988ff6273cfe5135ec7d427c620a1094f6a1))
18
+ * **perf:** skip traversing types for NotGiven values ([e5a8fd5](https://github.com/prelude-so/python-sdk/commit/e5a8fd59dd7168e68ff026e9d11d796e3d002241))
19
+ * **types:** handle more discriminated union shapes ([#80](https://github.com/prelude-so/python-sdk/issues/80)) ([716195b](https://github.com/prelude-so/python-sdk/commit/716195b1874b4ec76cd39465810e3500c756eae8))
20
+
21
+
22
+ ### Chores
23
+
24
+ * fix typos ([#83](https://github.com/prelude-so/python-sdk/issues/83)) ([ab98ad3](https://github.com/prelude-so/python-sdk/commit/ab98ad32961298cf1a2f47e6b3cc66a9f69cddbc))
25
+ * **internal:** bump rye to 0.44.0 ([#78](https://github.com/prelude-so/python-sdk/issues/78)) ([436ceca](https://github.com/prelude-so/python-sdk/commit/436ceca01c22fd4015010d5bd3852ce319d0ed65))
26
+ * **internal:** codegen related update ([#79](https://github.com/prelude-so/python-sdk/issues/79)) ([e5e9c6d](https://github.com/prelude-so/python-sdk/commit/e5e9c6d643232cad96a285dd7dc662f98684fbdc))
27
+ * **internal:** expand CI branch coverage ([#87](https://github.com/prelude-so/python-sdk/issues/87)) ([3edb1aa](https://github.com/prelude-so/python-sdk/commit/3edb1aab16d2b38705d64969e9ac70fe00951ee6))
28
+ * **internal:** reduce CI branch coverage ([70118ea](https://github.com/prelude-so/python-sdk/commit/70118ea5611c2f4337b21ac7da52a740bc52d7ff))
29
+ * **internal:** remove extra empty newlines ([#76](https://github.com/prelude-so/python-sdk/issues/76)) ([3e52319](https://github.com/prelude-so/python-sdk/commit/3e5231901ad7bcc6e06a4c82aeaa619f759434f7))
30
+ * **internal:** remove trailing character ([#84](https://github.com/prelude-so/python-sdk/issues/84)) ([526b990](https://github.com/prelude-so/python-sdk/commit/526b990f47cf42a44064d85ed2d8f9acbe35a609))
31
+ * **internal:** slight transform perf improvement ([#85](https://github.com/prelude-so/python-sdk/issues/85)) ([b77e93b](https://github.com/prelude-so/python-sdk/commit/b77e93ba797273dd8a145183d9b9c712659163cd))
32
+ * **tests:** improve enum examples ([#86](https://github.com/prelude-so/python-sdk/issues/86)) ([140d696](https://github.com/prelude-so/python-sdk/commit/140d6966a00666b4ade42fef7de7ec701cf697d3))
33
+
3
34
  ## 0.2.0 (2025-03-11)
4
35
 
5
36
  Full Changelog: [v0.1.0...v0.2.0](https://github.com/prelude-so/python-sdk/compare/v0.1.0...v0.2.0)
@@ -1,12 +1,11 @@
1
- Metadata-Version: 2.4
1
+ Metadata-Version: 2.3
2
2
  Name: prelude-python-sdk
3
- Version: 0.2.0
3
+ Version: 0.3.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
7
7
  Author-email: Prelude <hello@prelude.so>
8
- License-Expression: Apache-2.0
9
- License-File: LICENSE
8
+ License: Apache-2.0
10
9
  Classifier: Intended Audience :: Developers
11
10
  Classifier: License :: OSI Approved :: Apache Software License
12
11
  Classifier: Operating System :: MacOS
@@ -1,3 +1,15 @@
1
+ # Lookup
2
+
3
+ Types:
4
+
5
+ ```python
6
+ from prelude_python_sdk.types import LookupLookupResponse
7
+ ```
8
+
9
+ Methods:
10
+
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
+
1
13
  # Transactional
2
14
 
3
15
  Types:
@@ -28,10 +40,15 @@ Methods:
28
40
  Types:
29
41
 
30
42
  ```python
31
- from prelude_python_sdk.types import WatchFeedBackResponse, WatchPredictResponse
43
+ from prelude_python_sdk.types import (
44
+ WatchPredictResponse,
45
+ WatchSendEventsResponse,
46
+ WatchSendFeedbacksResponse,
47
+ )
32
48
  ```
33
49
 
34
50
  Methods:
35
51
 
36
- - <code title="post /v2/watch/feedback">client.watch.<a href="./src/prelude_python_sdk/resources/watch.py">feed_back</a>(\*\*<a href="src/prelude_python_sdk/types/watch_feed_back_params.py">params</a>) -> <a href="./src/prelude_python_sdk/types/watch_feed_back_response.py">WatchFeedBackResponse</a></code>
37
52
  - <code title="post /v2/watch/predict">client.watch.<a href="./src/prelude_python_sdk/resources/watch.py">predict</a>(\*\*<a href="src/prelude_python_sdk/types/watch_predict_params.py">params</a>) -> <a href="./src/prelude_python_sdk/types/watch_predict_response.py">WatchPredictResponse</a></code>
53
+ - <code title="post /v2/watch/event">client.watch.<a href="./src/prelude_python_sdk/resources/watch.py">send_events</a>(\*\*<a href="src/prelude_python_sdk/types/watch_send_events_params.py">params</a>) -> <a href="./src/prelude_python_sdk/types/watch_send_events_response.py">WatchSendEventsResponse</a></code>
54
+ - <code title="post /v2/watch/feedback">client.watch.<a href="./src/prelude_python_sdk/resources/watch.py">send_feedbacks</a>(\*\*<a href="src/prelude_python_sdk/types/watch_send_feedbacks_params.py">params</a>) -> <a href="./src/prelude_python_sdk/types/watch_send_feedbacks_response.py">WatchSendFeedbacksResponse</a></code>
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env bash
2
+
3
+ set -eux
4
+ mkdir -p dist
5
+ rye build --clean
6
+ rye publish --yes --token=$PYPI_TOKEN
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "prelude-python-sdk"
3
- version = "0.2.0"
3
+ version = "0.3.0"
4
4
  description = "The official Python library for the Prelude API"
5
5
  dynamic = ["readme"]
6
6
  license = "Apache-2.0"
@@ -38,7 +38,6 @@ Homepage = "https://github.com/prelude-so/python-sdk"
38
38
  Repository = "https://github.com/prelude-so/python-sdk"
39
39
 
40
40
 
41
-
42
41
  [tool.rye]
43
42
  managed = true
44
43
  # version pins are in requirements-dev.lock
@@ -87,7 +86,7 @@ typecheck = { chain = [
87
86
  "typecheck:mypy" = "mypy ."
88
87
 
89
88
  [build-system]
90
- requires = ["hatchling", "hatch-fancy-pypi-readme"]
89
+ requires = ["hatchling==1.26.3", "hatch-fancy-pypi-readme"]
91
90
  build-backend = "hatchling.build"
92
91
 
93
92
  [tool.hatch.build]
@@ -152,7 +151,6 @@ reportImplicitOverride = true
152
151
  reportImportCycles = false
153
152
  reportPrivateUsage = false
154
153
 
155
-
156
154
  [tool.ruff]
157
155
  line-length = 120
158
156
  output-format = "grouped"
@@ -7,6 +7,7 @@
7
7
  # all-features: true
8
8
  # with-sources: false
9
9
  # generate-hashes: false
10
+ # universal: false
10
11
 
11
12
  -e file:.
12
13
  annotated-types==0.6.0
@@ -7,6 +7,7 @@
7
7
  # all-features: true
8
8
  # with-sources: false
9
9
  # generate-hashes: false
10
+ # universal: false
10
11
 
11
12
  -e file:.
12
13
  annotated-types==0.6.0
@@ -24,7 +24,7 @@ from ._utils import (
24
24
  get_async_library,
25
25
  )
26
26
  from ._version import __version__
27
- from .resources import watch, verification, transactional
27
+ from .resources import watch, lookup, verification, transactional
28
28
  from ._streaming import Stream as Stream, AsyncStream as AsyncStream
29
29
  from ._exceptions import PreludeError, APIStatusError
30
30
  from ._base_client import (
@@ -37,6 +37,7 @@ __all__ = ["Timeout", "Transport", "ProxiesTypes", "RequestOptions", "Prelude",
37
37
 
38
38
 
39
39
  class Prelude(SyncAPIClient):
40
+ lookup: lookup.LookupResource
40
41
  transactional: transactional.TransactionalResource
41
42
  verification: verification.VerificationResource
42
43
  watch: watch.WatchResource
@@ -97,6 +98,7 @@ class Prelude(SyncAPIClient):
97
98
  _strict_response_validation=_strict_response_validation,
98
99
  )
99
100
 
101
+ self.lookup = lookup.LookupResource(self)
100
102
  self.transactional = transactional.TransactionalResource(self)
101
103
  self.verification = verification.VerificationResource(self)
102
104
  self.watch = watch.WatchResource(self)
@@ -209,6 +211,7 @@ class Prelude(SyncAPIClient):
209
211
 
210
212
 
211
213
  class AsyncPrelude(AsyncAPIClient):
214
+ lookup: lookup.AsyncLookupResource
212
215
  transactional: transactional.AsyncTransactionalResource
213
216
  verification: verification.AsyncVerificationResource
214
217
  watch: watch.AsyncWatchResource
@@ -269,6 +272,7 @@ class AsyncPrelude(AsyncAPIClient):
269
272
  _strict_response_validation=_strict_response_validation,
270
273
  )
271
274
 
275
+ self.lookup = lookup.AsyncLookupResource(self)
272
276
  self.transactional = transactional.AsyncTransactionalResource(self)
273
277
  self.verification = verification.AsyncVerificationResource(self)
274
278
  self.watch = watch.AsyncWatchResource(self)
@@ -382,6 +386,7 @@ class AsyncPrelude(AsyncAPIClient):
382
386
 
383
387
  class PreludeWithRawResponse:
384
388
  def __init__(self, client: Prelude) -> None:
389
+ self.lookup = lookup.LookupResourceWithRawResponse(client.lookup)
385
390
  self.transactional = transactional.TransactionalResourceWithRawResponse(client.transactional)
386
391
  self.verification = verification.VerificationResourceWithRawResponse(client.verification)
387
392
  self.watch = watch.WatchResourceWithRawResponse(client.watch)
@@ -389,6 +394,7 @@ class PreludeWithRawResponse:
389
394
 
390
395
  class AsyncPreludeWithRawResponse:
391
396
  def __init__(self, client: AsyncPrelude) -> None:
397
+ self.lookup = lookup.AsyncLookupResourceWithRawResponse(client.lookup)
392
398
  self.transactional = transactional.AsyncTransactionalResourceWithRawResponse(client.transactional)
393
399
  self.verification = verification.AsyncVerificationResourceWithRawResponse(client.verification)
394
400
  self.watch = watch.AsyncWatchResourceWithRawResponse(client.watch)
@@ -396,6 +402,7 @@ class AsyncPreludeWithRawResponse:
396
402
 
397
403
  class PreludeWithStreamedResponse:
398
404
  def __init__(self, client: Prelude) -> None:
405
+ self.lookup = lookup.LookupResourceWithStreamingResponse(client.lookup)
399
406
  self.transactional = transactional.TransactionalResourceWithStreamingResponse(client.transactional)
400
407
  self.verification = verification.VerificationResourceWithStreamingResponse(client.verification)
401
408
  self.watch = watch.WatchResourceWithStreamingResponse(client.watch)
@@ -403,6 +410,7 @@ class PreludeWithStreamedResponse:
403
410
 
404
411
  class AsyncPreludeWithStreamedResponse:
405
412
  def __init__(self, client: AsyncPrelude) -> None:
413
+ self.lookup = lookup.AsyncLookupResourceWithStreamingResponse(client.lookup)
406
414
  self.transactional = transactional.AsyncTransactionalResourceWithStreamingResponse(client.transactional)
407
415
  self.verification = verification.AsyncVerificationResourceWithStreamingResponse(client.verification)
408
416
  self.watch = watch.AsyncWatchResourceWithStreamingResponse(client.watch)
@@ -65,7 +65,7 @@ from ._compat import (
65
65
  from ._constants import RAW_RESPONSE_HEADER
66
66
 
67
67
  if TYPE_CHECKING:
68
- from pydantic_core.core_schema import ModelField, LiteralSchema, ModelFieldsSchema
68
+ from pydantic_core.core_schema import ModelField, ModelSchema, LiteralSchema, ModelFieldsSchema
69
69
 
70
70
  __all__ = ["BaseModel", "GenericModel"]
71
71
 
@@ -646,15 +646,18 @@ def _build_discriminated_union_meta(*, union: type, meta_annotations: tuple[Any,
646
646
 
647
647
  def _extract_field_schema_pv2(model: type[BaseModel], field_name: str) -> ModelField | None:
648
648
  schema = model.__pydantic_core_schema__
649
+ if schema["type"] == "definitions":
650
+ schema = schema["schema"]
651
+
649
652
  if schema["type"] != "model":
650
653
  return None
651
654
 
655
+ schema = cast("ModelSchema", schema)
652
656
  fields_schema = schema["schema"]
653
657
  if fields_schema["type"] != "model-fields":
654
658
  return None
655
659
 
656
660
  fields_schema = cast("ModelFieldsSchema", fields_schema)
657
-
658
661
  field = fields_schema["fields"].get(field_name)
659
662
  if not field:
660
663
  return None
@@ -678,7 +681,7 @@ def set_pydantic_config(typ: Any, config: pydantic.ConfigDict) -> None:
678
681
  setattr(typ, "__pydantic_config__", config) # noqa: B010
679
682
 
680
683
 
681
- # our use of subclasssing here causes weirdness for type checkers,
684
+ # our use of subclassing here causes weirdness for type checkers,
682
685
  # so we just pretend that we don't subclass
683
686
  if TYPE_CHECKING:
684
687
  GenericModel = BaseModel
@@ -5,13 +5,15 @@ import base64
5
5
  import pathlib
6
6
  from typing import Any, Mapping, TypeVar, cast
7
7
  from datetime import date, datetime
8
- from typing_extensions import Literal, get_args, override, get_type_hints
8
+ from typing_extensions import Literal, get_args, override, get_type_hints as _get_type_hints
9
9
 
10
10
  import anyio
11
11
  import pydantic
12
12
 
13
13
  from ._utils import (
14
14
  is_list,
15
+ is_given,
16
+ lru_cache,
15
17
  is_mapping,
16
18
  is_iterable,
17
19
  )
@@ -108,6 +110,7 @@ def transform(
108
110
  return cast(_T, transformed)
109
111
 
110
112
 
113
+ @lru_cache(maxsize=8096)
111
114
  def _get_annotated_type(type_: type) -> type | None:
112
115
  """If the given type is an `Annotated` type then it is returned, if not `None` is returned.
113
116
 
@@ -126,7 +129,7 @@ def _get_annotated_type(type_: type) -> type | None:
126
129
  def _maybe_transform_key(key: str, type_: type) -> str:
127
130
  """Transform the given `data` based on the annotations provided in `type_`.
128
131
 
129
- Note: this function only looks at `Annotated` types that contain `PropertInfo` metadata.
132
+ Note: this function only looks at `Annotated` types that contain `PropertyInfo` metadata.
130
133
  """
131
134
  annotated_type = _get_annotated_type(type_)
132
135
  if annotated_type is None:
@@ -142,6 +145,10 @@ def _maybe_transform_key(key: str, type_: type) -> str:
142
145
  return key
143
146
 
144
147
 
148
+ def _no_transform_needed(annotation: type) -> bool:
149
+ return annotation == float or annotation == int
150
+
151
+
145
152
  def _transform_recursive(
146
153
  data: object,
147
154
  *,
@@ -184,6 +191,15 @@ def _transform_recursive(
184
191
  return cast(object, data)
185
192
 
186
193
  inner_type = extract_type_arg(stripped_type, 0)
194
+ if _no_transform_needed(inner_type):
195
+ # for some types there is no need to transform anything, so we can get a small
196
+ # perf boost from skipping that work.
197
+ #
198
+ # but we still need to convert to a list to ensure the data is json-serializable
199
+ if is_list(data):
200
+ return data
201
+ return list(data)
202
+
187
203
  return [_transform_recursive(d, annotation=annotation, inner_type=inner_type) for d in data]
188
204
 
189
205
  if is_union_type(stripped_type):
@@ -245,6 +261,11 @@ def _transform_typeddict(
245
261
  result: dict[str, object] = {}
246
262
  annotations = get_type_hints(expected_type, include_extras=True)
247
263
  for key, value in data.items():
264
+ if not is_given(value):
265
+ # we don't need to include `NotGiven` values here as they'll
266
+ # be stripped out before the request is sent anyway
267
+ continue
268
+
248
269
  type_ = annotations.get(key)
249
270
  if type_ is None:
250
271
  # we do not have a type annotation for this field, leave it as is
@@ -332,6 +353,15 @@ async def _async_transform_recursive(
332
353
  return cast(object, data)
333
354
 
334
355
  inner_type = extract_type_arg(stripped_type, 0)
356
+ if _no_transform_needed(inner_type):
357
+ # for some types there is no need to transform anything, so we can get a small
358
+ # perf boost from skipping that work.
359
+ #
360
+ # but we still need to convert to a list to ensure the data is json-serializable
361
+ if is_list(data):
362
+ return data
363
+ return list(data)
364
+
335
365
  return [await _async_transform_recursive(d, annotation=annotation, inner_type=inner_type) for d in data]
336
366
 
337
367
  if is_union_type(stripped_type):
@@ -393,6 +423,11 @@ async def _async_transform_typeddict(
393
423
  result: dict[str, object] = {}
394
424
  annotations = get_type_hints(expected_type, include_extras=True)
395
425
  for key, value in data.items():
426
+ if not is_given(value):
427
+ # we don't need to include `NotGiven` values here as they'll
428
+ # be stripped out before the request is sent anyway
429
+ continue
430
+
396
431
  type_ = annotations.get(key)
397
432
  if type_ is None:
398
433
  # we do not have a type annotation for this field, leave it as is
@@ -400,3 +435,13 @@ async def _async_transform_typeddict(
400
435
  else:
401
436
  result[_maybe_transform_key(key, type_)] = await _async_transform_recursive(value, annotation=type_)
402
437
  return result
438
+
439
+
440
+ @lru_cache(maxsize=8096)
441
+ def get_type_hints(
442
+ obj: Any,
443
+ globalns: dict[str, Any] | None = None,
444
+ localns: Mapping[str, Any] | None = None,
445
+ include_extras: bool = False,
446
+ ) -> dict[str, Any]:
447
+ return _get_type_hints(obj, globalns=globalns, localns=localns, include_extras=include_extras)
@@ -13,6 +13,7 @@ from typing_extensions import (
13
13
  get_origin,
14
14
  )
15
15
 
16
+ from ._utils import lru_cache
16
17
  from .._types import InheritsGeneric
17
18
  from .._compat import is_union as _is_union
18
19
 
@@ -66,6 +67,7 @@ def is_type_alias_type(tp: Any, /) -> TypeIs[typing_extensions.TypeAliasType]:
66
67
 
67
68
 
68
69
  # Extracts T from Annotated[T, ...] or from Required[Annotated[T, ...]]
70
+ @lru_cache(maxsize=8096)
69
71
  def strip_annotated_type(typ: type) -> type:
70
72
  if is_required_type(typ) or is_annotated_type(typ):
71
73
  return strip_annotated_type(cast(type, get_args(typ)[0]))
@@ -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.2.0" # x-release-please-version
4
+ __version__ = "0.3.0" # x-release-please-version
@@ -8,6 +8,14 @@ from .watch import (
8
8
  WatchResourceWithStreamingResponse,
9
9
  AsyncWatchResourceWithStreamingResponse,
10
10
  )
11
+ from .lookup import (
12
+ LookupResource,
13
+ AsyncLookupResource,
14
+ LookupResourceWithRawResponse,
15
+ AsyncLookupResourceWithRawResponse,
16
+ LookupResourceWithStreamingResponse,
17
+ AsyncLookupResourceWithStreamingResponse,
18
+ )
11
19
  from .verification import (
12
20
  VerificationResource,
13
21
  AsyncVerificationResource,
@@ -26,6 +34,12 @@ from .transactional import (
26
34
  )
27
35
 
28
36
  __all__ = [
37
+ "LookupResource",
38
+ "AsyncLookupResource",
39
+ "LookupResourceWithRawResponse",
40
+ "AsyncLookupResourceWithRawResponse",
41
+ "LookupResourceWithStreamingResponse",
42
+ "AsyncLookupResourceWithStreamingResponse",
29
43
  "TransactionalResource",
30
44
  "AsyncTransactionalResource",
31
45
  "TransactionalResourceWithRawResponse",
@@ -0,0 +1,199 @@
1
+ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import List
6
+ from typing_extensions import Literal
7
+
8
+ import httpx
9
+
10
+ from ..types import lookup_lookup_params
11
+ from .._types import NOT_GIVEN, Body, Query, Headers, NotGiven
12
+ from .._utils import (
13
+ maybe_transform,
14
+ async_maybe_transform,
15
+ )
16
+ from .._compat import cached_property
17
+ from .._resource import SyncAPIResource, AsyncAPIResource
18
+ from .._response import (
19
+ to_raw_response_wrapper,
20
+ to_streamed_response_wrapper,
21
+ async_to_raw_response_wrapper,
22
+ async_to_streamed_response_wrapper,
23
+ )
24
+ from .._base_client import make_request_options
25
+ from ..types.lookup_lookup_response import LookupLookupResponse
26
+
27
+ __all__ = ["LookupResource", "AsyncLookupResource"]
28
+
29
+
30
+ class LookupResource(SyncAPIResource):
31
+ @cached_property
32
+ def with_raw_response(self) -> LookupResourceWithRawResponse:
33
+ """
34
+ This property can be used as a prefix for any HTTP method call to return
35
+ the raw response object instead of the parsed content.
36
+
37
+ For more information, see https://www.github.com/prelude-so/python-sdk#accessing-raw-response-data-eg-headers
38
+ """
39
+ return LookupResourceWithRawResponse(self)
40
+
41
+ @cached_property
42
+ def with_streaming_response(self) -> LookupResourceWithStreamingResponse:
43
+ """
44
+ An alternative to `.with_raw_response` that doesn't eagerly read the response body.
45
+
46
+ For more information, see https://www.github.com/prelude-so/python-sdk#with_streaming_response
47
+ """
48
+ return LookupResourceWithStreamingResponse(self)
49
+
50
+ def lookup(
51
+ self,
52
+ phone_number: str,
53
+ *,
54
+ type: List[Literal["cnam"]] | NotGiven = NOT_GIVEN,
55
+ # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
56
+ # The extra values given here take precedence over values defined on the client or passed to this method.
57
+ extra_headers: Headers | None = None,
58
+ extra_query: Query | None = None,
59
+ extra_body: Body | None = None,
60
+ timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN,
61
+ ) -> LookupLookupResponse:
62
+ """
63
+ Retrieve detailed information about a phone number including carrier data, line
64
+ type, and portability status.
65
+
66
+ Args:
67
+ phone_number: An E.164 formatted phone number to look up.
68
+
69
+ type:
70
+ Optional features. Possible values are:
71
+
72
+ - `cnam` - Retrieve CNAM (Caller ID Name) along with other information. Contact
73
+ us if you need to use this functionality.
74
+
75
+ extra_headers: Send extra headers
76
+
77
+ extra_query: Add additional query parameters to the request
78
+
79
+ extra_body: Add additional JSON properties to the request
80
+
81
+ timeout: Override the client-level default timeout for this request, in seconds
82
+ """
83
+ if not phone_number:
84
+ raise ValueError(f"Expected a non-empty value for `phone_number` but received {phone_number!r}")
85
+ return self._get(
86
+ f"/v2/lookup/{phone_number}",
87
+ options=make_request_options(
88
+ extra_headers=extra_headers,
89
+ extra_query=extra_query,
90
+ extra_body=extra_body,
91
+ timeout=timeout,
92
+ query=maybe_transform({"type": type}, lookup_lookup_params.LookupLookupParams),
93
+ ),
94
+ cast_to=LookupLookupResponse,
95
+ )
96
+
97
+
98
+ class AsyncLookupResource(AsyncAPIResource):
99
+ @cached_property
100
+ def with_raw_response(self) -> AsyncLookupResourceWithRawResponse:
101
+ """
102
+ This property can be used as a prefix for any HTTP method call to return
103
+ the raw response object instead of the parsed content.
104
+
105
+ For more information, see https://www.github.com/prelude-so/python-sdk#accessing-raw-response-data-eg-headers
106
+ """
107
+ return AsyncLookupResourceWithRawResponse(self)
108
+
109
+ @cached_property
110
+ def with_streaming_response(self) -> AsyncLookupResourceWithStreamingResponse:
111
+ """
112
+ An alternative to `.with_raw_response` that doesn't eagerly read the response body.
113
+
114
+ For more information, see https://www.github.com/prelude-so/python-sdk#with_streaming_response
115
+ """
116
+ return AsyncLookupResourceWithStreamingResponse(self)
117
+
118
+ async def lookup(
119
+ self,
120
+ phone_number: str,
121
+ *,
122
+ type: List[Literal["cnam"]] | NotGiven = NOT_GIVEN,
123
+ # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
124
+ # The extra values given here take precedence over values defined on the client or passed to this method.
125
+ extra_headers: Headers | None = None,
126
+ extra_query: Query | None = None,
127
+ extra_body: Body | None = None,
128
+ timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN,
129
+ ) -> LookupLookupResponse:
130
+ """
131
+ Retrieve detailed information about a phone number including carrier data, line
132
+ type, and portability status.
133
+
134
+ Args:
135
+ phone_number: An E.164 formatted phone number to look up.
136
+
137
+ type:
138
+ Optional features. Possible values are:
139
+
140
+ - `cnam` - Retrieve CNAM (Caller ID Name) along with other information. Contact
141
+ us if you need to use this functionality.
142
+
143
+ extra_headers: Send extra headers
144
+
145
+ extra_query: Add additional query parameters to the request
146
+
147
+ extra_body: Add additional JSON properties to the request
148
+
149
+ timeout: Override the client-level default timeout for this request, in seconds
150
+ """
151
+ if not phone_number:
152
+ raise ValueError(f"Expected a non-empty value for `phone_number` but received {phone_number!r}")
153
+ return await self._get(
154
+ f"/v2/lookup/{phone_number}",
155
+ options=make_request_options(
156
+ extra_headers=extra_headers,
157
+ extra_query=extra_query,
158
+ extra_body=extra_body,
159
+ timeout=timeout,
160
+ query=await async_maybe_transform({"type": type}, lookup_lookup_params.LookupLookupParams),
161
+ ),
162
+ cast_to=LookupLookupResponse,
163
+ )
164
+
165
+
166
+ class LookupResourceWithRawResponse:
167
+ def __init__(self, lookup: LookupResource) -> None:
168
+ self._lookup = lookup
169
+
170
+ self.lookup = to_raw_response_wrapper(
171
+ lookup.lookup,
172
+ )
173
+
174
+
175
+ class AsyncLookupResourceWithRawResponse:
176
+ def __init__(self, lookup: AsyncLookupResource) -> None:
177
+ self._lookup = lookup
178
+
179
+ self.lookup = async_to_raw_response_wrapper(
180
+ lookup.lookup,
181
+ )
182
+
183
+
184
+ class LookupResourceWithStreamingResponse:
185
+ def __init__(self, lookup: LookupResource) -> None:
186
+ self._lookup = lookup
187
+
188
+ self.lookup = to_streamed_response_wrapper(
189
+ lookup.lookup,
190
+ )
191
+
192
+
193
+ class AsyncLookupResourceWithStreamingResponse:
194
+ def __init__(self, lookup: AsyncLookupResource) -> None:
195
+ self._lookup = lookup
196
+
197
+ self.lookup = async_to_streamed_response_wrapper(
198
+ lookup.lookup,
199
+ )