From 7b38f5ffeb2d98d296e5f67f46e5000343dc4591 Mon Sep 17 00:00:00 2001 From: cloudpdf-sdk-bot Date: Tue, 11 Aug 2026 16:56:58 +0000 Subject: [PATCH] chore: generate CloudPDF Python SDK 3.0.0a2 --- .fern/metadata.json | 4 +- README.md | 16 +- cloudpdf-generation.json | 8 +- pyproject.toml | 2 +- reference.md | 802 ++++++++++++- src/cloudpdf/__init__.py | 219 +++- src/cloudpdf/client.py | 27 +- src/cloudpdf/core/client_wrapper.py | 18 +- src/cloudpdf/documents/__init__.py | 5 +- src/cloudpdf/documents/client.py | 88 +- src/cloudpdf/documents/raw_client.py | 98 +- src/cloudpdf/documents/types/__init__.py | 4 +- ...ocuments_init_request_upload_preference.py | 5 + src/cloudpdf/errors/__init__.py | 15 +- src/cloudpdf/errors/conflict_error.py | 11 + src/cloudpdf/errors/gone_error.py | 11 + .../errors/unprocessable_entity_error.py | 11 + src/cloudpdf/shares/__init__.py | 4 + src/cloudpdf/shares/client.py | 669 +++++++++++ src/cloudpdf/shares/raw_client.py | 1012 +++++++++++++++++ src/cloudpdf/tenants/client.py | 235 ++++ src/cloudpdf/tenants/raw_client.py | 347 ++++++ src/cloudpdf/types/__init__.py | 192 +++- ...ocuments_init200response_created_upload.py | 6 +- ...s_init200response_created_upload_proxy.py} | 2 +- ...ocuments_init200response_resumed_upload.py | 6 +- ...s_init200response_resumed_upload_proxy.py} | 2 +- ...y => documents_upload_proxy200response.py} | 2 +- .../documents_upload_proxy400response.py | 20 + ...ocuments_upload_proxy400response_error.py} | 2 +- .../documents_upload_proxy409response.py | 20 + ...documents_upload_proxy409response_error.py | 20 + .../types/shares_create200response.py | 20 + .../types/shares_create200response_share.py | 45 + .../types/shares_create400response.py | 20 + .../types/shares_create400response_error.py | 20 + .../types/shares_create403response.py | 20 + .../types/shares_create403response_error.py | 20 + .../types/shares_create404response.py | 20 + .../types/shares_create404response_error.py | 20 + src/cloudpdf/types/shares_delete_response.py | 20 + .../types/shares_delete_response_error.py | 20 + .../types/shares_exchange200response.py | 24 + .../types/shares_exchange400response.py | 20 + .../types/shares_exchange400response_error.py | 20 + .../types/shares_exchange403response.py | 20 + .../types/shares_exchange403response_error.py | 20 + .../types/shares_exchange404response.py | 20 + .../types/shares_exchange404response_error.py | 20 + .../types/shares_exchange410response.py | 20 + .../types/shares_exchange410response_error.py | 20 + .../types/shares_exchange422response.py | 20 + .../types/shares_exchange422response_error.py | 20 + src/cloudpdf/types/shares_get200response.py | 20 + .../types/shares_get200response_share.py | 45 + src/cloudpdf/types/shares_get404response.py | 20 + .../types/shares_get404response_error.py | 20 + ...0response.py => shares_list200response.py} | 11 +- .../shares_list200response_shares_item.py | 45 + src/cloudpdf/types/shares_list400response.py | 20 + .../types/shares_list400response_error.py | 20 + .../types/shares_update200response.py | 20 + .../types/shares_update200response_share.py | 45 + .../types/shares_update400response.py | 20 + .../types/shares_update400response_error.py | 20 + .../types/shares_update404response.py | 20 + .../types/shares_update404response_error.py | 20 + .../types/tenants_create200response_tenant.py | 2 + ...tenants_create200response_tenant_status.py | 5 + .../types/tenants_get200response_tenant.py | 2 + .../tenants_get200response_tenant_status.py | 5 + .../tenants_list200response_tenants_item.py | 2 + ...nts_list200response_tenants_item_status.py | 5 + src/cloudpdf/types/tenants_resume_response.py | 20 + .../types/tenants_resume_response_error.py | 20 + .../types/tenants_suspend_response.py | 20 + .../types/tenants_suspend_response_error.py | 20 + .../types/tenants_usage200response.py | 27 + .../types/tenants_usage200response_metrics.py | 27 + .../types/tenants_usage400response.py | 20 + .../types/tenants_usage400response_error.py | 20 + .../types/tenants_usage404response.py | 20 + .../types/tenants_usage404response_error.py | 20 + src/cloudpdf/types/tokens_issue_request.py | 1 + .../types/tokens_issue_request_doc.py | 1 + ...ens_issue_request_tenant_scope_item_one.py | 3 +- 86 files changed, 4767 insertions(+), 151 deletions(-) create mode 100644 src/cloudpdf/documents/types/documents_init_request_upload_preference.py create mode 100644 src/cloudpdf/errors/conflict_error.py create mode 100644 src/cloudpdf/errors/gone_error.py create mode 100644 src/cloudpdf/errors/unprocessable_entity_error.py create mode 100644 src/cloudpdf/shares/__init__.py create mode 100644 src/cloudpdf/shares/client.py create mode 100644 src/cloudpdf/shares/raw_client.py rename src/cloudpdf/types/{documents_init200response_created_upload_direct.py => documents_init200response_created_upload_proxy.py} (87%) rename src/cloudpdf/types/{documents_init200response_resumed_upload_direct.py => documents_init200response_resumed_upload_proxy.py} (87%) rename src/cloudpdf/types/{documents_upload_direct200response.py => documents_upload_proxy200response.py} (88%) create mode 100644 src/cloudpdf/types/documents_upload_proxy400response.py rename src/cloudpdf/types/{documents_upload_direct400response_error.py => documents_upload_proxy400response_error.py} (88%) create mode 100644 src/cloudpdf/types/documents_upload_proxy409response.py create mode 100644 src/cloudpdf/types/documents_upload_proxy409response_error.py create mode 100644 src/cloudpdf/types/shares_create200response.py create mode 100644 src/cloudpdf/types/shares_create200response_share.py create mode 100644 src/cloudpdf/types/shares_create400response.py create mode 100644 src/cloudpdf/types/shares_create400response_error.py create mode 100644 src/cloudpdf/types/shares_create403response.py create mode 100644 src/cloudpdf/types/shares_create403response_error.py create mode 100644 src/cloudpdf/types/shares_create404response.py create mode 100644 src/cloudpdf/types/shares_create404response_error.py create mode 100644 src/cloudpdf/types/shares_delete_response.py create mode 100644 src/cloudpdf/types/shares_delete_response_error.py create mode 100644 src/cloudpdf/types/shares_exchange200response.py create mode 100644 src/cloudpdf/types/shares_exchange400response.py create mode 100644 src/cloudpdf/types/shares_exchange400response_error.py create mode 100644 src/cloudpdf/types/shares_exchange403response.py create mode 100644 src/cloudpdf/types/shares_exchange403response_error.py create mode 100644 src/cloudpdf/types/shares_exchange404response.py create mode 100644 src/cloudpdf/types/shares_exchange404response_error.py create mode 100644 src/cloudpdf/types/shares_exchange410response.py create mode 100644 src/cloudpdf/types/shares_exchange410response_error.py create mode 100644 src/cloudpdf/types/shares_exchange422response.py create mode 100644 src/cloudpdf/types/shares_exchange422response_error.py create mode 100644 src/cloudpdf/types/shares_get200response.py create mode 100644 src/cloudpdf/types/shares_get200response_share.py create mode 100644 src/cloudpdf/types/shares_get404response.py create mode 100644 src/cloudpdf/types/shares_get404response_error.py rename src/cloudpdf/types/{documents_upload_direct400response.py => shares_list200response.py} (52%) create mode 100644 src/cloudpdf/types/shares_list200response_shares_item.py create mode 100644 src/cloudpdf/types/shares_list400response.py create mode 100644 src/cloudpdf/types/shares_list400response_error.py create mode 100644 src/cloudpdf/types/shares_update200response.py create mode 100644 src/cloudpdf/types/shares_update200response_share.py create mode 100644 src/cloudpdf/types/shares_update400response.py create mode 100644 src/cloudpdf/types/shares_update400response_error.py create mode 100644 src/cloudpdf/types/shares_update404response.py create mode 100644 src/cloudpdf/types/shares_update404response_error.py create mode 100644 src/cloudpdf/types/tenants_create200response_tenant_status.py create mode 100644 src/cloudpdf/types/tenants_get200response_tenant_status.py create mode 100644 src/cloudpdf/types/tenants_list200response_tenants_item_status.py create mode 100644 src/cloudpdf/types/tenants_resume_response.py create mode 100644 src/cloudpdf/types/tenants_resume_response_error.py create mode 100644 src/cloudpdf/types/tenants_suspend_response.py create mode 100644 src/cloudpdf/types/tenants_suspend_response_error.py create mode 100644 src/cloudpdf/types/tenants_usage200response.py create mode 100644 src/cloudpdf/types/tenants_usage200response_metrics.py create mode 100644 src/cloudpdf/types/tenants_usage400response.py create mode 100644 src/cloudpdf/types/tenants_usage400response_error.py create mode 100644 src/cloudpdf/types/tenants_usage404response.py create mode 100644 src/cloudpdf/types/tenants_usage404response_error.py diff --git a/.fern/metadata.json b/.fern/metadata.json index 5410961..5f99da4 100644 --- a/.fern/metadata.json +++ b/.fern/metadata.json @@ -7,9 +7,9 @@ "client_class_name": "CloudPDFClient", "environment_class_name": "CloudPDFEnvironment" }, - "originGitCommit": "a0adb9e77ef16feaef2358d71b247b4f5a98fd23", + "originGitCommit": "627dce09ca948cde662d6e23a3dc1a049b6440d7", "originGitCommitIsDirty": false, "invokedBy": "ci", - "requestedVersion": "3.0.0a1", + "requestedVersion": "3.0.0a2", "ciProvider": "github" } \ No newline at end of file diff --git a/README.md b/README.md index ba68b39..666a0c2 100644 --- a/README.md +++ b/README.md @@ -41,8 +41,8 @@ client = CloudPDFClient( base_url="https://yourhost.com/path/to/api", ) -client.tenants.create( - id="id", +client.shares.exchange( + share_token="shareToken", ) ``` @@ -62,8 +62,8 @@ client = AsyncCloudPDFClient( async def main() -> None: - await client.tenants.create( - id="id", + await client.shares.exchange( + share_token="shareToken", ) @@ -79,7 +79,7 @@ will be thrown. from cloudpdf.core.api_error import ApiError try: - client.tenants.create(...) + client.shares.exchange(...) except ApiError as e: print(e.status_code) print(e.body) @@ -96,7 +96,7 @@ The `.with_raw_response` property returns a "raw" client that can be used to acc from cloudpdf import CloudPDFClient client = CloudPDFClient(...) -response = client.tenants.with_raw_response.create(...) +response = client.shares.with_raw_response.exchange(...) print(response.headers) # access the response headers print(response.status_code) # access the response status code print(response.data) # access the underlying object @@ -127,7 +127,7 @@ Which status codes are retried depends on the `retryStatusCodes` generator confi Use the `max_retries` request option to configure this behavior. ```python -client.tenants.create(..., request_options={ +client.shares.exchange(..., request_options={ "max_retries": 1 }) ``` @@ -142,7 +142,7 @@ from cloudpdf import CloudPDFClient client = CloudPDFClient(..., timeout=20.0) # Override timeout for a specific method -client.tenants.create(..., request_options={ +client.shares.exchange(..., request_options={ "timeout": 1 }) ``` diff --git a/cloudpdf-generation.json b/cloudpdf-generation.json index f302e83..50a88b6 100644 --- a/cloudpdf-generation.json +++ b/cloudpdf-generation.json @@ -1,12 +1,12 @@ { "language": "python", - "canonicalVersion": "3.0.0-next.1", - "sdkVersion": "3.0.0a1", + "canonicalVersion": "3.0.0-next.2", + "sdkVersion": "3.0.0a2", "source": { "repository": "embedpdf/embed-pdf-viewer", "openapi": "cloudpdf/contract/openapi.json", - "openapiSha256": "6858ce7912e9063d8fb171ade95fc473db01c5971a3af241a612dda79cc05100", - "gitCommit": "a0adb9e77ef16feaef2358d71b247b4f5a98fd23", + "openapiSha256": "afef16ae2ee6de353cf141d766e4815df5cee075c906b34c728c1176bc10ddb1", + "gitCommit": "627dce09ca948cde662d6e23a3dc1a049b6440d7", "gitCommitIsDirty": false }, "fern": { diff --git a/pyproject.toml b/pyproject.toml index 704afd8..7bc6eb1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ dynamic = ["version"] [tool.poetry] name = "cloudpdf" -version = "3.0.0a1" +version = "3.0.0a2" description = "The official Python SDK for the CloudPDF API." readme = "README.md" authors = ["CloudPDF "] diff --git a/reference.md b/reference.md index a21f890..3e84ff3 100644 --- a/reference.md +++ b/reference.md @@ -443,6 +443,550 @@ client.doc.text( + + + + +## Shares +
client.shares.exchange(...) -> SharesExchange200Response +
+
+ +#### 📝 Description + +
+
+ +
+
+ +Unauthenticated, but requires a browser Origin header, checked against the grant allowlist. Unknown, revoked, and disabled tokens are indistinguishable (404). Passphrase-protected grants return 422 SharePasswordRequired until `password` is supplied. Mounted only when the deployment can sign (HS256 mode). +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```python +from cloudpdf import CloudPDFClient + +client = CloudPDFClient( + token="", + base_url="https://yourhost.com/path/to/api", +) + +client.shares.exchange( + share_token="shareToken", +) + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**share_token:** `str` + +
+
+ +
+
+ +**password:** `typing.Optional[str]` + +
+
+ +
+
+ +**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration. + +
+
+
+
+ + +
+
+
+ +
client.shares.list(...) -> SharesList200Response +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```python +from cloudpdf import CloudPDFClient + +client = CloudPDFClient( + token="", + base_url="https://yourhost.com/path/to/api", +) + +client.shares.list( + tenant_id="tenantId", +) + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**tenant_id:** `str` + +
+
+ +
+
+ +**limit:** `typing.Optional[int]` + +
+
+ +
+
+ +**cursor:** `typing.Optional[str]` + +
+
+ +
+
+ +**doc_id:** `typing.Optional[str]` + +
+
+ +
+
+ +**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration. + +
+
+
+
+ + +
+
+
+ +
client.shares.create(...) -> SharesCreate200Response +
+
+ +#### 📝 Description + +
+
+ +
+
+ +The returned share id IS the public share token. Mounted only when the deployment can sign (HS256 mode) — exchange mints session JWTs, so grants exist only where minting does. +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```python +from cloudpdf import CloudPDFClient + +client = CloudPDFClient( + token="", + base_url="https://yourhost.com/path/to/api", +) + +client.shares.create( + tenant_id="tenantId", + doc_id="docId", + scope=[ + "scope" + ], +) + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**tenant_id:** `str` + +
+
+ +
+
+ +**doc_id:** `str` + +
+
+ +
+
+ +**scope:** `typing.List[str]` + +
+
+ +
+
+ +**layer_name:** `typing.Optional[str]` + +
+
+ +
+
+ +**origins:** `typing.Optional[typing.List[str]]` + +
+
+ +
+
+ +**password:** `typing.Optional[str]` + +
+
+ +
+
+ +**session_ttl_seconds:** `typing.Optional[int]` + +
+
+ +
+
+ +**expires_at:** `typing.Optional[int]` + +
+
+ +
+
+ +**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration. + +
+
+
+
+ + +
+
+
+ +
client.shares.get(...) -> SharesGet200Response +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```python +from cloudpdf import CloudPDFClient + +client = CloudPDFClient( + token="", + base_url="https://yourhost.com/path/to/api", +) + +client.shares.get( + tenant_id="tenantId", + share_id="shareId", +) + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**tenant_id:** `str` + +
+
+ +
+
+ +**share_id:** `str` + +
+
+ +
+
+ +**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration. + +
+
+
+
+ + +
+
+
+ +
client.shares.delete(...) +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```python +from cloudpdf import CloudPDFClient + +client = CloudPDFClient( + token="", + base_url="https://yourhost.com/path/to/api", +) + +client.shares.delete( + tenant_id="tenantId", + share_id="shareId", +) + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**tenant_id:** `str` + +
+
+ +
+
+ +**share_id:** `str` + +
+
+ +
+
+ +**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration. + +
+
+
+
+ + +
+
+
+ +
client.shares.update(...) -> SharesUpdate200Response +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```python +from cloudpdf import CloudPDFClient + +client = CloudPDFClient( + token="", + base_url="https://yourhost.com/path/to/api", +) + +client.shares.update( + tenant_id="tenantId", + share_id="shareId", +) + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**tenant_id:** `str` + +
+
+ +
+
+ +**share_id:** `str` + +
+
+ +
+
+ +**scope:** `typing.Optional[typing.List[str]]` + +
+
+ +
+
+ +**origins:** `typing.Optional[typing.List[str]]` + +
+
+ +
+
+ +**password:** `typing.Optional[str]` + +
+
+ +
+
+ +**session_ttl_seconds:** `typing.Optional[int]` + +
+
+ +
+
+ +**disabled:** `typing.Optional[bool]` + +
+
+ +
+
+ +**expires_at:** `typing.Optional[int]` + +
+
+ +
+
+ +**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration. + +
+
+
+
+ +
@@ -704,6 +1248,224 @@ client.tenants.delete( + + + + +
client.tenants.resume(...) +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```python +from cloudpdf import CloudPDFClient + +client = CloudPDFClient( + token="", + base_url="https://yourhost.com/path/to/api", +) + +client.tenants.resume( + tenant_id="tenantId", +) + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**tenant_id:** `str` + +
+
+ +
+
+ +**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration. + +
+
+
+
+ + +
+
+
+ +
client.tenants.suspend(...) +
+
+ +#### 📝 Description + +
+
+ +
+
+ +Instantly reversible with resume. The API token is exempt, so a suspended tenant can still be inspected, exported, resumed, or deleted. +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```python +from cloudpdf import CloudPDFClient + +client = CloudPDFClient( + token="", + base_url="https://yourhost.com/path/to/api", +) + +client.tenants.suspend( + tenant_id="tenantId", +) + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**tenant_id:** `str` + +
+
+ +
+
+ +**reason:** `typing.Optional[str]` + +
+
+ +
+
+ +**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration. + +
+
+
+
+ + +
+
+
+ +
client.tenants.usage(...) -> TenantsUsage200Response +
+
+ +#### 📝 Description + +
+
+ +
+
+ +Facts only — no limits or billing state. Views count share exchanges plus authorized /v1/access grants, deduplicated across the two. +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```python +from cloudpdf import CloudPDFClient + +client = CloudPDFClient( + token="", + base_url="https://yourhost.com/path/to/api", +) + +client.tenants.usage( + tenant_id="tenantId", +) + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**tenant_id:** `str` + +
+
+ +
+
+ +**period:** `typing.Optional[str]` + +
+
+ +
+
+ +**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration. + +
+
+
+
+ +
@@ -1135,10 +1897,24 @@ client.documents.thumbnail( -
client.documents.upload_direct(...) -> DocumentsUploadDirect200Response +
client.documents.upload_proxy(...) -> DocumentsUploadProxy200Response +
+
+ +#### 📝 Description + +
+
+
+This bounded origin-mediated fallback must only be used after documents.init returns upload.kind=proxy. Auto mode prefers a presigned object-store PUT whenever available. +
+
+
+
+ #### 🔌 Usage
@@ -1148,7 +1924,19 @@ client.documents.thumbnail(
```python -client.documents.upload_direct(...) +from cloudpdf import CloudPDFClient + +client = CloudPDFClient( + token="", + base_url="https://yourhost.com/path/to/api", +) + +client.documents.upload_proxy( + tenant_id="tenantId", + id="id", + file="example_file", +) + ```
@@ -1179,7 +1967,7 @@ client.documents.upload_direct(...)
-**request:** `typing.Union[bytes, typing.Iterator[bytes], typing.AsyncIterator[bytes]]` +**file:** `core.File`
@@ -1303,6 +2091,14 @@ client.documents.init(
+**upload_preference:** `typing.Optional[DocumentsInitRequestUploadPreference]` + +
+
+ +
+
+ **request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
diff --git a/src/cloudpdf/__init__.py b/src/cloudpdf/__init__.py index 5122219..3787b73 100644 --- a/src/cloudpdf/__init__.py +++ b/src/cloudpdf/__init__.py @@ -2094,12 +2094,12 @@ DocumentsInit200ResponseCreatedDocumentState, DocumentsInit200ResponseCreatedDocumentThumbnailState, DocumentsInit200ResponseCreatedUpload, - DocumentsInit200ResponseCreatedUploadDirect, DocumentsInit200ResponseCreatedUploadPresigned, DocumentsInit200ResponseCreatedUploadPresignedPresigned, DocumentsInit200ResponseCreatedUploadPresignedPresignedMethod, - DocumentsInit200ResponseCreatedUpload_Direct, + DocumentsInit200ResponseCreatedUploadProxy, DocumentsInit200ResponseCreatedUpload_Presigned, + DocumentsInit200ResponseCreatedUpload_Proxy, DocumentsInit200ResponseDeduped, DocumentsInit200ResponseDedupedDocument, DocumentsInit200ResponseDedupedDocumentState, @@ -2109,12 +2109,12 @@ DocumentsInit200ResponseResumedDocumentState, DocumentsInit200ResponseResumedDocumentThumbnailState, DocumentsInit200ResponseResumedUpload, - DocumentsInit200ResponseResumedUploadDirect, DocumentsInit200ResponseResumedUploadPresigned, DocumentsInit200ResponseResumedUploadPresignedPresigned, DocumentsInit200ResponseResumedUploadPresignedPresignedMethod, - DocumentsInit200ResponseResumedUpload_Direct, + DocumentsInit200ResponseResumedUploadProxy, DocumentsInit200ResponseResumedUpload_Presigned, + DocumentsInit200ResponseResumedUpload_Proxy, DocumentsInit200Response_Created, DocumentsInit200Response_Deduped, DocumentsInit200Response_Resumed, @@ -2128,26 +2128,76 @@ DocumentsList400ResponseError, DocumentsThumbnailResponse, DocumentsThumbnailResponseError, - DocumentsUploadDirect200Response, - DocumentsUploadDirect400Response, - DocumentsUploadDirect400ResponseError, + DocumentsUploadProxy200Response, + DocumentsUploadProxy400Response, + DocumentsUploadProxy400ResponseError, + DocumentsUploadProxy409Response, + DocumentsUploadProxy409ResponseError, EngineErrorPayload, EngineErrorPayloadCode, EngineErrorPayloadName, + SharesCreate200Response, + SharesCreate200ResponseShare, + SharesCreate400Response, + SharesCreate400ResponseError, + SharesCreate403Response, + SharesCreate403ResponseError, + SharesCreate404Response, + SharesCreate404ResponseError, + SharesDeleteResponse, + SharesDeleteResponseError, + SharesExchange200Response, + SharesExchange400Response, + SharesExchange400ResponseError, + SharesExchange403Response, + SharesExchange403ResponseError, + SharesExchange404Response, + SharesExchange404ResponseError, + SharesExchange410Response, + SharesExchange410ResponseError, + SharesExchange422Response, + SharesExchange422ResponseError, + SharesGet200Response, + SharesGet200ResponseShare, + SharesGet404Response, + SharesGet404ResponseError, + SharesList200Response, + SharesList200ResponseSharesItem, + SharesList400Response, + SharesList400ResponseError, + SharesUpdate200Response, + SharesUpdate200ResponseShare, + SharesUpdate400Response, + SharesUpdate400ResponseError, + SharesUpdate404Response, + SharesUpdate404ResponseError, TenantsCreate200Response, TenantsCreate200ResponseTenant, + TenantsCreate200ResponseTenantStatus, TenantsCreate400Response, TenantsCreate400ResponseError, TenantsDeleteResponse, TenantsDeleteResponseError, TenantsGet200Response, TenantsGet200ResponseTenant, + TenantsGet200ResponseTenantStatus, TenantsGet404Response, TenantsGet404ResponseError, TenantsList200Response, TenantsList200ResponseTenantsItem, + TenantsList200ResponseTenantsItemStatus, TenantsList400Response, TenantsList400ResponseError, + TenantsResumeResponse, + TenantsResumeResponseError, + TenantsSuspendResponse, + TenantsSuspendResponseError, + TenantsUsage200Response, + TenantsUsage200ResponseMetrics, + TenantsUsage400Response, + TenantsUsage400ResponseError, + TenantsUsage404Response, + TenantsUsage404ResponseError, TokensIssue200Response, TokensIssue400Response, TokensIssue400ResponseError, @@ -2166,11 +2216,22 @@ TokensRevokeResponse, TokensRevokeResponseError, ) - from .errors import BadRequestError, ForbiddenError, NotFoundError - from . import deployment, doc, documents, tenants, tokens + from .errors import ( + BadRequestError, + ConflictError, + ForbiddenError, + GoneError, + NotFoundError, + UnprocessableEntityError, + ) + from . import deployment, doc, documents, shares, tenants, tokens from ._default_clients import DefaultAioHttpClient, DefaultAsyncHttpxClient from .client import AsyncCloudPDFClient, CloudPDFClient - from .documents import DocumentsInitRequestDedupMode, ListDocumentsRequestState + from .documents import ( + DocumentsInitRequestDedupMode, + DocumentsInitRequestUploadPreference, + ListDocumentsRequestState, + ) from .version import __version__ _dynamic_imports: typing.Dict[str, str] = { "AdminErrorPayload": ".types", @@ -2178,6 +2239,7 @@ "AsyncCloudPDFClient": ".client", "BadRequestError": ".errors", "CloudPDFClient": ".client", + "ConflictError": ".errors", "DefaultAioHttpClient": "._default_clients", "DefaultAsyncHttpxClient": "._default_clients", "DeploymentLicenseStatusResponse": ".types", @@ -4265,12 +4327,12 @@ "DocumentsInit200ResponseCreatedDocumentState": ".types", "DocumentsInit200ResponseCreatedDocumentThumbnailState": ".types", "DocumentsInit200ResponseCreatedUpload": ".types", - "DocumentsInit200ResponseCreatedUploadDirect": ".types", "DocumentsInit200ResponseCreatedUploadPresigned": ".types", "DocumentsInit200ResponseCreatedUploadPresignedPresigned": ".types", "DocumentsInit200ResponseCreatedUploadPresignedPresignedMethod": ".types", - "DocumentsInit200ResponseCreatedUpload_Direct": ".types", + "DocumentsInit200ResponseCreatedUploadProxy": ".types", "DocumentsInit200ResponseCreatedUpload_Presigned": ".types", + "DocumentsInit200ResponseCreatedUpload_Proxy": ".types", "DocumentsInit200ResponseDeduped": ".types", "DocumentsInit200ResponseDedupedDocument": ".types", "DocumentsInit200ResponseDedupedDocumentState": ".types", @@ -4280,18 +4342,19 @@ "DocumentsInit200ResponseResumedDocumentState": ".types", "DocumentsInit200ResponseResumedDocumentThumbnailState": ".types", "DocumentsInit200ResponseResumedUpload": ".types", - "DocumentsInit200ResponseResumedUploadDirect": ".types", "DocumentsInit200ResponseResumedUploadPresigned": ".types", "DocumentsInit200ResponseResumedUploadPresignedPresigned": ".types", "DocumentsInit200ResponseResumedUploadPresignedPresignedMethod": ".types", - "DocumentsInit200ResponseResumedUpload_Direct": ".types", + "DocumentsInit200ResponseResumedUploadProxy": ".types", "DocumentsInit200ResponseResumedUpload_Presigned": ".types", + "DocumentsInit200ResponseResumedUpload_Proxy": ".types", "DocumentsInit200Response_Created": ".types", "DocumentsInit200Response_Deduped": ".types", "DocumentsInit200Response_Resumed": ".types", "DocumentsInit400Response": ".types", "DocumentsInit400ResponseError": ".types", "DocumentsInitRequestDedupMode": ".documents", + "DocumentsInitRequestUploadPreference": ".documents", "DocumentsList200Response": ".types", "DocumentsList200ResponseDocumentsItem": ".types", "DocumentsList200ResponseDocumentsItemState": ".types", @@ -4300,29 +4363,80 @@ "DocumentsList400ResponseError": ".types", "DocumentsThumbnailResponse": ".types", "DocumentsThumbnailResponseError": ".types", - "DocumentsUploadDirect200Response": ".types", - "DocumentsUploadDirect400Response": ".types", - "DocumentsUploadDirect400ResponseError": ".types", + "DocumentsUploadProxy200Response": ".types", + "DocumentsUploadProxy400Response": ".types", + "DocumentsUploadProxy400ResponseError": ".types", + "DocumentsUploadProxy409Response": ".types", + "DocumentsUploadProxy409ResponseError": ".types", "EngineErrorPayload": ".types", "EngineErrorPayloadCode": ".types", "EngineErrorPayloadName": ".types", "ForbiddenError": ".errors", + "GoneError": ".errors", "ListDocumentsRequestState": ".documents", "NotFoundError": ".errors", + "SharesCreate200Response": ".types", + "SharesCreate200ResponseShare": ".types", + "SharesCreate400Response": ".types", + "SharesCreate400ResponseError": ".types", + "SharesCreate403Response": ".types", + "SharesCreate403ResponseError": ".types", + "SharesCreate404Response": ".types", + "SharesCreate404ResponseError": ".types", + "SharesDeleteResponse": ".types", + "SharesDeleteResponseError": ".types", + "SharesExchange200Response": ".types", + "SharesExchange400Response": ".types", + "SharesExchange400ResponseError": ".types", + "SharesExchange403Response": ".types", + "SharesExchange403ResponseError": ".types", + "SharesExchange404Response": ".types", + "SharesExchange404ResponseError": ".types", + "SharesExchange410Response": ".types", + "SharesExchange410ResponseError": ".types", + "SharesExchange422Response": ".types", + "SharesExchange422ResponseError": ".types", + "SharesGet200Response": ".types", + "SharesGet200ResponseShare": ".types", + "SharesGet404Response": ".types", + "SharesGet404ResponseError": ".types", + "SharesList200Response": ".types", + "SharesList200ResponseSharesItem": ".types", + "SharesList400Response": ".types", + "SharesList400ResponseError": ".types", + "SharesUpdate200Response": ".types", + "SharesUpdate200ResponseShare": ".types", + "SharesUpdate400Response": ".types", + "SharesUpdate400ResponseError": ".types", + "SharesUpdate404Response": ".types", + "SharesUpdate404ResponseError": ".types", "TenantsCreate200Response": ".types", "TenantsCreate200ResponseTenant": ".types", + "TenantsCreate200ResponseTenantStatus": ".types", "TenantsCreate400Response": ".types", "TenantsCreate400ResponseError": ".types", "TenantsDeleteResponse": ".types", "TenantsDeleteResponseError": ".types", "TenantsGet200Response": ".types", "TenantsGet200ResponseTenant": ".types", + "TenantsGet200ResponseTenantStatus": ".types", "TenantsGet404Response": ".types", "TenantsGet404ResponseError": ".types", "TenantsList200Response": ".types", "TenantsList200ResponseTenantsItem": ".types", + "TenantsList200ResponseTenantsItemStatus": ".types", "TenantsList400Response": ".types", "TenantsList400ResponseError": ".types", + "TenantsResumeResponse": ".types", + "TenantsResumeResponseError": ".types", + "TenantsSuspendResponse": ".types", + "TenantsSuspendResponseError": ".types", + "TenantsUsage200Response": ".types", + "TenantsUsage200ResponseMetrics": ".types", + "TenantsUsage400Response": ".types", + "TenantsUsage400ResponseError": ".types", + "TenantsUsage404Response": ".types", + "TenantsUsage404ResponseError": ".types", "TokensIssue200Response": ".types", "TokensIssue400Response": ".types", "TokensIssue400ResponseError": ".types", @@ -4340,10 +4454,12 @@ "TokensIssueRequest_Tenant": ".types", "TokensRevokeResponse": ".types", "TokensRevokeResponseError": ".types", + "UnprocessableEntityError": ".errors", "__version__": ".version", "deployment": ".deployment", "doc": ".doc", "documents": ".documents", + "shares": ".shares", "tenants": ".tenants", "tokens": ".tokens", } @@ -4376,6 +4492,7 @@ def __dir__(): "AsyncCloudPDFClient", "BadRequestError", "CloudPDFClient", + "ConflictError", "DefaultAioHttpClient", "DefaultAsyncHttpxClient", "DeploymentLicenseStatusResponse", @@ -6463,12 +6580,12 @@ def __dir__(): "DocumentsInit200ResponseCreatedDocumentState", "DocumentsInit200ResponseCreatedDocumentThumbnailState", "DocumentsInit200ResponseCreatedUpload", - "DocumentsInit200ResponseCreatedUploadDirect", "DocumentsInit200ResponseCreatedUploadPresigned", "DocumentsInit200ResponseCreatedUploadPresignedPresigned", "DocumentsInit200ResponseCreatedUploadPresignedPresignedMethod", - "DocumentsInit200ResponseCreatedUpload_Direct", + "DocumentsInit200ResponseCreatedUploadProxy", "DocumentsInit200ResponseCreatedUpload_Presigned", + "DocumentsInit200ResponseCreatedUpload_Proxy", "DocumentsInit200ResponseDeduped", "DocumentsInit200ResponseDedupedDocument", "DocumentsInit200ResponseDedupedDocumentState", @@ -6478,18 +6595,19 @@ def __dir__(): "DocumentsInit200ResponseResumedDocumentState", "DocumentsInit200ResponseResumedDocumentThumbnailState", "DocumentsInit200ResponseResumedUpload", - "DocumentsInit200ResponseResumedUploadDirect", "DocumentsInit200ResponseResumedUploadPresigned", "DocumentsInit200ResponseResumedUploadPresignedPresigned", "DocumentsInit200ResponseResumedUploadPresignedPresignedMethod", - "DocumentsInit200ResponseResumedUpload_Direct", + "DocumentsInit200ResponseResumedUploadProxy", "DocumentsInit200ResponseResumedUpload_Presigned", + "DocumentsInit200ResponseResumedUpload_Proxy", "DocumentsInit200Response_Created", "DocumentsInit200Response_Deduped", "DocumentsInit200Response_Resumed", "DocumentsInit400Response", "DocumentsInit400ResponseError", "DocumentsInitRequestDedupMode", + "DocumentsInitRequestUploadPreference", "DocumentsList200Response", "DocumentsList200ResponseDocumentsItem", "DocumentsList200ResponseDocumentsItemState", @@ -6498,29 +6616,80 @@ def __dir__(): "DocumentsList400ResponseError", "DocumentsThumbnailResponse", "DocumentsThumbnailResponseError", - "DocumentsUploadDirect200Response", - "DocumentsUploadDirect400Response", - "DocumentsUploadDirect400ResponseError", + "DocumentsUploadProxy200Response", + "DocumentsUploadProxy400Response", + "DocumentsUploadProxy400ResponseError", + "DocumentsUploadProxy409Response", + "DocumentsUploadProxy409ResponseError", "EngineErrorPayload", "EngineErrorPayloadCode", "EngineErrorPayloadName", "ForbiddenError", + "GoneError", "ListDocumentsRequestState", "NotFoundError", + "SharesCreate200Response", + "SharesCreate200ResponseShare", + "SharesCreate400Response", + "SharesCreate400ResponseError", + "SharesCreate403Response", + "SharesCreate403ResponseError", + "SharesCreate404Response", + "SharesCreate404ResponseError", + "SharesDeleteResponse", + "SharesDeleteResponseError", + "SharesExchange200Response", + "SharesExchange400Response", + "SharesExchange400ResponseError", + "SharesExchange403Response", + "SharesExchange403ResponseError", + "SharesExchange404Response", + "SharesExchange404ResponseError", + "SharesExchange410Response", + "SharesExchange410ResponseError", + "SharesExchange422Response", + "SharesExchange422ResponseError", + "SharesGet200Response", + "SharesGet200ResponseShare", + "SharesGet404Response", + "SharesGet404ResponseError", + "SharesList200Response", + "SharesList200ResponseSharesItem", + "SharesList400Response", + "SharesList400ResponseError", + "SharesUpdate200Response", + "SharesUpdate200ResponseShare", + "SharesUpdate400Response", + "SharesUpdate400ResponseError", + "SharesUpdate404Response", + "SharesUpdate404ResponseError", "TenantsCreate200Response", "TenantsCreate200ResponseTenant", + "TenantsCreate200ResponseTenantStatus", "TenantsCreate400Response", "TenantsCreate400ResponseError", "TenantsDeleteResponse", "TenantsDeleteResponseError", "TenantsGet200Response", "TenantsGet200ResponseTenant", + "TenantsGet200ResponseTenantStatus", "TenantsGet404Response", "TenantsGet404ResponseError", "TenantsList200Response", "TenantsList200ResponseTenantsItem", + "TenantsList200ResponseTenantsItemStatus", "TenantsList400Response", "TenantsList400ResponseError", + "TenantsResumeResponse", + "TenantsResumeResponseError", + "TenantsSuspendResponse", + "TenantsSuspendResponseError", + "TenantsUsage200Response", + "TenantsUsage200ResponseMetrics", + "TenantsUsage400Response", + "TenantsUsage400ResponseError", + "TenantsUsage404Response", + "TenantsUsage404ResponseError", "TokensIssue200Response", "TokensIssue400Response", "TokensIssue400ResponseError", @@ -6538,10 +6707,12 @@ def __dir__(): "TokensIssueRequest_Tenant", "TokensRevokeResponse", "TokensRevokeResponseError", + "UnprocessableEntityError", "__version__", "deployment", "doc", "documents", + "shares", "tenants", "tokens", ] diff --git a/src/cloudpdf/client.py b/src/cloudpdf/client.py index 36ab6a4..926f71f 100644 --- a/src/cloudpdf/client.py +++ b/src/cloudpdf/client.py @@ -12,6 +12,7 @@ from .deployment.client import AsyncDeploymentClient, DeploymentClient from .doc.client import AsyncDocClient, DocClient from .documents.client import AsyncDocumentsClient, DocumentsClient + from .shares.client import AsyncSharesClient, SharesClient from .tenants.client import AsyncTenantsClient, TenantsClient from .tokens.client import AsyncTokensClient, TokensClient @@ -25,7 +26,7 @@ class CloudPDFClient: base_url : str The base url to use for requests from the client. - token : typing.Union[str, typing.Callable[[], str]] + token : typing.Optional[typing.Union[str, typing.Callable[[], str]]] headers : typing.Optional[typing.Dict[str, str]] Additional headers to send with every request. @@ -64,7 +65,7 @@ def __init__( self, *, base_url: str, - token: typing.Union[str, typing.Callable[[], str]], + token: typing.Optional[typing.Union[str, typing.Callable[[], str]]] = None, headers: typing.Optional[typing.Dict[str, str]] = None, timeout: typing.Optional[float] = None, max_retries: typing.Optional[int] = None, @@ -93,6 +94,7 @@ def __init__( ) self._deployment: typing.Optional[DeploymentClient] = None self._doc: typing.Optional[DocClient] = None + self._shares: typing.Optional[SharesClient] = None self._tenants: typing.Optional[TenantsClient] = None self._documents: typing.Optional[DocumentsClient] = None self._tokens: typing.Optional[TokensClient] = None @@ -113,6 +115,14 @@ def doc(self): self._doc = DocClient(client_wrapper=self._client_wrapper) return self._doc + @property + def shares(self): + if self._shares is None: + from .shares.client import SharesClient # noqa: E402 + + self._shares = SharesClient(client_wrapper=self._client_wrapper) + return self._shares + @property def tenants(self): if self._tenants is None: @@ -165,7 +175,7 @@ class AsyncCloudPDFClient: base_url : str The base url to use for requests from the client. - token : typing.Union[str, typing.Callable[[], str]] + token : typing.Optional[typing.Union[str, typing.Callable[[], str]]] headers : typing.Optional[typing.Dict[str, str]] Additional headers to send with every request. @@ -207,7 +217,7 @@ def __init__( self, *, base_url: str, - token: typing.Union[str, typing.Callable[[], str]], + token: typing.Optional[typing.Union[str, typing.Callable[[], str]]] = None, headers: typing.Optional[typing.Dict[str, str]] = None, async_token: typing.Optional[typing.Callable[[], typing.Awaitable[str]]] = None, timeout: typing.Optional[float] = None, @@ -236,6 +246,7 @@ def __init__( ) self._deployment: typing.Optional[AsyncDeploymentClient] = None self._doc: typing.Optional[AsyncDocClient] = None + self._shares: typing.Optional[AsyncSharesClient] = None self._tenants: typing.Optional[AsyncTenantsClient] = None self._documents: typing.Optional[AsyncDocumentsClient] = None self._tokens: typing.Optional[AsyncTokensClient] = None @@ -256,6 +267,14 @@ def doc(self): self._doc = AsyncDocClient(client_wrapper=self._client_wrapper) return self._doc + @property + def shares(self): + if self._shares is None: + from .shares.client import AsyncSharesClient # noqa: E402 + + self._shares = AsyncSharesClient(client_wrapper=self._client_wrapper) + return self._shares + @property def tenants(self): if self._tenants is None: diff --git a/src/cloudpdf/core/client_wrapper.py b/src/cloudpdf/core/client_wrapper.py index ddb66d3..3f3ceea 100644 --- a/src/cloudpdf/core/client_wrapper.py +++ b/src/cloudpdf/core/client_wrapper.py @@ -11,7 +11,7 @@ class BaseClientWrapper: def __init__( self, *, - token: typing.Union[str, typing.Callable[[], str]], + token: typing.Optional[typing.Union[str, typing.Callable[[], str]]] = None, headers: typing.Optional[typing.Dict[str, str]] = None, base_url: str, timeout: typing.Optional[float] = None, @@ -33,19 +33,21 @@ def get_headers(self) -> typing.Dict[str, str]: import platform headers: typing.Dict[str, str] = { - "User-Agent": "cloudpdf/3.0.0a1", + "User-Agent": "cloudpdf/3.0.0a2", "X-Fern-Language": "Python", "X-Fern-Runtime": f"python/{platform.python_version()}", "X-Fern-Platform": f"{platform.system().lower()}/{platform.release()}", "X-Fern-SDK-Name": "cloudpdf", - "X-Fern-SDK-Version": "3.0.0a1", + "X-Fern-SDK-Version": "3.0.0a2", **(self.get_custom_headers() or {}), } - headers["Authorization"] = f"Bearer {self._get_token()}" + token = self._get_token() + if token is not None: + headers["Authorization"] = f"Bearer {token}" return headers - def _get_token(self) -> str: - if isinstance(self._token, str): + def _get_token(self) -> typing.Optional[str]: + if isinstance(self._token, str) or self._token is None: return self._token else: return self._token() @@ -73,7 +75,7 @@ class SyncClientWrapper(BaseClientWrapper): def __init__( self, *, - token: typing.Union[str, typing.Callable[[], str]], + token: typing.Optional[typing.Union[str, typing.Callable[[], str]]] = None, headers: typing.Optional[typing.Dict[str, str]] = None, base_url: str, timeout: typing.Optional[float] = None, @@ -107,7 +109,7 @@ class AsyncClientWrapper(BaseClientWrapper): def __init__( self, *, - token: typing.Union[str, typing.Callable[[], str]], + token: typing.Optional[typing.Union[str, typing.Callable[[], str]]] = None, headers: typing.Optional[typing.Dict[str, str]] = None, base_url: str, timeout: typing.Optional[float] = None, diff --git a/src/cloudpdf/documents/__init__.py b/src/cloudpdf/documents/__init__.py index 682480b..cb363e5 100644 --- a/src/cloudpdf/documents/__init__.py +++ b/src/cloudpdf/documents/__init__.py @@ -6,9 +6,10 @@ from importlib import import_module if typing.TYPE_CHECKING: - from .types import DocumentsInitRequestDedupMode, ListDocumentsRequestState + from .types import DocumentsInitRequestDedupMode, DocumentsInitRequestUploadPreference, ListDocumentsRequestState _dynamic_imports: typing.Dict[str, str] = { "DocumentsInitRequestDedupMode": ".types", + "DocumentsInitRequestUploadPreference": ".types", "ListDocumentsRequestState": ".types", } @@ -34,4 +35,4 @@ def __dir__(): return sorted(lazy_attrs) -__all__ = ["DocumentsInitRequestDedupMode", "ListDocumentsRequestState"] +__all__ = ["DocumentsInitRequestDedupMode", "DocumentsInitRequestUploadPreference", "ListDocumentsRequestState"] diff --git a/src/cloudpdf/documents/client.py b/src/cloudpdf/documents/client.py index 21ffc24..8ea1bed 100644 --- a/src/cloudpdf/documents/client.py +++ b/src/cloudpdf/documents/client.py @@ -2,15 +2,17 @@ import typing +from .. import core from ..core.client_wrapper import AsyncClientWrapper, SyncClientWrapper from ..core.request_options import RequestOptions from ..types.documents_commit200response import DocumentsCommit200Response from ..types.documents_get200response import DocumentsGet200Response from ..types.documents_init200response import DocumentsInit200Response from ..types.documents_list200response import DocumentsList200Response -from ..types.documents_upload_direct200response import DocumentsUploadDirect200Response +from ..types.documents_upload_proxy200response import DocumentsUploadProxy200Response from .raw_client import AsyncRawDocumentsClient, RawDocumentsClient from .types.documents_init_request_dedup_mode import DocumentsInitRequestDedupMode +from .types.documents_init_request_upload_preference import DocumentsInitRequestUploadPreference from .types.list_documents_request_state import ListDocumentsRequestState # this is used as the default value for optional parameters @@ -247,32 +249,43 @@ def thumbnail( with self._raw_client.thumbnail(tenant_id, id, request_options=request_options) as r: yield from r.data - def upload_direct( - self, - tenant_id: str, - id: str, - *, - request: typing.Union[bytes, typing.Iterator[bytes], typing.AsyncIterator[bytes]], - request_options: typing.Optional[RequestOptions] = None, - ) -> DocumentsUploadDirect200Response: + def upload_proxy( + self, tenant_id: str, id: str, *, file: core.File, request_options: typing.Optional[RequestOptions] = None + ) -> DocumentsUploadProxy200Response: """ + This bounded origin-mediated fallback must only be used after documents.init returns upload.kind=proxy. Auto mode prefers a presigned object-store PUT whenever available. + Parameters ---------- tenant_id : str id : str - request : typing.Union[bytes, typing.Iterator[bytes], typing.AsyncIterator[bytes]] + file : core.File + See core.File for more documentation request_options : typing.Optional[RequestOptions] Request-specific configuration. Returns ------- - DocumentsUploadDirect200Response + DocumentsUploadProxy200Response OK + + Examples + -------- + from cloudpdf import CloudPDFClient + + client = CloudPDFClient( + token="YOUR_TOKEN", + base_url="https://yourhost.com/path/to/api", + ) + client.documents.upload_proxy( + tenant_id="tenantId", + id="id", + ) """ - _response = self._raw_client.upload_direct(tenant_id, id, request=request, request_options=request_options) + _response = self._raw_client.upload_proxy(tenant_id, id, file=file, request_options=request_options) return _response.data def init( @@ -286,6 +299,7 @@ def init( dedup_mode: typing.Optional[DocumentsInitRequestDedupMode] = OMIT, doc_id: typing.Optional[str] = OMIT, upload_ttl_sec: typing.Optional[float] = OMIT, + upload_preference: typing.Optional[DocumentsInitRequestUploadPreference] = OMIT, request_options: typing.Optional[RequestOptions] = None, ) -> DocumentsInit200Response: """ @@ -307,6 +321,8 @@ def init( upload_ttl_sec : typing.Optional[float] + upload_preference : typing.Optional[DocumentsInitRequestUploadPreference] + request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -338,6 +354,7 @@ def init( dedup_mode=dedup_mode, doc_id=doc_id, upload_ttl_sec=upload_ttl_sec, + upload_preference=upload_preference, request_options=request_options, ) return _response.data @@ -623,34 +640,51 @@ async def main() -> None: async for _chunk in r.data: yield _chunk - async def upload_direct( - self, - tenant_id: str, - id: str, - *, - request: typing.Union[bytes, typing.Iterator[bytes], typing.AsyncIterator[bytes]], - request_options: typing.Optional[RequestOptions] = None, - ) -> DocumentsUploadDirect200Response: + async def upload_proxy( + self, tenant_id: str, id: str, *, file: core.File, request_options: typing.Optional[RequestOptions] = None + ) -> DocumentsUploadProxy200Response: """ + This bounded origin-mediated fallback must only be used after documents.init returns upload.kind=proxy. Auto mode prefers a presigned object-store PUT whenever available. + Parameters ---------- tenant_id : str id : str - request : typing.Union[bytes, typing.Iterator[bytes], typing.AsyncIterator[bytes]] + file : core.File + See core.File for more documentation request_options : typing.Optional[RequestOptions] Request-specific configuration. Returns ------- - DocumentsUploadDirect200Response + DocumentsUploadProxy200Response OK - """ - _response = await self._raw_client.upload_direct( - tenant_id, id, request=request, request_options=request_options + + Examples + -------- + import asyncio + + from cloudpdf import AsyncCloudPDFClient + + client = AsyncCloudPDFClient( + token="YOUR_TOKEN", + base_url="https://yourhost.com/path/to/api", ) + + + async def main() -> None: + await client.documents.upload_proxy( + tenant_id="tenantId", + id="id", + ) + + + asyncio.run(main()) + """ + _response = await self._raw_client.upload_proxy(tenant_id, id, file=file, request_options=request_options) return _response.data async def init( @@ -664,6 +698,7 @@ async def init( dedup_mode: typing.Optional[DocumentsInitRequestDedupMode] = OMIT, doc_id: typing.Optional[str] = OMIT, upload_ttl_sec: typing.Optional[float] = OMIT, + upload_preference: typing.Optional[DocumentsInitRequestUploadPreference] = OMIT, request_options: typing.Optional[RequestOptions] = None, ) -> DocumentsInit200Response: """ @@ -685,6 +720,8 @@ async def init( upload_ttl_sec : typing.Optional[float] + upload_preference : typing.Optional[DocumentsInitRequestUploadPreference] + request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -724,6 +761,7 @@ async def main() -> None: dedup_mode=dedup_mode, doc_id=doc_id, upload_ttl_sec=upload_ttl_sec, + upload_preference=upload_preference, request_options=request_options, ) return _response.data diff --git a/src/cloudpdf/documents/raw_client.py b/src/cloudpdf/documents/raw_client.py index 8aae546..95c33b0 100644 --- a/src/cloudpdf/documents/raw_client.py +++ b/src/cloudpdf/documents/raw_client.py @@ -4,6 +4,7 @@ import typing from json.decoder import JSONDecodeError +from .. import core from ..core.api_error import ApiError from ..core.client_wrapper import AsyncClientWrapper, SyncClientWrapper from ..core.http_response import AsyncHttpResponse, HttpResponse @@ -12,14 +13,17 @@ from ..core.pydantic_utilities import parse_obj_as from ..core.request_options import RequestOptions from ..errors.bad_request_error import BadRequestError +from ..errors.conflict_error import ConflictError from ..errors.forbidden_error import ForbiddenError from ..errors.not_found_error import NotFoundError from ..types.documents_commit200response import DocumentsCommit200Response from ..types.documents_get200response import DocumentsGet200Response from ..types.documents_init200response import DocumentsInit200Response from ..types.documents_list200response import DocumentsList200Response -from ..types.documents_upload_direct200response import DocumentsUploadDirect200Response +from ..types.documents_upload_proxy200response import DocumentsUploadProxy200Response +from ..types.documents_upload_proxy409response import DocumentsUploadProxy409Response from .types.documents_init_request_dedup_mode import DocumentsInitRequestDedupMode +from .types.documents_init_request_upload_preference import DocumentsInitRequestUploadPreference from .types.list_documents_request_state import ListDocumentsRequestState from pydantic import ValidationError @@ -423,47 +427,46 @@ def _stream() -> HttpResponse[typing.Iterator[bytes]]: yield _stream() - def upload_direct( - self, - tenant_id: str, - id: str, - *, - request: typing.Union[bytes, typing.Iterator[bytes], typing.AsyncIterator[bytes]], - request_options: typing.Optional[RequestOptions] = None, - ) -> HttpResponse[DocumentsUploadDirect200Response]: + def upload_proxy( + self, tenant_id: str, id: str, *, file: core.File, request_options: typing.Optional[RequestOptions] = None + ) -> HttpResponse[DocumentsUploadProxy200Response]: """ + This bounded origin-mediated fallback must only be used after documents.init returns upload.kind=proxy. Auto mode prefers a presigned object-store PUT whenever available. + Parameters ---------- tenant_id : str id : str - request : typing.Union[bytes, typing.Iterator[bytes], typing.AsyncIterator[bytes]] + file : core.File + See core.File for more documentation request_options : typing.Optional[RequestOptions] Request-specific configuration. Returns ------- - HttpResponse[DocumentsUploadDirect200Response] + HttpResponse[DocumentsUploadProxy200Response] OK """ _response = self._client_wrapper.httpx_client.request( - f"v1/tenants/{encode_path_param(tenant_id)}/documents/{encode_path_param(id)}/upload-direct", + f"v1/tenants/{encode_path_param(tenant_id)}/documents/{encode_path_param(id)}/upload-proxy", method="POST", - content=request, - headers={ - "content-type": "application/pdf", + data={}, + files={ + "file": file, }, request_options=request_options, omit=OMIT, + force_multipart=True, ) try: if 200 <= _response.status_code < 300: _data = typing.cast( - DocumentsUploadDirect200Response, + DocumentsUploadProxy200Response, parse_obj_as( - type_=DocumentsUploadDirect200Response, # type: ignore + type_=DocumentsUploadProxy200Response, # type: ignore object_=_response.json(), ), ) @@ -479,6 +482,17 @@ def upload_direct( ), ), ) + if _response.status_code == 409: + raise ConflictError( + headers=dict(_response.headers), + body=typing.cast( + DocumentsUploadProxy409Response, + parse_obj_as( + type_=DocumentsUploadProxy409Response, # type: ignore + object_=_response.json(), + ), + ), + ) _response_json = _response.json() except JSONDecodeError: raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text) @@ -499,6 +513,7 @@ def init( dedup_mode: typing.Optional[DocumentsInitRequestDedupMode] = OMIT, doc_id: typing.Optional[str] = OMIT, upload_ttl_sec: typing.Optional[float] = OMIT, + upload_preference: typing.Optional[DocumentsInitRequestUploadPreference] = OMIT, request_options: typing.Optional[RequestOptions] = None, ) -> HttpResponse[DocumentsInit200Response]: """ @@ -520,6 +535,8 @@ def init( upload_ttl_sec : typing.Optional[float] + upload_preference : typing.Optional[DocumentsInitRequestUploadPreference] + request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -539,6 +556,7 @@ def init( "dedupMode": dedup_mode, "docId": doc_id, "uploadTtlSec": upload_ttl_sec, + "uploadPreference": upload_preference, }, headers={ "content-type": "application/json", @@ -975,47 +993,46 @@ async def _stream() -> AsyncHttpResponse[typing.AsyncIterator[bytes]]: yield await _stream() - async def upload_direct( - self, - tenant_id: str, - id: str, - *, - request: typing.Union[bytes, typing.Iterator[bytes], typing.AsyncIterator[bytes]], - request_options: typing.Optional[RequestOptions] = None, - ) -> AsyncHttpResponse[DocumentsUploadDirect200Response]: + async def upload_proxy( + self, tenant_id: str, id: str, *, file: core.File, request_options: typing.Optional[RequestOptions] = None + ) -> AsyncHttpResponse[DocumentsUploadProxy200Response]: """ + This bounded origin-mediated fallback must only be used after documents.init returns upload.kind=proxy. Auto mode prefers a presigned object-store PUT whenever available. + Parameters ---------- tenant_id : str id : str - request : typing.Union[bytes, typing.Iterator[bytes], typing.AsyncIterator[bytes]] + file : core.File + See core.File for more documentation request_options : typing.Optional[RequestOptions] Request-specific configuration. Returns ------- - AsyncHttpResponse[DocumentsUploadDirect200Response] + AsyncHttpResponse[DocumentsUploadProxy200Response] OK """ _response = await self._client_wrapper.httpx_client.request( - f"v1/tenants/{encode_path_param(tenant_id)}/documents/{encode_path_param(id)}/upload-direct", + f"v1/tenants/{encode_path_param(tenant_id)}/documents/{encode_path_param(id)}/upload-proxy", method="POST", - content=request, - headers={ - "content-type": "application/pdf", + data={}, + files={ + "file": file, }, request_options=request_options, omit=OMIT, + force_multipart=True, ) try: if 200 <= _response.status_code < 300: _data = typing.cast( - DocumentsUploadDirect200Response, + DocumentsUploadProxy200Response, parse_obj_as( - type_=DocumentsUploadDirect200Response, # type: ignore + type_=DocumentsUploadProxy200Response, # type: ignore object_=_response.json(), ), ) @@ -1031,6 +1048,17 @@ async def upload_direct( ), ), ) + if _response.status_code == 409: + raise ConflictError( + headers=dict(_response.headers), + body=typing.cast( + DocumentsUploadProxy409Response, + parse_obj_as( + type_=DocumentsUploadProxy409Response, # type: ignore + object_=_response.json(), + ), + ), + ) _response_json = _response.json() except JSONDecodeError: raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text) @@ -1051,6 +1079,7 @@ async def init( dedup_mode: typing.Optional[DocumentsInitRequestDedupMode] = OMIT, doc_id: typing.Optional[str] = OMIT, upload_ttl_sec: typing.Optional[float] = OMIT, + upload_preference: typing.Optional[DocumentsInitRequestUploadPreference] = OMIT, request_options: typing.Optional[RequestOptions] = None, ) -> AsyncHttpResponse[DocumentsInit200Response]: """ @@ -1072,6 +1101,8 @@ async def init( upload_ttl_sec : typing.Optional[float] + upload_preference : typing.Optional[DocumentsInitRequestUploadPreference] + request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -1091,6 +1122,7 @@ async def init( "dedupMode": dedup_mode, "docId": doc_id, "uploadTtlSec": upload_ttl_sec, + "uploadPreference": upload_preference, }, headers={ "content-type": "application/json", diff --git a/src/cloudpdf/documents/types/__init__.py b/src/cloudpdf/documents/types/__init__.py index bf03b51..013d304 100644 --- a/src/cloudpdf/documents/types/__init__.py +++ b/src/cloudpdf/documents/types/__init__.py @@ -7,9 +7,11 @@ if typing.TYPE_CHECKING: from .documents_init_request_dedup_mode import DocumentsInitRequestDedupMode + from .documents_init_request_upload_preference import DocumentsInitRequestUploadPreference from .list_documents_request_state import ListDocumentsRequestState _dynamic_imports: typing.Dict[str, str] = { "DocumentsInitRequestDedupMode": ".documents_init_request_dedup_mode", + "DocumentsInitRequestUploadPreference": ".documents_init_request_upload_preference", "ListDocumentsRequestState": ".list_documents_request_state", } @@ -35,4 +37,4 @@ def __dir__(): return sorted(lazy_attrs) -__all__ = ["DocumentsInitRequestDedupMode", "ListDocumentsRequestState"] +__all__ = ["DocumentsInitRequestDedupMode", "DocumentsInitRequestUploadPreference", "ListDocumentsRequestState"] diff --git a/src/cloudpdf/documents/types/documents_init_request_upload_preference.py b/src/cloudpdf/documents/types/documents_init_request_upload_preference.py new file mode 100644 index 0000000..714bf29 --- /dev/null +++ b/src/cloudpdf/documents/types/documents_init_request_upload_preference.py @@ -0,0 +1,5 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +DocumentsInitRequestUploadPreference = typing.Union[typing.Literal["auto", "presigned", "proxy"], typing.Any] diff --git a/src/cloudpdf/errors/__init__.py b/src/cloudpdf/errors/__init__.py index c0566fa..f1ffc3d 100644 --- a/src/cloudpdf/errors/__init__.py +++ b/src/cloudpdf/errors/__init__.py @@ -7,12 +7,18 @@ if typing.TYPE_CHECKING: from .bad_request_error import BadRequestError + from .conflict_error import ConflictError from .forbidden_error import ForbiddenError + from .gone_error import GoneError from .not_found_error import NotFoundError + from .unprocessable_entity_error import UnprocessableEntityError _dynamic_imports: typing.Dict[str, str] = { "BadRequestError": ".bad_request_error", + "ConflictError": ".conflict_error", "ForbiddenError": ".forbidden_error", + "GoneError": ".gone_error", "NotFoundError": ".not_found_error", + "UnprocessableEntityError": ".unprocessable_entity_error", } @@ -37,4 +43,11 @@ def __dir__(): return sorted(lazy_attrs) -__all__ = ["BadRequestError", "ForbiddenError", "NotFoundError"] +__all__ = [ + "BadRequestError", + "ConflictError", + "ForbiddenError", + "GoneError", + "NotFoundError", + "UnprocessableEntityError", +] diff --git a/src/cloudpdf/errors/conflict_error.py b/src/cloudpdf/errors/conflict_error.py new file mode 100644 index 0000000..e790a76 --- /dev/null +++ b/src/cloudpdf/errors/conflict_error.py @@ -0,0 +1,11 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +from ..core.api_error import ApiError +from ..types.documents_upload_proxy409response import DocumentsUploadProxy409Response + + +class ConflictError(ApiError): + def __init__(self, body: DocumentsUploadProxy409Response, headers: typing.Optional[typing.Dict[str, str]] = None): + super().__init__(status_code=409, headers=headers, body=body) diff --git a/src/cloudpdf/errors/gone_error.py b/src/cloudpdf/errors/gone_error.py new file mode 100644 index 0000000..ca6d177 --- /dev/null +++ b/src/cloudpdf/errors/gone_error.py @@ -0,0 +1,11 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +from ..core.api_error import ApiError +from ..types.shares_exchange410response import SharesExchange410Response + + +class GoneError(ApiError): + def __init__(self, body: SharesExchange410Response, headers: typing.Optional[typing.Dict[str, str]] = None): + super().__init__(status_code=410, headers=headers, body=body) diff --git a/src/cloudpdf/errors/unprocessable_entity_error.py b/src/cloudpdf/errors/unprocessable_entity_error.py new file mode 100644 index 0000000..c0cadfe --- /dev/null +++ b/src/cloudpdf/errors/unprocessable_entity_error.py @@ -0,0 +1,11 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +from ..core.api_error import ApiError +from ..types.shares_exchange422response import SharesExchange422Response + + +class UnprocessableEntityError(ApiError): + def __init__(self, body: SharesExchange422Response, headers: typing.Optional[typing.Dict[str, str]] = None): + super().__init__(status_code=422, headers=headers, body=body) diff --git a/src/cloudpdf/shares/__init__.py b/src/cloudpdf/shares/__init__.py new file mode 100644 index 0000000..5cde020 --- /dev/null +++ b/src/cloudpdf/shares/__init__.py @@ -0,0 +1,4 @@ +# This file was auto-generated by Fern from our API Definition. + +# isort: skip_file + diff --git a/src/cloudpdf/shares/client.py b/src/cloudpdf/shares/client.py new file mode 100644 index 0000000..f382b59 --- /dev/null +++ b/src/cloudpdf/shares/client.py @@ -0,0 +1,669 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +from ..core.client_wrapper import AsyncClientWrapper, SyncClientWrapper +from ..core.request_options import RequestOptions +from ..types.shares_create200response import SharesCreate200Response +from ..types.shares_exchange200response import SharesExchange200Response +from ..types.shares_get200response import SharesGet200Response +from ..types.shares_list200response import SharesList200Response +from ..types.shares_update200response import SharesUpdate200Response +from .raw_client import AsyncRawSharesClient, RawSharesClient + +# this is used as the default value for optional parameters +OMIT = typing.cast(typing.Any, ...) + + +class SharesClient: + def __init__(self, *, client_wrapper: SyncClientWrapper): + self._raw_client = RawSharesClient(client_wrapper=client_wrapper) + + @property + def with_raw_response(self) -> RawSharesClient: + """ + Retrieves a raw implementation of this client that returns raw responses. + + Returns + ------- + RawSharesClient + """ + return self._raw_client + + def exchange( + self, + *, + share_token: str, + password: typing.Optional[str] = OMIT, + request_options: typing.Optional[RequestOptions] = None, + ) -> SharesExchange200Response: + """ + Unauthenticated, but requires a browser Origin header, checked against the grant allowlist. Unknown, revoked, and disabled tokens are indistinguishable (404). Passphrase-protected grants return 422 SharePasswordRequired until `password` is supplied. Mounted only when the deployment can sign (HS256 mode). + + Parameters + ---------- + share_token : str + + password : typing.Optional[str] + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + SharesExchange200Response + OK + + Examples + -------- + from cloudpdf import CloudPDFClient + + client = CloudPDFClient( + token="YOUR_TOKEN", + base_url="https://yourhost.com/path/to/api", + ) + client.shares.exchange( + share_token="shareToken", + ) + """ + _response = self._raw_client.exchange( + share_token=share_token, password=password, request_options=request_options + ) + return _response.data + + def list( + self, + tenant_id: str, + *, + limit: typing.Optional[int] = None, + cursor: typing.Optional[str] = None, + doc_id: typing.Optional[str] = None, + request_options: typing.Optional[RequestOptions] = None, + ) -> SharesList200Response: + """ + Parameters + ---------- + tenant_id : str + + limit : typing.Optional[int] + + cursor : typing.Optional[str] + + doc_id : typing.Optional[str] + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + SharesList200Response + OK + + Examples + -------- + from cloudpdf import CloudPDFClient + + client = CloudPDFClient( + token="YOUR_TOKEN", + base_url="https://yourhost.com/path/to/api", + ) + client.shares.list( + tenant_id="tenantId", + ) + """ + _response = self._raw_client.list( + tenant_id, limit=limit, cursor=cursor, doc_id=doc_id, request_options=request_options + ) + return _response.data + + def create( + self, + tenant_id: str, + *, + doc_id: str, + scope: typing.Sequence[str], + layer_name: typing.Optional[str] = OMIT, + origins: typing.Optional[typing.Sequence[str]] = OMIT, + password: typing.Optional[str] = OMIT, + session_ttl_seconds: typing.Optional[int] = OMIT, + expires_at: typing.Optional[int] = OMIT, + request_options: typing.Optional[RequestOptions] = None, + ) -> SharesCreate200Response: + """ + The returned share id IS the public share token. Mounted only when the deployment can sign (HS256 mode) — exchange mints session JWTs, so grants exist only where minting does. + + Parameters + ---------- + tenant_id : str + + doc_id : str + + scope : typing.Sequence[str] + + layer_name : typing.Optional[str] + + origins : typing.Optional[typing.Sequence[str]] + + password : typing.Optional[str] + + session_ttl_seconds : typing.Optional[int] + + expires_at : typing.Optional[int] + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + SharesCreate200Response + OK + + Examples + -------- + from cloudpdf import CloudPDFClient + + client = CloudPDFClient( + token="YOUR_TOKEN", + base_url="https://yourhost.com/path/to/api", + ) + client.shares.create( + tenant_id="tenantId", + doc_id="docId", + scope=["scope"], + ) + """ + _response = self._raw_client.create( + tenant_id, + doc_id=doc_id, + scope=scope, + layer_name=layer_name, + origins=origins, + password=password, + session_ttl_seconds=session_ttl_seconds, + expires_at=expires_at, + request_options=request_options, + ) + return _response.data + + def get( + self, tenant_id: str, share_id: str, *, request_options: typing.Optional[RequestOptions] = None + ) -> SharesGet200Response: + """ + Parameters + ---------- + tenant_id : str + + share_id : str + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + SharesGet200Response + OK + + Examples + -------- + from cloudpdf import CloudPDFClient + + client = CloudPDFClient( + token="YOUR_TOKEN", + base_url="https://yourhost.com/path/to/api", + ) + client.shares.get( + tenant_id="tenantId", + share_id="shareId", + ) + """ + _response = self._raw_client.get(tenant_id, share_id, request_options=request_options) + return _response.data + + def delete(self, tenant_id: str, share_id: str, *, request_options: typing.Optional[RequestOptions] = None) -> None: + """ + Parameters + ---------- + tenant_id : str + + share_id : str + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + None + + Examples + -------- + from cloudpdf import CloudPDFClient + + client = CloudPDFClient( + token="YOUR_TOKEN", + base_url="https://yourhost.com/path/to/api", + ) + client.shares.delete( + tenant_id="tenantId", + share_id="shareId", + ) + """ + _response = self._raw_client.delete(tenant_id, share_id, request_options=request_options) + return _response.data + + def update( + self, + tenant_id: str, + share_id: str, + *, + scope: typing.Optional[typing.Sequence[str]] = OMIT, + origins: typing.Optional[typing.Sequence[str]] = OMIT, + password: typing.Optional[str] = OMIT, + session_ttl_seconds: typing.Optional[int] = OMIT, + disabled: typing.Optional[bool] = OMIT, + expires_at: typing.Optional[int] = OMIT, + request_options: typing.Optional[RequestOptions] = None, + ) -> SharesUpdate200Response: + """ + Parameters + ---------- + tenant_id : str + + share_id : str + + scope : typing.Optional[typing.Sequence[str]] + + origins : typing.Optional[typing.Sequence[str]] + + password : typing.Optional[str] + + session_ttl_seconds : typing.Optional[int] + + disabled : typing.Optional[bool] + + expires_at : typing.Optional[int] + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + SharesUpdate200Response + OK + + Examples + -------- + from cloudpdf import CloudPDFClient + + client = CloudPDFClient( + token="YOUR_TOKEN", + base_url="https://yourhost.com/path/to/api", + ) + client.shares.update( + tenant_id="tenantId", + share_id="shareId", + ) + """ + _response = self._raw_client.update( + tenant_id, + share_id, + scope=scope, + origins=origins, + password=password, + session_ttl_seconds=session_ttl_seconds, + disabled=disabled, + expires_at=expires_at, + request_options=request_options, + ) + return _response.data + + +class AsyncSharesClient: + def __init__(self, *, client_wrapper: AsyncClientWrapper): + self._raw_client = AsyncRawSharesClient(client_wrapper=client_wrapper) + + @property + def with_raw_response(self) -> AsyncRawSharesClient: + """ + Retrieves a raw implementation of this client that returns raw responses. + + Returns + ------- + AsyncRawSharesClient + """ + return self._raw_client + + async def exchange( + self, + *, + share_token: str, + password: typing.Optional[str] = OMIT, + request_options: typing.Optional[RequestOptions] = None, + ) -> SharesExchange200Response: + """ + Unauthenticated, but requires a browser Origin header, checked against the grant allowlist. Unknown, revoked, and disabled tokens are indistinguishable (404). Passphrase-protected grants return 422 SharePasswordRequired until `password` is supplied. Mounted only when the deployment can sign (HS256 mode). + + Parameters + ---------- + share_token : str + + password : typing.Optional[str] + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + SharesExchange200Response + OK + + Examples + -------- + import asyncio + + from cloudpdf import AsyncCloudPDFClient + + client = AsyncCloudPDFClient( + token="YOUR_TOKEN", + base_url="https://yourhost.com/path/to/api", + ) + + + async def main() -> None: + await client.shares.exchange( + share_token="shareToken", + ) + + + asyncio.run(main()) + """ + _response = await self._raw_client.exchange( + share_token=share_token, password=password, request_options=request_options + ) + return _response.data + + async def list( + self, + tenant_id: str, + *, + limit: typing.Optional[int] = None, + cursor: typing.Optional[str] = None, + doc_id: typing.Optional[str] = None, + request_options: typing.Optional[RequestOptions] = None, + ) -> SharesList200Response: + """ + Parameters + ---------- + tenant_id : str + + limit : typing.Optional[int] + + cursor : typing.Optional[str] + + doc_id : typing.Optional[str] + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + SharesList200Response + OK + + Examples + -------- + import asyncio + + from cloudpdf import AsyncCloudPDFClient + + client = AsyncCloudPDFClient( + token="YOUR_TOKEN", + base_url="https://yourhost.com/path/to/api", + ) + + + async def main() -> None: + await client.shares.list( + tenant_id="tenantId", + ) + + + asyncio.run(main()) + """ + _response = await self._raw_client.list( + tenant_id, limit=limit, cursor=cursor, doc_id=doc_id, request_options=request_options + ) + return _response.data + + async def create( + self, + tenant_id: str, + *, + doc_id: str, + scope: typing.Sequence[str], + layer_name: typing.Optional[str] = OMIT, + origins: typing.Optional[typing.Sequence[str]] = OMIT, + password: typing.Optional[str] = OMIT, + session_ttl_seconds: typing.Optional[int] = OMIT, + expires_at: typing.Optional[int] = OMIT, + request_options: typing.Optional[RequestOptions] = None, + ) -> SharesCreate200Response: + """ + The returned share id IS the public share token. Mounted only when the deployment can sign (HS256 mode) — exchange mints session JWTs, so grants exist only where minting does. + + Parameters + ---------- + tenant_id : str + + doc_id : str + + scope : typing.Sequence[str] + + layer_name : typing.Optional[str] + + origins : typing.Optional[typing.Sequence[str]] + + password : typing.Optional[str] + + session_ttl_seconds : typing.Optional[int] + + expires_at : typing.Optional[int] + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + SharesCreate200Response + OK + + Examples + -------- + import asyncio + + from cloudpdf import AsyncCloudPDFClient + + client = AsyncCloudPDFClient( + token="YOUR_TOKEN", + base_url="https://yourhost.com/path/to/api", + ) + + + async def main() -> None: + await client.shares.create( + tenant_id="tenantId", + doc_id="docId", + scope=["scope"], + ) + + + asyncio.run(main()) + """ + _response = await self._raw_client.create( + tenant_id, + doc_id=doc_id, + scope=scope, + layer_name=layer_name, + origins=origins, + password=password, + session_ttl_seconds=session_ttl_seconds, + expires_at=expires_at, + request_options=request_options, + ) + return _response.data + + async def get( + self, tenant_id: str, share_id: str, *, request_options: typing.Optional[RequestOptions] = None + ) -> SharesGet200Response: + """ + Parameters + ---------- + tenant_id : str + + share_id : str + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + SharesGet200Response + OK + + Examples + -------- + import asyncio + + from cloudpdf import AsyncCloudPDFClient + + client = AsyncCloudPDFClient( + token="YOUR_TOKEN", + base_url="https://yourhost.com/path/to/api", + ) + + + async def main() -> None: + await client.shares.get( + tenant_id="tenantId", + share_id="shareId", + ) + + + asyncio.run(main()) + """ + _response = await self._raw_client.get(tenant_id, share_id, request_options=request_options) + return _response.data + + async def delete( + self, tenant_id: str, share_id: str, *, request_options: typing.Optional[RequestOptions] = None + ) -> None: + """ + Parameters + ---------- + tenant_id : str + + share_id : str + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + None + + Examples + -------- + import asyncio + + from cloudpdf import AsyncCloudPDFClient + + client = AsyncCloudPDFClient( + token="YOUR_TOKEN", + base_url="https://yourhost.com/path/to/api", + ) + + + async def main() -> None: + await client.shares.delete( + tenant_id="tenantId", + share_id="shareId", + ) + + + asyncio.run(main()) + """ + _response = await self._raw_client.delete(tenant_id, share_id, request_options=request_options) + return _response.data + + async def update( + self, + tenant_id: str, + share_id: str, + *, + scope: typing.Optional[typing.Sequence[str]] = OMIT, + origins: typing.Optional[typing.Sequence[str]] = OMIT, + password: typing.Optional[str] = OMIT, + session_ttl_seconds: typing.Optional[int] = OMIT, + disabled: typing.Optional[bool] = OMIT, + expires_at: typing.Optional[int] = OMIT, + request_options: typing.Optional[RequestOptions] = None, + ) -> SharesUpdate200Response: + """ + Parameters + ---------- + tenant_id : str + + share_id : str + + scope : typing.Optional[typing.Sequence[str]] + + origins : typing.Optional[typing.Sequence[str]] + + password : typing.Optional[str] + + session_ttl_seconds : typing.Optional[int] + + disabled : typing.Optional[bool] + + expires_at : typing.Optional[int] + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + SharesUpdate200Response + OK + + Examples + -------- + import asyncio + + from cloudpdf import AsyncCloudPDFClient + + client = AsyncCloudPDFClient( + token="YOUR_TOKEN", + base_url="https://yourhost.com/path/to/api", + ) + + + async def main() -> None: + await client.shares.update( + tenant_id="tenantId", + share_id="shareId", + ) + + + asyncio.run(main()) + """ + _response = await self._raw_client.update( + tenant_id, + share_id, + scope=scope, + origins=origins, + password=password, + session_ttl_seconds=session_ttl_seconds, + disabled=disabled, + expires_at=expires_at, + request_options=request_options, + ) + return _response.data diff --git a/src/cloudpdf/shares/raw_client.py b/src/cloudpdf/shares/raw_client.py new file mode 100644 index 0000000..5050454 --- /dev/null +++ b/src/cloudpdf/shares/raw_client.py @@ -0,0 +1,1012 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing +from json.decoder import JSONDecodeError + +from ..core.api_error import ApiError +from ..core.client_wrapper import AsyncClientWrapper, SyncClientWrapper +from ..core.http_response import AsyncHttpResponse, HttpResponse +from ..core.jsonable_encoder import encode_path_param +from ..core.parse_error import ParsingError +from ..core.pydantic_utilities import parse_obj_as +from ..core.request_options import RequestOptions +from ..errors.bad_request_error import BadRequestError +from ..errors.forbidden_error import ForbiddenError +from ..errors.gone_error import GoneError +from ..errors.not_found_error import NotFoundError +from ..errors.unprocessable_entity_error import UnprocessableEntityError +from ..types.shares_create200response import SharesCreate200Response +from ..types.shares_exchange200response import SharesExchange200Response +from ..types.shares_exchange410response import SharesExchange410Response +from ..types.shares_exchange422response import SharesExchange422Response +from ..types.shares_get200response import SharesGet200Response +from ..types.shares_list200response import SharesList200Response +from ..types.shares_update200response import SharesUpdate200Response +from pydantic import ValidationError + +# this is used as the default value for optional parameters +OMIT = typing.cast(typing.Any, ...) + + +class RawSharesClient: + def __init__(self, *, client_wrapper: SyncClientWrapper): + self._client_wrapper = client_wrapper + + def exchange( + self, + *, + share_token: str, + password: typing.Optional[str] = OMIT, + request_options: typing.Optional[RequestOptions] = None, + ) -> HttpResponse[SharesExchange200Response]: + """ + Unauthenticated, but requires a browser Origin header, checked against the grant allowlist. Unknown, revoked, and disabled tokens are indistinguishable (404). Passphrase-protected grants return 422 SharePasswordRequired until `password` is supplied. Mounted only when the deployment can sign (HS256 mode). + + Parameters + ---------- + share_token : str + + password : typing.Optional[str] + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + HttpResponse[SharesExchange200Response] + OK + """ + _response = self._client_wrapper.httpx_client.request( + "v1/share-sessions", + method="POST", + json={ + "shareToken": share_token, + "password": password, + }, + headers={ + "content-type": "application/json", + }, + request_options=request_options, + omit=OMIT, + ) + try: + if 200 <= _response.status_code < 300: + _data = typing.cast( + SharesExchange200Response, + parse_obj_as( + type_=SharesExchange200Response, # type: ignore + object_=_response.json(), + ), + ) + return HttpResponse(response=_response, data=_data) + if _response.status_code == 400: + raise BadRequestError( + headers=dict(_response.headers), + body=typing.cast( + typing.Any, + parse_obj_as( + type_=typing.Any, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 403: + raise ForbiddenError( + headers=dict(_response.headers), + body=typing.cast( + typing.Any, + parse_obj_as( + type_=typing.Any, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 404: + raise NotFoundError( + headers=dict(_response.headers), + body=typing.cast( + typing.Any, + parse_obj_as( + type_=typing.Any, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 410: + raise GoneError( + headers=dict(_response.headers), + body=typing.cast( + SharesExchange410Response, + parse_obj_as( + type_=SharesExchange410Response, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 422: + raise UnprocessableEntityError( + headers=dict(_response.headers), + body=typing.cast( + SharesExchange422Response, + parse_obj_as( + type_=SharesExchange422Response, # type: ignore + object_=_response.json(), + ), + ), + ) + _response_json = _response.json() + except JSONDecodeError: + raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text) + except ValidationError as e: + raise ParsingError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e + ) + raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json) + + def list( + self, + tenant_id: str, + *, + limit: typing.Optional[int] = None, + cursor: typing.Optional[str] = None, + doc_id: typing.Optional[str] = None, + request_options: typing.Optional[RequestOptions] = None, + ) -> HttpResponse[SharesList200Response]: + """ + Parameters + ---------- + tenant_id : str + + limit : typing.Optional[int] + + cursor : typing.Optional[str] + + doc_id : typing.Optional[str] + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + HttpResponse[SharesList200Response] + OK + """ + _response = self._client_wrapper.httpx_client.request( + f"v1/tenants/{encode_path_param(tenant_id)}/shares", + method="GET", + params={ + "limit": limit, + "cursor": cursor, + "docId": doc_id, + }, + request_options=request_options, + ) + try: + if 200 <= _response.status_code < 300: + _data = typing.cast( + SharesList200Response, + parse_obj_as( + type_=SharesList200Response, # type: ignore + object_=_response.json(), + ), + ) + return HttpResponse(response=_response, data=_data) + if _response.status_code == 400: + raise BadRequestError( + headers=dict(_response.headers), + body=typing.cast( + typing.Any, + parse_obj_as( + type_=typing.Any, # type: ignore + object_=_response.json(), + ), + ), + ) + _response_json = _response.json() + except JSONDecodeError: + raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text) + except ValidationError as e: + raise ParsingError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e + ) + raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json) + + def create( + self, + tenant_id: str, + *, + doc_id: str, + scope: typing.Sequence[str], + layer_name: typing.Optional[str] = OMIT, + origins: typing.Optional[typing.Sequence[str]] = OMIT, + password: typing.Optional[str] = OMIT, + session_ttl_seconds: typing.Optional[int] = OMIT, + expires_at: typing.Optional[int] = OMIT, + request_options: typing.Optional[RequestOptions] = None, + ) -> HttpResponse[SharesCreate200Response]: + """ + The returned share id IS the public share token. Mounted only when the deployment can sign (HS256 mode) — exchange mints session JWTs, so grants exist only where minting does. + + Parameters + ---------- + tenant_id : str + + doc_id : str + + scope : typing.Sequence[str] + + layer_name : typing.Optional[str] + + origins : typing.Optional[typing.Sequence[str]] + + password : typing.Optional[str] + + session_ttl_seconds : typing.Optional[int] + + expires_at : typing.Optional[int] + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + HttpResponse[SharesCreate200Response] + OK + """ + _response = self._client_wrapper.httpx_client.request( + f"v1/tenants/{encode_path_param(tenant_id)}/shares", + method="POST", + json={ + "docId": doc_id, + "layerName": layer_name, + "scope": scope, + "origins": origins, + "password": password, + "sessionTtlSeconds": session_ttl_seconds, + "expiresAt": expires_at, + }, + headers={ + "content-type": "application/json", + }, + request_options=request_options, + omit=OMIT, + ) + try: + if 200 <= _response.status_code < 300: + _data = typing.cast( + SharesCreate200Response, + parse_obj_as( + type_=SharesCreate200Response, # type: ignore + object_=_response.json(), + ), + ) + return HttpResponse(response=_response, data=_data) + if _response.status_code == 400: + raise BadRequestError( + headers=dict(_response.headers), + body=typing.cast( + typing.Any, + parse_obj_as( + type_=typing.Any, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 403: + raise ForbiddenError( + headers=dict(_response.headers), + body=typing.cast( + typing.Any, + parse_obj_as( + type_=typing.Any, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 404: + raise NotFoundError( + headers=dict(_response.headers), + body=typing.cast( + typing.Any, + parse_obj_as( + type_=typing.Any, # type: ignore + object_=_response.json(), + ), + ), + ) + _response_json = _response.json() + except JSONDecodeError: + raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text) + except ValidationError as e: + raise ParsingError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e + ) + raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json) + + def get( + self, tenant_id: str, share_id: str, *, request_options: typing.Optional[RequestOptions] = None + ) -> HttpResponse[SharesGet200Response]: + """ + Parameters + ---------- + tenant_id : str + + share_id : str + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + HttpResponse[SharesGet200Response] + OK + """ + _response = self._client_wrapper.httpx_client.request( + f"v1/tenants/{encode_path_param(tenant_id)}/shares/{encode_path_param(share_id)}", + method="GET", + request_options=request_options, + ) + try: + if 200 <= _response.status_code < 300: + _data = typing.cast( + SharesGet200Response, + parse_obj_as( + type_=SharesGet200Response, # type: ignore + object_=_response.json(), + ), + ) + return HttpResponse(response=_response, data=_data) + if _response.status_code == 404: + raise NotFoundError( + headers=dict(_response.headers), + body=typing.cast( + typing.Any, + parse_obj_as( + type_=typing.Any, # type: ignore + object_=_response.json(), + ), + ), + ) + _response_json = _response.json() + except JSONDecodeError: + raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text) + except ValidationError as e: + raise ParsingError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e + ) + raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json) + + def delete( + self, tenant_id: str, share_id: str, *, request_options: typing.Optional[RequestOptions] = None + ) -> HttpResponse[None]: + """ + Parameters + ---------- + tenant_id : str + + share_id : str + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + HttpResponse[None] + """ + _response = self._client_wrapper.httpx_client.request( + f"v1/tenants/{encode_path_param(tenant_id)}/shares/{encode_path_param(share_id)}", + method="DELETE", + request_options=request_options, + ) + try: + if 200 <= _response.status_code < 300: + return HttpResponse(response=_response, data=None) + if _response.status_code == 404: + raise NotFoundError( + headers=dict(_response.headers), + body=typing.cast( + typing.Any, + parse_obj_as( + type_=typing.Any, # type: ignore + object_=_response.json(), + ), + ), + ) + _response_json = _response.json() + except JSONDecodeError: + raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text) + except ValidationError as e: + raise ParsingError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e + ) + raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json) + + def update( + self, + tenant_id: str, + share_id: str, + *, + scope: typing.Optional[typing.Sequence[str]] = OMIT, + origins: typing.Optional[typing.Sequence[str]] = OMIT, + password: typing.Optional[str] = OMIT, + session_ttl_seconds: typing.Optional[int] = OMIT, + disabled: typing.Optional[bool] = OMIT, + expires_at: typing.Optional[int] = OMIT, + request_options: typing.Optional[RequestOptions] = None, + ) -> HttpResponse[SharesUpdate200Response]: + """ + Parameters + ---------- + tenant_id : str + + share_id : str + + scope : typing.Optional[typing.Sequence[str]] + + origins : typing.Optional[typing.Sequence[str]] + + password : typing.Optional[str] + + session_ttl_seconds : typing.Optional[int] + + disabled : typing.Optional[bool] + + expires_at : typing.Optional[int] + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + HttpResponse[SharesUpdate200Response] + OK + """ + _response = self._client_wrapper.httpx_client.request( + f"v1/tenants/{encode_path_param(tenant_id)}/shares/{encode_path_param(share_id)}", + method="PATCH", + json={ + "scope": scope, + "origins": origins, + "password": password, + "sessionTtlSeconds": session_ttl_seconds, + "disabled": disabled, + "expiresAt": expires_at, + }, + headers={ + "content-type": "application/json", + }, + request_options=request_options, + omit=OMIT, + ) + try: + if 200 <= _response.status_code < 300: + _data = typing.cast( + SharesUpdate200Response, + parse_obj_as( + type_=SharesUpdate200Response, # type: ignore + object_=_response.json(), + ), + ) + return HttpResponse(response=_response, data=_data) + if _response.status_code == 400: + raise BadRequestError( + headers=dict(_response.headers), + body=typing.cast( + typing.Any, + parse_obj_as( + type_=typing.Any, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 404: + raise NotFoundError( + headers=dict(_response.headers), + body=typing.cast( + typing.Any, + parse_obj_as( + type_=typing.Any, # type: ignore + object_=_response.json(), + ), + ), + ) + _response_json = _response.json() + except JSONDecodeError: + raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text) + except ValidationError as e: + raise ParsingError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e + ) + raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json) + + +class AsyncRawSharesClient: + def __init__(self, *, client_wrapper: AsyncClientWrapper): + self._client_wrapper = client_wrapper + + async def exchange( + self, + *, + share_token: str, + password: typing.Optional[str] = OMIT, + request_options: typing.Optional[RequestOptions] = None, + ) -> AsyncHttpResponse[SharesExchange200Response]: + """ + Unauthenticated, but requires a browser Origin header, checked against the grant allowlist. Unknown, revoked, and disabled tokens are indistinguishable (404). Passphrase-protected grants return 422 SharePasswordRequired until `password` is supplied. Mounted only when the deployment can sign (HS256 mode). + + Parameters + ---------- + share_token : str + + password : typing.Optional[str] + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + AsyncHttpResponse[SharesExchange200Response] + OK + """ + _response = await self._client_wrapper.httpx_client.request( + "v1/share-sessions", + method="POST", + json={ + "shareToken": share_token, + "password": password, + }, + headers={ + "content-type": "application/json", + }, + request_options=request_options, + omit=OMIT, + ) + try: + if 200 <= _response.status_code < 300: + _data = typing.cast( + SharesExchange200Response, + parse_obj_as( + type_=SharesExchange200Response, # type: ignore + object_=_response.json(), + ), + ) + return AsyncHttpResponse(response=_response, data=_data) + if _response.status_code == 400: + raise BadRequestError( + headers=dict(_response.headers), + body=typing.cast( + typing.Any, + parse_obj_as( + type_=typing.Any, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 403: + raise ForbiddenError( + headers=dict(_response.headers), + body=typing.cast( + typing.Any, + parse_obj_as( + type_=typing.Any, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 404: + raise NotFoundError( + headers=dict(_response.headers), + body=typing.cast( + typing.Any, + parse_obj_as( + type_=typing.Any, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 410: + raise GoneError( + headers=dict(_response.headers), + body=typing.cast( + SharesExchange410Response, + parse_obj_as( + type_=SharesExchange410Response, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 422: + raise UnprocessableEntityError( + headers=dict(_response.headers), + body=typing.cast( + SharesExchange422Response, + parse_obj_as( + type_=SharesExchange422Response, # type: ignore + object_=_response.json(), + ), + ), + ) + _response_json = _response.json() + except JSONDecodeError: + raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text) + except ValidationError as e: + raise ParsingError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e + ) + raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json) + + async def list( + self, + tenant_id: str, + *, + limit: typing.Optional[int] = None, + cursor: typing.Optional[str] = None, + doc_id: typing.Optional[str] = None, + request_options: typing.Optional[RequestOptions] = None, + ) -> AsyncHttpResponse[SharesList200Response]: + """ + Parameters + ---------- + tenant_id : str + + limit : typing.Optional[int] + + cursor : typing.Optional[str] + + doc_id : typing.Optional[str] + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + AsyncHttpResponse[SharesList200Response] + OK + """ + _response = await self._client_wrapper.httpx_client.request( + f"v1/tenants/{encode_path_param(tenant_id)}/shares", + method="GET", + params={ + "limit": limit, + "cursor": cursor, + "docId": doc_id, + }, + request_options=request_options, + ) + try: + if 200 <= _response.status_code < 300: + _data = typing.cast( + SharesList200Response, + parse_obj_as( + type_=SharesList200Response, # type: ignore + object_=_response.json(), + ), + ) + return AsyncHttpResponse(response=_response, data=_data) + if _response.status_code == 400: + raise BadRequestError( + headers=dict(_response.headers), + body=typing.cast( + typing.Any, + parse_obj_as( + type_=typing.Any, # type: ignore + object_=_response.json(), + ), + ), + ) + _response_json = _response.json() + except JSONDecodeError: + raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text) + except ValidationError as e: + raise ParsingError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e + ) + raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json) + + async def create( + self, + tenant_id: str, + *, + doc_id: str, + scope: typing.Sequence[str], + layer_name: typing.Optional[str] = OMIT, + origins: typing.Optional[typing.Sequence[str]] = OMIT, + password: typing.Optional[str] = OMIT, + session_ttl_seconds: typing.Optional[int] = OMIT, + expires_at: typing.Optional[int] = OMIT, + request_options: typing.Optional[RequestOptions] = None, + ) -> AsyncHttpResponse[SharesCreate200Response]: + """ + The returned share id IS the public share token. Mounted only when the deployment can sign (HS256 mode) — exchange mints session JWTs, so grants exist only where minting does. + + Parameters + ---------- + tenant_id : str + + doc_id : str + + scope : typing.Sequence[str] + + layer_name : typing.Optional[str] + + origins : typing.Optional[typing.Sequence[str]] + + password : typing.Optional[str] + + session_ttl_seconds : typing.Optional[int] + + expires_at : typing.Optional[int] + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + AsyncHttpResponse[SharesCreate200Response] + OK + """ + _response = await self._client_wrapper.httpx_client.request( + f"v1/tenants/{encode_path_param(tenant_id)}/shares", + method="POST", + json={ + "docId": doc_id, + "layerName": layer_name, + "scope": scope, + "origins": origins, + "password": password, + "sessionTtlSeconds": session_ttl_seconds, + "expiresAt": expires_at, + }, + headers={ + "content-type": "application/json", + }, + request_options=request_options, + omit=OMIT, + ) + try: + if 200 <= _response.status_code < 300: + _data = typing.cast( + SharesCreate200Response, + parse_obj_as( + type_=SharesCreate200Response, # type: ignore + object_=_response.json(), + ), + ) + return AsyncHttpResponse(response=_response, data=_data) + if _response.status_code == 400: + raise BadRequestError( + headers=dict(_response.headers), + body=typing.cast( + typing.Any, + parse_obj_as( + type_=typing.Any, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 403: + raise ForbiddenError( + headers=dict(_response.headers), + body=typing.cast( + typing.Any, + parse_obj_as( + type_=typing.Any, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 404: + raise NotFoundError( + headers=dict(_response.headers), + body=typing.cast( + typing.Any, + parse_obj_as( + type_=typing.Any, # type: ignore + object_=_response.json(), + ), + ), + ) + _response_json = _response.json() + except JSONDecodeError: + raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text) + except ValidationError as e: + raise ParsingError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e + ) + raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json) + + async def get( + self, tenant_id: str, share_id: str, *, request_options: typing.Optional[RequestOptions] = None + ) -> AsyncHttpResponse[SharesGet200Response]: + """ + Parameters + ---------- + tenant_id : str + + share_id : str + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + AsyncHttpResponse[SharesGet200Response] + OK + """ + _response = await self._client_wrapper.httpx_client.request( + f"v1/tenants/{encode_path_param(tenant_id)}/shares/{encode_path_param(share_id)}", + method="GET", + request_options=request_options, + ) + try: + if 200 <= _response.status_code < 300: + _data = typing.cast( + SharesGet200Response, + parse_obj_as( + type_=SharesGet200Response, # type: ignore + object_=_response.json(), + ), + ) + return AsyncHttpResponse(response=_response, data=_data) + if _response.status_code == 404: + raise NotFoundError( + headers=dict(_response.headers), + body=typing.cast( + typing.Any, + parse_obj_as( + type_=typing.Any, # type: ignore + object_=_response.json(), + ), + ), + ) + _response_json = _response.json() + except JSONDecodeError: + raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text) + except ValidationError as e: + raise ParsingError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e + ) + raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json) + + async def delete( + self, tenant_id: str, share_id: str, *, request_options: typing.Optional[RequestOptions] = None + ) -> AsyncHttpResponse[None]: + """ + Parameters + ---------- + tenant_id : str + + share_id : str + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + AsyncHttpResponse[None] + """ + _response = await self._client_wrapper.httpx_client.request( + f"v1/tenants/{encode_path_param(tenant_id)}/shares/{encode_path_param(share_id)}", + method="DELETE", + request_options=request_options, + ) + try: + if 200 <= _response.status_code < 300: + return AsyncHttpResponse(response=_response, data=None) + if _response.status_code == 404: + raise NotFoundError( + headers=dict(_response.headers), + body=typing.cast( + typing.Any, + parse_obj_as( + type_=typing.Any, # type: ignore + object_=_response.json(), + ), + ), + ) + _response_json = _response.json() + except JSONDecodeError: + raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text) + except ValidationError as e: + raise ParsingError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e + ) + raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json) + + async def update( + self, + tenant_id: str, + share_id: str, + *, + scope: typing.Optional[typing.Sequence[str]] = OMIT, + origins: typing.Optional[typing.Sequence[str]] = OMIT, + password: typing.Optional[str] = OMIT, + session_ttl_seconds: typing.Optional[int] = OMIT, + disabled: typing.Optional[bool] = OMIT, + expires_at: typing.Optional[int] = OMIT, + request_options: typing.Optional[RequestOptions] = None, + ) -> AsyncHttpResponse[SharesUpdate200Response]: + """ + Parameters + ---------- + tenant_id : str + + share_id : str + + scope : typing.Optional[typing.Sequence[str]] + + origins : typing.Optional[typing.Sequence[str]] + + password : typing.Optional[str] + + session_ttl_seconds : typing.Optional[int] + + disabled : typing.Optional[bool] + + expires_at : typing.Optional[int] + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + AsyncHttpResponse[SharesUpdate200Response] + OK + """ + _response = await self._client_wrapper.httpx_client.request( + f"v1/tenants/{encode_path_param(tenant_id)}/shares/{encode_path_param(share_id)}", + method="PATCH", + json={ + "scope": scope, + "origins": origins, + "password": password, + "sessionTtlSeconds": session_ttl_seconds, + "disabled": disabled, + "expiresAt": expires_at, + }, + headers={ + "content-type": "application/json", + }, + request_options=request_options, + omit=OMIT, + ) + try: + if 200 <= _response.status_code < 300: + _data = typing.cast( + SharesUpdate200Response, + parse_obj_as( + type_=SharesUpdate200Response, # type: ignore + object_=_response.json(), + ), + ) + return AsyncHttpResponse(response=_response, data=_data) + if _response.status_code == 400: + raise BadRequestError( + headers=dict(_response.headers), + body=typing.cast( + typing.Any, + parse_obj_as( + type_=typing.Any, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 404: + raise NotFoundError( + headers=dict(_response.headers), + body=typing.cast( + typing.Any, + parse_obj_as( + type_=typing.Any, # type: ignore + object_=_response.json(), + ), + ), + ) + _response_json = _response.json() + except JSONDecodeError: + raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text) + except ValidationError as e: + raise ParsingError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e + ) + raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json) diff --git a/src/cloudpdf/tenants/client.py b/src/cloudpdf/tenants/client.py index 4b1e769..8e6bfcf 100644 --- a/src/cloudpdf/tenants/client.py +++ b/src/cloudpdf/tenants/client.py @@ -7,6 +7,7 @@ from ..types.tenants_create200response import TenantsCreate200Response from ..types.tenants_get200response import TenantsGet200Response from ..types.tenants_list200response import TenantsList200Response +from ..types.tenants_usage200response import TenantsUsage200Response from .raw_client import AsyncRawTenantsClient, RawTenantsClient # this is used as the default value for optional parameters @@ -155,6 +156,111 @@ def delete(self, tenant_id: str, *, request_options: typing.Optional[RequestOpti _response = self._raw_client.delete(tenant_id, request_options=request_options) return _response.data + def resume(self, tenant_id: str, *, request_options: typing.Optional[RequestOptions] = None) -> None: + """ + Parameters + ---------- + tenant_id : str + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + None + + Examples + -------- + from cloudpdf import CloudPDFClient + + client = CloudPDFClient( + token="YOUR_TOKEN", + base_url="https://yourhost.com/path/to/api", + ) + client.tenants.resume( + tenant_id="tenantId", + ) + """ + _response = self._raw_client.resume(tenant_id, request_options=request_options) + return _response.data + + def suspend( + self, + tenant_id: str, + *, + reason: typing.Optional[str] = OMIT, + request_options: typing.Optional[RequestOptions] = None, + ) -> None: + """ + Instantly reversible with resume. The API token is exempt, so a suspended tenant can still be inspected, exported, resumed, or deleted. + + Parameters + ---------- + tenant_id : str + + reason : typing.Optional[str] + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + None + + Examples + -------- + from cloudpdf import CloudPDFClient + + client = CloudPDFClient( + token="YOUR_TOKEN", + base_url="https://yourhost.com/path/to/api", + ) + client.tenants.suspend( + tenant_id="tenantId", + ) + """ + _response = self._raw_client.suspend(tenant_id, reason=reason, request_options=request_options) + return _response.data + + def usage( + self, + tenant_id: str, + *, + period: typing.Optional[str] = None, + request_options: typing.Optional[RequestOptions] = None, + ) -> TenantsUsage200Response: + """ + Facts only — no limits or billing state. Views count share exchanges plus authorized /v1/access grants, deduplicated across the two. + + Parameters + ---------- + tenant_id : str + + period : typing.Optional[str] + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + TenantsUsage200Response + OK + + Examples + -------- + from cloudpdf import CloudPDFClient + + client = CloudPDFClient( + token="YOUR_TOKEN", + base_url="https://yourhost.com/path/to/api", + ) + client.tenants.usage( + tenant_id="tenantId", + ) + """ + _response = self._raw_client.usage(tenant_id, period=period, request_options=request_options) + return _response.data + class AsyncTenantsClient: def __init__(self, *, client_wrapper: AsyncClientWrapper): @@ -331,3 +437,132 @@ async def main() -> None: """ _response = await self._raw_client.delete(tenant_id, request_options=request_options) return _response.data + + async def resume(self, tenant_id: str, *, request_options: typing.Optional[RequestOptions] = None) -> None: + """ + Parameters + ---------- + tenant_id : str + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + None + + Examples + -------- + import asyncio + + from cloudpdf import AsyncCloudPDFClient + + client = AsyncCloudPDFClient( + token="YOUR_TOKEN", + base_url="https://yourhost.com/path/to/api", + ) + + + async def main() -> None: + await client.tenants.resume( + tenant_id="tenantId", + ) + + + asyncio.run(main()) + """ + _response = await self._raw_client.resume(tenant_id, request_options=request_options) + return _response.data + + async def suspend( + self, + tenant_id: str, + *, + reason: typing.Optional[str] = OMIT, + request_options: typing.Optional[RequestOptions] = None, + ) -> None: + """ + Instantly reversible with resume. The API token is exempt, so a suspended tenant can still be inspected, exported, resumed, or deleted. + + Parameters + ---------- + tenant_id : str + + reason : typing.Optional[str] + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + None + + Examples + -------- + import asyncio + + from cloudpdf import AsyncCloudPDFClient + + client = AsyncCloudPDFClient( + token="YOUR_TOKEN", + base_url="https://yourhost.com/path/to/api", + ) + + + async def main() -> None: + await client.tenants.suspend( + tenant_id="tenantId", + ) + + + asyncio.run(main()) + """ + _response = await self._raw_client.suspend(tenant_id, reason=reason, request_options=request_options) + return _response.data + + async def usage( + self, + tenant_id: str, + *, + period: typing.Optional[str] = None, + request_options: typing.Optional[RequestOptions] = None, + ) -> TenantsUsage200Response: + """ + Facts only — no limits or billing state. Views count share exchanges plus authorized /v1/access grants, deduplicated across the two. + + Parameters + ---------- + tenant_id : str + + period : typing.Optional[str] + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + TenantsUsage200Response + OK + + Examples + -------- + import asyncio + + from cloudpdf import AsyncCloudPDFClient + + client = AsyncCloudPDFClient( + token="YOUR_TOKEN", + base_url="https://yourhost.com/path/to/api", + ) + + + async def main() -> None: + await client.tenants.usage( + tenant_id="tenantId", + ) + + + asyncio.run(main()) + """ + _response = await self._raw_client.usage(tenant_id, period=period, request_options=request_options) + return _response.data diff --git a/src/cloudpdf/tenants/raw_client.py b/src/cloudpdf/tenants/raw_client.py index 8c25a23..420514f 100644 --- a/src/cloudpdf/tenants/raw_client.py +++ b/src/cloudpdf/tenants/raw_client.py @@ -15,6 +15,7 @@ from ..types.tenants_create200response import TenantsCreate200Response from ..types.tenants_get200response import TenantsGet200Response from ..types.tenants_list200response import TenantsList200Response +from ..types.tenants_usage200response import TenantsUsage200Response from pydantic import ValidationError # this is used as the default value for optional parameters @@ -241,6 +242,178 @@ def delete(self, tenant_id: str, *, request_options: typing.Optional[RequestOpti ) raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json) + def resume(self, tenant_id: str, *, request_options: typing.Optional[RequestOptions] = None) -> HttpResponse[None]: + """ + Parameters + ---------- + tenant_id : str + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + HttpResponse[None] + """ + _response = self._client_wrapper.httpx_client.request( + f"v1/tenants/{encode_path_param(tenant_id)}/resume", + method="POST", + request_options=request_options, + ) + try: + if 200 <= _response.status_code < 300: + return HttpResponse(response=_response, data=None) + if _response.status_code == 404: + raise NotFoundError( + headers=dict(_response.headers), + body=typing.cast( + typing.Any, + parse_obj_as( + type_=typing.Any, # type: ignore + object_=_response.json(), + ), + ), + ) + _response_json = _response.json() + except JSONDecodeError: + raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text) + except ValidationError as e: + raise ParsingError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e + ) + raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json) + + def suspend( + self, + tenant_id: str, + *, + reason: typing.Optional[str] = OMIT, + request_options: typing.Optional[RequestOptions] = None, + ) -> HttpResponse[None]: + """ + Instantly reversible with resume. The API token is exempt, so a suspended tenant can still be inspected, exported, resumed, or deleted. + + Parameters + ---------- + tenant_id : str + + reason : typing.Optional[str] + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + HttpResponse[None] + """ + _response = self._client_wrapper.httpx_client.request( + f"v1/tenants/{encode_path_param(tenant_id)}/suspend", + method="POST", + json={ + "reason": reason, + }, + headers={ + "content-type": "application/json", + }, + request_options=request_options, + omit=OMIT, + ) + try: + if 200 <= _response.status_code < 300: + return HttpResponse(response=_response, data=None) + if _response.status_code == 404: + raise NotFoundError( + headers=dict(_response.headers), + body=typing.cast( + typing.Any, + parse_obj_as( + type_=typing.Any, # type: ignore + object_=_response.json(), + ), + ), + ) + _response_json = _response.json() + except JSONDecodeError: + raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text) + except ValidationError as e: + raise ParsingError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e + ) + raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json) + + def usage( + self, + tenant_id: str, + *, + period: typing.Optional[str] = None, + request_options: typing.Optional[RequestOptions] = None, + ) -> HttpResponse[TenantsUsage200Response]: + """ + Facts only — no limits or billing state. Views count share exchanges plus authorized /v1/access grants, deduplicated across the two. + + Parameters + ---------- + tenant_id : str + + period : typing.Optional[str] + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + HttpResponse[TenantsUsage200Response] + OK + """ + _response = self._client_wrapper.httpx_client.request( + f"v1/tenants/{encode_path_param(tenant_id)}/usage", + method="GET", + params={ + "period": period, + }, + request_options=request_options, + ) + try: + if 200 <= _response.status_code < 300: + _data = typing.cast( + TenantsUsage200Response, + parse_obj_as( + type_=TenantsUsage200Response, # type: ignore + object_=_response.json(), + ), + ) + return HttpResponse(response=_response, data=_data) + if _response.status_code == 400: + raise BadRequestError( + headers=dict(_response.headers), + body=typing.cast( + typing.Any, + parse_obj_as( + type_=typing.Any, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 404: + raise NotFoundError( + headers=dict(_response.headers), + body=typing.cast( + typing.Any, + parse_obj_as( + type_=typing.Any, # type: ignore + object_=_response.json(), + ), + ), + ) + _response_json = _response.json() + except JSONDecodeError: + raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text) + except ValidationError as e: + raise ParsingError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e + ) + raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json) + class AsyncRawTenantsClient: def __init__(self, *, client_wrapper: AsyncClientWrapper): @@ -463,3 +636,177 @@ async def delete( status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e ) raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json) + + async def resume( + self, tenant_id: str, *, request_options: typing.Optional[RequestOptions] = None + ) -> AsyncHttpResponse[None]: + """ + Parameters + ---------- + tenant_id : str + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + AsyncHttpResponse[None] + """ + _response = await self._client_wrapper.httpx_client.request( + f"v1/tenants/{encode_path_param(tenant_id)}/resume", + method="POST", + request_options=request_options, + ) + try: + if 200 <= _response.status_code < 300: + return AsyncHttpResponse(response=_response, data=None) + if _response.status_code == 404: + raise NotFoundError( + headers=dict(_response.headers), + body=typing.cast( + typing.Any, + parse_obj_as( + type_=typing.Any, # type: ignore + object_=_response.json(), + ), + ), + ) + _response_json = _response.json() + except JSONDecodeError: + raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text) + except ValidationError as e: + raise ParsingError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e + ) + raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json) + + async def suspend( + self, + tenant_id: str, + *, + reason: typing.Optional[str] = OMIT, + request_options: typing.Optional[RequestOptions] = None, + ) -> AsyncHttpResponse[None]: + """ + Instantly reversible with resume. The API token is exempt, so a suspended tenant can still be inspected, exported, resumed, or deleted. + + Parameters + ---------- + tenant_id : str + + reason : typing.Optional[str] + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + AsyncHttpResponse[None] + """ + _response = await self._client_wrapper.httpx_client.request( + f"v1/tenants/{encode_path_param(tenant_id)}/suspend", + method="POST", + json={ + "reason": reason, + }, + headers={ + "content-type": "application/json", + }, + request_options=request_options, + omit=OMIT, + ) + try: + if 200 <= _response.status_code < 300: + return AsyncHttpResponse(response=_response, data=None) + if _response.status_code == 404: + raise NotFoundError( + headers=dict(_response.headers), + body=typing.cast( + typing.Any, + parse_obj_as( + type_=typing.Any, # type: ignore + object_=_response.json(), + ), + ), + ) + _response_json = _response.json() + except JSONDecodeError: + raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text) + except ValidationError as e: + raise ParsingError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e + ) + raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json) + + async def usage( + self, + tenant_id: str, + *, + period: typing.Optional[str] = None, + request_options: typing.Optional[RequestOptions] = None, + ) -> AsyncHttpResponse[TenantsUsage200Response]: + """ + Facts only — no limits or billing state. Views count share exchanges plus authorized /v1/access grants, deduplicated across the two. + + Parameters + ---------- + tenant_id : str + + period : typing.Optional[str] + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + AsyncHttpResponse[TenantsUsage200Response] + OK + """ + _response = await self._client_wrapper.httpx_client.request( + f"v1/tenants/{encode_path_param(tenant_id)}/usage", + method="GET", + params={ + "period": period, + }, + request_options=request_options, + ) + try: + if 200 <= _response.status_code < 300: + _data = typing.cast( + TenantsUsage200Response, + parse_obj_as( + type_=TenantsUsage200Response, # type: ignore + object_=_response.json(), + ), + ) + return AsyncHttpResponse(response=_response, data=_data) + if _response.status_code == 400: + raise BadRequestError( + headers=dict(_response.headers), + body=typing.cast( + typing.Any, + parse_obj_as( + type_=typing.Any, # type: ignore + object_=_response.json(), + ), + ), + ) + if _response.status_code == 404: + raise NotFoundError( + headers=dict(_response.headers), + body=typing.cast( + typing.Any, + parse_obj_as( + type_=typing.Any, # type: ignore + object_=_response.json(), + ), + ), + ) + _response_json = _response.json() + except JSONDecodeError: + raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text) + except ValidationError as e: + raise ParsingError( + status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e + ) + raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json) diff --git a/src/cloudpdf/types/__init__.py b/src/cloudpdf/types/__init__.py index 55f9eef..da38636 100644 --- a/src/cloudpdf/types/__init__.py +++ b/src/cloudpdf/types/__init__.py @@ -5265,10 +5265,9 @@ ) from .documents_init200response_created_upload import ( DocumentsInit200ResponseCreatedUpload, - DocumentsInit200ResponseCreatedUpload_Direct, DocumentsInit200ResponseCreatedUpload_Presigned, + DocumentsInit200ResponseCreatedUpload_Proxy, ) - from .documents_init200response_created_upload_direct import DocumentsInit200ResponseCreatedUploadDirect from .documents_init200response_created_upload_presigned import DocumentsInit200ResponseCreatedUploadPresigned from .documents_init200response_created_upload_presigned_presigned import ( DocumentsInit200ResponseCreatedUploadPresignedPresigned, @@ -5276,6 +5275,7 @@ from .documents_init200response_created_upload_presigned_presigned_method import ( DocumentsInit200ResponseCreatedUploadPresignedPresignedMethod, ) + from .documents_init200response_created_upload_proxy import DocumentsInit200ResponseCreatedUploadProxy from .documents_init200response_deduped import DocumentsInit200ResponseDeduped from .documents_init200response_deduped_document import DocumentsInit200ResponseDedupedDocument from .documents_init200response_deduped_document_state import DocumentsInit200ResponseDedupedDocumentState @@ -5290,10 +5290,9 @@ ) from .documents_init200response_resumed_upload import ( DocumentsInit200ResponseResumedUpload, - DocumentsInit200ResponseResumedUpload_Direct, DocumentsInit200ResponseResumedUpload_Presigned, + DocumentsInit200ResponseResumedUpload_Proxy, ) - from .documents_init200response_resumed_upload_direct import DocumentsInit200ResponseResumedUploadDirect from .documents_init200response_resumed_upload_presigned import DocumentsInit200ResponseResumedUploadPresigned from .documents_init200response_resumed_upload_presigned_presigned import ( DocumentsInit200ResponseResumedUploadPresignedPresigned, @@ -5301,6 +5300,7 @@ from .documents_init200response_resumed_upload_presigned_presigned_method import ( DocumentsInit200ResponseResumedUploadPresignedPresignedMethod, ) + from .documents_init200response_resumed_upload_proxy import DocumentsInit200ResponseResumedUploadProxy from .documents_init400response import DocumentsInit400Response from .documents_init400response_error import DocumentsInit400ResponseError from .documents_list200response import DocumentsList200Response @@ -5313,26 +5313,76 @@ from .documents_list400response_error import DocumentsList400ResponseError from .documents_thumbnail_response import DocumentsThumbnailResponse from .documents_thumbnail_response_error import DocumentsThumbnailResponseError - from .documents_upload_direct200response import DocumentsUploadDirect200Response - from .documents_upload_direct400response import DocumentsUploadDirect400Response - from .documents_upload_direct400response_error import DocumentsUploadDirect400ResponseError + from .documents_upload_proxy200response import DocumentsUploadProxy200Response + from .documents_upload_proxy400response import DocumentsUploadProxy400Response + from .documents_upload_proxy400response_error import DocumentsUploadProxy400ResponseError + from .documents_upload_proxy409response import DocumentsUploadProxy409Response + from .documents_upload_proxy409response_error import DocumentsUploadProxy409ResponseError from .engine_error_payload import EngineErrorPayload from .engine_error_payload_code import EngineErrorPayloadCode from .engine_error_payload_name import EngineErrorPayloadName + from .shares_create200response import SharesCreate200Response + from .shares_create200response_share import SharesCreate200ResponseShare + from .shares_create400response import SharesCreate400Response + from .shares_create400response_error import SharesCreate400ResponseError + from .shares_create403response import SharesCreate403Response + from .shares_create403response_error import SharesCreate403ResponseError + from .shares_create404response import SharesCreate404Response + from .shares_create404response_error import SharesCreate404ResponseError + from .shares_delete_response import SharesDeleteResponse + from .shares_delete_response_error import SharesDeleteResponseError + from .shares_exchange200response import SharesExchange200Response + from .shares_exchange400response import SharesExchange400Response + from .shares_exchange400response_error import SharesExchange400ResponseError + from .shares_exchange403response import SharesExchange403Response + from .shares_exchange403response_error import SharesExchange403ResponseError + from .shares_exchange404response import SharesExchange404Response + from .shares_exchange404response_error import SharesExchange404ResponseError + from .shares_exchange410response import SharesExchange410Response + from .shares_exchange410response_error import SharesExchange410ResponseError + from .shares_exchange422response import SharesExchange422Response + from .shares_exchange422response_error import SharesExchange422ResponseError + from .shares_get200response import SharesGet200Response + from .shares_get200response_share import SharesGet200ResponseShare + from .shares_get404response import SharesGet404Response + from .shares_get404response_error import SharesGet404ResponseError + from .shares_list200response import SharesList200Response + from .shares_list200response_shares_item import SharesList200ResponseSharesItem + from .shares_list400response import SharesList400Response + from .shares_list400response_error import SharesList400ResponseError + from .shares_update200response import SharesUpdate200Response + from .shares_update200response_share import SharesUpdate200ResponseShare + from .shares_update400response import SharesUpdate400Response + from .shares_update400response_error import SharesUpdate400ResponseError + from .shares_update404response import SharesUpdate404Response + from .shares_update404response_error import SharesUpdate404ResponseError from .tenants_create200response import TenantsCreate200Response from .tenants_create200response_tenant import TenantsCreate200ResponseTenant + from .tenants_create200response_tenant_status import TenantsCreate200ResponseTenantStatus from .tenants_create400response import TenantsCreate400Response from .tenants_create400response_error import TenantsCreate400ResponseError from .tenants_delete_response import TenantsDeleteResponse from .tenants_delete_response_error import TenantsDeleteResponseError from .tenants_get200response import TenantsGet200Response from .tenants_get200response_tenant import TenantsGet200ResponseTenant + from .tenants_get200response_tenant_status import TenantsGet200ResponseTenantStatus from .tenants_get404response import TenantsGet404Response from .tenants_get404response_error import TenantsGet404ResponseError from .tenants_list200response import TenantsList200Response from .tenants_list200response_tenants_item import TenantsList200ResponseTenantsItem + from .tenants_list200response_tenants_item_status import TenantsList200ResponseTenantsItemStatus from .tenants_list400response import TenantsList400Response from .tenants_list400response_error import TenantsList400ResponseError + from .tenants_resume_response import TenantsResumeResponse + from .tenants_resume_response_error import TenantsResumeResponseError + from .tenants_suspend_response import TenantsSuspendResponse + from .tenants_suspend_response_error import TenantsSuspendResponseError + from .tenants_usage200response import TenantsUsage200Response + from .tenants_usage200response_metrics import TenantsUsage200ResponseMetrics + from .tenants_usage400response import TenantsUsage400Response + from .tenants_usage400response_error import TenantsUsage400ResponseError + from .tenants_usage404response import TenantsUsage404Response + from .tenants_usage404response_error import TenantsUsage404ResponseError from .tokens_issue200response import TokensIssue200Response from .tokens_issue400response import TokensIssue400Response from .tokens_issue400response_error import TokensIssue400ResponseError @@ -7436,12 +7486,12 @@ "DocumentsInit200ResponseCreatedDocumentState": ".documents_init200response_created_document_state", "DocumentsInit200ResponseCreatedDocumentThumbnailState": ".documents_init200response_created_document_thumbnail_state", "DocumentsInit200ResponseCreatedUpload": ".documents_init200response_created_upload", - "DocumentsInit200ResponseCreatedUploadDirect": ".documents_init200response_created_upload_direct", "DocumentsInit200ResponseCreatedUploadPresigned": ".documents_init200response_created_upload_presigned", "DocumentsInit200ResponseCreatedUploadPresignedPresigned": ".documents_init200response_created_upload_presigned_presigned", "DocumentsInit200ResponseCreatedUploadPresignedPresignedMethod": ".documents_init200response_created_upload_presigned_presigned_method", - "DocumentsInit200ResponseCreatedUpload_Direct": ".documents_init200response_created_upload", + "DocumentsInit200ResponseCreatedUploadProxy": ".documents_init200response_created_upload_proxy", "DocumentsInit200ResponseCreatedUpload_Presigned": ".documents_init200response_created_upload", + "DocumentsInit200ResponseCreatedUpload_Proxy": ".documents_init200response_created_upload", "DocumentsInit200ResponseDeduped": ".documents_init200response_deduped", "DocumentsInit200ResponseDedupedDocument": ".documents_init200response_deduped_document", "DocumentsInit200ResponseDedupedDocumentState": ".documents_init200response_deduped_document_state", @@ -7451,12 +7501,12 @@ "DocumentsInit200ResponseResumedDocumentState": ".documents_init200response_resumed_document_state", "DocumentsInit200ResponseResumedDocumentThumbnailState": ".documents_init200response_resumed_document_thumbnail_state", "DocumentsInit200ResponseResumedUpload": ".documents_init200response_resumed_upload", - "DocumentsInit200ResponseResumedUploadDirect": ".documents_init200response_resumed_upload_direct", "DocumentsInit200ResponseResumedUploadPresigned": ".documents_init200response_resumed_upload_presigned", "DocumentsInit200ResponseResumedUploadPresignedPresigned": ".documents_init200response_resumed_upload_presigned_presigned", "DocumentsInit200ResponseResumedUploadPresignedPresignedMethod": ".documents_init200response_resumed_upload_presigned_presigned_method", - "DocumentsInit200ResponseResumedUpload_Direct": ".documents_init200response_resumed_upload", + "DocumentsInit200ResponseResumedUploadProxy": ".documents_init200response_resumed_upload_proxy", "DocumentsInit200ResponseResumedUpload_Presigned": ".documents_init200response_resumed_upload", + "DocumentsInit200ResponseResumedUpload_Proxy": ".documents_init200response_resumed_upload", "DocumentsInit200Response_Created": ".documents_init200response", "DocumentsInit200Response_Deduped": ".documents_init200response", "DocumentsInit200Response_Resumed": ".documents_init200response", @@ -7470,26 +7520,76 @@ "DocumentsList400ResponseError": ".documents_list400response_error", "DocumentsThumbnailResponse": ".documents_thumbnail_response", "DocumentsThumbnailResponseError": ".documents_thumbnail_response_error", - "DocumentsUploadDirect200Response": ".documents_upload_direct200response", - "DocumentsUploadDirect400Response": ".documents_upload_direct400response", - "DocumentsUploadDirect400ResponseError": ".documents_upload_direct400response_error", + "DocumentsUploadProxy200Response": ".documents_upload_proxy200response", + "DocumentsUploadProxy400Response": ".documents_upload_proxy400response", + "DocumentsUploadProxy400ResponseError": ".documents_upload_proxy400response_error", + "DocumentsUploadProxy409Response": ".documents_upload_proxy409response", + "DocumentsUploadProxy409ResponseError": ".documents_upload_proxy409response_error", "EngineErrorPayload": ".engine_error_payload", "EngineErrorPayloadCode": ".engine_error_payload_code", "EngineErrorPayloadName": ".engine_error_payload_name", + "SharesCreate200Response": ".shares_create200response", + "SharesCreate200ResponseShare": ".shares_create200response_share", + "SharesCreate400Response": ".shares_create400response", + "SharesCreate400ResponseError": ".shares_create400response_error", + "SharesCreate403Response": ".shares_create403response", + "SharesCreate403ResponseError": ".shares_create403response_error", + "SharesCreate404Response": ".shares_create404response", + "SharesCreate404ResponseError": ".shares_create404response_error", + "SharesDeleteResponse": ".shares_delete_response", + "SharesDeleteResponseError": ".shares_delete_response_error", + "SharesExchange200Response": ".shares_exchange200response", + "SharesExchange400Response": ".shares_exchange400response", + "SharesExchange400ResponseError": ".shares_exchange400response_error", + "SharesExchange403Response": ".shares_exchange403response", + "SharesExchange403ResponseError": ".shares_exchange403response_error", + "SharesExchange404Response": ".shares_exchange404response", + "SharesExchange404ResponseError": ".shares_exchange404response_error", + "SharesExchange410Response": ".shares_exchange410response", + "SharesExchange410ResponseError": ".shares_exchange410response_error", + "SharesExchange422Response": ".shares_exchange422response", + "SharesExchange422ResponseError": ".shares_exchange422response_error", + "SharesGet200Response": ".shares_get200response", + "SharesGet200ResponseShare": ".shares_get200response_share", + "SharesGet404Response": ".shares_get404response", + "SharesGet404ResponseError": ".shares_get404response_error", + "SharesList200Response": ".shares_list200response", + "SharesList200ResponseSharesItem": ".shares_list200response_shares_item", + "SharesList400Response": ".shares_list400response", + "SharesList400ResponseError": ".shares_list400response_error", + "SharesUpdate200Response": ".shares_update200response", + "SharesUpdate200ResponseShare": ".shares_update200response_share", + "SharesUpdate400Response": ".shares_update400response", + "SharesUpdate400ResponseError": ".shares_update400response_error", + "SharesUpdate404Response": ".shares_update404response", + "SharesUpdate404ResponseError": ".shares_update404response_error", "TenantsCreate200Response": ".tenants_create200response", "TenantsCreate200ResponseTenant": ".tenants_create200response_tenant", + "TenantsCreate200ResponseTenantStatus": ".tenants_create200response_tenant_status", "TenantsCreate400Response": ".tenants_create400response", "TenantsCreate400ResponseError": ".tenants_create400response_error", "TenantsDeleteResponse": ".tenants_delete_response", "TenantsDeleteResponseError": ".tenants_delete_response_error", "TenantsGet200Response": ".tenants_get200response", "TenantsGet200ResponseTenant": ".tenants_get200response_tenant", + "TenantsGet200ResponseTenantStatus": ".tenants_get200response_tenant_status", "TenantsGet404Response": ".tenants_get404response", "TenantsGet404ResponseError": ".tenants_get404response_error", "TenantsList200Response": ".tenants_list200response", "TenantsList200ResponseTenantsItem": ".tenants_list200response_tenants_item", + "TenantsList200ResponseTenantsItemStatus": ".tenants_list200response_tenants_item_status", "TenantsList400Response": ".tenants_list400response", "TenantsList400ResponseError": ".tenants_list400response_error", + "TenantsResumeResponse": ".tenants_resume_response", + "TenantsResumeResponseError": ".tenants_resume_response_error", + "TenantsSuspendResponse": ".tenants_suspend_response", + "TenantsSuspendResponseError": ".tenants_suspend_response_error", + "TenantsUsage200Response": ".tenants_usage200response", + "TenantsUsage200ResponseMetrics": ".tenants_usage200response_metrics", + "TenantsUsage400Response": ".tenants_usage400response", + "TenantsUsage400ResponseError": ".tenants_usage400response_error", + "TenantsUsage404Response": ".tenants_usage404response", + "TenantsUsage404ResponseError": ".tenants_usage404response_error", "TokensIssue200Response": ".tokens_issue200response", "TokensIssue400Response": ".tokens_issue400response", "TokensIssue400ResponseError": ".tokens_issue400response_error", @@ -9619,12 +9719,12 @@ def __dir__(): "DocumentsInit200ResponseCreatedDocumentState", "DocumentsInit200ResponseCreatedDocumentThumbnailState", "DocumentsInit200ResponseCreatedUpload", - "DocumentsInit200ResponseCreatedUploadDirect", "DocumentsInit200ResponseCreatedUploadPresigned", "DocumentsInit200ResponseCreatedUploadPresignedPresigned", "DocumentsInit200ResponseCreatedUploadPresignedPresignedMethod", - "DocumentsInit200ResponseCreatedUpload_Direct", + "DocumentsInit200ResponseCreatedUploadProxy", "DocumentsInit200ResponseCreatedUpload_Presigned", + "DocumentsInit200ResponseCreatedUpload_Proxy", "DocumentsInit200ResponseDeduped", "DocumentsInit200ResponseDedupedDocument", "DocumentsInit200ResponseDedupedDocumentState", @@ -9634,12 +9734,12 @@ def __dir__(): "DocumentsInit200ResponseResumedDocumentState", "DocumentsInit200ResponseResumedDocumentThumbnailState", "DocumentsInit200ResponseResumedUpload", - "DocumentsInit200ResponseResumedUploadDirect", "DocumentsInit200ResponseResumedUploadPresigned", "DocumentsInit200ResponseResumedUploadPresignedPresigned", "DocumentsInit200ResponseResumedUploadPresignedPresignedMethod", - "DocumentsInit200ResponseResumedUpload_Direct", + "DocumentsInit200ResponseResumedUploadProxy", "DocumentsInit200ResponseResumedUpload_Presigned", + "DocumentsInit200ResponseResumedUpload_Proxy", "DocumentsInit200Response_Created", "DocumentsInit200Response_Deduped", "DocumentsInit200Response_Resumed", @@ -9653,26 +9753,76 @@ def __dir__(): "DocumentsList400ResponseError", "DocumentsThumbnailResponse", "DocumentsThumbnailResponseError", - "DocumentsUploadDirect200Response", - "DocumentsUploadDirect400Response", - "DocumentsUploadDirect400ResponseError", + "DocumentsUploadProxy200Response", + "DocumentsUploadProxy400Response", + "DocumentsUploadProxy400ResponseError", + "DocumentsUploadProxy409Response", + "DocumentsUploadProxy409ResponseError", "EngineErrorPayload", "EngineErrorPayloadCode", "EngineErrorPayloadName", + "SharesCreate200Response", + "SharesCreate200ResponseShare", + "SharesCreate400Response", + "SharesCreate400ResponseError", + "SharesCreate403Response", + "SharesCreate403ResponseError", + "SharesCreate404Response", + "SharesCreate404ResponseError", + "SharesDeleteResponse", + "SharesDeleteResponseError", + "SharesExchange200Response", + "SharesExchange400Response", + "SharesExchange400ResponseError", + "SharesExchange403Response", + "SharesExchange403ResponseError", + "SharesExchange404Response", + "SharesExchange404ResponseError", + "SharesExchange410Response", + "SharesExchange410ResponseError", + "SharesExchange422Response", + "SharesExchange422ResponseError", + "SharesGet200Response", + "SharesGet200ResponseShare", + "SharesGet404Response", + "SharesGet404ResponseError", + "SharesList200Response", + "SharesList200ResponseSharesItem", + "SharesList400Response", + "SharesList400ResponseError", + "SharesUpdate200Response", + "SharesUpdate200ResponseShare", + "SharesUpdate400Response", + "SharesUpdate400ResponseError", + "SharesUpdate404Response", + "SharesUpdate404ResponseError", "TenantsCreate200Response", "TenantsCreate200ResponseTenant", + "TenantsCreate200ResponseTenantStatus", "TenantsCreate400Response", "TenantsCreate400ResponseError", "TenantsDeleteResponse", "TenantsDeleteResponseError", "TenantsGet200Response", "TenantsGet200ResponseTenant", + "TenantsGet200ResponseTenantStatus", "TenantsGet404Response", "TenantsGet404ResponseError", "TenantsList200Response", "TenantsList200ResponseTenantsItem", + "TenantsList200ResponseTenantsItemStatus", "TenantsList400Response", "TenantsList400ResponseError", + "TenantsResumeResponse", + "TenantsResumeResponseError", + "TenantsSuspendResponse", + "TenantsSuspendResponseError", + "TenantsUsage200Response", + "TenantsUsage200ResponseMetrics", + "TenantsUsage400Response", + "TenantsUsage400ResponseError", + "TenantsUsage404Response", + "TenantsUsage404ResponseError", "TokensIssue200Response", "TokensIssue400Response", "TokensIssue400ResponseError", diff --git a/src/cloudpdf/types/documents_init200response_created_upload.py b/src/cloudpdf/types/documents_init200response_created_upload.py index 2015c9a..1d729e0 100644 --- a/src/cloudpdf/types/documents_init200response_created_upload.py +++ b/src/cloudpdf/types/documents_init200response_created_upload.py @@ -27,8 +27,8 @@ class Config: extra = pydantic.Extra.allow -class DocumentsInit200ResponseCreatedUpload_Direct(UniversalBaseModel): - kind: typing.Literal["direct"] = "direct" +class DocumentsInit200ResponseCreatedUpload_Proxy(UniversalBaseModel): + kind: typing.Literal["proxy"] = "proxy" url: str key: str @@ -43,6 +43,6 @@ class Config: DocumentsInit200ResponseCreatedUpload = typing_extensions.Annotated[ - typing.Union[DocumentsInit200ResponseCreatedUpload_Presigned, DocumentsInit200ResponseCreatedUpload_Direct], + typing.Union[DocumentsInit200ResponseCreatedUpload_Presigned, DocumentsInit200ResponseCreatedUpload_Proxy], pydantic.Field(discriminator="kind"), ] diff --git a/src/cloudpdf/types/documents_init200response_created_upload_direct.py b/src/cloudpdf/types/documents_init200response_created_upload_proxy.py similarity index 87% rename from src/cloudpdf/types/documents_init200response_created_upload_direct.py rename to src/cloudpdf/types/documents_init200response_created_upload_proxy.py index 7623f74..8ab24ec 100644 --- a/src/cloudpdf/types/documents_init200response_created_upload_direct.py +++ b/src/cloudpdf/types/documents_init200response_created_upload_proxy.py @@ -6,7 +6,7 @@ from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel -class DocumentsInit200ResponseCreatedUploadDirect(UniversalBaseModel): +class DocumentsInit200ResponseCreatedUploadProxy(UniversalBaseModel): url: str key: str diff --git a/src/cloudpdf/types/documents_init200response_resumed_upload.py b/src/cloudpdf/types/documents_init200response_resumed_upload.py index 8a366f4..b3a9e18 100644 --- a/src/cloudpdf/types/documents_init200response_resumed_upload.py +++ b/src/cloudpdf/types/documents_init200response_resumed_upload.py @@ -27,8 +27,8 @@ class Config: extra = pydantic.Extra.allow -class DocumentsInit200ResponseResumedUpload_Direct(UniversalBaseModel): - kind: typing.Literal["direct"] = "direct" +class DocumentsInit200ResponseResumedUpload_Proxy(UniversalBaseModel): + kind: typing.Literal["proxy"] = "proxy" url: str key: str @@ -43,6 +43,6 @@ class Config: DocumentsInit200ResponseResumedUpload = typing_extensions.Annotated[ - typing.Union[DocumentsInit200ResponseResumedUpload_Presigned, DocumentsInit200ResponseResumedUpload_Direct], + typing.Union[DocumentsInit200ResponseResumedUpload_Presigned, DocumentsInit200ResponseResumedUpload_Proxy], pydantic.Field(discriminator="kind"), ] diff --git a/src/cloudpdf/types/documents_init200response_resumed_upload_direct.py b/src/cloudpdf/types/documents_init200response_resumed_upload_proxy.py similarity index 87% rename from src/cloudpdf/types/documents_init200response_resumed_upload_direct.py rename to src/cloudpdf/types/documents_init200response_resumed_upload_proxy.py index 3165196..a39a8d6 100644 --- a/src/cloudpdf/types/documents_init200response_resumed_upload_direct.py +++ b/src/cloudpdf/types/documents_init200response_resumed_upload_proxy.py @@ -6,7 +6,7 @@ from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel -class DocumentsInit200ResponseResumedUploadDirect(UniversalBaseModel): +class DocumentsInit200ResponseResumedUploadProxy(UniversalBaseModel): url: str key: str diff --git a/src/cloudpdf/types/documents_upload_direct200response.py b/src/cloudpdf/types/documents_upload_proxy200response.py similarity index 88% rename from src/cloudpdf/types/documents_upload_direct200response.py rename to src/cloudpdf/types/documents_upload_proxy200response.py index 8540c02..4fd81e4 100644 --- a/src/cloudpdf/types/documents_upload_direct200response.py +++ b/src/cloudpdf/types/documents_upload_proxy200response.py @@ -6,7 +6,7 @@ from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel -class DocumentsUploadDirect200Response(UniversalBaseModel): +class DocumentsUploadProxy200Response(UniversalBaseModel): sha256: str if IS_PYDANTIC_V2: diff --git a/src/cloudpdf/types/documents_upload_proxy400response.py b/src/cloudpdf/types/documents_upload_proxy400response.py new file mode 100644 index 0000000..2fe63ec --- /dev/null +++ b/src/cloudpdf/types/documents_upload_proxy400response.py @@ -0,0 +1,20 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .documents_upload_proxy400response_error import DocumentsUploadProxy400ResponseError + + +class DocumentsUploadProxy400Response(UniversalBaseModel): + error: DocumentsUploadProxy400ResponseError + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/cloudpdf/types/documents_upload_direct400response_error.py b/src/cloudpdf/types/documents_upload_proxy400response_error.py similarity index 88% rename from src/cloudpdf/types/documents_upload_direct400response_error.py rename to src/cloudpdf/types/documents_upload_proxy400response_error.py index 6c2e2b7..7708a7b 100644 --- a/src/cloudpdf/types/documents_upload_direct400response_error.py +++ b/src/cloudpdf/types/documents_upload_proxy400response_error.py @@ -6,7 +6,7 @@ from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel -class DocumentsUploadDirect400ResponseError(UniversalBaseModel): +class DocumentsUploadProxy400ResponseError(UniversalBaseModel): code: str message: str diff --git a/src/cloudpdf/types/documents_upload_proxy409response.py b/src/cloudpdf/types/documents_upload_proxy409response.py new file mode 100644 index 0000000..b380d08 --- /dev/null +++ b/src/cloudpdf/types/documents_upload_proxy409response.py @@ -0,0 +1,20 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .documents_upload_proxy409response_error import DocumentsUploadProxy409ResponseError + + +class DocumentsUploadProxy409Response(UniversalBaseModel): + error: DocumentsUploadProxy409ResponseError + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/cloudpdf/types/documents_upload_proxy409response_error.py b/src/cloudpdf/types/documents_upload_proxy409response_error.py new file mode 100644 index 0000000..09da388 --- /dev/null +++ b/src/cloudpdf/types/documents_upload_proxy409response_error.py @@ -0,0 +1,20 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel + + +class DocumentsUploadProxy409ResponseError(UniversalBaseModel): + code: str + message: str + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/cloudpdf/types/shares_create200response.py b/src/cloudpdf/types/shares_create200response.py new file mode 100644 index 0000000..68466eb --- /dev/null +++ b/src/cloudpdf/types/shares_create200response.py @@ -0,0 +1,20 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .shares_create200response_share import SharesCreate200ResponseShare + + +class SharesCreate200Response(UniversalBaseModel): + share: SharesCreate200ResponseShare + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/cloudpdf/types/shares_create200response_share.py b/src/cloudpdf/types/shares_create200response_share.py new file mode 100644 index 0000000..d434a03 --- /dev/null +++ b/src/cloudpdf/types/shares_create200response_share.py @@ -0,0 +1,45 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +import typing_extensions +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from ..core.serialization import FieldMetadata + + +class SharesCreate200ResponseShare(UniversalBaseModel): + id: str + tenant_id: typing_extensions.Annotated[str, FieldMetadata(alias="tenantId"), pydantic.Field(alias="tenantId")] + doc_id: typing_extensions.Annotated[str, FieldMetadata(alias="docId"), pydantic.Field(alias="docId")] + layer_name: typing_extensions.Annotated[str, FieldMetadata(alias="layerName"), pydantic.Field(alias="layerName")] + scope: typing.List[str] + origins: typing.Optional[typing.List[str]] = None + password_protected: typing_extensions.Annotated[ + bool, FieldMetadata(alias="passwordProtected"), pydantic.Field(alias="passwordProtected") + ] + session_ttl_seconds: typing_extensions.Annotated[ + float, FieldMetadata(alias="sessionTtlSeconds"), pydantic.Field(alias="sessionTtlSeconds") + ] + disabled: bool + expires_at: typing_extensions.Annotated[ + typing.Optional[float], FieldMetadata(alias="expiresAt"), pydantic.Field(alias="expiresAt") + ] = None + exchange_count: typing_extensions.Annotated[ + float, FieldMetadata(alias="exchangeCount"), pydantic.Field(alias="exchangeCount") + ] + last_exchanged_at: typing_extensions.Annotated[ + typing.Optional[float], FieldMetadata(alias="lastExchangedAt"), pydantic.Field(alias="lastExchangedAt") + ] = None + created_by: typing_extensions.Annotated[str, FieldMetadata(alias="createdBy"), pydantic.Field(alias="createdBy")] + created_at: typing_extensions.Annotated[float, FieldMetadata(alias="createdAt"), pydantic.Field(alias="createdAt")] + updated_at: typing_extensions.Annotated[float, FieldMetadata(alias="updatedAt"), pydantic.Field(alias="updatedAt")] + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/cloudpdf/types/shares_create400response.py b/src/cloudpdf/types/shares_create400response.py new file mode 100644 index 0000000..d6a71e7 --- /dev/null +++ b/src/cloudpdf/types/shares_create400response.py @@ -0,0 +1,20 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .shares_create400response_error import SharesCreate400ResponseError + + +class SharesCreate400Response(UniversalBaseModel): + error: SharesCreate400ResponseError + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/cloudpdf/types/shares_create400response_error.py b/src/cloudpdf/types/shares_create400response_error.py new file mode 100644 index 0000000..1a5858f --- /dev/null +++ b/src/cloudpdf/types/shares_create400response_error.py @@ -0,0 +1,20 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel + + +class SharesCreate400ResponseError(UniversalBaseModel): + code: str + message: str + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/cloudpdf/types/shares_create403response.py b/src/cloudpdf/types/shares_create403response.py new file mode 100644 index 0000000..a399675 --- /dev/null +++ b/src/cloudpdf/types/shares_create403response.py @@ -0,0 +1,20 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .shares_create403response_error import SharesCreate403ResponseError + + +class SharesCreate403Response(UniversalBaseModel): + error: SharesCreate403ResponseError + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/cloudpdf/types/shares_create403response_error.py b/src/cloudpdf/types/shares_create403response_error.py new file mode 100644 index 0000000..3eff3bd --- /dev/null +++ b/src/cloudpdf/types/shares_create403response_error.py @@ -0,0 +1,20 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel + + +class SharesCreate403ResponseError(UniversalBaseModel): + code: str + message: str + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/cloudpdf/types/shares_create404response.py b/src/cloudpdf/types/shares_create404response.py new file mode 100644 index 0000000..69d4e7b --- /dev/null +++ b/src/cloudpdf/types/shares_create404response.py @@ -0,0 +1,20 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .shares_create404response_error import SharesCreate404ResponseError + + +class SharesCreate404Response(UniversalBaseModel): + error: SharesCreate404ResponseError + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/cloudpdf/types/shares_create404response_error.py b/src/cloudpdf/types/shares_create404response_error.py new file mode 100644 index 0000000..9e1d523 --- /dev/null +++ b/src/cloudpdf/types/shares_create404response_error.py @@ -0,0 +1,20 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel + + +class SharesCreate404ResponseError(UniversalBaseModel): + code: str + message: str + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/cloudpdf/types/shares_delete_response.py b/src/cloudpdf/types/shares_delete_response.py new file mode 100644 index 0000000..a3f879f --- /dev/null +++ b/src/cloudpdf/types/shares_delete_response.py @@ -0,0 +1,20 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .shares_delete_response_error import SharesDeleteResponseError + + +class SharesDeleteResponse(UniversalBaseModel): + error: SharesDeleteResponseError + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/cloudpdf/types/shares_delete_response_error.py b/src/cloudpdf/types/shares_delete_response_error.py new file mode 100644 index 0000000..ed6f3d3 --- /dev/null +++ b/src/cloudpdf/types/shares_delete_response_error.py @@ -0,0 +1,20 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel + + +class SharesDeleteResponseError(UniversalBaseModel): + code: str + message: str + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/cloudpdf/types/shares_exchange200response.py b/src/cloudpdf/types/shares_exchange200response.py new file mode 100644 index 0000000..01cb86c --- /dev/null +++ b/src/cloudpdf/types/shares_exchange200response.py @@ -0,0 +1,24 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +import typing_extensions +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from ..core.serialization import FieldMetadata + + +class SharesExchange200Response(UniversalBaseModel): + token: str + doc_id: typing_extensions.Annotated[str, FieldMetadata(alias="docId"), pydantic.Field(alias="docId")] + layer_name: typing_extensions.Annotated[str, FieldMetadata(alias="layerName"), pydantic.Field(alias="layerName")] + expires_at: typing_extensions.Annotated[float, FieldMetadata(alias="expiresAt"), pydantic.Field(alias="expiresAt")] + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/cloudpdf/types/shares_exchange400response.py b/src/cloudpdf/types/shares_exchange400response.py new file mode 100644 index 0000000..c02dacf --- /dev/null +++ b/src/cloudpdf/types/shares_exchange400response.py @@ -0,0 +1,20 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .shares_exchange400response_error import SharesExchange400ResponseError + + +class SharesExchange400Response(UniversalBaseModel): + error: SharesExchange400ResponseError + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/cloudpdf/types/shares_exchange400response_error.py b/src/cloudpdf/types/shares_exchange400response_error.py new file mode 100644 index 0000000..0ab81f1 --- /dev/null +++ b/src/cloudpdf/types/shares_exchange400response_error.py @@ -0,0 +1,20 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel + + +class SharesExchange400ResponseError(UniversalBaseModel): + code: str + message: str + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/cloudpdf/types/shares_exchange403response.py b/src/cloudpdf/types/shares_exchange403response.py new file mode 100644 index 0000000..2d190e0 --- /dev/null +++ b/src/cloudpdf/types/shares_exchange403response.py @@ -0,0 +1,20 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .shares_exchange403response_error import SharesExchange403ResponseError + + +class SharesExchange403Response(UniversalBaseModel): + error: SharesExchange403ResponseError + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/cloudpdf/types/shares_exchange403response_error.py b/src/cloudpdf/types/shares_exchange403response_error.py new file mode 100644 index 0000000..cec9889 --- /dev/null +++ b/src/cloudpdf/types/shares_exchange403response_error.py @@ -0,0 +1,20 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel + + +class SharesExchange403ResponseError(UniversalBaseModel): + code: str + message: str + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/cloudpdf/types/shares_exchange404response.py b/src/cloudpdf/types/shares_exchange404response.py new file mode 100644 index 0000000..3d77d5e --- /dev/null +++ b/src/cloudpdf/types/shares_exchange404response.py @@ -0,0 +1,20 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .shares_exchange404response_error import SharesExchange404ResponseError + + +class SharesExchange404Response(UniversalBaseModel): + error: SharesExchange404ResponseError + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/cloudpdf/types/shares_exchange404response_error.py b/src/cloudpdf/types/shares_exchange404response_error.py new file mode 100644 index 0000000..1949a05 --- /dev/null +++ b/src/cloudpdf/types/shares_exchange404response_error.py @@ -0,0 +1,20 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel + + +class SharesExchange404ResponseError(UniversalBaseModel): + code: str + message: str + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/cloudpdf/types/shares_exchange410response.py b/src/cloudpdf/types/shares_exchange410response.py new file mode 100644 index 0000000..e83c55b --- /dev/null +++ b/src/cloudpdf/types/shares_exchange410response.py @@ -0,0 +1,20 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .shares_exchange410response_error import SharesExchange410ResponseError + + +class SharesExchange410Response(UniversalBaseModel): + error: SharesExchange410ResponseError + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/cloudpdf/types/shares_exchange410response_error.py b/src/cloudpdf/types/shares_exchange410response_error.py new file mode 100644 index 0000000..3275851 --- /dev/null +++ b/src/cloudpdf/types/shares_exchange410response_error.py @@ -0,0 +1,20 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel + + +class SharesExchange410ResponseError(UniversalBaseModel): + code: str + message: str + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/cloudpdf/types/shares_exchange422response.py b/src/cloudpdf/types/shares_exchange422response.py new file mode 100644 index 0000000..7f09b46 --- /dev/null +++ b/src/cloudpdf/types/shares_exchange422response.py @@ -0,0 +1,20 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .shares_exchange422response_error import SharesExchange422ResponseError + + +class SharesExchange422Response(UniversalBaseModel): + error: SharesExchange422ResponseError + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/cloudpdf/types/shares_exchange422response_error.py b/src/cloudpdf/types/shares_exchange422response_error.py new file mode 100644 index 0000000..3d9ff52 --- /dev/null +++ b/src/cloudpdf/types/shares_exchange422response_error.py @@ -0,0 +1,20 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel + + +class SharesExchange422ResponseError(UniversalBaseModel): + code: str + message: str + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/cloudpdf/types/shares_get200response.py b/src/cloudpdf/types/shares_get200response.py new file mode 100644 index 0000000..bae9fdb --- /dev/null +++ b/src/cloudpdf/types/shares_get200response.py @@ -0,0 +1,20 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .shares_get200response_share import SharesGet200ResponseShare + + +class SharesGet200Response(UniversalBaseModel): + share: SharesGet200ResponseShare + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/cloudpdf/types/shares_get200response_share.py b/src/cloudpdf/types/shares_get200response_share.py new file mode 100644 index 0000000..13c1436 --- /dev/null +++ b/src/cloudpdf/types/shares_get200response_share.py @@ -0,0 +1,45 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +import typing_extensions +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from ..core.serialization import FieldMetadata + + +class SharesGet200ResponseShare(UniversalBaseModel): + id: str + tenant_id: typing_extensions.Annotated[str, FieldMetadata(alias="tenantId"), pydantic.Field(alias="tenantId")] + doc_id: typing_extensions.Annotated[str, FieldMetadata(alias="docId"), pydantic.Field(alias="docId")] + layer_name: typing_extensions.Annotated[str, FieldMetadata(alias="layerName"), pydantic.Field(alias="layerName")] + scope: typing.List[str] + origins: typing.Optional[typing.List[str]] = None + password_protected: typing_extensions.Annotated[ + bool, FieldMetadata(alias="passwordProtected"), pydantic.Field(alias="passwordProtected") + ] + session_ttl_seconds: typing_extensions.Annotated[ + float, FieldMetadata(alias="sessionTtlSeconds"), pydantic.Field(alias="sessionTtlSeconds") + ] + disabled: bool + expires_at: typing_extensions.Annotated[ + typing.Optional[float], FieldMetadata(alias="expiresAt"), pydantic.Field(alias="expiresAt") + ] = None + exchange_count: typing_extensions.Annotated[ + float, FieldMetadata(alias="exchangeCount"), pydantic.Field(alias="exchangeCount") + ] + last_exchanged_at: typing_extensions.Annotated[ + typing.Optional[float], FieldMetadata(alias="lastExchangedAt"), pydantic.Field(alias="lastExchangedAt") + ] = None + created_by: typing_extensions.Annotated[str, FieldMetadata(alias="createdBy"), pydantic.Field(alias="createdBy")] + created_at: typing_extensions.Annotated[float, FieldMetadata(alias="createdAt"), pydantic.Field(alias="createdAt")] + updated_at: typing_extensions.Annotated[float, FieldMetadata(alias="updatedAt"), pydantic.Field(alias="updatedAt")] + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/cloudpdf/types/shares_get404response.py b/src/cloudpdf/types/shares_get404response.py new file mode 100644 index 0000000..f4edce2 --- /dev/null +++ b/src/cloudpdf/types/shares_get404response.py @@ -0,0 +1,20 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .shares_get404response_error import SharesGet404ResponseError + + +class SharesGet404Response(UniversalBaseModel): + error: SharesGet404ResponseError + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/cloudpdf/types/shares_get404response_error.py b/src/cloudpdf/types/shares_get404response_error.py new file mode 100644 index 0000000..fc123aa --- /dev/null +++ b/src/cloudpdf/types/shares_get404response_error.py @@ -0,0 +1,20 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel + + +class SharesGet404ResponseError(UniversalBaseModel): + code: str + message: str + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/cloudpdf/types/documents_upload_direct400response.py b/src/cloudpdf/types/shares_list200response.py similarity index 52% rename from src/cloudpdf/types/documents_upload_direct400response.py rename to src/cloudpdf/types/shares_list200response.py index 7e75534..7b42301 100644 --- a/src/cloudpdf/types/documents_upload_direct400response.py +++ b/src/cloudpdf/types/shares_list200response.py @@ -3,12 +3,17 @@ import typing import pydantic +import typing_extensions from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel -from .documents_upload_direct400response_error import DocumentsUploadDirect400ResponseError +from ..core.serialization import FieldMetadata +from .shares_list200response_shares_item import SharesList200ResponseSharesItem -class DocumentsUploadDirect400Response(UniversalBaseModel): - error: DocumentsUploadDirect400ResponseError +class SharesList200Response(UniversalBaseModel): + shares: typing.List[SharesList200ResponseSharesItem] + next_cursor: typing_extensions.Annotated[ + typing.Optional[str], FieldMetadata(alias="nextCursor"), pydantic.Field(alias="nextCursor") + ] = None if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 diff --git a/src/cloudpdf/types/shares_list200response_shares_item.py b/src/cloudpdf/types/shares_list200response_shares_item.py new file mode 100644 index 0000000..65548b0 --- /dev/null +++ b/src/cloudpdf/types/shares_list200response_shares_item.py @@ -0,0 +1,45 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +import typing_extensions +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from ..core.serialization import FieldMetadata + + +class SharesList200ResponseSharesItem(UniversalBaseModel): + id: str + tenant_id: typing_extensions.Annotated[str, FieldMetadata(alias="tenantId"), pydantic.Field(alias="tenantId")] + doc_id: typing_extensions.Annotated[str, FieldMetadata(alias="docId"), pydantic.Field(alias="docId")] + layer_name: typing_extensions.Annotated[str, FieldMetadata(alias="layerName"), pydantic.Field(alias="layerName")] + scope: typing.List[str] + origins: typing.Optional[typing.List[str]] = None + password_protected: typing_extensions.Annotated[ + bool, FieldMetadata(alias="passwordProtected"), pydantic.Field(alias="passwordProtected") + ] + session_ttl_seconds: typing_extensions.Annotated[ + float, FieldMetadata(alias="sessionTtlSeconds"), pydantic.Field(alias="sessionTtlSeconds") + ] + disabled: bool + expires_at: typing_extensions.Annotated[ + typing.Optional[float], FieldMetadata(alias="expiresAt"), pydantic.Field(alias="expiresAt") + ] = None + exchange_count: typing_extensions.Annotated[ + float, FieldMetadata(alias="exchangeCount"), pydantic.Field(alias="exchangeCount") + ] + last_exchanged_at: typing_extensions.Annotated[ + typing.Optional[float], FieldMetadata(alias="lastExchangedAt"), pydantic.Field(alias="lastExchangedAt") + ] = None + created_by: typing_extensions.Annotated[str, FieldMetadata(alias="createdBy"), pydantic.Field(alias="createdBy")] + created_at: typing_extensions.Annotated[float, FieldMetadata(alias="createdAt"), pydantic.Field(alias="createdAt")] + updated_at: typing_extensions.Annotated[float, FieldMetadata(alias="updatedAt"), pydantic.Field(alias="updatedAt")] + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/cloudpdf/types/shares_list400response.py b/src/cloudpdf/types/shares_list400response.py new file mode 100644 index 0000000..5fd652e --- /dev/null +++ b/src/cloudpdf/types/shares_list400response.py @@ -0,0 +1,20 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .shares_list400response_error import SharesList400ResponseError + + +class SharesList400Response(UniversalBaseModel): + error: SharesList400ResponseError + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/cloudpdf/types/shares_list400response_error.py b/src/cloudpdf/types/shares_list400response_error.py new file mode 100644 index 0000000..db8f4d2 --- /dev/null +++ b/src/cloudpdf/types/shares_list400response_error.py @@ -0,0 +1,20 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel + + +class SharesList400ResponseError(UniversalBaseModel): + code: str + message: str + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/cloudpdf/types/shares_update200response.py b/src/cloudpdf/types/shares_update200response.py new file mode 100644 index 0000000..cb8a857 --- /dev/null +++ b/src/cloudpdf/types/shares_update200response.py @@ -0,0 +1,20 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .shares_update200response_share import SharesUpdate200ResponseShare + + +class SharesUpdate200Response(UniversalBaseModel): + share: SharesUpdate200ResponseShare + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/cloudpdf/types/shares_update200response_share.py b/src/cloudpdf/types/shares_update200response_share.py new file mode 100644 index 0000000..6dd7cc7 --- /dev/null +++ b/src/cloudpdf/types/shares_update200response_share.py @@ -0,0 +1,45 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +import typing_extensions +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from ..core.serialization import FieldMetadata + + +class SharesUpdate200ResponseShare(UniversalBaseModel): + id: str + tenant_id: typing_extensions.Annotated[str, FieldMetadata(alias="tenantId"), pydantic.Field(alias="tenantId")] + doc_id: typing_extensions.Annotated[str, FieldMetadata(alias="docId"), pydantic.Field(alias="docId")] + layer_name: typing_extensions.Annotated[str, FieldMetadata(alias="layerName"), pydantic.Field(alias="layerName")] + scope: typing.List[str] + origins: typing.Optional[typing.List[str]] = None + password_protected: typing_extensions.Annotated[ + bool, FieldMetadata(alias="passwordProtected"), pydantic.Field(alias="passwordProtected") + ] + session_ttl_seconds: typing_extensions.Annotated[ + float, FieldMetadata(alias="sessionTtlSeconds"), pydantic.Field(alias="sessionTtlSeconds") + ] + disabled: bool + expires_at: typing_extensions.Annotated[ + typing.Optional[float], FieldMetadata(alias="expiresAt"), pydantic.Field(alias="expiresAt") + ] = None + exchange_count: typing_extensions.Annotated[ + float, FieldMetadata(alias="exchangeCount"), pydantic.Field(alias="exchangeCount") + ] + last_exchanged_at: typing_extensions.Annotated[ + typing.Optional[float], FieldMetadata(alias="lastExchangedAt"), pydantic.Field(alias="lastExchangedAt") + ] = None + created_by: typing_extensions.Annotated[str, FieldMetadata(alias="createdBy"), pydantic.Field(alias="createdBy")] + created_at: typing_extensions.Annotated[float, FieldMetadata(alias="createdAt"), pydantic.Field(alias="createdAt")] + updated_at: typing_extensions.Annotated[float, FieldMetadata(alias="updatedAt"), pydantic.Field(alias="updatedAt")] + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/cloudpdf/types/shares_update400response.py b/src/cloudpdf/types/shares_update400response.py new file mode 100644 index 0000000..ca6c5e1 --- /dev/null +++ b/src/cloudpdf/types/shares_update400response.py @@ -0,0 +1,20 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .shares_update400response_error import SharesUpdate400ResponseError + + +class SharesUpdate400Response(UniversalBaseModel): + error: SharesUpdate400ResponseError + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/cloudpdf/types/shares_update400response_error.py b/src/cloudpdf/types/shares_update400response_error.py new file mode 100644 index 0000000..288ac4f --- /dev/null +++ b/src/cloudpdf/types/shares_update400response_error.py @@ -0,0 +1,20 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel + + +class SharesUpdate400ResponseError(UniversalBaseModel): + code: str + message: str + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/cloudpdf/types/shares_update404response.py b/src/cloudpdf/types/shares_update404response.py new file mode 100644 index 0000000..28cae7a --- /dev/null +++ b/src/cloudpdf/types/shares_update404response.py @@ -0,0 +1,20 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .shares_update404response_error import SharesUpdate404ResponseError + + +class SharesUpdate404Response(UniversalBaseModel): + error: SharesUpdate404ResponseError + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/cloudpdf/types/shares_update404response_error.py b/src/cloudpdf/types/shares_update404response_error.py new file mode 100644 index 0000000..1bb9194 --- /dev/null +++ b/src/cloudpdf/types/shares_update404response_error.py @@ -0,0 +1,20 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel + + +class SharesUpdate404ResponseError(UniversalBaseModel): + code: str + message: str + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/cloudpdf/types/tenants_create200response_tenant.py b/src/cloudpdf/types/tenants_create200response_tenant.py index c45c80a..535f830 100644 --- a/src/cloudpdf/types/tenants_create200response_tenant.py +++ b/src/cloudpdf/types/tenants_create200response_tenant.py @@ -6,6 +6,7 @@ import typing_extensions from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel from ..core.serialization import FieldMetadata +from .tenants_create200response_tenant_status import TenantsCreate200ResponseTenantStatus class TenantsCreate200ResponseTenant(UniversalBaseModel): @@ -14,6 +15,7 @@ class TenantsCreate200ResponseTenant(UniversalBaseModel): auto_provisioned: typing_extensions.Annotated[ bool, FieldMetadata(alias="autoProvisioned"), pydantic.Field(alias="autoProvisioned") ] + status: typing.Optional[TenantsCreate200ResponseTenantStatus] = None created_at: typing_extensions.Annotated[float, FieldMetadata(alias="createdAt"), pydantic.Field(alias="createdAt")] if IS_PYDANTIC_V2: diff --git a/src/cloudpdf/types/tenants_create200response_tenant_status.py b/src/cloudpdf/types/tenants_create200response_tenant_status.py new file mode 100644 index 0000000..79158af --- /dev/null +++ b/src/cloudpdf/types/tenants_create200response_tenant_status.py @@ -0,0 +1,5 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +TenantsCreate200ResponseTenantStatus = typing.Union[typing.Literal["active", "suspended"], typing.Any] diff --git a/src/cloudpdf/types/tenants_get200response_tenant.py b/src/cloudpdf/types/tenants_get200response_tenant.py index 0224287..38c276d 100644 --- a/src/cloudpdf/types/tenants_get200response_tenant.py +++ b/src/cloudpdf/types/tenants_get200response_tenant.py @@ -6,6 +6,7 @@ import typing_extensions from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel from ..core.serialization import FieldMetadata +from .tenants_get200response_tenant_status import TenantsGet200ResponseTenantStatus class TenantsGet200ResponseTenant(UniversalBaseModel): @@ -14,6 +15,7 @@ class TenantsGet200ResponseTenant(UniversalBaseModel): auto_provisioned: typing_extensions.Annotated[ bool, FieldMetadata(alias="autoProvisioned"), pydantic.Field(alias="autoProvisioned") ] + status: typing.Optional[TenantsGet200ResponseTenantStatus] = None created_at: typing_extensions.Annotated[float, FieldMetadata(alias="createdAt"), pydantic.Field(alias="createdAt")] if IS_PYDANTIC_V2: diff --git a/src/cloudpdf/types/tenants_get200response_tenant_status.py b/src/cloudpdf/types/tenants_get200response_tenant_status.py new file mode 100644 index 0000000..00bdfd1 --- /dev/null +++ b/src/cloudpdf/types/tenants_get200response_tenant_status.py @@ -0,0 +1,5 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +TenantsGet200ResponseTenantStatus = typing.Union[typing.Literal["active", "suspended"], typing.Any] diff --git a/src/cloudpdf/types/tenants_list200response_tenants_item.py b/src/cloudpdf/types/tenants_list200response_tenants_item.py index 5caabbc..8ac17c9 100644 --- a/src/cloudpdf/types/tenants_list200response_tenants_item.py +++ b/src/cloudpdf/types/tenants_list200response_tenants_item.py @@ -6,6 +6,7 @@ import typing_extensions from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel from ..core.serialization import FieldMetadata +from .tenants_list200response_tenants_item_status import TenantsList200ResponseTenantsItemStatus class TenantsList200ResponseTenantsItem(UniversalBaseModel): @@ -14,6 +15,7 @@ class TenantsList200ResponseTenantsItem(UniversalBaseModel): auto_provisioned: typing_extensions.Annotated[ bool, FieldMetadata(alias="autoProvisioned"), pydantic.Field(alias="autoProvisioned") ] + status: typing.Optional[TenantsList200ResponseTenantsItemStatus] = None created_at: typing_extensions.Annotated[float, FieldMetadata(alias="createdAt"), pydantic.Field(alias="createdAt")] if IS_PYDANTIC_V2: diff --git a/src/cloudpdf/types/tenants_list200response_tenants_item_status.py b/src/cloudpdf/types/tenants_list200response_tenants_item_status.py new file mode 100644 index 0000000..d7603de --- /dev/null +++ b/src/cloudpdf/types/tenants_list200response_tenants_item_status.py @@ -0,0 +1,5 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +TenantsList200ResponseTenantsItemStatus = typing.Union[typing.Literal["active", "suspended"], typing.Any] diff --git a/src/cloudpdf/types/tenants_resume_response.py b/src/cloudpdf/types/tenants_resume_response.py new file mode 100644 index 0000000..3260c75 --- /dev/null +++ b/src/cloudpdf/types/tenants_resume_response.py @@ -0,0 +1,20 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .tenants_resume_response_error import TenantsResumeResponseError + + +class TenantsResumeResponse(UniversalBaseModel): + error: TenantsResumeResponseError + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/cloudpdf/types/tenants_resume_response_error.py b/src/cloudpdf/types/tenants_resume_response_error.py new file mode 100644 index 0000000..82707d2 --- /dev/null +++ b/src/cloudpdf/types/tenants_resume_response_error.py @@ -0,0 +1,20 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel + + +class TenantsResumeResponseError(UniversalBaseModel): + code: str + message: str + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/cloudpdf/types/tenants_suspend_response.py b/src/cloudpdf/types/tenants_suspend_response.py new file mode 100644 index 0000000..4ddec34 --- /dev/null +++ b/src/cloudpdf/types/tenants_suspend_response.py @@ -0,0 +1,20 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .tenants_suspend_response_error import TenantsSuspendResponseError + + +class TenantsSuspendResponse(UniversalBaseModel): + error: TenantsSuspendResponseError + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/cloudpdf/types/tenants_suspend_response_error.py b/src/cloudpdf/types/tenants_suspend_response_error.py new file mode 100644 index 0000000..be45f86 --- /dev/null +++ b/src/cloudpdf/types/tenants_suspend_response_error.py @@ -0,0 +1,20 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel + + +class TenantsSuspendResponseError(UniversalBaseModel): + code: str + message: str + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/cloudpdf/types/tenants_usage200response.py b/src/cloudpdf/types/tenants_usage200response.py new file mode 100644 index 0000000..7b7adf6 --- /dev/null +++ b/src/cloudpdf/types/tenants_usage200response.py @@ -0,0 +1,27 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +import typing_extensions +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from ..core.serialization import FieldMetadata +from .tenants_usage200response_metrics import TenantsUsage200ResponseMetrics + + +class TenantsUsage200Response(UniversalBaseModel): + tenant_id: typing_extensions.Annotated[str, FieldMetadata(alias="tenantId"), pydantic.Field(alias="tenantId")] + period_start: typing_extensions.Annotated[ + str, FieldMetadata(alias="periodStart"), pydantic.Field(alias="periodStart") + ] + period_end: typing_extensions.Annotated[str, FieldMetadata(alias="periodEnd"), pydantic.Field(alias="periodEnd")] + metrics: TenantsUsage200ResponseMetrics + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/cloudpdf/types/tenants_usage200response_metrics.py b/src/cloudpdf/types/tenants_usage200response_metrics.py new file mode 100644 index 0000000..5d500ec --- /dev/null +++ b/src/cloudpdf/types/tenants_usage200response_metrics.py @@ -0,0 +1,27 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +import typing_extensions +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from ..core.serialization import FieldMetadata + + +class TenantsUsage200ResponseMetrics(UniversalBaseModel): + pdf_views: typing_extensions.Annotated[float, FieldMetadata(alias="pdf.views"), pydantic.Field(alias="pdf.views")] + pdf_uploads: typing_extensions.Annotated[ + float, FieldMetadata(alias="pdf.uploads"), pydantic.Field(alias="pdf.uploads") + ] + storage_bytes: typing_extensions.Annotated[ + float, FieldMetadata(alias="storage.bytes"), pydantic.Field(alias="storage.bytes") + ] + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/cloudpdf/types/tenants_usage400response.py b/src/cloudpdf/types/tenants_usage400response.py new file mode 100644 index 0000000..4f8d47f --- /dev/null +++ b/src/cloudpdf/types/tenants_usage400response.py @@ -0,0 +1,20 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .tenants_usage400response_error import TenantsUsage400ResponseError + + +class TenantsUsage400Response(UniversalBaseModel): + error: TenantsUsage400ResponseError + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/cloudpdf/types/tenants_usage400response_error.py b/src/cloudpdf/types/tenants_usage400response_error.py new file mode 100644 index 0000000..2d02145 --- /dev/null +++ b/src/cloudpdf/types/tenants_usage400response_error.py @@ -0,0 +1,20 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel + + +class TenantsUsage400ResponseError(UniversalBaseModel): + code: str + message: str + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/cloudpdf/types/tenants_usage404response.py b/src/cloudpdf/types/tenants_usage404response.py new file mode 100644 index 0000000..d525509 --- /dev/null +++ b/src/cloudpdf/types/tenants_usage404response.py @@ -0,0 +1,20 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .tenants_usage404response_error import TenantsUsage404ResponseError + + +class TenantsUsage404Response(UniversalBaseModel): + error: TenantsUsage404ResponseError + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/cloudpdf/types/tenants_usage404response_error.py b/src/cloudpdf/types/tenants_usage404response_error.py new file mode 100644 index 0000000..950bb75 --- /dev/null +++ b/src/cloudpdf/types/tenants_usage404response_error.py @@ -0,0 +1,20 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel + + +class TenantsUsage404ResponseError(UniversalBaseModel): + code: str + message: str + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/cloudpdf/types/tokens_issue_request.py b/src/cloudpdf/types/tokens_issue_request.py index e784e60..2c60d8c 100644 --- a/src/cloudpdf/types/tokens_issue_request.py +++ b/src/cloudpdf/types/tokens_issue_request.py @@ -29,6 +29,7 @@ class TokensIssueRequest_Doc(UniversalBaseModel): typing.Optional[str], FieldMetadata(alias="groupId"), pydantic.Field(alias="groupId") ] = None groups: typing.Optional[typing.List[str]] = None + origins: typing.Optional[typing.List[str]] = None expires_in: typing_extensions.Annotated[int, FieldMetadata(alias="expiresIn"), pydantic.Field(alias="expiresIn")] if IS_PYDANTIC_V2: diff --git a/src/cloudpdf/types/tokens_issue_request_doc.py b/src/cloudpdf/types/tokens_issue_request_doc.py index 19ff2fc..fde4d89 100644 --- a/src/cloudpdf/types/tokens_issue_request_doc.py +++ b/src/cloudpdf/types/tokens_issue_request_doc.py @@ -25,6 +25,7 @@ class TokensIssueRequestDoc(UniversalBaseModel): typing.Optional[str], FieldMetadata(alias="groupId"), pydantic.Field(alias="groupId") ] = None groups: typing.Optional[typing.List[str]] = None + origins: typing.Optional[typing.List[str]] = None expires_in: typing_extensions.Annotated[int, FieldMetadata(alias="expiresIn"), pydantic.Field(alias="expiresIn")] if IS_PYDANTIC_V2: diff --git a/src/cloudpdf/types/tokens_issue_request_tenant_scope_item_one.py b/src/cloudpdf/types/tokens_issue_request_tenant_scope_item_one.py index 9eb7360..34d0d73 100644 --- a/src/cloudpdf/types/tokens_issue_request_tenant_scope_item_one.py +++ b/src/cloudpdf/types/tokens_issue_request_tenant_scope_item_one.py @@ -3,5 +3,6 @@ import typing TokensIssueRequestTenantScopeItemOne = typing.Union[ - typing.Literal["docs.create", "docs.read", "docs.delete", "tokens.issue-doc", "tokens.revoke"], typing.Any + typing.Literal["docs.create", "docs.read", "docs.delete", "tokens.issue-doc", "tokens.revoke", "shares.manage"], + typing.Any, ]