Visitar URL original
feat(api): api update · unlayer/unlayer-python@eafe372 · GitHub
Skip to content

Commit eafe372

Browse files
feat(api): api update
1 parent db50139 commit eafe372

7 files changed

Lines changed: 167 additions & 61 deletions

File tree

‎.stats.yml‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
configured_endpoints: 24
2-
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/unlayer%2Funlayer-9942f4da50a072ed2feb0c1aa835272455da6a6e9a22b23d51f75c6002c9da64.yml
3-
openapi_spec_hash: 19ba50f4ff2d2bb8b2a16a6083d1e1e9
4-
config_hash: 6d277064312d0ee93ce6df0eee354fa6
2+
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/unlayer%2Funlayer-737d922f62f9846af680567f50b999b1cec12674d24ae99e262ab1bcc0cbe311.yml
3+
openapi_spec_hash: e1c7ddabf7b87df222fd4e268193d1dd
4+
config_hash: 69225430c17187a9fea0a90e757affff

‎README.md‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ from unlayer import Unlayer
3333

3434
client = Unlayer(
3535
api_key=os.environ.get("UNLAYER_API_KEY"), # This is the default and can be omitted
36+
# or 'production' | 'dev'; defaults to "production".
37+
environment="qa",
3638
)
3739

3840
response = client.project.current_list()
@@ -55,6 +57,8 @@ from unlayer import AsyncUnlayer
5557

5658
client = AsyncUnlayer(
5759
api_key=os.environ.get("UNLAYER_API_KEY"), # This is the default and can be omitted
60+
# or 'production' | 'dev'; defaults to "production".
61+
environment="qa",
5862
)
5963

6064

‎api.md‎

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -39,23 +39,25 @@ Methods:
3939
- <code title="get /project/v1/templates/{id}">client.project.<a href="./src/unlayer/resources/project.py">templates_retrieve</a>(id) -> <a href="./src/unlayer/types/project_templates_retrieve_response.py">ProjectTemplatesRetrieveResponse</a></code>
4040
- <code title="put /project/v1/templates/{id}">client.project.<a href="./src/unlayer/resources/project.py">templates_update</a>(id, \*\*<a href="src/unlayer/types/project_templates_update_params.py">params</a>) -> <a href="./src/unlayer/types/project_templates_update_response.py">ProjectTemplatesUpdateResponse</a></code>
4141

42-
# Documents
42+
# Emails
4343

4444
Types:
4545

4646
```python
4747
from unlayer.types import (
48-
DocumentDocumentsRetrieveResponse,
49-
DocumentGenerateCreateResponse,
50-
DocumentGenerateTemplateTemplateResponse,
48+
EmailRetrieveResponse,
49+
EmailRenderCreateResponse,
50+
EmailSendCreateResponse,
51+
EmailSendTemplateTemplateResponse,
5152
)
5253
```
5354

5455
Methods:
5556

56-
- <code title="get /documents/v1/documents/{id}">client.documents.<a href="./src/unlayer/resources/documents.py">documents_retrieve</a>(id) -> <a href="./src/unlayer/types/document_documents_retrieve_response.py">DocumentDocumentsRetrieveResponse</a></code>
57-
- <code title="post /documents/v1/generate">client.documents.<a href="./src/unlayer/resources/documents.py">generate_create</a>(\*\*<a href="src/unlayer/types/document_generate_create_params.py">params</a>) -> <a href="./src/unlayer/types/document_generate_create_response.py">DocumentGenerateCreateResponse</a></code>
58-
- <code title="post /documents/v1/generate/template">client.documents.<a href="./src/unlayer/resources/documents.py">generate_template_template</a>(\*\*<a href="src/unlayer/types/document_generate_template_template_params.py">params</a>) -> <a href="./src/unlayer/types/document_generate_template_template_response.py">DocumentGenerateTemplateTemplateResponse</a></code>
57+
- <code title="get /emails/v1/emails/{id}">client.emails.<a href="./src/unlayer/resources/emails.py">retrieve</a>(id) -> <a href="./src/unlayer/types/email_retrieve_response.py">EmailRetrieveResponse</a></code>
58+
- <code title="post /emails/v1/render">client.emails.<a href="./src/unlayer/resources/emails.py">render_create</a>(\*\*<a href="src/unlayer/types/email_render_create_params.py">params</a>) -> <a href="./src/unlayer/types/email_render_create_response.py">EmailRenderCreateResponse</a></code>
59+
- <code title="post /emails/v1/send">client.emails.<a href="./src/unlayer/resources/emails.py">send_create</a>(\*\*<a href="src/unlayer/types/email_send_create_params.py">params</a>) -> <a href="./src/unlayer/types/email_send_create_response.py">EmailSendCreateResponse</a></code>
60+
- <code title="post /emails/v1/send/template">client.emails.<a href="./src/unlayer/resources/emails.py">send_template_template</a>(\*\*<a href="src/unlayer/types/email_send_template_template_params.py">params</a>) -> <a href="./src/unlayer/types/email_send_template_template_response.py">EmailSendTemplateTemplateResponse</a></code>
5961

