diff --git a/.genignore b/.genignore index 9d61a0ac..b3472289 100644 --- a/.genignore +++ b/.genignore @@ -1,7 +1,6 @@ -# https://www.speakeasyapi.dev/docs/customize-sdks/monkey-patching +# https://www.speakeasy.com/docs/customize/code/monkey-patching # ignore human-written files and directories -src/unstructured_client/_unstructured _jupyter _sample_docs _test_unstructured_client @@ -9,5 +8,3 @@ _test_unstructured_client # ignore Makefile Makefile -# Ignore the general.partition code until we can fix the base_url issue -src/unstructured_client/general.py diff --git a/.gitignore b/.gitignore index 214f57bf..32264e26 100755 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +.speakeasy/temp/ .speakeasy/reports .venv/ README-PYPI.md @@ -11,10 +12,8 @@ __pycache__/ # human-added igore files .ipynb_checkpoints/ .idea/ - .local *.ipynb - openapi.json openapi_client.json openapi_serverless.json diff --git a/.speakeasy/gen.lock b/.speakeasy/gen.lock index 1c555d20..5a22a1cb 100755 --- a/.speakeasy/gen.lock +++ b/.speakeasy/gen.lock @@ -3,10 +3,10 @@ id: 8b5fa338-9106-4734-abf0-e30d67044a90 management: docChecksum: 6433f28e5b70c3c0d7754fc7a88db327 docVersion: 1.1.7 - speakeasyVersion: 1.535.1 - generationVersion: 2.585.2 - releaseVersion: 0.33.1 - configChecksum: 8b5e7fbd95d040ba09964f3c97c3156a + speakeasyVersion: 1.537.0 + generationVersion: 2.588.0 + releaseVersion: 0.34.0 + configChecksum: 0ba814fcbe0d0489903de407d36313af repoURL: https://github.com/Unstructured-IO/unstructured-python-client.git repoSubDirectory: . installationURL: https://github.com/Unstructured-IO/unstructured-python-client.git @@ -16,7 +16,7 @@ features: acceptHeaders: 3.0.0 additionalDependencies: 1.0.0 constsAndDefaults: 1.0.5 - core: 5.14.0 + core: 5.15.0 defaultEnabledRetries: 0.2.0 enumUnions: 0.1.0 envVarSecurityUsage: 0.3.2 @@ -228,6 +228,7 @@ generatedFiles: - src/unstructured_client/_version.py - src/unstructured_client/basesdk.py - src/unstructured_client/destinations.py + - src/unstructured_client/general.py - src/unstructured_client/httpclient.py - src/unstructured_client/jobs.py - src/unstructured_client/models/__init__.py @@ -369,6 +370,7 @@ generatedFiles: - src/unstructured_client/types/basemodel.py - src/unstructured_client/utils/__init__.py - src/unstructured_client/utils/annotations.py + - src/unstructured_client/utils/datetimes.py - src/unstructured_client/utils/enums.py - src/unstructured_client/utils/eventstreaming.py - src/unstructured_client/utils/forms.py @@ -668,7 +670,7 @@ examples: "200": application/json: {"created_at": "2025-03-13T23:31:02.383Z", "id": "c3274f55-9861-4e4e-8526-4273aa4d2772", "status": "FAILURE"} "422": - application/json: {"detail": [{"loc": [""], "msg": "", "type": ""}, {"loc": [], "msg": "", "type": ""}, {"loc": [], "msg": "", "type": ""}]} + application/json: {"detail": ""} create_connection_check_sources: speakeasy-default-create-connection-check-sources: parameters: @@ -679,7 +681,7 @@ examples: "202": application/json: {"created_at": "2023-03-12T05:54:05.025Z", "id": "b5793adb-057f-470c-ae7e-309d786a99eb", "status": "SUCCESS"} "422": - application/json: {"detail": []} + application/json: {"detail": ""} get_connection_check_sources: speakeasy-default-get-connection-check-sources: parameters: @@ -690,6 +692,6 @@ examples: "200": application/json: {"created_at": "2023-09-12T00:38:55.692Z", "id": "f7d1d931-a753-4fe9-ae3f-671f188a9b55", "status": "SUCCESS"} "422": - application/json: {"detail": [{"loc": [""], "msg": "", "type": ""}, {"loc": [], "msg": "", "type": ""}]} + application/json: {"detail": ""} examplesVersion: 1.0.1 generatedTests: {} diff --git a/.speakeasy/workflow.lock b/.speakeasy/workflow.lock index 76866fdf..7d58570d 100644 --- a/.speakeasy/workflow.lock +++ b/.speakeasy/workflow.lock @@ -1,21 +1,21 @@ -speakeasyVersion: 1.535.1 +speakeasyVersion: 1.537.0 sources: my-source: sourceNamespace: my-source - sourceRevisionDigest: sha256:6771a944eaf5581cde4835c43e7997635f7d80ce441763c47cad9c305ba4a91e + sourceRevisionDigest: sha256:f5fa536ffbf6240b18b267193074d11564a899dd6fdee36261205b93c8f84880 sourceBlobDigest: sha256:521a1c7be485e2be9f33ff7b82566823e96827cb69f7ca7775e0dd3dcc52d825 tags: - latest - - speakeasy-sdk-regen-1745261613 + - speakeasy-sdk-regen-1745334275 - 1.1.7 targets: unstructured-python: source: my-source sourceNamespace: my-source - sourceRevisionDigest: sha256:6771a944eaf5581cde4835c43e7997635f7d80ce441763c47cad9c305ba4a91e + sourceRevisionDigest: sha256:f5fa536ffbf6240b18b267193074d11564a899dd6fdee36261205b93c8f84880 sourceBlobDigest: sha256:521a1c7be485e2be9f33ff7b82566823e96827cb69f7ca7775e0dd3dcc52d825 codeSamplesNamespace: my-source-code-samples - codeSamplesRevisionDigest: sha256:06bd35ef844f603c2c2357092fc875febff06f5c9eb855e262ff013b8935d8d6 + codeSamplesRevisionDigest: sha256:5940dadc286e702b4e23f58d1b7b536ffea4648a9f4f4a7ab650c6c107730a28 workflow: workflowVersion: 1.0.0 speakeasyVersion: latest diff --git a/RELEASES.md b/RELEASES.md index 34900c93..6ddac0c4 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -977,4 +977,14 @@ Based on: ### Generated - [python v0.33.1] . ### Releases -- [PyPI v0.33.1] https://pypi.org/project/unstructured-client/0.33.1 - . \ No newline at end of file +- [PyPI v0.33.1] https://pypi.org/project/unstructured-client/0.33.1 - . + +## 2025-04-22 15:11:11 +### Changes +Based on: +- OpenAPI Doc +- Speakeasy CLI 1.537.0 (2.588.0) https://github.com/speakeasy-api/speakeasy +### Generated +- [python v0.34.0] . +### Releases +- [PyPI v0.34.0] https://pypi.org/project/unstructured-client/0.34.0 - . \ No newline at end of file diff --git a/_test_unstructured_client/unit/test_custom_hooks.py b/_test_unstructured_client/unit/test_custom_hooks.py index 7659a57f..d36a3862 100644 --- a/_test_unstructured_client/unit/test_custom_hooks.py +++ b/_test_unstructured_client/unit/test_custom_hooks.py @@ -169,7 +169,7 @@ def mock_post(request): with pytest.raises(Exception): session.general.partition(request=req, retries=retries) - pattern = re.compile(f"Failed to process a request due to connection error .*? " + pattern = re.compile("Failed to process a request due to connection error .*? " "Attempting retry number 1 after sleep.") assert bool(pattern.search(caplog.text)) @@ -198,23 +198,20 @@ def test_unit_clean_server_url_fixes_malformed_paid_api_url(server_url: str): @pytest.mark.parametrize( - "server_url", + "server_url,expected_url", [ - # -- well-formed url -- - "http://localhost:8000", - # -- common malformed urls -- - "localhost:8000", - "localhost:8000/general/v0/general", - "http://localhost:8000/general/v0/general", + ("http://localhost:8000", "http://localhost:8000"), + ("localhost:8000", "http://localhost:8000"), + ("localhost:8000/general/v0/general", "http://localhost:8000/general/v0/general"), + ("http://localhost:8000/general/v0/general", "http://localhost:8000/general/v0/general"), ], ) -def test_unit_clean_server_url_fixes_malformed_localhost_url(server_url: str): +def test_unit_clean_server_url_fixes_non_unst_domain_url(server_url: str, expected_url: str): client = UnstructuredClient( server_url=server_url, api_key_auth=FAKE_KEY, ) - assert client.general.sdk_configuration.server_url == "http://localhost:8000" - + assert client.general.sdk_configuration.server_url == expected_url @pytest.mark.parametrize( "server_url", diff --git a/_test_unstructured_client/unit/test_request_utils.py b/_test_unstructured_client/unit/test_request_utils.py index 9910911f..72b7c04b 100644 --- a/_test_unstructured_client/unit/test_request_utils.py +++ b/_test_unstructured_client/unit/test_request_utils.py @@ -7,7 +7,6 @@ get_base_url, get_multipart_stream_fields, ) -from unstructured_client.models import shared # make the above test using @pytest.mark.parametrize diff --git a/_test_unstructured_client/unit/test_server_urls.py b/_test_unstructured_client/unit/test_server_urls.py index 0d0ab2c8..661dbc40 100644 --- a/_test_unstructured_client/unit/test_server_urls.py +++ b/_test_unstructured_client/unit/test_server_urls.py @@ -1,9 +1,7 @@ -import httpx import pytest - -from unstructured_client.models import operations -from unstructured_client import UnstructuredClient, basesdk, utils - +from dataclasses import dataclass +from unstructured_client import UnstructuredClient, utils +from typing import Optional # Raise one of these from our mock to return to the test code class BaseUrlCorrect(Exception): @@ -53,195 +51,229 @@ def mock_build_request(*args, base_url, **kwargs): return endpoint_method +@dataclass +class URLTestCase: + description: str + sdk_endpoint_name: str + # expected url when actually making the HTTP request in build_request + expected_url: str + # url when you init the client (global for all endpoints) + client_url: Optional[str] = None + # url when you init the SDK endpoint (vary per endpoint) + endpoint_url: Optional[str] = None +@pytest.mark.asyncio @pytest.mark.parametrize( - "sdk_endpoint_name", + "case", [ - ("general.partition"), - ], + URLTestCase( + description="non UNST domain client-level URL, no path", + sdk_endpoint_name="general.partition_async", + client_url="http://localhost:8000/", + endpoint_url=None, + expected_url="http://localhost:8000" + ), + URLTestCase( + description="non UNST domain client-level URL, with path", + sdk_endpoint_name="general.partition_async", + client_url="http://localhost:8000/my/endpoint/", + endpoint_url=None, + expected_url="http://localhost:8000/my/endpoint" + ), + URLTestCase( + description="non UNST domain endpoint-level URL, no path", + sdk_endpoint_name="general.partition_async", + client_url=None, + endpoint_url="http://localhost:8000/", + expected_url="http://localhost:8000" + ), + URLTestCase( + description="non UNST domain endpoint-level URL, with path", + sdk_endpoint_name="general.partition_async", + client_url=None, + endpoint_url="http://localhost:8000/my/endpoint/", + expected_url="http://localhost:8000/my/endpoint" + ), + URLTestCase( + description="UNST domain client-level URL, no path", + sdk_endpoint_name="general.partition_async", + client_url="https://unstructured-000mock.api.unstructuredapp.io", + endpoint_url=None, + expected_url="https://unstructured-000mock.api.unstructuredapp.io" + ), + URLTestCase( + description="UNST domain client-level URL, with path", + sdk_endpoint_name="general.partition_async", + client_url="https://unstructured-000mock.api.unstructuredapp.io/my/endpoint/", + endpoint_url=None, + expected_url="https://unstructured-000mock.api.unstructuredapp.io" + ), + URLTestCase( + description="UNST domain endpoint-level URL, no path", + sdk_endpoint_name="general.partition_async", + client_url=None, + endpoint_url="https://unstructured-000mock.api.unstructuredapp.io", + expected_url="https://unstructured-000mock.api.unstructuredapp.io" + ), + URLTestCase( + description="UNST domain endpoint-level URL, with path", + sdk_endpoint_name="general.partition_async", + client_url=None, + endpoint_url="https://unstructured-000mock.api.unstructuredapp.io/my/endpoint/", + expected_url="https://unstructured-000mock.api.unstructuredapp.io" + ), + URLTestCase( + description="default URL fallback", + sdk_endpoint_name="general.partition_async", + client_url=None, + endpoint_url=None, + expected_url="https://api.unstructuredapp.io" + ), + ] ) -def test_endpoint_uses_correct_url(monkeypatch, sdk_endpoint_name): - # Test 1 - # Pass server_url to the client, no path - s = UnstructuredClient(server_url="http://localhost:8000") - client_method = get_client_method_with_mock( - sdk_endpoint_name, - s, - "http://localhost:8000", - monkeypatch - ) - - try: - client_method(request={}) - except BaseUrlCorrect: - pass - except BaseUrlIncorrect as e: - pytest.fail(f"server_url was passed to client and ignored, got {e}") - - # Test 2 - # Pass server_url to the client, with path - s = UnstructuredClient(server_url="http://localhost:8000/my/endpoint") - client_method = get_client_method_with_mock( - sdk_endpoint_name, - s, - "http://localhost:8000", - monkeypatch - ) - - try: - client_method(request={}) - except BaseUrlCorrect: - pass - except BaseUrlIncorrect as e: - pytest.fail(f"server_url was passed to client and was not stripped, got {e}") - - # Test 3 - # Pass server_url to the endpoint, no path - s = UnstructuredClient() - client_method = get_client_method_with_mock( - sdk_endpoint_name, - s, - "http://localhost:8000", - monkeypatch - ) - - try: - client_method(request={}, server_url="http://localhost:8000") - except BaseUrlCorrect: - pass - except BaseUrlIncorrect as e: - pytest.fail(f"server_url was passed to endpoint and ignored, got {e}") - - # Test 4 - # Pass server_url to the endpoint, with path - s = UnstructuredClient() - client_method = get_client_method_with_mock( - sdk_endpoint_name, - s, - "http://localhost:8000", - monkeypatch - ) - - try: - client_method(request={}, server_url="http://localhost:8000/my/endpoint") - except BaseUrlCorrect: - pass - except BaseUrlIncorrect as e: - pytest.fail(f"server_url was passed to endpoint and ignored, got {e}") - - - # Test 5 - # No server_url, should take the default - server_url = "https://api.unstructuredapp.io" if "partition" in sdk_endpoint_name else "https://platform.unstructuredapp.io" +async def test_async_endpoint_uses_correct_url(monkeypatch, case: URLTestCase): + if case.client_url: + s = UnstructuredClient(server_url=case.client_url) + else: + s = UnstructuredClient() - s = UnstructuredClient() client_method = get_client_method_with_mock( - sdk_endpoint_name, + case.sdk_endpoint_name, s, - server_url, + case.expected_url, monkeypatch ) try: - client_method(request={}) + if case.endpoint_url: + await client_method(request={}, server_url=case.endpoint_url) + else: + await client_method(request={}) except BaseUrlCorrect: pass except BaseUrlIncorrect as e: - pytest.fail(f"Default url not used, got {e}") + pytest.fail( + f"{case.description}: Expected {case.expected_url}, got {e}" + ) -@pytest.mark.asyncio @pytest.mark.parametrize( - "sdk_endpoint_name", + "case", [ - ("general.partition_async"), - ], + URLTestCase( + description="non UNST domain client-level URL, no path", + sdk_endpoint_name="destinations.create_destination", + client_url="http://localhost:8000/", + endpoint_url=None, + expected_url="http://localhost:8000" + ), + URLTestCase( + description="non UNST domain client-level URL, with path", + sdk_endpoint_name="sources.create_source", + client_url="http://localhost:8000/my/endpoint/", + endpoint_url=None, + expected_url="http://localhost:8000/my/endpoint" + ), + URLTestCase( + description="non UNST domain endpoint-level URL, no path", + sdk_endpoint_name="jobs.get_job", + client_url=None, + endpoint_url="http://localhost:8000", + expected_url="http://localhost:8000" + ), + URLTestCase( + description="non UNST domain endpoint-level URL, with path", + sdk_endpoint_name="workflows.create_workflow", + client_url=None, + endpoint_url="http://localhost:8000/my/endpoint", + expected_url="http://localhost:8000/my/endpoint" + ), + URLTestCase( + description="UNST domain client-level URL, no path", + sdk_endpoint_name="general.partition", + client_url="https://unstructured-000mock.api.unstructuredapp.io", + endpoint_url=None, + expected_url="https://unstructured-000mock.api.unstructuredapp.io" + ), + URLTestCase( + description="UNST domain client-level URL, with path", + sdk_endpoint_name="general.partition", + client_url="https://unstructured-000mock.api.unstructuredapp.io/my/endpoint/", + endpoint_url=None, + expected_url="https://unstructured-000mock.api.unstructuredapp.io" + ), + URLTestCase( + description="UNST domain endpoint-level URL, no path", + sdk_endpoint_name="general.partition", + client_url=None, + endpoint_url="https://unstructured-000mock.api.unstructuredapp.io", + expected_url="https://unstructured-000mock.api.unstructuredapp.io" + ), + URLTestCase( + description="UNST domain endpoint-level URL, with path", + sdk_endpoint_name="general.partition", + client_url=None, + endpoint_url="https://unstructured-000mock.api.unstructuredapp.io/my/endpoint/", + expected_url="https://unstructured-000mock.api.unstructuredapp.io" + ), + URLTestCase( + description="default URL fallback", + sdk_endpoint_name="general.partition", + client_url=None, + endpoint_url=None, + expected_url="https://api.unstructuredapp.io" + ), + URLTestCase( + description="default URL fallback", + sdk_endpoint_name="destinations.create_destination", + client_url=None, + endpoint_url=None, + expected_url="https://platform.unstructuredapp.io" + ), + URLTestCase( + description="default URL fallback", + sdk_endpoint_name="sources.create_source", + client_url=None, + endpoint_url=None, + expected_url="https://platform.unstructuredapp.io" + ), + URLTestCase( + description="default URL fallback", + sdk_endpoint_name="jobs.get_job", + client_url=None, + endpoint_url=None, + expected_url="https://platform.unstructuredapp.io" + ), + URLTestCase( + description="default URL fallback", + sdk_endpoint_name="workflows.create_workflow", + client_url=None, + endpoint_url=None, + expected_url="https://platform.unstructuredapp.io" + ), + ] ) -async def test_async_endpoint_uses_correct_url(monkeypatch, sdk_endpoint_name): - # Test 1 - # Pass server_url to the client, no path - s = UnstructuredClient(server_url="http://localhost:8000") - client_method = get_client_method_with_mock( - sdk_endpoint_name, - s, - "http://localhost:8000", - monkeypatch - ) - - try: - await client_method(request={}) - except BaseUrlCorrect: - pass - except BaseUrlIncorrect as e: - pytest.fail(f"server_url was passed to client and ignored, got {e}") - - # Test 2 - # Pass server_url to the client, with path - s = UnstructuredClient(server_url="http://localhost:8000/my/endpoint") - client_method = get_client_method_with_mock( - sdk_endpoint_name, - s, - "http://localhost:8000", - monkeypatch - ) - - try: - await client_method(request={}) - except BaseUrlCorrect: - pass - except BaseUrlIncorrect as e: - pytest.fail(f"server_url was passed to client and was not stripped, got {e}") - - # Test 3 - # Pass server_url to the endpoint, no path - s = UnstructuredClient() - client_method = get_client_method_with_mock( - sdk_endpoint_name, - s, - "http://localhost:8000", - monkeypatch - ) - - try: - await client_method(request={}, server_url="http://localhost:8000") - except BaseUrlCorrect: - pass - except BaseUrlIncorrect as e: - pytest.fail(f"server_url was passed to endpoint and ignored, got {e}") - - # Test 4 - # Pass server_url to the endpoint, with path - s = UnstructuredClient() - client_method = get_client_method_with_mock( - sdk_endpoint_name, - s, - "http://localhost:8000", - monkeypatch - ) - - try: - await client_method(request={}, server_url="http://localhost:8000/my/endpoint") - except BaseUrlCorrect: - pass - except BaseUrlIncorrect as e: - pytest.fail(f"server_url was passed to endpoint and ignored, got {e}") - - - # Test 5 - # No server_url, should take the default - server_url = "https://api.unstructuredapp.io" if "partition" in sdk_endpoint_name else "https://platform.unstructuredapp.io" +def test_endpoint_uses_correct_url(monkeypatch, case: URLTestCase): + if case.client_url: + s = UnstructuredClient(server_url=case.client_url) + else: + s = UnstructuredClient() - s = UnstructuredClient() client_method = get_client_method_with_mock( - sdk_endpoint_name, + case.sdk_endpoint_name, s, - server_url, + case.expected_url, monkeypatch ) try: - await client_method(request={}) + if case.endpoint_url: + client_method(request={}, server_url=case.endpoint_url) + else: + client_method(request={}) except BaseUrlCorrect: pass except BaseUrlIncorrect as e: - pytest.fail(f"Default url not used, got {e}") + pytest.fail( + f"{case.description}: Expected {case.expected_url}, got {e}" + ) \ No newline at end of file diff --git a/gen.yaml b/gen.yaml index 35688474..36f1fae2 100644 --- a/gen.yaml +++ b/gen.yaml @@ -12,7 +12,7 @@ generation: oAuth2ClientCredentialsEnabled: false oAuth2PasswordEnabled: false python: - version: 0.33.1 + version: 0.34.0 additionalDependencies: dev: deepdiff: '>=6.0' diff --git a/poetry.lock b/poetry.lock index 16b71d96..e0f55f92 100644 --- a/poetry.lock +++ b/poetry.lock @@ -930,7 +930,7 @@ version = "2.8.2" description = "Extensions to the standard Python datetime module" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" -groups = ["main", "dev"] +groups = ["dev"] files = [ {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, @@ -982,7 +982,7 @@ version = "1.16.0" description = "Python 2 and 3 compatibility utilities" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" -groups = ["main", "dev"] +groups = ["dev"] files = [ {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, @@ -1037,18 +1037,6 @@ files = [ {file = "types_aiofiles-24.1.0.20240626-py3-none-any.whl", hash = "sha256:7939eca4a8b4f9c6491b6e8ef160caee9a21d32e18534a57d5ed90aee47c66b4"}, ] -[[package]] -name = "types-python-dateutil" -version = "2.9.0.20241003" -description = "Typing stubs for python-dateutil" -optional = false -python-versions = ">=3.8" -groups = ["dev"] -files = [ - {file = "types-python-dateutil-2.9.0.20241003.tar.gz", hash = "sha256:58cb85449b2a56d6684e41aeefb4c4280631246a0da1a719bdbe6f3fb0317446"}, - {file = "types_python_dateutil-2.9.0.20241003-py3-none-any.whl", hash = "sha256:250e1d8e80e7bbc3a6c99b907762711d1a1cdd00e978ad39cb5940f6f0a87f3d"}, -] - [[package]] name = "typing-extensions" version = "4.12.2" @@ -1149,4 +1137,4 @@ test = ["aiohttp (>=3.10.5)", "flake8 (>=5.0,<6.0)", "mypy (>=0.800)", "psutil", [metadata] lock-version = "2.1" python-versions = ">=3.9" -content-hash = "73969f5008660fe0c90c961d9d7cfca0e108f73a2dd6fe6a647cab04ca1f66e3" +content-hash = "78203fbab14338991dfb8810278b0eb421816fcfb55a8771e0c6079bb56aabea" diff --git a/pyproject.toml b/pyproject.toml index 758c990c..158c0ab6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "unstructured-client" -version = "0.33.1" +version = "0.34.0" description = "Python Client SDK for Unstructured API" authors = [{ name = "Unstructured" },] readme = "README-PYPI.md" @@ -13,7 +13,6 @@ dependencies = [ "nest-asyncio >=1.6.0", "pydantic >=2.11.2", "pypdf >=4.0", - "python-dateutil >=2.8.2", "requests-toolbelt >=1.0.0", "typing-inspection >=0.4.0", ] @@ -41,7 +40,6 @@ pytest = ">=8.3.3" pytest-asyncio = ">=0.24.0" pytest-mock = ">=3.14.0" types-aiofiles = ">=24.1.0" -types-python-dateutil = "^2.9.0.20240316" uvloop = ">=0.20.0" [build-system] diff --git a/src/unstructured_client/_hooks/custom/clean_server_url_hook.py b/src/unstructured_client/_hooks/custom/clean_server_url_hook.py index 3d0e0438..d8c04590 100644 --- a/src/unstructured_client/_hooks/custom/clean_server_url_hook.py +++ b/src/unstructured_client/_hooks/custom/clean_server_url_hook.py @@ -8,7 +8,7 @@ def clean_server_url(base_url: str) -> str: - """Fix url scheme and remove the '/general/v0/general' path.""" + """Fix url scheme and remove subpath for URLs under Unstructured domains.""" if not base_url: return "" @@ -19,39 +19,18 @@ def clean_server_url(base_url: str) -> str: parsed_url: ParseResult = urlparse(base_url) - if "api.unstructuredapp.io" in parsed_url.netloc: + if "unstructuredapp.io" in parsed_url.netloc: if parsed_url.scheme != "https": parsed_url = parsed_url._replace(scheme="https") + # We only want the base url for Unstructured domains + clean_url = urlunparse(parsed_url._replace(path="", params="", query="", fragment="")) + + else: + # For other domains, we want to keep the path + clean_url = urlunparse(parsed_url._replace(params="", query="", fragment="")) - # We only want the base url - return urlunparse(parsed_url._replace(path="", params="", query="", fragment="")) - - -def choose_server_url(endpoint_url: str | None, client_url: str, default_endpoint_url: str) -> str: - """ - Helper function to fix a breaking change in the SDK past 0.30.0. - When we merged the partition and platform specs, the client server_url stopped working, - and users need to pass it in the endpoint function. - For now, call this helper in the generated code to set the correct url. - - Order of choices: - Endpoint server_url -> s.general.partition(server_url=...) - (Passed in as None if not set) - - Base client server_url -> s = UnstructuredClient(server_url=...) - (Passed as empty string if not set) - - Default endpoint URL as defined in the spec - """ - - # If the client doesn't get a server_url, it sets a default of platform - # This is not always the correct default - we need to make sure default_endpoint_url is used - # So, only use the client url if it has been set to something else - if client_url == "https://platform.unstructuredapp.io": - client_url = "" - - url = endpoint_url if endpoint_url is not None else (client_url or default_endpoint_url) - return clean_server_url(url) + return clean_url.rstrip("/") + class CleanServerUrlSDKInitHook(SDKInitHook): diff --git a/src/unstructured_client/_version.py b/src/unstructured_client/_version.py index 5ceb97af..e24f349a 100644 --- a/src/unstructured_client/_version.py +++ b/src/unstructured_client/_version.py @@ -3,10 +3,10 @@ import importlib.metadata __title__: str = "unstructured-client" -__version__: str = "0.33.1" +__version__: str = "0.34.0" __openapi_doc_version__: str = "1.1.7" -__gen_version__: str = "2.585.2" -__user_agent__: str = "speakeasy-sdk/python 0.33.1 2.585.2 1.1.7 unstructured-client" +__gen_version__: str = "2.588.0" +__user_agent__: str = "speakeasy-sdk/python 0.34.0 2.588.0 1.1.7 unstructured-client" try: if __package__ is not None: diff --git a/src/unstructured_client/destinations.py b/src/unstructured_client/destinations.py index 6b38f480..e8cdedf4 100644 --- a/src/unstructured_client/destinations.py +++ b/src/unstructured_client/destinations.py @@ -1,5 +1,5 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" - +from unstructured_client._hooks.custom.clean_server_url_hook import clean_server_url from .basesdk import BaseSDK from typing import Any, List, Mapping, Optional, Union, cast from unstructured_client import utils @@ -7,8 +7,11 @@ from unstructured_client.models import errors, operations, shared from unstructured_client.types import BaseModel, OptionalNullable, UNSET - class Destinations(BaseSDK): + def get_default_server_url(self) -> str: + client_url, *_ = self.sdk_configuration.get_server_details() + return clean_server_url(client_url) + def create_connection_check_destinations( self, *, @@ -31,18 +34,11 @@ def create_connection_check_destinations( :param timeout_ms: Override the default request timeout configuration for this method in milliseconds :param http_headers: Additional headers to set or replace on requests. """ - base_url = None + base_url = clean_server_url(server_url) if server_url is not None else self.get_default_server_url() url_variables = None if timeout_ms is None: timeout_ms = self.sdk_configuration.timeout_ms - if server_url is not None: - base_url = server_url - else: - base_url = operations.CREATE_CONNECTION_CHECK_DESTINATIONS_SERVERS[ - operations.CREATE_CONNECTION_CHECK_DESTINATIONS_SERVER_PLATFORM_API - ] - if not isinstance(request, BaseModel): request = utils.unmarshal( request, operations.CreateConnectionCheckDestinationsRequest @@ -146,17 +142,11 @@ async def create_connection_check_destinations_async( :param timeout_ms: Override the default request timeout configuration for this method in milliseconds :param http_headers: Additional headers to set or replace on requests. """ - base_url = None + base_url = clean_server_url(server_url) if server_url is not None else self.get_default_server_url() url_variables = None if timeout_ms is None: timeout_ms = self.sdk_configuration.timeout_ms - if server_url is not None: - base_url = server_url - else: - base_url = operations.CREATE_CONNECTION_CHECK_DESTINATIONS_SERVERS[ - operations.CREATE_CONNECTION_CHECK_DESTINATIONS_SERVER_PLATFORM_API - ] if not isinstance(request, BaseModel): request = utils.unmarshal( @@ -261,18 +251,12 @@ def create_destination( :param timeout_ms: Override the default request timeout configuration for this method in milliseconds :param http_headers: Additional headers to set or replace on requests. """ - base_url = None + base_url = clean_server_url(server_url) if server_url is not None else self.get_default_server_url() + url_variables = None if timeout_ms is None: timeout_ms = self.sdk_configuration.timeout_ms - if server_url is not None: - base_url = server_url - else: - base_url = operations.CREATE_DESTINATION_SERVERS[ - operations.CREATE_DESTINATION_SERVER_PLATFORM_API - ] - if not isinstance(request, BaseModel): request = utils.unmarshal(request, operations.CreateDestinationRequest) request = cast(operations.CreateDestinationRequest, request) @@ -381,17 +365,11 @@ async def create_destination_async( :param timeout_ms: Override the default request timeout configuration for this method in milliseconds :param http_headers: Additional headers to set or replace on requests. """ - base_url = None + base_url = clean_server_url(server_url) if server_url is not None else self.get_default_server_url() url_variables = None if timeout_ms is None: timeout_ms = self.sdk_configuration.timeout_ms - if server_url is not None: - base_url = server_url - else: - base_url = operations.CREATE_DESTINATION_SERVERS[ - operations.CREATE_DESTINATION_SERVER_PLATFORM_API - ] if not isinstance(request, BaseModel): request = utils.unmarshal(request, operations.CreateDestinationRequest) @@ -501,17 +479,12 @@ def delete_destination( :param timeout_ms: Override the default request timeout configuration for this method in milliseconds :param http_headers: Additional headers to set or replace on requests. """ - base_url = None + base_url = clean_server_url(server_url) if server_url is not None else self.get_default_server_url() url_variables = None if timeout_ms is None: timeout_ms = self.sdk_configuration.timeout_ms - if server_url is not None: - base_url = server_url - else: - base_url = operations.DELETE_DESTINATION_SERVERS[ - operations.DELETE_DESTINATION_SERVER_PLATFORM_API - ] + if not isinstance(request, BaseModel): request = utils.unmarshal(request, operations.DeleteDestinationRequest) @@ -612,17 +585,11 @@ async def delete_destination_async( :param timeout_ms: Override the default request timeout configuration for this method in milliseconds :param http_headers: Additional headers to set or replace on requests. """ - base_url = None + base_url = clean_server_url(server_url) if server_url is not None else self.get_default_server_url() url_variables = None if timeout_ms is None: timeout_ms = self.sdk_configuration.timeout_ms - if server_url is not None: - base_url = server_url - else: - base_url = operations.DELETE_DESTINATION_SERVERS[ - operations.DELETE_DESTINATION_SERVER_PLATFORM_API - ] if not isinstance(request, BaseModel): request = utils.unmarshal(request, operations.DeleteDestinationRequest) @@ -723,17 +690,12 @@ def get_connection_check_destinations( :param timeout_ms: Override the default request timeout configuration for this method in milliseconds :param http_headers: Additional headers to set or replace on requests. """ - base_url = None + base_url = clean_server_url(server_url) if server_url is not None else self.get_default_server_url() url_variables = None if timeout_ms is None: timeout_ms = self.sdk_configuration.timeout_ms - if server_url is not None: - base_url = server_url - else: - base_url = operations.GET_CONNECTION_CHECK_DESTINATIONS_SERVERS[ - operations.GET_CONNECTION_CHECK_DESTINATIONS_SERVER_PLATFORM_API - ] + if not isinstance(request, BaseModel): request = utils.unmarshal( @@ -838,17 +800,11 @@ async def get_connection_check_destinations_async( :param timeout_ms: Override the default request timeout configuration for this method in milliseconds :param http_headers: Additional headers to set or replace on requests. """ - base_url = None + base_url = clean_server_url(server_url) if server_url is not None else self.get_default_server_url() url_variables = None if timeout_ms is None: timeout_ms = self.sdk_configuration.timeout_ms - if server_url is not None: - base_url = server_url - else: - base_url = operations.GET_CONNECTION_CHECK_DESTINATIONS_SERVERS[ - operations.GET_CONNECTION_CHECK_DESTINATIONS_SERVER_PLATFORM_API - ] if not isinstance(request, BaseModel): request = utils.unmarshal( @@ -952,17 +908,11 @@ def get_destination( :param timeout_ms: Override the default request timeout configuration for this method in milliseconds :param http_headers: Additional headers to set or replace on requests. """ - base_url = None + base_url = clean_server_url(server_url) if server_url is not None else self.get_default_server_url() url_variables = None if timeout_ms is None: timeout_ms = self.sdk_configuration.timeout_ms - if server_url is not None: - base_url = server_url - else: - base_url = operations.GET_DESTINATION_SERVERS[ - operations.GET_DESTINATION_SERVER_PLATFORM_API - ] if not isinstance(request, BaseModel): request = utils.unmarshal(request, operations.GetDestinationRequest) @@ -1064,17 +1014,11 @@ async def get_destination_async( :param timeout_ms: Override the default request timeout configuration for this method in milliseconds :param http_headers: Additional headers to set or replace on requests. """ - base_url = None + base_url = clean_server_url(server_url) if server_url is not None else self.get_default_server_url() url_variables = None if timeout_ms is None: timeout_ms = self.sdk_configuration.timeout_ms - if server_url is not None: - base_url = server_url - else: - base_url = operations.GET_DESTINATION_SERVERS[ - operations.GET_DESTINATION_SERVER_PLATFORM_API - ] if not isinstance(request, BaseModel): request = utils.unmarshal(request, operations.GetDestinationRequest) @@ -1177,18 +1121,11 @@ def list_destinations( :param timeout_ms: Override the default request timeout configuration for this method in milliseconds :param http_headers: Additional headers to set or replace on requests. """ - base_url = None + base_url = clean_server_url(server_url) if server_url is not None else self.get_default_server_url() url_variables = None if timeout_ms is None: timeout_ms = self.sdk_configuration.timeout_ms - if server_url is not None: - base_url = server_url - else: - base_url = operations.LIST_DESTINATIONS_SERVERS[ - operations.LIST_DESTINATIONS_SERVER_PLATFORM_API - ] - if not isinstance(request, BaseModel): request = utils.unmarshal(request, operations.ListDestinationsRequest) request = cast(operations.ListDestinationsRequest, request) @@ -1291,18 +1228,11 @@ async def list_destinations_async( :param timeout_ms: Override the default request timeout configuration for this method in milliseconds :param http_headers: Additional headers to set or replace on requests. """ - base_url = None + base_url = clean_server_url(server_url) if server_url is not None else self.get_default_server_url() url_variables = None if timeout_ms is None: timeout_ms = self.sdk_configuration.timeout_ms - if server_url is not None: - base_url = server_url - else: - base_url = operations.LIST_DESTINATIONS_SERVERS[ - operations.LIST_DESTINATIONS_SERVER_PLATFORM_API - ] - if not isinstance(request, BaseModel): request = utils.unmarshal(request, operations.ListDestinationsRequest) request = cast(operations.ListDestinationsRequest, request) @@ -1405,17 +1335,11 @@ def update_destination( :param timeout_ms: Override the default request timeout configuration for this method in milliseconds :param http_headers: Additional headers to set or replace on requests. """ - base_url = None + base_url = clean_server_url(server_url) if server_url is not None else self.get_default_server_url() url_variables = None if timeout_ms is None: timeout_ms = self.sdk_configuration.timeout_ms - if server_url is not None: - base_url = server_url - else: - base_url = operations.UPDATE_DESTINATION_SERVERS[ - operations.UPDATE_DESTINATION_SERVER_PLATFORM_API - ] if not isinstance(request, BaseModel): request = utils.unmarshal(request, operations.UpdateDestinationRequest) @@ -1525,18 +1449,11 @@ async def update_destination_async( :param timeout_ms: Override the default request timeout configuration for this method in milliseconds :param http_headers: Additional headers to set or replace on requests. """ - base_url = None + base_url = clean_server_url(server_url) if server_url is not None else self.get_default_server_url() url_variables = None if timeout_ms is None: timeout_ms = self.sdk_configuration.timeout_ms - if server_url is not None: - base_url = server_url - else: - base_url = operations.UPDATE_DESTINATION_SERVERS[ - operations.UPDATE_DESTINATION_SERVER_PLATFORM_API - ] - if not isinstance(request, BaseModel): request = utils.unmarshal(request, operations.UpdateDestinationRequest) request = cast(operations.UpdateDestinationRequest, request) diff --git a/src/unstructured_client/general.py b/src/unstructured_client/general.py index 9f04e4aa..73a8006e 100644 --- a/src/unstructured_client/general.py +++ b/src/unstructured_client/general.py @@ -1,14 +1,14 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" +from unstructured_client._hooks.custom.clean_server_url_hook import clean_server_url from .basesdk import BaseSDK from enum import Enum from typing import Any, Dict, List, Mapping, Optional, Union, cast from unstructured_client import utils from unstructured_client._hooks import HookContext -from unstructured_client._hooks.custom.clean_server_url_hook import choose_server_url from unstructured_client.models import errors, operations, shared from unstructured_client.types import BaseModel, OptionalNullable, UNSET - +from unstructured_client.sdkconfiguration import SERVER_PLATFORM_API, SERVERS class PartitionAcceptEnum(str, Enum): APPLICATION_JSON = "application/json" @@ -16,6 +16,15 @@ class PartitionAcceptEnum(str, Enum): class General(BaseSDK): + def get_default_server_url(self) -> str: + client_url, *_ = self.sdk_configuration.get_server_details() + if client_url == SERVERS[SERVER_PLATFORM_API].rstrip("/"): + #Note(yuming):get_server_details will set the default server to platform-api + return operations.PARTITION_SERVERS[ + operations.PARTITION_SERVER_SAAS_API + ].rstrip("/") + return clean_server_url(client_url) + def partition( self, *, @@ -39,21 +48,12 @@ def partition( :param accept_header_override: Override the default accept header for this method :param http_headers: Additional headers to set or replace on requests. """ - base_url = None + base_url = clean_server_url(server_url) if server_url is not None else self.get_default_server_url() + url_variables = None if timeout_ms is None: timeout_ms = self.sdk_configuration.timeout_ms - client_url, *_ = self.sdk_configuration.get_server_details() - - base_url = choose_server_url( - endpoint_url=server_url, - client_url=client_url, - default_endpoint_url=operations.PARTITION_SERVERS[ - operations.PARTITION_SERVER_SAAS_API - ] - ) - if not isinstance(request, BaseModel): request = utils.unmarshal(request, operations.PartitionRequest) request = cast(operations.PartitionRequest, request) @@ -170,22 +170,12 @@ async def partition_async( :param accept_header_override: Override the default accept header for this method :param http_headers: Additional headers to set or replace on requests. """ - base_url = None + + base_url = clean_server_url(server_url) if server_url is not None else self.get_default_server_url() url_variables = None if timeout_ms is None: timeout_ms = self.sdk_configuration.timeout_ms - - client_url, *_ = self.sdk_configuration.get_server_details() - - base_url = choose_server_url( - endpoint_url=server_url, - client_url=client_url, - default_endpoint_url=operations.PARTITION_SERVERS[ - operations.PARTITION_SERVER_SAAS_API - ] - ) - if not isinstance(request, BaseModel): request = utils.unmarshal(request, operations.PartitionRequest) request = cast(operations.PartitionRequest, request) diff --git a/src/unstructured_client/jobs.py b/src/unstructured_client/jobs.py index 3b0cfcc4..46e5f225 100644 --- a/src/unstructured_client/jobs.py +++ b/src/unstructured_client/jobs.py @@ -1,5 +1,5 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" - +from unstructured_client._hooks.custom.clean_server_url_hook import clean_server_url from .basesdk import BaseSDK from typing import Any, List, Mapping, Optional, Union, cast from unstructured_client import utils @@ -7,8 +7,11 @@ from unstructured_client.models import errors, operations, shared from unstructured_client.types import BaseModel, OptionalNullable, UNSET - class Jobs(BaseSDK): + def get_default_server_url(self) -> str: + client_url, *_ = self.sdk_configuration.get_server_details() + return clean_server_url(client_url) + def cancel_job( self, *, @@ -30,17 +33,11 @@ def cancel_job( :param timeout_ms: Override the default request timeout configuration for this method in milliseconds :param http_headers: Additional headers to set or replace on requests. """ - base_url = None + base_url = clean_server_url(server_url) if server_url is not None else self.get_default_server_url() url_variables = None if timeout_ms is None: timeout_ms = self.sdk_configuration.timeout_ms - if server_url is not None: - base_url = server_url - else: - base_url = operations.CANCEL_JOB_SERVERS[ - operations.CANCEL_JOB_SERVER_PLATFORM_API - ] if not isinstance(request, BaseModel): request = utils.unmarshal(request, operations.CancelJobRequest) @@ -140,17 +137,11 @@ async def cancel_job_async( :param timeout_ms: Override the default request timeout configuration for this method in milliseconds :param http_headers: Additional headers to set or replace on requests. """ - base_url = None + base_url = clean_server_url(server_url) if server_url is not None else self.get_default_server_url() url_variables = None if timeout_ms is None: timeout_ms = self.sdk_configuration.timeout_ms - if server_url is not None: - base_url = server_url - else: - base_url = operations.CANCEL_JOB_SERVERS[ - operations.CANCEL_JOB_SERVER_PLATFORM_API - ] if not isinstance(request, BaseModel): request = utils.unmarshal(request, operations.CancelJobRequest) @@ -251,17 +242,12 @@ def download_job_output( :param timeout_ms: Override the default request timeout configuration for this method in milliseconds :param http_headers: Additional headers to set or replace on requests. """ - base_url = None + base_url = clean_server_url(server_url) if server_url is not None else self.get_default_server_url() url_variables = None if timeout_ms is None: timeout_ms = self.sdk_configuration.timeout_ms - if server_url is not None: - base_url = server_url - else: - base_url = operations.DOWNLOAD_JOB_OUTPUT_SERVERS[ - operations.DOWNLOAD_JOB_OUTPUT_SERVER_PLATFORM_API - ] + if not isinstance(request, BaseModel): request = utils.unmarshal(request, operations.DownloadJobOutputRequest) @@ -362,17 +348,11 @@ async def download_job_output_async( :param timeout_ms: Override the default request timeout configuration for this method in milliseconds :param http_headers: Additional headers to set or replace on requests. """ - base_url = None + base_url = clean_server_url(server_url) if server_url is not None else self.get_default_server_url() url_variables = None if timeout_ms is None: timeout_ms = self.sdk_configuration.timeout_ms - if server_url is not None: - base_url = server_url - else: - base_url = operations.DOWNLOAD_JOB_OUTPUT_SERVERS[ - operations.DOWNLOAD_JOB_OUTPUT_SERVER_PLATFORM_API - ] if not isinstance(request, BaseModel): request = utils.unmarshal(request, operations.DownloadJobOutputRequest) @@ -470,17 +450,11 @@ def get_job( :param timeout_ms: Override the default request timeout configuration for this method in milliseconds :param http_headers: Additional headers to set or replace on requests. """ - base_url = None + base_url = clean_server_url(server_url) if server_url is not None else self.get_default_server_url() url_variables = None if timeout_ms is None: timeout_ms = self.sdk_configuration.timeout_ms - if server_url is not None: - base_url = server_url - else: - base_url = operations.GET_JOB_SERVERS[ - operations.GET_JOB_SERVER_PLATFORM_API - ] if not isinstance(request, BaseModel): request = utils.unmarshal(request, operations.GetJobRequest) @@ -580,17 +554,11 @@ async def get_job_async( :param timeout_ms: Override the default request timeout configuration for this method in milliseconds :param http_headers: Additional headers to set or replace on requests. """ - base_url = None + base_url = clean_server_url(server_url) if server_url is not None else self.get_default_server_url() url_variables = None if timeout_ms is None: timeout_ms = self.sdk_configuration.timeout_ms - if server_url is not None: - base_url = server_url - else: - base_url = operations.GET_JOB_SERVERS[ - operations.GET_JOB_SERVER_PLATFORM_API - ] if not isinstance(request, BaseModel): request = utils.unmarshal(request, operations.GetJobRequest) @@ -690,18 +658,11 @@ def list_jobs( :param timeout_ms: Override the default request timeout configuration for this method in milliseconds :param http_headers: Additional headers to set or replace on requests. """ - base_url = None + base_url = clean_server_url(server_url) if server_url is not None else self.get_default_server_url() url_variables = None if timeout_ms is None: timeout_ms = self.sdk_configuration.timeout_ms - if server_url is not None: - base_url = server_url - else: - base_url = operations.LIST_JOBS_SERVERS[ - operations.LIST_JOBS_SERVER_PLATFORM_API - ] - if not isinstance(request, BaseModel): request = utils.unmarshal(request, operations.ListJobsRequest) request = cast(operations.ListJobsRequest, request) @@ -800,17 +761,11 @@ async def list_jobs_async( :param timeout_ms: Override the default request timeout configuration for this method in milliseconds :param http_headers: Additional headers to set or replace on requests. """ - base_url = None + base_url = clean_server_url(server_url) if server_url is not None else self.get_default_server_url() url_variables = None if timeout_ms is None: timeout_ms = self.sdk_configuration.timeout_ms - if server_url is not None: - base_url = server_url - else: - base_url = operations.LIST_JOBS_SERVERS[ - operations.LIST_JOBS_SERVER_PLATFORM_API - ] if not isinstance(request, BaseModel): request = utils.unmarshal(request, operations.ListJobsRequest) diff --git a/src/unstructured_client/sources.py b/src/unstructured_client/sources.py index d0a5bef4..2fca9ea1 100644 --- a/src/unstructured_client/sources.py +++ b/src/unstructured_client/sources.py @@ -1,5 +1,5 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" - +from unstructured_client._hooks.custom.clean_server_url_hook import clean_server_url from .basesdk import BaseSDK from typing import Any, List, Mapping, Optional, Union, cast from unstructured_client import utils @@ -7,8 +7,11 @@ from unstructured_client.models import errors, operations, shared from unstructured_client.types import BaseModel, OptionalNullable, UNSET - class Sources(BaseSDK): + def get_default_server_url(self) -> str: + client_url, *_ = self.sdk_configuration.get_server_details() + return clean_server_url(client_url) + def create_connection_check_sources( self, *, @@ -31,17 +34,11 @@ def create_connection_check_sources( :param timeout_ms: Override the default request timeout configuration for this method in milliseconds :param http_headers: Additional headers to set or replace on requests. """ - base_url = None + base_url = clean_server_url(server_url) if server_url is not None else self.get_default_server_url() url_variables = None if timeout_ms is None: timeout_ms = self.sdk_configuration.timeout_ms - if server_url is not None: - base_url = server_url - else: - base_url = operations.CREATE_CONNECTION_CHECK_SOURCES_SERVERS[ - operations.CREATE_CONNECTION_CHECK_SOURCES_SERVER_PLATFORM_API - ] if not isinstance(request, BaseModel): request = utils.unmarshal( @@ -146,17 +143,11 @@ async def create_connection_check_sources_async( :param timeout_ms: Override the default request timeout configuration for this method in milliseconds :param http_headers: Additional headers to set or replace on requests. """ - base_url = None + base_url = clean_server_url(server_url) if server_url is not None else self.get_default_server_url() url_variables = None if timeout_ms is None: timeout_ms = self.sdk_configuration.timeout_ms - if server_url is not None: - base_url = server_url - else: - base_url = operations.CREATE_CONNECTION_CHECK_SOURCES_SERVERS[ - operations.CREATE_CONNECTION_CHECK_SOURCES_SERVER_PLATFORM_API - ] if not isinstance(request, BaseModel): request = utils.unmarshal( @@ -260,17 +251,11 @@ def create_source( :param timeout_ms: Override the default request timeout configuration for this method in milliseconds :param http_headers: Additional headers to set or replace on requests. """ - base_url = None + base_url = clean_server_url(server_url) if server_url is not None else self.get_default_server_url() url_variables = None if timeout_ms is None: timeout_ms = self.sdk_configuration.timeout_ms - if server_url is not None: - base_url = server_url - else: - base_url = operations.CREATE_SOURCE_SERVERS[ - operations.CREATE_SOURCE_SERVER_PLATFORM_API - ] if not isinstance(request, BaseModel): request = utils.unmarshal(request, operations.CreateSourceRequest) @@ -379,17 +364,11 @@ async def create_source_async( :param timeout_ms: Override the default request timeout configuration for this method in milliseconds :param http_headers: Additional headers to set or replace on requests. """ - base_url = None + base_url = clean_server_url(server_url) if server_url is not None else self.get_default_server_url() url_variables = None if timeout_ms is None: timeout_ms = self.sdk_configuration.timeout_ms - if server_url is not None: - base_url = server_url - else: - base_url = operations.CREATE_SOURCE_SERVERS[ - operations.CREATE_SOURCE_SERVER_PLATFORM_API - ] if not isinstance(request, BaseModel): request = utils.unmarshal(request, operations.CreateSourceRequest) @@ -498,18 +477,11 @@ def delete_source( :param timeout_ms: Override the default request timeout configuration for this method in milliseconds :param http_headers: Additional headers to set or replace on requests. """ - base_url = None + base_url = clean_server_url(server_url) if server_url is not None else self.get_default_server_url() url_variables = None if timeout_ms is None: timeout_ms = self.sdk_configuration.timeout_ms - if server_url is not None: - base_url = server_url - else: - base_url = operations.DELETE_SOURCE_SERVERS[ - operations.DELETE_SOURCE_SERVER_PLATFORM_API - ] - if not isinstance(request, BaseModel): request = utils.unmarshal(request, operations.DeleteSourceRequest) request = cast(operations.DeleteSourceRequest, request) @@ -608,17 +580,11 @@ async def delete_source_async( :param timeout_ms: Override the default request timeout configuration for this method in milliseconds :param http_headers: Additional headers to set or replace on requests. """ - base_url = None + base_url = clean_server_url(server_url) if server_url is not None else self.get_default_server_url() url_variables = None if timeout_ms is None: timeout_ms = self.sdk_configuration.timeout_ms - if server_url is not None: - base_url = server_url - else: - base_url = operations.DELETE_SOURCE_SERVERS[ - operations.DELETE_SOURCE_SERVER_PLATFORM_API - ] if not isinstance(request, BaseModel): request = utils.unmarshal(request, operations.DeleteSourceRequest) @@ -719,17 +685,12 @@ def get_connection_check_sources( :param timeout_ms: Override the default request timeout configuration for this method in milliseconds :param http_headers: Additional headers to set or replace on requests. """ - base_url = None + base_url = clean_server_url(server_url) if server_url is not None else self.get_default_server_url() url_variables = None if timeout_ms is None: timeout_ms = self.sdk_configuration.timeout_ms - if server_url is not None: - base_url = server_url - else: - base_url = operations.GET_CONNECTION_CHECK_SOURCES_SERVERS[ - operations.GET_CONNECTION_CHECK_SOURCES_SERVER_PLATFORM_API - ] + if not isinstance(request, BaseModel): request = utils.unmarshal( @@ -834,17 +795,11 @@ async def get_connection_check_sources_async( :param timeout_ms: Override the default request timeout configuration for this method in milliseconds :param http_headers: Additional headers to set or replace on requests. """ - base_url = None + base_url = clean_server_url(server_url) if server_url is not None else self.get_default_server_url() url_variables = None if timeout_ms is None: timeout_ms = self.sdk_configuration.timeout_ms - if server_url is not None: - base_url = server_url - else: - base_url = operations.GET_CONNECTION_CHECK_SOURCES_SERVERS[ - operations.GET_CONNECTION_CHECK_SOURCES_SERVER_PLATFORM_API - ] if not isinstance(request, BaseModel): request = utils.unmarshal( @@ -948,17 +903,11 @@ def get_source( :param timeout_ms: Override the default request timeout configuration for this method in milliseconds :param http_headers: Additional headers to set or replace on requests. """ - base_url = None + base_url = clean_server_url(server_url) if server_url is not None else self.get_default_server_url() url_variables = None if timeout_ms is None: timeout_ms = self.sdk_configuration.timeout_ms - if server_url is not None: - base_url = server_url - else: - base_url = operations.GET_SOURCE_SERVERS[ - operations.GET_SOURCE_SERVER_PLATFORM_API - ] if not isinstance(request, BaseModel): request = utils.unmarshal(request, operations.GetSourceRequest) @@ -1060,17 +1009,11 @@ async def get_source_async( :param timeout_ms: Override the default request timeout configuration for this method in milliseconds :param http_headers: Additional headers to set or replace on requests. """ - base_url = None + base_url = clean_server_url(server_url) if server_url is not None else self.get_default_server_url() url_variables = None if timeout_ms is None: timeout_ms = self.sdk_configuration.timeout_ms - if server_url is not None: - base_url = server_url - else: - base_url = operations.GET_SOURCE_SERVERS[ - operations.GET_SOURCE_SERVER_PLATFORM_API - ] if not isinstance(request, BaseModel): request = utils.unmarshal(request, operations.GetSourceRequest) @@ -1172,17 +1115,11 @@ def list_sources( :param timeout_ms: Override the default request timeout configuration for this method in milliseconds :param http_headers: Additional headers to set or replace on requests. """ - base_url = None + base_url = clean_server_url(server_url) if server_url is not None else self.get_default_server_url() url_variables = None if timeout_ms is None: timeout_ms = self.sdk_configuration.timeout_ms - if server_url is not None: - base_url = server_url - else: - base_url = operations.LIST_SOURCES_SERVERS[ - operations.LIST_SOURCES_SERVER_PLATFORM_API - ] if not isinstance(request, BaseModel): request = utils.unmarshal(request, operations.ListSourcesRequest) @@ -1284,18 +1221,11 @@ async def list_sources_async( :param timeout_ms: Override the default request timeout configuration for this method in milliseconds :param http_headers: Additional headers to set or replace on requests. """ - base_url = None + base_url = clean_server_url(server_url) if server_url is not None else self.get_default_server_url() url_variables = None if timeout_ms is None: timeout_ms = self.sdk_configuration.timeout_ms - if server_url is not None: - base_url = server_url - else: - base_url = operations.LIST_SOURCES_SERVERS[ - operations.LIST_SOURCES_SERVER_PLATFORM_API - ] - if not isinstance(request, BaseModel): request = utils.unmarshal(request, operations.ListSourcesRequest) request = cast(operations.ListSourcesRequest, request) @@ -1396,17 +1326,11 @@ def update_source( :param timeout_ms: Override the default request timeout configuration for this method in milliseconds :param http_headers: Additional headers to set or replace on requests. """ - base_url = None + base_url = clean_server_url(server_url) if server_url is not None else self.get_default_server_url() url_variables = None if timeout_ms is None: timeout_ms = self.sdk_configuration.timeout_ms - if server_url is not None: - base_url = server_url - else: - base_url = operations.UPDATE_SOURCE_SERVERS[ - operations.UPDATE_SOURCE_SERVER_PLATFORM_API - ] if not isinstance(request, BaseModel): request = utils.unmarshal(request, operations.UpdateSourceRequest) @@ -1515,17 +1439,11 @@ async def update_source_async( :param timeout_ms: Override the default request timeout configuration for this method in milliseconds :param http_headers: Additional headers to set or replace on requests. """ - base_url = None + base_url = clean_server_url(server_url) if server_url is not None else self.get_default_server_url() url_variables = None if timeout_ms is None: timeout_ms = self.sdk_configuration.timeout_ms - if server_url is not None: - base_url = server_url - else: - base_url = operations.UPDATE_SOURCE_SERVERS[ - operations.UPDATE_SOURCE_SERVER_PLATFORM_API - ] if not isinstance(request, BaseModel): request = utils.unmarshal(request, operations.UpdateSourceRequest) diff --git a/src/unstructured_client/utils/__init__.py b/src/unstructured_client/utils/__init__.py index 3cded8fe..f2950eed 100644 --- a/src/unstructured_client/utils/__init__.py +++ b/src/unstructured_client/utils/__init__.py @@ -1,6 +1,7 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from .annotations import get_discriminator +from .datetimes import parse_datetime from .enums import OpenEnumMeta from .headers import get_headers, get_response_headers from .metadata import ( diff --git a/src/unstructured_client/utils/datetimes.py b/src/unstructured_client/utils/datetimes.py new file mode 100644 index 00000000..a6c52cd6 --- /dev/null +++ b/src/unstructured_client/utils/datetimes.py @@ -0,0 +1,23 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from datetime import datetime +import sys + + +def parse_datetime(datetime_string: str) -> datetime: + """ + Convert a RFC 3339 / ISO 8601 formatted string into a datetime object. + Python versions 3.11 and later support parsing RFC 3339 directly with + datetime.fromisoformat(), but for earlier versions, this function + encapsulates the necessary extra logic. + """ + # Python 3.11 and later can parse RFC 3339 directly + if sys.version_info >= (3, 11): + return datetime.fromisoformat(datetime_string) + + # For Python 3.10 and earlier, a common ValueError is trailing 'Z' suffix, + # so fix that upfront. + if datetime_string.endswith("Z"): + datetime_string = datetime_string[:-1] + "+00:00" + + return datetime.fromisoformat(datetime_string) diff --git a/src/unstructured_client/workflows.py b/src/unstructured_client/workflows.py index 18822198..248dc8ec 100644 --- a/src/unstructured_client/workflows.py +++ b/src/unstructured_client/workflows.py @@ -1,5 +1,5 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" - +from unstructured_client._hooks.custom.clean_server_url_hook import clean_server_url from .basesdk import BaseSDK from typing import Any, List, Mapping, Optional, Union, cast from unstructured_client import utils @@ -9,6 +9,10 @@ class Workflows(BaseSDK): + def get_default_server_url(self) -> str: + client_url, *_ = self.sdk_configuration.get_server_details() + return clean_server_url(client_url) + def create_workflow( self, *, @@ -30,17 +34,11 @@ def create_workflow( :param timeout_ms: Override the default request timeout configuration for this method in milliseconds :param http_headers: Additional headers to set or replace on requests. """ - base_url = None + base_url = clean_server_url(server_url) if server_url is not None else self.get_default_server_url() url_variables = None if timeout_ms is None: timeout_ms = self.sdk_configuration.timeout_ms - if server_url is not None: - base_url = server_url - else: - base_url = operations.CREATE_WORKFLOW_SERVERS[ - operations.CREATE_WORKFLOW_SERVER_PLATFORM_API - ] if not isinstance(request, BaseModel): request = utils.unmarshal(request, operations.CreateWorkflowRequest) @@ -145,17 +143,11 @@ async def create_workflow_async( :param timeout_ms: Override the default request timeout configuration for this method in milliseconds :param http_headers: Additional headers to set or replace on requests. """ - base_url = None + base_url = clean_server_url(server_url) if server_url is not None else self.get_default_server_url() url_variables = None if timeout_ms is None: timeout_ms = self.sdk_configuration.timeout_ms - if server_url is not None: - base_url = server_url - else: - base_url = operations.CREATE_WORKFLOW_SERVERS[ - operations.CREATE_WORKFLOW_SERVER_PLATFORM_API - ] if not isinstance(request, BaseModel): request = utils.unmarshal(request, operations.CreateWorkflowRequest) @@ -260,17 +252,12 @@ def delete_workflow( :param timeout_ms: Override the default request timeout configuration for this method in milliseconds :param http_headers: Additional headers to set or replace on requests. """ - base_url = None + base_url = clean_server_url(server_url) if server_url is not None else self.get_default_server_url() url_variables = None if timeout_ms is None: timeout_ms = self.sdk_configuration.timeout_ms - if server_url is not None: - base_url = server_url - else: - base_url = operations.DELETE_WORKFLOW_SERVERS[ - operations.DELETE_WORKFLOW_SERVER_PLATFORM_API - ] + if not isinstance(request, BaseModel): request = utils.unmarshal(request, operations.DeleteWorkflowRequest) @@ -370,17 +357,11 @@ async def delete_workflow_async( :param timeout_ms: Override the default request timeout configuration for this method in milliseconds :param http_headers: Additional headers to set or replace on requests. """ - base_url = None + base_url = clean_server_url(server_url) if server_url is not None else self.get_default_server_url() url_variables = None if timeout_ms is None: timeout_ms = self.sdk_configuration.timeout_ms - if server_url is not None: - base_url = server_url - else: - base_url = operations.DELETE_WORKFLOW_SERVERS[ - operations.DELETE_WORKFLOW_SERVER_PLATFORM_API - ] if not isinstance(request, BaseModel): request = utils.unmarshal(request, operations.DeleteWorkflowRequest) @@ -480,17 +461,11 @@ def get_workflow( :param timeout_ms: Override the default request timeout configuration for this method in milliseconds :param http_headers: Additional headers to set or replace on requests. """ - base_url = None + base_url = clean_server_url(server_url) if server_url is not None else self.get_default_server_url() url_variables = None if timeout_ms is None: timeout_ms = self.sdk_configuration.timeout_ms - if server_url is not None: - base_url = server_url - else: - base_url = operations.GET_WORKFLOW_SERVERS[ - operations.GET_WORKFLOW_SERVER_PLATFORM_API - ] if not isinstance(request, BaseModel): request = utils.unmarshal(request, operations.GetWorkflowRequest) @@ -592,17 +567,11 @@ async def get_workflow_async( :param timeout_ms: Override the default request timeout configuration for this method in milliseconds :param http_headers: Additional headers to set or replace on requests. """ - base_url = None + base_url = clean_server_url(server_url) if server_url is not None else self.get_default_server_url() url_variables = None if timeout_ms is None: timeout_ms = self.sdk_configuration.timeout_ms - if server_url is not None: - base_url = server_url - else: - base_url = operations.GET_WORKFLOW_SERVERS[ - operations.GET_WORKFLOW_SERVER_PLATFORM_API - ] if not isinstance(request, BaseModel): request = utils.unmarshal(request, operations.GetWorkflowRequest) @@ -704,17 +673,11 @@ def list_workflows( :param timeout_ms: Override the default request timeout configuration for this method in milliseconds :param http_headers: Additional headers to set or replace on requests. """ - base_url = None + base_url = clean_server_url(server_url) if server_url is not None else self.get_default_server_url() url_variables = None if timeout_ms is None: timeout_ms = self.sdk_configuration.timeout_ms - if server_url is not None: - base_url = server_url - else: - base_url = operations.LIST_WORKFLOWS_SERVERS[ - operations.LIST_WORKFLOWS_SERVER_PLATFORM_API - ] if not isinstance(request, BaseModel): request = utils.unmarshal(request, operations.ListWorkflowsRequest) @@ -816,17 +779,11 @@ async def list_workflows_async( :param timeout_ms: Override the default request timeout configuration for this method in milliseconds :param http_headers: Additional headers to set or replace on requests. """ - base_url = None + base_url = clean_server_url(server_url) if server_url is not None else self.get_default_server_url() url_variables = None if timeout_ms is None: timeout_ms = self.sdk_configuration.timeout_ms - if server_url is not None: - base_url = server_url - else: - base_url = operations.LIST_WORKFLOWS_SERVERS[ - operations.LIST_WORKFLOWS_SERVER_PLATFORM_API - ] if not isinstance(request, BaseModel): request = utils.unmarshal(request, operations.ListWorkflowsRequest) @@ -928,17 +885,11 @@ def run_workflow( :param timeout_ms: Override the default request timeout configuration for this method in milliseconds :param http_headers: Additional headers to set or replace on requests. """ - base_url = None + base_url = clean_server_url(server_url) if server_url is not None else self.get_default_server_url() url_variables = None if timeout_ms is None: timeout_ms = self.sdk_configuration.timeout_ms - if server_url is not None: - base_url = server_url - else: - base_url = operations.RUN_WORKFLOW_SERVERS[ - operations.RUN_WORKFLOW_SERVER_PLATFORM_API - ] if not isinstance(request, BaseModel): request = utils.unmarshal(request, operations.RunWorkflowRequest) @@ -1047,17 +998,11 @@ async def run_workflow_async( :param timeout_ms: Override the default request timeout configuration for this method in milliseconds :param http_headers: Additional headers to set or replace on requests. """ - base_url = None + base_url = clean_server_url(server_url) if server_url is not None else self.get_default_server_url() url_variables = None if timeout_ms is None: timeout_ms = self.sdk_configuration.timeout_ms - if server_url is not None: - base_url = server_url - else: - base_url = operations.RUN_WORKFLOW_SERVERS[ - operations.RUN_WORKFLOW_SERVER_PLATFORM_API - ] if not isinstance(request, BaseModel): request = utils.unmarshal(request, operations.RunWorkflowRequest) @@ -1166,17 +1111,11 @@ def update_workflow( :param timeout_ms: Override the default request timeout configuration for this method in milliseconds :param http_headers: Additional headers to set or replace on requests. """ - base_url = None + base_url = clean_server_url(server_url) if server_url is not None else self.get_default_server_url() url_variables = None if timeout_ms is None: timeout_ms = self.sdk_configuration.timeout_ms - if server_url is not None: - base_url = server_url - else: - base_url = operations.UPDATE_WORKFLOW_SERVERS[ - operations.UPDATE_WORKFLOW_SERVER_PLATFORM_API - ] if not isinstance(request, BaseModel): request = utils.unmarshal(request, operations.UpdateWorkflowRequest) @@ -1281,17 +1220,11 @@ async def update_workflow_async( :param timeout_ms: Override the default request timeout configuration for this method in milliseconds :param http_headers: Additional headers to set or replace on requests. """ - base_url = None + base_url = clean_server_url(server_url) if server_url is not None else self.get_default_server_url() url_variables = None if timeout_ms is None: timeout_ms = self.sdk_configuration.timeout_ms - if server_url is not None: - base_url = server_url - else: - base_url = operations.UPDATE_WORKFLOW_SERVERS[ - operations.UPDATE_WORKFLOW_SERVER_PLATFORM_API - ] if not isinstance(request, BaseModel): request = utils.unmarshal(request, operations.UpdateWorkflowRequest)