33from __future__ import annotations
44
55import 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
99import httpx
1010
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
3652class 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
210252class 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(
384452class 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
392460class 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
400468class 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
408476class 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
416484Client = Unlayer
0 commit comments