6062
# Pages
6163

@@ -69,22 +71,20 @@ Methods:
6971

7072
- <code title="post /pages/v1/render">client.pages.<a href="./src/unlayer/resources/pages.py">render_create</a>(\*\*<a href="src/unlayer/types/page_render_create_params.py">params</a>) -> <a href="./src/unlayer/types/page_render_create_response.py">PageRenderCreateResponse</a></code>
7173

72-
# Emails
74+
# Documents
7375

7476
Types:
7577

7678
```python
7779
from unlayer.types import (
78-
EmailRetrieveResponse,
79-
EmailRenderCreateResponse,
80-
EmailSendCreateResponse,
81-
EmailSendTemplateTemplateResponse,
80+
DocumentDocumentsRetrieveResponse,
81+
DocumentGenerateCreateResponse,
82+
DocumentGenerateTemplateTemplateResponse,
8283
)
8384
```
8485

8586
Methods:
8687

87-
- <code title="get /emails/v1/emails/{id}">client.emails.<a href="./src/unlayer/resources/emails.py">retrieve</a>(id) -> <a href="./src/unlayer/types/email_retrieve_response.py">EmailRetrieveResponse</a></code>
88-
- <code title="post /emails/v1/render">client.emails.<a href="./src/unlayer/resources/emails.py">render_create</a>(\*\*<a href="src/unlayer/types/email_render_create_params.py">params</a>) -> <a href="./src/unlayer/types/email_render_create_response.py">EmailRenderCreateResponse</a></code>
89-
- <code title="post /emails/v1/send">client.emails.<a href="./src/unlayer/resources/emails.py">send_create</a>(\*\*<a href="src/unlayer/types/email_send_create_params.py">params</a>) -> <a href="./src/unlayer/types/email_send_create_response.py">EmailSendCreateResponse</a></code>
90-
- <code title="post /emails/v1/send/template">client.emails.<a href="./src/unlayer/resources/emails.py">send_template_template</a>(\*\*<a href="src/unlayer/types/email_send_template_template_params.py">params</a>) -> <a href="./src/unlayer/types/email_send_template_template_response.py">EmailSendTemplateTemplateResponse</a></code>
88+
- <code title="get /documents/v1/documents/{id}">client.documents.<a href="./src/unlayer/resources/documents.py">documents_retrieve</a>(id) -> <a href="./src/unlayer/types/document_documents_retrieve_response.py">DocumentDocumentsRetrieveResponse</a></code>
89+
- <code title="post /documents/v1/generate">client.documents.<a href="./src/unlayer/resources/documents.py">generate_create</a>(\*\*<a href="src/unlayer/types/document_generate_create_params.py">params</a>) -> <a href="./src/unlayer/types/document_generate_create_response.py">DocumentGenerateCreateResponse</a></code>
90+
- <code title="post /documents/v1/generate/template">client.documents.<a href="./src/unlayer/resources/documents.py">generate_template_template</a>(\*\*<a href="src/unlayer/types/document_generate_template_template_params.py">params</a>) -> <a href="./src/unlayer/types/document_generate_template_template_response.py">DocumentGenerateTemplateTemplateResponse</a></code>

‎src/unlayer/__init__.py‎

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,18 @@
55
from . import types
66
from ._types import NOT_GIVEN, Omit, NoneType, NotGiven, Transport, ProxiesTypes, omit, not_given
77
from ._utils import file_from_path
8-
from ._client import Client, Stream, Timeout, Unlayer, Transport, AsyncClient, AsyncStream, AsyncUnlayer, RequestOptions
8+
from ._client import (
9+
ENVIRONMENTS,
10+
Client,
11+
Stream,
12+
Timeout,
13+
Unlayer,
14+
Transport,
15+
AsyncClient,
16+
AsyncStream,
17+
AsyncUnlayer,
18+
RequestOptions,
19+
)
920
from ._models import BaseModel
1021
from ._version import __title__, __version__
1122
from ._response import APIResponse as APIResponse, AsyncAPIResponse as AsyncAPIResponse
@@ -63,6 +74,7 @@
6374
"AsyncStream",
6475
"Unlayer",
6576
"AsyncUnlayer",
77+
"ENVIRONMENTS",
6678
"file_from_path",
6779
"BaseModel",
6880
"DEFAULT_TIMEOUT",

‎src/unlayer/_client.py‎

Lines changed: 97 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
from __future__ import annotations
44

55
import os
6-
from typing import Any, Mapping
7-
from typing_extensions import Self, override
6+
from typing import Any, Dict, Mapping, cast
7+
from typing_extensions import Self, Literal, override
88

99
import httpx
1010

@@ -30,25 +30,44 @@
3030
AsyncAPIClient,
3131
)
3232

33-
__all__ = ["Timeout", "Transport", "ProxiesTypes", "RequestOptions", "Unlayer", "AsyncUnlayer", "Client", "AsyncClient"]
33+
__all__ = [
34+
"ENVIRONMENTS",
35+
"Timeout",
36+
"Transport",
37+
"ProxiesTypes",
38+
"RequestOptions",
39+
"Unlayer",
40+
"AsyncUnlayer",
41+
"Client",
42+
"AsyncClient",
43+
]
44+
45+
ENVIRONMENTS: Dict[str, str] = {
46+
"production": "https://api.unlayer.com",
47+
"qa": "https://api.qa.unlayer.com",
48+
"dev": "https://api.dev.unlayer.com",
49+
}
3450

3551

3652
class Unlayer(SyncAPIClient):
3753
project: project.ProjectResource
38-
documents: documents.DocumentsResource
39-
pages: pages.PagesResource
4054
emails: emails.EmailsResource
55+
pages: pages.PagesResource
56+
documents: documents.DocumentsResource
4157
with_raw_response: UnlayerWithRawResponse
4258
with_streaming_response: UnlayerWithStreamedResponse
4359

4460
# client options
4561
api_key: str
4662

63+
_environment: Literal["production", "qa", "dev"] | NotGiven
64+
4765
def __init__(
4866
self,
4967
*,
5068
api_key: str | None = None,
51-
base_url: str | httpx.URL | None = None,
69+
environment: Literal["production", "qa", "dev"] | NotGiven = not_given,
70+
base_url: str | httpx.URL | None | NotGiven = not_given,
5271
timeout: float | Timeout | None | NotGiven = not_given,
5372
max_retries: int = DEFAULT_MAX_RETRIES,
5473
default_headers: Mapping[str, str] | None = None,
@@ -79,10 +98,31 @@ def __init__(
7998
)
8099
self.api_key = api_key
81100

82-
if base_url is None:
83-
base_url = os.environ.get("UNLAYER_BASE_URL")
84-
if base_url is None:
85-
base_url = f"https://api.unlayer.com"
101+
self._environment = environment
102+
103+
base_url_env = os.environ.get("UNLAYER_BASE_URL")
104+
if is_given(base_url) and base_url is not None:
105+
# cast required because mypy doesn't understand the type narrowing
106+
base_url = cast("str | httpx.URL", base_url) # pyright: ignore[reportUnnecessaryCast]
107+
elif is_given(environment):
108+
if base_url_env and base_url is not None:
109+
raise ValueError(
110+
"Ambiguous URL; The `UNLAYER_BASE_URL` env var and the `environment` argument are given. If you want to use the environment, you must pass base_url=None",
111+
)
112+
113+
try:
114+
base_url = ENVIRONMENTS[environment]
115+
except KeyError as exc:
116+
raise ValueError(f"Unknown environment: {environment}") from exc
117+
elif base_url_env is not None:
118+
base_url = base_url_env
119+
else:
120+
self._environment = environment = "production"
121+
122+
try:
123+
base_url = ENVIRONMENTS[environment]
124+
except KeyError as exc:
125+
raise ValueError(f"Unknown environment: {environment}") from exc
86126

87127
super().__init__(
88128
version=__version__,
@@ -96,9 +136,9 @@ def __init__(
96136
)
97137

98138
self.project = project.ProjectResource(self)
99-
self.documents = documents.DocumentsResource(self)
100-
self.pages = pages.PagesResource(self)
101139
self.emails = emails.EmailsResource(self)
140+
self.pages = pages.PagesResource(self)
141+
self.documents = documents.DocumentsResource(self)
102142
self.with_raw_response = UnlayerWithRawResponse(self)
103143
self.with_streaming_response = UnlayerWithStreamedResponse(self)
104144

@@ -126,6 +166,7 @@ def copy(
126166
self,
127167
*,
128168
api_key: str | None = None,
169+
environment: Literal["production", "qa", "dev"] | None = None,
129170
base_url: str | httpx.URL | None = None,
130171
timeout: float | Timeout | None | NotGiven = not_given,
131172
http_client: httpx.Client | None = None,
@@ -161,6 +202,7 @@ def copy(
161202
return self.__class__(
162203
api_key=api_key or self.api_key,
163204
base_url=base_url or self.base_url,
205+
environment=environment or self._environment,
164206
timeout=self.timeout if isinstance(timeout, NotGiven) else timeout,
165207
http_client=http_client,
166208
max_retries=max_retries if is_given(max_retries) else self.max_retries,
@@ -209,20 +251,23 @@ def _make_status_error(
209251

210252
class AsyncUnlayer(AsyncAPIClient):
211253
project: project.AsyncProjectResource
212-
documents: documents.AsyncDocumentsResource
213-
pages: pages.AsyncPagesResource
214254
emails: emails.AsyncEmailsResource
255+
pages: pages.AsyncPagesResource
256+
documents: documents.AsyncDocumentsResource
215257
with_raw_response: AsyncUnlayerWithRawResponse
216258
with_streaming_response: AsyncUnlayerWithStreamedResponse
217259

218260
# client options
219261
api_key: str
220262

263+
_environment: Literal["production", "qa", "dev"] | NotGiven
264+
221265
def __init__(
222266
self,
223267
*,
224268
api_key: str | None = None,
225-
base_url: str | httpx.URL | None = None,
269+
environment: Literal["production", "qa", "dev"] | NotGiven = not_given,
270+
base_url: str | httpx.URL | None | NotGiven = not_given,
226271
timeout: float | Timeout | None | NotGiven = not_given,
227272
max_retries: int = DEFAULT_MAX_RETRIES,
228273
default_headers: Mapping[str, str] | None = None,
@@ -253,10 +298,31 @@ def __init__(
253298
)
254299
self.api_key = api_key
255300

256-
if base_url is None:
257-
base_url = os.environ.get("UNLAYER_BASE_URL")
258-
if base_url is None:
259-
base_url = f"https://api.unlayer.com"
301+
self._environment = environment
302+
303+
base_url_env = os.environ.get("UNLAYER_BASE_URL")
304+
if is_given(base_url) and base_url is not None:
305+
# cast required because mypy doesn't understand the type narrowing
306+
base_url = cast("str | httpx.URL", base_url) # pyright: ignore[reportUnnecessaryCast]
307+
elif is_given(environment):
308+
if base_url_env and base_url is not None:
309+
raise ValueError(
310+
"Ambiguous URL; The `UNLAYER_BASE_URL` env var and the `environment` argument are given. If you want to use the environment, you must pass base_url=None",
311+
)
312+
313+
try:
314+
base_url = ENVIRONMENTS[environment]
315+
except KeyError as exc:
316+
raise ValueError(f"Unknown environment: {environment}") from exc
317+
elif base_url_env is not None:
318+
base_url = base_url_env
319+
else:
320+
self._environment = environment = "production"
321+
322+
try:
323+
base_url = ENVIRONMENTS[environment]
324+
except KeyError as exc:
325+
raise ValueError(f"Unknown environment: {environment}") from exc
260326

261327
super().__init__(
262328
version=__version__,
@@ -270,9 +336,9 @@ def __init__(
270336
)
271337

272338
self.project = project.AsyncProjectResource(self)
273-
self.documents = documents.AsyncDocumentsResource(self)
274-
self.pages = pages.AsyncPagesResource(self)
275339
self.emails = emails.AsyncEmailsResource(self)
340+
self.pages = pages.AsyncPagesResource(self)
341+
self.documents = documents.AsyncDocumentsResource(self)
276342
self.with_raw_response = AsyncUnlayerWithRawResponse(self)
277343
self.with_streaming_response = AsyncUnlayerWithStreamedResponse(self)
278344

@@ -300,6 +366,7 @@ def copy(
300366
self,
301367
*,
302368
api_key: str | None = None,
369+
environment: Literal["production", "qa", "dev"] | None = None,
303370
base_url: str | httpx.URL | None = None,
304371
timeout: float | Timeout | None | NotGiven = not_given,
305372
http_client: httpx.AsyncClient | None = None,
@@ -335,6 +402,7 @@ def copy(
335402
return self.__class__(
336403
api_key=api_key or self.api_key,
337404
base_url=base_url or self.base_url,
405+
environment=environment or self._environment,
338406
timeout=self.timeout if isinstance(timeout, NotGiven) else timeout,
339407
http_client=http_client,
340408
max_retries=max_retries if is_given(max_retries) else self.max_retries,
@@ -384,33 +452,33 @@ def _make_status_error(
384452
class UnlayerWithRawResponse:
385453
def __init__(self, client: Unlayer) -> None:
386454
self.project = project.ProjectResourceWithRawResponse(client.project)
387-
self.documents = documents.DocumentsResourceWithRawResponse(client.documents)
388-
self.pages = pages.PagesResourceWithRawResponse(client.pages)
389455
self.emails = emails.EmailsResourceWithRawResponse(client.emails)
456+
self.pages = pages.PagesResourceWithRawResponse(client.pages)
457+
self.documents = documents.DocumentsResourceWithRawResponse(client.documents)
390458

391459

392460
class AsyncUnlayerWithRawResponse:
393461
def __init__(self, client: AsyncUnlayer) -> None:
394462
self.project = project.AsyncProjectResourceWithRawResponse(client.project)
395-
self.documents = documents.AsyncDocumentsResourceWithRawResponse(client.documents)
396-
self.pages = pages.AsyncPagesResourceWithRawResponse(client.pages)
397463
self.emails = emails.AsyncEmailsResourceWithRawResponse(client.emails)
464+
self.pages = pages.AsyncPagesResourceWithRawResponse(client.pages)
465+
self.documents = documents.AsyncDocumentsResourceWithRawResponse(client.documents)
398466

399467

400468
class UnlayerWithStreamedResponse:
401469
def __init__(self, client: Unlayer) -> None:
402470
self.project = project.ProjectResourceWithStreamingResponse(client.project)
403-
self.documents = documents.DocumentsResourceWithStreamingResponse(client.documents)
404-
self.pages = pages.PagesResourceWithStreamingResponse(client.pages)
405471
self.emails = emails.EmailsResourceWithStreamingResponse(client.emails)
472+
self.pages = pages.PagesResourceWithStreamingResponse(client.pages)
473+
self.documents = documents.DocumentsResourceWithStreamingResponse(client.documents)
406474

407475

408476
class AsyncUnlayerWithStreamedResponse:
409477
def __init__(self, client: AsyncUnlayer) -> None:
410478
self.project = project.AsyncProjectResourceWithStreamingResponse(client.project)
411-
self.documents = documents.AsyncDocumentsResourceWithStreamingResponse(client.documents)
412-
self.pages = pages.AsyncPagesResourceWithStreamingResponse(client.pages)
413479
self.emails = emails.AsyncEmailsResourceWithStreamingResponse(client.emails)
480+
self.pages = pages.AsyncPagesResourceWithStreamingResponse(client.pages)
481+
self.documents = documents.AsyncDocumentsResourceWithStreamingResponse(client.documents)
414482

415483

416484
Client = Unlayer

0 commit comments

Comments
 (0)