From 4ec747324174ed90aab55a4a6d1df7c7912e443d Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Thu, 19 Mar 2026 15:38:45 +0000 Subject: [PATCH 1/2] fix: sanitize endpoint path params --- src/gradient/_utils/__init__.py | 1 + src/gradient/_utils/_path.py | 127 ++++++++++++++++++ src/gradient/resources/agents/agents.py | 52 +++---- src/gradient/resources/agents/api_keys.py | 76 ++++++----- .../evaluation_metrics/anthropic/keys.py | 42 +++--- .../agents/evaluation_metrics/openai/keys.py | 42 +++--- .../evaluation_metrics/scheduled_indexing.py | 28 ++-- .../evaluation_metrics/workspaces/agents.py | 26 ++-- .../workspaces/workspaces.py | 46 +++---- .../resources/agents/evaluation_runs.py | 48 ++++--- .../resources/agents/evaluation_test_cases.py | 42 +++--- src/gradient/resources/agents/functions.py | 48 ++++--- .../resources/agents/knowledge_bases.py | 47 ++++--- src/gradient/resources/agents/routes.py | 66 +++++---- src/gradient/resources/agents/versions.py | 22 ++- .../resources/apps/job_invocations.py | 20 ++- src/gradient/resources/billing.py | 22 ++- .../databases/schema_registry/config.py | 70 ++++++---- .../resources/gpu_droplets/account/keys.py | 32 ++--- .../resources/gpu_droplets/actions.py | 36 +++-- .../resources/gpu_droplets/autoscale.py | 66 ++++----- .../resources/gpu_droplets/backups.py | 22 ++- .../destroy_with_associated_resources.py | 64 ++++----- .../gpu_droplets/firewalls/droplets.py | 22 ++- .../gpu_droplets/firewalls/firewalls.py | 32 ++--- .../resources/gpu_droplets/firewalls/rules.py | 22 ++- .../resources/gpu_droplets/firewalls/tags.py | 22 ++- .../gpu_droplets/floating_ips/actions.py | 36 +++-- .../gpu_droplets/floating_ips/floating_ips.py | 22 ++- .../resources/gpu_droplets/gpu_droplets.py | 62 ++++----- .../resources/gpu_droplets/images/actions.py | 32 ++--- .../resources/gpu_droplets/images/images.py | 32 ++--- .../gpu_droplets/load_balancers/droplets.py | 22 ++- .../load_balancers/forwarding_rules.py | 22 ++- .../load_balancers/load_balancers.py | 42 +++--- .../resources/gpu_droplets/snapshots.py | 22 ++- .../resources/gpu_droplets/volumes/actions.py | 32 ++--- .../gpu_droplets/volumes/snapshots.py | 42 +++--- .../resources/gpu_droplets/volumes/volumes.py | 22 ++- src/gradient/resources/inference/api_keys.py | 32 ++--- .../resources/knowledge_bases/data_sources.py | 68 ++++++---- .../knowledge_bases/indexing_jobs.py | 50 +++---- .../knowledge_bases/knowledge_bases.py | 2 +- .../resources/models/providers/anthropic.py | 42 +++--- .../resources/models/providers/openai.py | 42 +++--- src/gradient/resources/nfs/nfs.py | 32 ++--- src/gradient/resources/nfs/snapshots.py | 22 ++- tests/test_utils/test_path.py | 89 ++++++++++++ 48 files changed, 1038 insertions(+), 872 deletions(-) create mode 100644 src/gradient/_utils/_path.py create mode 100644 tests/test_utils/test_path.py diff --git a/src/gradient/_utils/__init__.py b/src/gradient/_utils/__init__.py index dc64e29a..10cb66d2 100644 --- a/src/gradient/_utils/__init__.py +++ b/src/gradient/_utils/__init__.py @@ -1,3 +1,4 @@ +from ._path import path_template as path_template from ._sync import asyncify as asyncify from ._proxy import LazyProxy as LazyProxy from ._utils import ( diff --git a/src/gradient/_utils/_path.py b/src/gradient/_utils/_path.py new file mode 100644 index 00000000..4d6e1e4c --- /dev/null +++ b/src/gradient/_utils/_path.py @@ -0,0 +1,127 @@ +from __future__ import annotations + +import re +from typing import ( + Any, + Mapping, + Callable, +) +from urllib.parse import quote + +# Matches '.' or '..' where each dot is either literal or percent-encoded (%2e / %2E). +_DOT_SEGMENT_RE = re.compile(r"^(?:\.|%2[eE]){1,2}$") + +_PLACEHOLDER_RE = re.compile(r"\{(\w+)\}") + + +def _quote_path_segment_part(value: str) -> str: + """Percent-encode `value` for use in a URI path segment. + + Considers characters not in `pchar` set from RFC 3986 §3.3 to be unsafe. + https://datatracker.ietf.org/doc/html/rfc3986#section-3.3 + """ + # quote() already treats unreserved characters (letters, digits, and -._~) + # as safe, so we only need to add sub-delims, ':', and '@'. + # Notably, unlike the default `safe` for quote(), / is unsafe and must be quoted. + return quote(value, safe="!$&'()*+,;=:@") + + +def _quote_query_part(value: str) -> str: + """Percent-encode `value` for use in a URI query string. + + Considers &, = and characters not in `query` set from RFC 3986 §3.4 to be unsafe. + https://datatracker.ietf.org/doc/html/rfc3986#section-3.4 + """ + return quote(value, safe="!$'()*+,;:@/?") + + +def _quote_fragment_part(value: str) -> str: + """Percent-encode `value` for use in a URI fragment. + + Considers characters not in `fragment` set from RFC 3986 §3.5 to be unsafe. + https://datatracker.ietf.org/doc/html/rfc3986#section-3.5 + """ + return quote(value, safe="!$&'()*+,;=:@/?") + + +def _interpolate( + template: str, + values: Mapping[str, Any], + quoter: Callable[[str], str], +) -> str: + """Replace {name} placeholders in `template`, quoting each value with `quoter`. + + Placeholder names are looked up in `values`. + + Raises: + KeyError: If a placeholder is not found in `values`. + """ + # re.split with a capturing group returns alternating + # [text, name, text, name, ..., text] elements. + parts = _PLACEHOLDER_RE.split(template) + + for i in range(1, len(parts), 2): + name = parts[i] + if name not in values: + raise KeyError(f"a value for placeholder {{{name}}} was not provided") + val = values[name] + if val is None: + parts[i] = "null" + elif isinstance(val, bool): + parts[i] = "true" if val else "false" + else: + parts[i] = quoter(str(values[name])) + + return "".join(parts) + + +def path_template(template: str, /, **kwargs: Any) -> str: + """Interpolate {name} placeholders in `template` from keyword arguments. + + Args: + template: The template string containing {name} placeholders. + **kwargs: Keyword arguments to interpolate into the template. + + Returns: + The template with placeholders interpolated and percent-encoded. + + Safe characters for percent-encoding are dependent on the URI component. + Placeholders in path and fragment portions are percent-encoded where the `segment` + and `fragment` sets from RFC 3986 respectively are considered safe. + Placeholders in the query portion are percent-encoded where the `query` set from + RFC 3986 §3.3 is considered safe except for = and & characters. + + Raises: + KeyError: If a placeholder is not found in `kwargs`. + ValueError: If resulting path contains /./ or /../ segments (including percent-encoded dot-segments). + """ + # Split the template into path, query, and fragment portions. + fragment_template: str | None = None + query_template: str | None = None + + rest = template + if "#" in rest: + rest, fragment_template = rest.split("#", 1) + if "?" in rest: + rest, query_template = rest.split("?", 1) + path_template = rest + + # Interpolate each portion with the appropriate quoting rules. + path_result = _interpolate(path_template, kwargs, _quote_path_segment_part) + + # Reject dot-segments (. and ..) in the final assembled path. The check + # runs after interpolation so that adjacent placeholders or a mix of static + # text and placeholders that together form a dot-segment are caught. + # Also reject percent-encoded dot-segments to protect against incorrectly + # implemented normalization in servers/proxies. + for segment in path_result.split("/"): + if _DOT_SEGMENT_RE.match(segment): + raise ValueError(f"Constructed path {path_result!r} contains dot-segment {segment!r} which is not allowed") + + result = path_result + if query_template is not None: + result += "?" + _interpolate(query_template, kwargs, _quote_query_part) + if fragment_template is not None: + result += "#" + _interpolate(fragment_template, kwargs, _quote_fragment_part) + + return result diff --git a/src/gradient/resources/agents/agents.py b/src/gradient/resources/agents/agents.py index e6790b29..a422c72d 100644 --- a/src/gradient/resources/agents/agents.py +++ b/src/gradient/resources/agents/agents.py @@ -23,7 +23,7 @@ agent_retrieve_usage_params, ) from ..._types import Body, Omit, Query, Headers, NotGiven, SequenceNotStr, omit, not_given -from ..._utils import maybe_transform, async_maybe_transform +from ..._utils import path_template, maybe_transform, async_maybe_transform from .api_keys import ( APIKeysResource, AsyncAPIKeysResource, @@ -325,9 +325,8 @@ def retrieve( if not uuid: raise ValueError(f"Expected a non-empty value for `uuid` but received {uuid!r}") return self._get( - f"/v2/gen-ai/agents/{uuid}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/agents/{uuid}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/gen-ai/agents/{uuid}", uuid=uuid), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -429,9 +428,8 @@ def update( if not path_uuid: raise ValueError(f"Expected a non-empty value for `path_uuid` but received {path_uuid!r}") return self._put( - f"/v2/gen-ai/agents/{path_uuid}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/agents/{path_uuid}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/gen-ai/agents/{path_uuid}", path_uuid=path_uuid), body=maybe_transform( { "agent_log_insights_enabled": agent_log_insights_enabled, @@ -540,9 +538,8 @@ def delete( if not uuid: raise ValueError(f"Expected a non-empty value for `uuid` but received {uuid!r}") return self._delete( - f"/v2/gen-ai/agents/{uuid}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/agents/{uuid}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/gen-ai/agents/{uuid}", uuid=uuid), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -583,9 +580,8 @@ def retrieve_usage( if not uuid: raise ValueError(f"Expected a non-empty value for `uuid` but received {uuid!r}") return self._get( - f"/v2/gen-ai/agents/{uuid}/usage" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/agents/{uuid}/usage", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/gen-ai/agents/{uuid}/usage", uuid=uuid), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -643,9 +639,8 @@ def update_status( if not path_uuid: raise ValueError(f"Expected a non-empty value for `path_uuid` but received {path_uuid!r}") return self._put( - f"/v2/gen-ai/agents/{path_uuid}/deployment_visibility" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/agents/{path_uuid}/deployment_visibility", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/gen-ai/agents/{path_uuid}/deployment_visibility", path_uuid=path_uuid), body=maybe_transform( { "body_uuid": body_uuid, @@ -953,9 +948,8 @@ async def retrieve( if not uuid: raise ValueError(f"Expected a non-empty value for `uuid` but received {uuid!r}") return await self._get( - f"/v2/gen-ai/agents/{uuid}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/agents/{uuid}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/gen-ai/agents/{uuid}", uuid=uuid), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -1057,9 +1051,8 @@ async def update( if not path_uuid: raise ValueError(f"Expected a non-empty value for `path_uuid` but received {path_uuid!r}") return await self._put( - f"/v2/gen-ai/agents/{path_uuid}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/agents/{path_uuid}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/gen-ai/agents/{path_uuid}", path_uuid=path_uuid), body=await async_maybe_transform( { "agent_log_insights_enabled": agent_log_insights_enabled, @@ -1168,9 +1161,8 @@ async def delete( if not uuid: raise ValueError(f"Expected a non-empty value for `uuid` but received {uuid!r}") return await self._delete( - f"/v2/gen-ai/agents/{uuid}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/agents/{uuid}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/gen-ai/agents/{uuid}", uuid=uuid), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -1211,9 +1203,8 @@ async def retrieve_usage( if not uuid: raise ValueError(f"Expected a non-empty value for `uuid` but received {uuid!r}") return await self._get( - f"/v2/gen-ai/agents/{uuid}/usage" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/agents/{uuid}/usage", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/gen-ai/agents/{uuid}/usage", uuid=uuid), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -1271,9 +1262,8 @@ async def update_status( if not path_uuid: raise ValueError(f"Expected a non-empty value for `path_uuid` but received {path_uuid!r}") return await self._put( - f"/v2/gen-ai/agents/{path_uuid}/deployment_visibility" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/agents/{path_uuid}/deployment_visibility", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/gen-ai/agents/{path_uuid}/deployment_visibility", path_uuid=path_uuid), body=await async_maybe_transform( { "body_uuid": body_uuid, diff --git a/src/gradient/resources/agents/api_keys.py b/src/gradient/resources/agents/api_keys.py index 8a045851..3ffdec58 100644 --- a/src/gradient/resources/agents/api_keys.py +++ b/src/gradient/resources/agents/api_keys.py @@ -5,7 +5,7 @@ import httpx from ..._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from ..._utils import maybe_transform, async_maybe_transform +from ..._utils import path_template, maybe_transform, async_maybe_transform from ..._compat import cached_property from ..._resource import SyncAPIResource, AsyncAPIResource from ..._response import ( @@ -82,9 +82,8 @@ def create( if not path_agent_uuid: raise ValueError(f"Expected a non-empty value for `path_agent_uuid` but received {path_agent_uuid!r}") return self._post( - f"/v2/gen-ai/agents/{path_agent_uuid}/api_keys" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/agents/{path_agent_uuid}/api_keys", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/gen-ai/agents/{path_agent_uuid}/api_keys", path_agent_uuid=path_agent_uuid), body=maybe_transform( { "body_agent_uuid": body_agent_uuid, @@ -137,9 +136,12 @@ def update( if not path_api_key_uuid: raise ValueError(f"Expected a non-empty value for `path_api_key_uuid` but received {path_api_key_uuid!r}") return self._put( - f"/v2/gen-ai/agents/{path_agent_uuid}/api_keys/{path_api_key_uuid}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/agents/{path_agent_uuid}/api_keys/{path_api_key_uuid}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template( + "/v2/gen-ai/agents/{path_agent_uuid}/api_keys/{path_api_key_uuid}", + path_agent_uuid=path_agent_uuid, + path_api_key_uuid=path_api_key_uuid, + ), body=maybe_transform( { "body_agent_uuid": body_agent_uuid, @@ -187,9 +189,8 @@ def list( if not agent_uuid: raise ValueError(f"Expected a non-empty value for `agent_uuid` but received {agent_uuid!r}") return self._get( - f"/v2/gen-ai/agents/{agent_uuid}/api_keys" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/agents/{agent_uuid}/api_keys", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/gen-ai/agents/{agent_uuid}/api_keys", agent_uuid=agent_uuid), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -236,9 +237,12 @@ def delete( if not api_key_uuid: raise ValueError(f"Expected a non-empty value for `api_key_uuid` but received {api_key_uuid!r}") return self._delete( - f"/v2/gen-ai/agents/{agent_uuid}/api_keys/{api_key_uuid}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/agents/{agent_uuid}/api_keys/{api_key_uuid}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template( + "/v2/gen-ai/agents/{agent_uuid}/api_keys/{api_key_uuid}", + agent_uuid=agent_uuid, + api_key_uuid=api_key_uuid, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -275,9 +279,12 @@ def regenerate( if not api_key_uuid: raise ValueError(f"Expected a non-empty value for `api_key_uuid` but received {api_key_uuid!r}") return self._put( - f"/v2/gen-ai/agents/{agent_uuid}/api_keys/{api_key_uuid}/regenerate" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/agents/{agent_uuid}/api_keys/{api_key_uuid}/regenerate", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template( + "/v2/gen-ai/agents/{agent_uuid}/api_keys/{api_key_uuid}/regenerate", + agent_uuid=agent_uuid, + api_key_uuid=api_key_uuid, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -342,9 +349,8 @@ async def create( if not path_agent_uuid: raise ValueError(f"Expected a non-empty value for `path_agent_uuid` but received {path_agent_uuid!r}") return await self._post( - f"/v2/gen-ai/agents/{path_agent_uuid}/api_keys" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/agents/{path_agent_uuid}/api_keys", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/gen-ai/agents/{path_agent_uuid}/api_keys", path_agent_uuid=path_agent_uuid), body=await async_maybe_transform( { "body_agent_uuid": body_agent_uuid, @@ -397,9 +403,12 @@ async def update( if not path_api_key_uuid: raise ValueError(f"Expected a non-empty value for `path_api_key_uuid` but received {path_api_key_uuid!r}") return await self._put( - f"/v2/gen-ai/agents/{path_agent_uuid}/api_keys/{path_api_key_uuid}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/agents/{path_agent_uuid}/api_keys/{path_api_key_uuid}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template( + "/v2/gen-ai/agents/{path_agent_uuid}/api_keys/{path_api_key_uuid}", + path_agent_uuid=path_agent_uuid, + path_api_key_uuid=path_api_key_uuid, + ), body=await async_maybe_transform( { "body_agent_uuid": body_agent_uuid, @@ -447,9 +456,8 @@ async def list( if not agent_uuid: raise ValueError(f"Expected a non-empty value for `agent_uuid` but received {agent_uuid!r}") return await self._get( - f"/v2/gen-ai/agents/{agent_uuid}/api_keys" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/agents/{agent_uuid}/api_keys", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/gen-ai/agents/{agent_uuid}/api_keys", agent_uuid=agent_uuid), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -496,9 +504,12 @@ async def delete( if not api_key_uuid: raise ValueError(f"Expected a non-empty value for `api_key_uuid` but received {api_key_uuid!r}") return await self._delete( - f"/v2/gen-ai/agents/{agent_uuid}/api_keys/{api_key_uuid}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/agents/{agent_uuid}/api_keys/{api_key_uuid}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template( + "/v2/gen-ai/agents/{agent_uuid}/api_keys/{api_key_uuid}", + agent_uuid=agent_uuid, + api_key_uuid=api_key_uuid, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -535,9 +546,12 @@ async def regenerate( if not api_key_uuid: raise ValueError(f"Expected a non-empty value for `api_key_uuid` but received {api_key_uuid!r}") return await self._put( - f"/v2/gen-ai/agents/{agent_uuid}/api_keys/{api_key_uuid}/regenerate" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/agents/{agent_uuid}/api_keys/{api_key_uuid}/regenerate", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template( + "/v2/gen-ai/agents/{agent_uuid}/api_keys/{api_key_uuid}/regenerate", + agent_uuid=agent_uuid, + api_key_uuid=api_key_uuid, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gradient/resources/agents/evaluation_metrics/anthropic/keys.py b/src/gradient/resources/agents/evaluation_metrics/anthropic/keys.py index 195d8f88..cb0bba1b 100644 --- a/src/gradient/resources/agents/evaluation_metrics/anthropic/keys.py +++ b/src/gradient/resources/agents/evaluation_metrics/anthropic/keys.py @@ -5,7 +5,7 @@ import httpx from ....._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from ....._utils import maybe_transform, async_maybe_transform +from ....._utils import path_template, maybe_transform, async_maybe_transform from ....._compat import cached_property from ....._resource import SyncAPIResource, AsyncAPIResource from ....._response import ( @@ -128,9 +128,8 @@ def retrieve( if not api_key_uuid: raise ValueError(f"Expected a non-empty value for `api_key_uuid` but received {api_key_uuid!r}") return self._get( - f"/v2/gen-ai/anthropic/keys/{api_key_uuid}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/anthropic/keys/{api_key_uuid}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/gen-ai/anthropic/keys/{api_key_uuid}", api_key_uuid=api_key_uuid), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -173,9 +172,8 @@ def update( if not path_api_key_uuid: raise ValueError(f"Expected a non-empty value for `path_api_key_uuid` but received {path_api_key_uuid!r}") return self._put( - f"/v2/gen-ai/anthropic/keys/{path_api_key_uuid}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/anthropic/keys/{path_api_key_uuid}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/gen-ai/anthropic/keys/{path_api_key_uuid}", path_api_key_uuid=path_api_key_uuid), body=maybe_transform( { "api_key": api_key, @@ -266,9 +264,8 @@ def delete( if not api_key_uuid: raise ValueError(f"Expected a non-empty value for `api_key_uuid` but received {api_key_uuid!r}") return self._delete( - f"/v2/gen-ai/anthropic/keys/{api_key_uuid}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/anthropic/keys/{api_key_uuid}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/gen-ai/anthropic/keys/{api_key_uuid}", api_key_uuid=api_key_uuid), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -307,9 +304,8 @@ def list_agents( if not uuid: raise ValueError(f"Expected a non-empty value for `uuid` but received {uuid!r}") return self._get( - f"/v2/gen-ai/anthropic/keys/{uuid}/agents" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/anthropic/keys/{uuid}/agents", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/gen-ai/anthropic/keys/{uuid}/agents", uuid=uuid), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -424,9 +420,8 @@ async def retrieve( if not api_key_uuid: raise ValueError(f"Expected a non-empty value for `api_key_uuid` but received {api_key_uuid!r}") return await self._get( - f"/v2/gen-ai/anthropic/keys/{api_key_uuid}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/anthropic/keys/{api_key_uuid}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/gen-ai/anthropic/keys/{api_key_uuid}", api_key_uuid=api_key_uuid), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -469,9 +464,8 @@ async def update( if not path_api_key_uuid: raise ValueError(f"Expected a non-empty value for `path_api_key_uuid` but received {path_api_key_uuid!r}") return await self._put( - f"/v2/gen-ai/anthropic/keys/{path_api_key_uuid}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/anthropic/keys/{path_api_key_uuid}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/gen-ai/anthropic/keys/{path_api_key_uuid}", path_api_key_uuid=path_api_key_uuid), body=await async_maybe_transform( { "api_key": api_key, @@ -562,9 +556,8 @@ async def delete( if not api_key_uuid: raise ValueError(f"Expected a non-empty value for `api_key_uuid` but received {api_key_uuid!r}") return await self._delete( - f"/v2/gen-ai/anthropic/keys/{api_key_uuid}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/anthropic/keys/{api_key_uuid}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/gen-ai/anthropic/keys/{api_key_uuid}", api_key_uuid=api_key_uuid), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -603,9 +596,8 @@ async def list_agents( if not uuid: raise ValueError(f"Expected a non-empty value for `uuid` but received {uuid!r}") return await self._get( - f"/v2/gen-ai/anthropic/keys/{uuid}/agents" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/anthropic/keys/{uuid}/agents", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/gen-ai/anthropic/keys/{uuid}/agents", uuid=uuid), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, diff --git a/src/gradient/resources/agents/evaluation_metrics/openai/keys.py b/src/gradient/resources/agents/evaluation_metrics/openai/keys.py index ffe4992d..50785e29 100644 --- a/src/gradient/resources/agents/evaluation_metrics/openai/keys.py +++ b/src/gradient/resources/agents/evaluation_metrics/openai/keys.py @@ -5,7 +5,7 @@ import httpx from ....._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from ....._utils import maybe_transform, async_maybe_transform +from ....._utils import path_template, maybe_transform, async_maybe_transform from ....._compat import cached_property from ....._resource import SyncAPIResource, AsyncAPIResource from ....._response import ( @@ -127,9 +127,8 @@ def retrieve( if not api_key_uuid: raise ValueError(f"Expected a non-empty value for `api_key_uuid` but received {api_key_uuid!r}") return self._get( - f"/v2/gen-ai/openai/keys/{api_key_uuid}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/openai/keys/{api_key_uuid}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/gen-ai/openai/keys/{api_key_uuid}", api_key_uuid=api_key_uuid), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -172,9 +171,8 @@ def update( if not path_api_key_uuid: raise ValueError(f"Expected a non-empty value for `path_api_key_uuid` but received {path_api_key_uuid!r}") return self._put( - f"/v2/gen-ai/openai/keys/{path_api_key_uuid}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/openai/keys/{path_api_key_uuid}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/gen-ai/openai/keys/{path_api_key_uuid}", path_api_key_uuid=path_api_key_uuid), body=maybe_transform( { "api_key": api_key, @@ -264,9 +262,8 @@ def delete( if not api_key_uuid: raise ValueError(f"Expected a non-empty value for `api_key_uuid` but received {api_key_uuid!r}") return self._delete( - f"/v2/gen-ai/openai/keys/{api_key_uuid}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/openai/keys/{api_key_uuid}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/gen-ai/openai/keys/{api_key_uuid}", api_key_uuid=api_key_uuid), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -305,9 +302,8 @@ def list_agents( if not uuid: raise ValueError(f"Expected a non-empty value for `uuid` but received {uuid!r}") return self._get( - f"/v2/gen-ai/openai/keys/{uuid}/agents" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/openai/keys/{uuid}/agents", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/gen-ai/openai/keys/{uuid}/agents", uuid=uuid), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -421,9 +417,8 @@ async def retrieve( if not api_key_uuid: raise ValueError(f"Expected a non-empty value for `api_key_uuid` but received {api_key_uuid!r}") return await self._get( - f"/v2/gen-ai/openai/keys/{api_key_uuid}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/openai/keys/{api_key_uuid}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/gen-ai/openai/keys/{api_key_uuid}", api_key_uuid=api_key_uuid), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -466,9 +461,8 @@ async def update( if not path_api_key_uuid: raise ValueError(f"Expected a non-empty value for `path_api_key_uuid` but received {path_api_key_uuid!r}") return await self._put( - f"/v2/gen-ai/openai/keys/{path_api_key_uuid}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/openai/keys/{path_api_key_uuid}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/gen-ai/openai/keys/{path_api_key_uuid}", path_api_key_uuid=path_api_key_uuid), body=await async_maybe_transform( { "api_key": api_key, @@ -558,9 +552,8 @@ async def delete( if not api_key_uuid: raise ValueError(f"Expected a non-empty value for `api_key_uuid` but received {api_key_uuid!r}") return await self._delete( - f"/v2/gen-ai/openai/keys/{api_key_uuid}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/openai/keys/{api_key_uuid}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/gen-ai/openai/keys/{api_key_uuid}", api_key_uuid=api_key_uuid), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -599,9 +592,8 @@ async def list_agents( if not uuid: raise ValueError(f"Expected a non-empty value for `uuid` but received {uuid!r}") return await self._get( - f"/v2/gen-ai/openai/keys/{uuid}/agents" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/openai/keys/{uuid}/agents", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/gen-ai/openai/keys/{uuid}/agents", uuid=uuid), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, diff --git a/src/gradient/resources/agents/evaluation_metrics/scheduled_indexing.py b/src/gradient/resources/agents/evaluation_metrics/scheduled_indexing.py index b3da363c..12830a71 100644 --- a/src/gradient/resources/agents/evaluation_metrics/scheduled_indexing.py +++ b/src/gradient/resources/agents/evaluation_metrics/scheduled_indexing.py @@ -7,7 +7,7 @@ import httpx from ...._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from ...._utils import maybe_transform, async_maybe_transform +from ...._utils import path_template, maybe_transform, async_maybe_transform from ...._compat import cached_property from ...._resource import SyncAPIResource, AsyncAPIResource from ...._response import ( @@ -129,9 +129,11 @@ def retrieve( f"Expected a non-empty value for `knowledge_base_uuid` but received {knowledge_base_uuid!r}" ) return self._get( - f"/v2/gen-ai/scheduled-indexing/knowledge-base/{knowledge_base_uuid}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/scheduled-indexing/knowledge-base/{knowledge_base_uuid}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template( + "/v2/gen-ai/scheduled-indexing/knowledge-base/{knowledge_base_uuid}", + knowledge_base_uuid=knowledge_base_uuid, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -165,9 +167,8 @@ def delete( if not uuid: raise ValueError(f"Expected a non-empty value for `uuid` but received {uuid!r}") return self._delete( - f"/v2/gen-ai/scheduled-indexing/{uuid}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/scheduled-indexing/{uuid}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/gen-ai/scheduled-indexing/{uuid}", uuid=uuid), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -279,9 +280,11 @@ async def retrieve( f"Expected a non-empty value for `knowledge_base_uuid` but received {knowledge_base_uuid!r}" ) return await self._get( - f"/v2/gen-ai/scheduled-indexing/knowledge-base/{knowledge_base_uuid}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/scheduled-indexing/knowledge-base/{knowledge_base_uuid}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template( + "/v2/gen-ai/scheduled-indexing/knowledge-base/{knowledge_base_uuid}", + knowledge_base_uuid=knowledge_base_uuid, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -315,9 +318,8 @@ async def delete( if not uuid: raise ValueError(f"Expected a non-empty value for `uuid` but received {uuid!r}") return await self._delete( - f"/v2/gen-ai/scheduled-indexing/{uuid}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/scheduled-indexing/{uuid}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/gen-ai/scheduled-indexing/{uuid}", uuid=uuid), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gradient/resources/agents/evaluation_metrics/workspaces/agents.py b/src/gradient/resources/agents/evaluation_metrics/workspaces/agents.py index 41f3f993..0ee78394 100644 --- a/src/gradient/resources/agents/evaluation_metrics/workspaces/agents.py +++ b/src/gradient/resources/agents/evaluation_metrics/workspaces/agents.py @@ -5,7 +5,7 @@ import httpx from ....._types import Body, Omit, Query, Headers, NotGiven, SequenceNotStr, omit, not_given -from ....._utils import maybe_transform, async_maybe_transform +from ....._utils import path_template, maybe_transform, async_maybe_transform from ....._compat import cached_property from ....._resource import SyncAPIResource, AsyncAPIResource from ....._response import ( @@ -82,9 +82,8 @@ def list( if not workspace_uuid: raise ValueError(f"Expected a non-empty value for `workspace_uuid` but received {workspace_uuid!r}") return self._get( - f"/v2/gen-ai/workspaces/{workspace_uuid}/agents" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/workspaces/{workspace_uuid}/agents", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/gen-ai/workspaces/{workspace_uuid}/agents", workspace_uuid=workspace_uuid), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -137,9 +136,10 @@ def move( f"Expected a non-empty value for `path_workspace_uuid` but received {path_workspace_uuid!r}" ) return self._put( - f"/v2/gen-ai/workspaces/{path_workspace_uuid}/agents" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/workspaces/{path_workspace_uuid}/agents", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template( + "/v2/gen-ai/workspaces/{path_workspace_uuid}/agents", path_workspace_uuid=path_workspace_uuid + ), body=maybe_transform( { "agent_uuids": agent_uuids, @@ -214,9 +214,8 @@ async def list( if not workspace_uuid: raise ValueError(f"Expected a non-empty value for `workspace_uuid` but received {workspace_uuid!r}") return await self._get( - f"/v2/gen-ai/workspaces/{workspace_uuid}/agents" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/workspaces/{workspace_uuid}/agents", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/gen-ai/workspaces/{workspace_uuid}/agents", workspace_uuid=workspace_uuid), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -269,9 +268,10 @@ async def move( f"Expected a non-empty value for `path_workspace_uuid` but received {path_workspace_uuid!r}" ) return await self._put( - f"/v2/gen-ai/workspaces/{path_workspace_uuid}/agents" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/workspaces/{path_workspace_uuid}/agents", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template( + "/v2/gen-ai/workspaces/{path_workspace_uuid}/agents", path_workspace_uuid=path_workspace_uuid + ), body=await async_maybe_transform( { "agent_uuids": agent_uuids, diff --git a/src/gradient/resources/agents/evaluation_metrics/workspaces/workspaces.py b/src/gradient/resources/agents/evaluation_metrics/workspaces/workspaces.py index 7c2be668..6cee67b4 100644 --- a/src/gradient/resources/agents/evaluation_metrics/workspaces/workspaces.py +++ b/src/gradient/resources/agents/evaluation_metrics/workspaces/workspaces.py @@ -13,7 +13,7 @@ AsyncAgentsResourceWithStreamingResponse, ) from ....._types import Body, Omit, Query, Headers, NotGiven, SequenceNotStr, omit, not_given -from ....._utils import maybe_transform, async_maybe_transform +from ....._utils import path_template, maybe_transform, async_maybe_transform from ....._compat import cached_property from ....._resource import SyncAPIResource, AsyncAPIResource from ....._response import ( @@ -146,9 +146,8 @@ def retrieve( if not workspace_uuid: raise ValueError(f"Expected a non-empty value for `workspace_uuid` but received {workspace_uuid!r}") return self._get( - f"/v2/gen-ai/workspaces/{workspace_uuid}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/workspaces/{workspace_uuid}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/gen-ai/workspaces/{workspace_uuid}", workspace_uuid=workspace_uuid), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -194,9 +193,8 @@ def update( f"Expected a non-empty value for `path_workspace_uuid` but received {path_workspace_uuid!r}" ) return self._put( - f"/v2/gen-ai/workspaces/{path_workspace_uuid}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/workspaces/{path_workspace_uuid}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/gen-ai/workspaces/{path_workspace_uuid}", path_workspace_uuid=path_workspace_uuid), body=maybe_transform( { "description": description, @@ -259,9 +257,8 @@ def delete( if not workspace_uuid: raise ValueError(f"Expected a non-empty value for `workspace_uuid` but received {workspace_uuid!r}") return self._delete( - f"/v2/gen-ai/workspaces/{workspace_uuid}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/workspaces/{workspace_uuid}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/gen-ai/workspaces/{workspace_uuid}", workspace_uuid=workspace_uuid), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -295,9 +292,10 @@ def list_evaluation_test_cases( if not workspace_uuid: raise ValueError(f"Expected a non-empty value for `workspace_uuid` but received {workspace_uuid!r}") return self._get( - f"/v2/gen-ai/workspaces/{workspace_uuid}/evaluation_test_cases" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/workspaces/{workspace_uuid}/evaluation_test_cases", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template( + "/v2/gen-ai/workspaces/{workspace_uuid}/evaluation_test_cases", workspace_uuid=workspace_uuid + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -415,9 +413,8 @@ async def retrieve( if not workspace_uuid: raise ValueError(f"Expected a non-empty value for `workspace_uuid` but received {workspace_uuid!r}") return await self._get( - f"/v2/gen-ai/workspaces/{workspace_uuid}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/workspaces/{workspace_uuid}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/gen-ai/workspaces/{workspace_uuid}", workspace_uuid=workspace_uuid), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -463,9 +460,8 @@ async def update( f"Expected a non-empty value for `path_workspace_uuid` but received {path_workspace_uuid!r}" ) return await self._put( - f"/v2/gen-ai/workspaces/{path_workspace_uuid}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/workspaces/{path_workspace_uuid}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/gen-ai/workspaces/{path_workspace_uuid}", path_workspace_uuid=path_workspace_uuid), body=await async_maybe_transform( { "description": description, @@ -528,9 +524,8 @@ async def delete( if not workspace_uuid: raise ValueError(f"Expected a non-empty value for `workspace_uuid` but received {workspace_uuid!r}") return await self._delete( - f"/v2/gen-ai/workspaces/{workspace_uuid}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/workspaces/{workspace_uuid}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/gen-ai/workspaces/{workspace_uuid}", workspace_uuid=workspace_uuid), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -564,9 +559,10 @@ async def list_evaluation_test_cases( if not workspace_uuid: raise ValueError(f"Expected a non-empty value for `workspace_uuid` but received {workspace_uuid!r}") return await self._get( - f"/v2/gen-ai/workspaces/{workspace_uuid}/evaluation_test_cases" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/workspaces/{workspace_uuid}/evaluation_test_cases", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template( + "/v2/gen-ai/workspaces/{workspace_uuid}/evaluation_test_cases", workspace_uuid=workspace_uuid + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gradient/resources/agents/evaluation_runs.py b/src/gradient/resources/agents/evaluation_runs.py index 50d51156..255bb901 100644 --- a/src/gradient/resources/agents/evaluation_runs.py +++ b/src/gradient/resources/agents/evaluation_runs.py @@ -5,7 +5,7 @@ import httpx from ..._types import Body, Omit, Query, Headers, NotGiven, SequenceNotStr, omit, not_given -from ..._utils import maybe_transform, async_maybe_transform +from ..._utils import path_template, maybe_transform, async_maybe_transform from ..._compat import cached_property from ..._resource import SyncAPIResource, AsyncAPIResource from ..._response import ( @@ -131,9 +131,10 @@ def retrieve( f"Expected a non-empty value for `evaluation_run_uuid` but received {evaluation_run_uuid!r}" ) return self._get( - f"/v2/gen-ai/evaluation_runs/{evaluation_run_uuid}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/evaluation_runs/{evaluation_run_uuid}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template( + "/v2/gen-ai/evaluation_runs/{evaluation_run_uuid}", evaluation_run_uuid=evaluation_run_uuid + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -175,9 +176,10 @@ def list_results( f"Expected a non-empty value for `evaluation_run_uuid` but received {evaluation_run_uuid!r}" ) return self._get( - f"/v2/gen-ai/evaluation_runs/{evaluation_run_uuid}/results" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/evaluation_runs/{evaluation_run_uuid}/results", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template( + "/v2/gen-ai/evaluation_runs/{evaluation_run_uuid}/results", evaluation_run_uuid=evaluation_run_uuid + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -224,9 +226,12 @@ def retrieve_results( f"Expected a non-empty value for `evaluation_run_uuid` but received {evaluation_run_uuid!r}" ) return self._get( - f"/v2/gen-ai/evaluation_runs/{evaluation_run_uuid}/results/{prompt_id}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/evaluation_runs/{evaluation_run_uuid}/results/{prompt_id}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template( + "/v2/gen-ai/evaluation_runs/{evaluation_run_uuid}/results/{prompt_id}", + evaluation_run_uuid=evaluation_run_uuid, + prompt_id=prompt_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -341,9 +346,10 @@ async def retrieve( f"Expected a non-empty value for `evaluation_run_uuid` but received {evaluation_run_uuid!r}" ) return await self._get( - f"/v2/gen-ai/evaluation_runs/{evaluation_run_uuid}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/evaluation_runs/{evaluation_run_uuid}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template( + "/v2/gen-ai/evaluation_runs/{evaluation_run_uuid}", evaluation_run_uuid=evaluation_run_uuid + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -385,9 +391,10 @@ async def list_results( f"Expected a non-empty value for `evaluation_run_uuid` but received {evaluation_run_uuid!r}" ) return await self._get( - f"/v2/gen-ai/evaluation_runs/{evaluation_run_uuid}/results" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/evaluation_runs/{evaluation_run_uuid}/results", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template( + "/v2/gen-ai/evaluation_runs/{evaluation_run_uuid}/results", evaluation_run_uuid=evaluation_run_uuid + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -434,9 +441,12 @@ async def retrieve_results( f"Expected a non-empty value for `evaluation_run_uuid` but received {evaluation_run_uuid!r}" ) return await self._get( - f"/v2/gen-ai/evaluation_runs/{evaluation_run_uuid}/results/{prompt_id}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/evaluation_runs/{evaluation_run_uuid}/results/{prompt_id}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template( + "/v2/gen-ai/evaluation_runs/{evaluation_run_uuid}/results/{prompt_id}", + evaluation_run_uuid=evaluation_run_uuid, + prompt_id=prompt_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gradient/resources/agents/evaluation_test_cases.py b/src/gradient/resources/agents/evaluation_test_cases.py index cb47155d..41c89f35 100644 --- a/src/gradient/resources/agents/evaluation_test_cases.py +++ b/src/gradient/resources/agents/evaluation_test_cases.py @@ -5,7 +5,7 @@ import httpx from ..._types import Body, Omit, Query, Headers, NotGiven, SequenceNotStr, omit, not_given -from ..._utils import maybe_transform, async_maybe_transform +from ..._utils import path_template, maybe_transform, async_maybe_transform from ..._compat import cached_property from ..._resource import SyncAPIResource, AsyncAPIResource from ..._response import ( @@ -149,9 +149,8 @@ def retrieve( if not test_case_uuid: raise ValueError(f"Expected a non-empty value for `test_case_uuid` but received {test_case_uuid!r}") return self._get( - f"/v2/gen-ai/evaluation_test_cases/{test_case_uuid}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/evaluation_test_cases/{test_case_uuid}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/gen-ai/evaluation_test_cases/{test_case_uuid}", test_case_uuid=test_case_uuid), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -208,9 +207,10 @@ def update( f"Expected a non-empty value for `path_test_case_uuid` but received {path_test_case_uuid!r}" ) return self._put( - f"/v2/gen-ai/evaluation_test_cases/{path_test_case_uuid}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/evaluation_test_cases/{path_test_case_uuid}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template( + "/v2/gen-ai/evaluation_test_cases/{path_test_case_uuid}", path_test_case_uuid=path_test_case_uuid + ), body=maybe_transform( { "dataset_uuid": dataset_uuid, @@ -284,9 +284,11 @@ def list_evaluation_runs( f"Expected a non-empty value for `evaluation_test_case_uuid` but received {evaluation_test_case_uuid!r}" ) return self._get( - f"/v2/gen-ai/evaluation_test_cases/{evaluation_test_case_uuid}/evaluation_runs" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/evaluation_test_cases/{evaluation_test_case_uuid}/evaluation_runs", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template( + "/v2/gen-ai/evaluation_test_cases/{evaluation_test_case_uuid}/evaluation_runs", + evaluation_test_case_uuid=evaluation_test_case_uuid, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -417,9 +419,8 @@ async def retrieve( if not test_case_uuid: raise ValueError(f"Expected a non-empty value for `test_case_uuid` but received {test_case_uuid!r}") return await self._get( - f"/v2/gen-ai/evaluation_test_cases/{test_case_uuid}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/evaluation_test_cases/{test_case_uuid}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/gen-ai/evaluation_test_cases/{test_case_uuid}", test_case_uuid=test_case_uuid), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -476,9 +477,10 @@ async def update( f"Expected a non-empty value for `path_test_case_uuid` but received {path_test_case_uuid!r}" ) return await self._put( - f"/v2/gen-ai/evaluation_test_cases/{path_test_case_uuid}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/evaluation_test_cases/{path_test_case_uuid}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template( + "/v2/gen-ai/evaluation_test_cases/{path_test_case_uuid}", path_test_case_uuid=path_test_case_uuid + ), body=await async_maybe_transform( { "dataset_uuid": dataset_uuid, @@ -552,9 +554,11 @@ async def list_evaluation_runs( f"Expected a non-empty value for `evaluation_test_case_uuid` but received {evaluation_test_case_uuid!r}" ) return await self._get( - f"/v2/gen-ai/evaluation_test_cases/{evaluation_test_case_uuid}/evaluation_runs" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/evaluation_test_cases/{evaluation_test_case_uuid}/evaluation_runs", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template( + "/v2/gen-ai/evaluation_test_cases/{evaluation_test_case_uuid}/evaluation_runs", + evaluation_test_case_uuid=evaluation_test_case_uuid, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, diff --git a/src/gradient/resources/agents/functions.py b/src/gradient/resources/agents/functions.py index fc58d899..7ec7cc3b 100644 --- a/src/gradient/resources/agents/functions.py +++ b/src/gradient/resources/agents/functions.py @@ -5,7 +5,7 @@ import httpx from ..._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from ..._utils import maybe_transform, async_maybe_transform +from ..._utils import path_template, maybe_transform, async_maybe_transform from ..._compat import cached_property from ..._resource import SyncAPIResource, AsyncAPIResource from ..._response import ( @@ -95,9 +95,8 @@ def create( if not path_agent_uuid: raise ValueError(f"Expected a non-empty value for `path_agent_uuid` but received {path_agent_uuid!r}") return self._post( - f"/v2/gen-ai/agents/{path_agent_uuid}/functions" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/agents/{path_agent_uuid}/functions", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/gen-ai/agents/{path_agent_uuid}/functions", path_agent_uuid=path_agent_uuid), body=maybe_transform( { "body_agent_uuid": body_agent_uuid, @@ -170,9 +169,12 @@ def update( if not path_function_uuid: raise ValueError(f"Expected a non-empty value for `path_function_uuid` but received {path_function_uuid!r}") return self._put( - f"/v2/gen-ai/agents/{path_agent_uuid}/functions/{path_function_uuid}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/agents/{path_agent_uuid}/functions/{path_function_uuid}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template( + "/v2/gen-ai/agents/{path_agent_uuid}/functions/{path_function_uuid}", + path_agent_uuid=path_agent_uuid, + path_function_uuid=path_function_uuid, + ), body=maybe_transform( { "body_agent_uuid": body_agent_uuid, @@ -222,9 +224,12 @@ def delete( if not function_uuid: raise ValueError(f"Expected a non-empty value for `function_uuid` but received {function_uuid!r}") return self._delete( - f"/v2/gen-ai/agents/{agent_uuid}/functions/{function_uuid}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/agents/{agent_uuid}/functions/{function_uuid}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template( + "/v2/gen-ai/agents/{agent_uuid}/functions/{function_uuid}", + agent_uuid=agent_uuid, + function_uuid=function_uuid, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -304,9 +309,8 @@ async def create( if not path_agent_uuid: raise ValueError(f"Expected a non-empty value for `path_agent_uuid` but received {path_agent_uuid!r}") return await self._post( - f"/v2/gen-ai/agents/{path_agent_uuid}/functions" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/agents/{path_agent_uuid}/functions", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/gen-ai/agents/{path_agent_uuid}/functions", path_agent_uuid=path_agent_uuid), body=await async_maybe_transform( { "body_agent_uuid": body_agent_uuid, @@ -379,9 +383,12 @@ async def update( if not path_function_uuid: raise ValueError(f"Expected a non-empty value for `path_function_uuid` but received {path_function_uuid!r}") return await self._put( - f"/v2/gen-ai/agents/{path_agent_uuid}/functions/{path_function_uuid}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/agents/{path_agent_uuid}/functions/{path_function_uuid}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template( + "/v2/gen-ai/agents/{path_agent_uuid}/functions/{path_function_uuid}", + path_agent_uuid=path_agent_uuid, + path_function_uuid=path_function_uuid, + ), body=await async_maybe_transform( { "body_agent_uuid": body_agent_uuid, @@ -431,9 +438,12 @@ async def delete( if not function_uuid: raise ValueError(f"Expected a non-empty value for `function_uuid` but received {function_uuid!r}") return await self._delete( - f"/v2/gen-ai/agents/{agent_uuid}/functions/{function_uuid}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/agents/{agent_uuid}/functions/{function_uuid}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template( + "/v2/gen-ai/agents/{agent_uuid}/functions/{function_uuid}", + agent_uuid=agent_uuid, + function_uuid=function_uuid, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gradient/resources/agents/knowledge_bases.py b/src/gradient/resources/agents/knowledge_bases.py index 57268294..a71175cf 100644 --- a/src/gradient/resources/agents/knowledge_bases.py +++ b/src/gradient/resources/agents/knowledge_bases.py @@ -5,6 +5,7 @@ import httpx from ..._types import Body, Query, Headers, NotGiven, not_given +from ..._utils import path_template from ..._compat import cached_property from ..._resource import SyncAPIResource, AsyncAPIResource from ..._response import ( @@ -71,9 +72,8 @@ def attach( if not agent_uuid: raise ValueError(f"Expected a non-empty value for `agent_uuid` but received {agent_uuid!r}") return self._post( - f"/v2/gen-ai/agents/{agent_uuid}/knowledge_bases" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/agents/{agent_uuid}/knowledge_bases", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/gen-ai/agents/{agent_uuid}/knowledge_bases", agent_uuid=agent_uuid), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -112,9 +112,12 @@ def attach_single( f"Expected a non-empty value for `knowledge_base_uuid` but received {knowledge_base_uuid!r}" ) return self._post( - f"/v2/gen-ai/agents/{agent_uuid}/knowledge_bases/{knowledge_base_uuid}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/agents/{agent_uuid}/knowledge_bases/{knowledge_base_uuid}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template( + "/v2/gen-ai/agents/{agent_uuid}/knowledge_bases/{knowledge_base_uuid}", + agent_uuid=agent_uuid, + knowledge_base_uuid=knowledge_base_uuid, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -153,9 +156,12 @@ def detach( f"Expected a non-empty value for `knowledge_base_uuid` but received {knowledge_base_uuid!r}" ) return self._delete( - f"/v2/gen-ai/agents/{agent_uuid}/knowledge_bases/{knowledge_base_uuid}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/agents/{agent_uuid}/knowledge_bases/{knowledge_base_uuid}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template( + "/v2/gen-ai/agents/{agent_uuid}/knowledge_bases/{knowledge_base_uuid}", + agent_uuid=agent_uuid, + knowledge_base_uuid=knowledge_base_uuid, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -214,9 +220,8 @@ async def attach( if not agent_uuid: raise ValueError(f"Expected a non-empty value for `agent_uuid` but received {agent_uuid!r}") return await self._post( - f"/v2/gen-ai/agents/{agent_uuid}/knowledge_bases" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/agents/{agent_uuid}/knowledge_bases", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/gen-ai/agents/{agent_uuid}/knowledge_bases", agent_uuid=agent_uuid), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -255,9 +260,12 @@ async def attach_single( f"Expected a non-empty value for `knowledge_base_uuid` but received {knowledge_base_uuid!r}" ) return await self._post( - f"/v2/gen-ai/agents/{agent_uuid}/knowledge_bases/{knowledge_base_uuid}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/agents/{agent_uuid}/knowledge_bases/{knowledge_base_uuid}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template( + "/v2/gen-ai/agents/{agent_uuid}/knowledge_bases/{knowledge_base_uuid}", + agent_uuid=agent_uuid, + knowledge_base_uuid=knowledge_base_uuid, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -296,9 +304,12 @@ async def detach( f"Expected a non-empty value for `knowledge_base_uuid` but received {knowledge_base_uuid!r}" ) return await self._delete( - f"/v2/gen-ai/agents/{agent_uuid}/knowledge_bases/{knowledge_base_uuid}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/agents/{agent_uuid}/knowledge_bases/{knowledge_base_uuid}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template( + "/v2/gen-ai/agents/{agent_uuid}/knowledge_bases/{knowledge_base_uuid}", + agent_uuid=agent_uuid, + knowledge_base_uuid=knowledge_base_uuid, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gradient/resources/agents/routes.py b/src/gradient/resources/agents/routes.py index 3f80e8e8..f2f3fc81 100644 --- a/src/gradient/resources/agents/routes.py +++ b/src/gradient/resources/agents/routes.py @@ -5,7 +5,7 @@ import httpx from ..._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from ..._utils import maybe_transform, async_maybe_transform +from ..._utils import path_template, maybe_transform, async_maybe_transform from ..._compat import cached_property from ..._resource import SyncAPIResource, AsyncAPIResource from ..._response import ( @@ -97,9 +97,12 @@ def update( f"Expected a non-empty value for `path_child_agent_uuid` but received {path_child_agent_uuid!r}" ) return self._put( - f"/v2/gen-ai/agents/{path_parent_agent_uuid}/child_agents/{path_child_agent_uuid}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/agents/{path_parent_agent_uuid}/child_agents/{path_child_agent_uuid}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template( + "/v2/gen-ai/agents/{path_parent_agent_uuid}/child_agents/{path_child_agent_uuid}", + path_parent_agent_uuid=path_parent_agent_uuid, + path_child_agent_uuid=path_child_agent_uuid, + ), body=maybe_transform( { "body_child_agent_uuid": body_child_agent_uuid, @@ -146,9 +149,12 @@ def delete( if not child_agent_uuid: raise ValueError(f"Expected a non-empty value for `child_agent_uuid` but received {child_agent_uuid!r}") return self._delete( - f"/v2/gen-ai/agents/{parent_agent_uuid}/child_agents/{child_agent_uuid}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/agents/{parent_agent_uuid}/child_agents/{child_agent_uuid}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template( + "/v2/gen-ai/agents/{parent_agent_uuid}/child_agents/{child_agent_uuid}", + parent_agent_uuid=parent_agent_uuid, + child_agent_uuid=child_agent_uuid, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -199,9 +205,12 @@ def add( f"Expected a non-empty value for `path_child_agent_uuid` but received {path_child_agent_uuid!r}" ) return self._post( - f"/v2/gen-ai/agents/{path_parent_agent_uuid}/child_agents/{path_child_agent_uuid}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/agents/{path_parent_agent_uuid}/child_agents/{path_child_agent_uuid}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template( + "/v2/gen-ai/agents/{path_parent_agent_uuid}/child_agents/{path_child_agent_uuid}", + path_parent_agent_uuid=path_parent_agent_uuid, + path_child_agent_uuid=path_child_agent_uuid, + ), body=maybe_transform( { "body_child_agent_uuid": body_child_agent_uuid, @@ -244,9 +253,8 @@ def view( if not uuid: raise ValueError(f"Expected a non-empty value for `uuid` but received {uuid!r}") return self._get( - f"/v2/gen-ai/agents/{uuid}/child_agents" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/agents/{uuid}/child_agents", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/gen-ai/agents/{uuid}/child_agents", uuid=uuid), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -327,9 +335,12 @@ async def update( f"Expected a non-empty value for `path_child_agent_uuid` but received {path_child_agent_uuid!r}" ) return await self._put( - f"/v2/gen-ai/agents/{path_parent_agent_uuid}/child_agents/{path_child_agent_uuid}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/agents/{path_parent_agent_uuid}/child_agents/{path_child_agent_uuid}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template( + "/v2/gen-ai/agents/{path_parent_agent_uuid}/child_agents/{path_child_agent_uuid}", + path_parent_agent_uuid=path_parent_agent_uuid, + path_child_agent_uuid=path_child_agent_uuid, + ), body=await async_maybe_transform( { "body_child_agent_uuid": body_child_agent_uuid, @@ -376,9 +387,12 @@ async def delete( if not child_agent_uuid: raise ValueError(f"Expected a non-empty value for `child_agent_uuid` but received {child_agent_uuid!r}") return await self._delete( - f"/v2/gen-ai/agents/{parent_agent_uuid}/child_agents/{child_agent_uuid}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/agents/{parent_agent_uuid}/child_agents/{child_agent_uuid}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template( + "/v2/gen-ai/agents/{parent_agent_uuid}/child_agents/{child_agent_uuid}", + parent_agent_uuid=parent_agent_uuid, + child_agent_uuid=child_agent_uuid, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -429,9 +443,12 @@ async def add( f"Expected a non-empty value for `path_child_agent_uuid` but received {path_child_agent_uuid!r}" ) return await self._post( - f"/v2/gen-ai/agents/{path_parent_agent_uuid}/child_agents/{path_child_agent_uuid}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/agents/{path_parent_agent_uuid}/child_agents/{path_child_agent_uuid}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template( + "/v2/gen-ai/agents/{path_parent_agent_uuid}/child_agents/{path_child_agent_uuid}", + path_parent_agent_uuid=path_parent_agent_uuid, + path_child_agent_uuid=path_child_agent_uuid, + ), body=await async_maybe_transform( { "body_child_agent_uuid": body_child_agent_uuid, @@ -474,9 +491,8 @@ async def view( if not uuid: raise ValueError(f"Expected a non-empty value for `uuid` but received {uuid!r}") return await self._get( - f"/v2/gen-ai/agents/{uuid}/child_agents" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/agents/{uuid}/child_agents", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/gen-ai/agents/{uuid}/child_agents", uuid=uuid), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gradient/resources/agents/versions.py b/src/gradient/resources/agents/versions.py index 90b55087..4aedeea1 100644 --- a/src/gradient/resources/agents/versions.py +++ b/src/gradient/resources/agents/versions.py @@ -5,7 +5,7 @@ import httpx from ..._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from ..._utils import maybe_transform, async_maybe_transform +from ..._utils import path_template, maybe_transform, async_maybe_transform from ..._compat import cached_property from ..._resource import SyncAPIResource, AsyncAPIResource from ..._response import ( @@ -79,9 +79,8 @@ def update( if not path_uuid: raise ValueError(f"Expected a non-empty value for `path_uuid` but received {path_uuid!r}") return self._put( - f"/v2/gen-ai/agents/{path_uuid}/versions" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/agents/{path_uuid}/versions", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/gen-ai/agents/{path_uuid}/versions", path_uuid=path_uuid), body=maybe_transform( { "body_uuid": body_uuid, @@ -128,9 +127,8 @@ def list( if not uuid: raise ValueError(f"Expected a non-empty value for `uuid` but received {uuid!r}") return self._get( - f"/v2/gen-ai/agents/{uuid}/versions" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/agents/{uuid}/versions", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/gen-ai/agents/{uuid}/versions", uuid=uuid), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -205,9 +203,8 @@ async def update( if not path_uuid: raise ValueError(f"Expected a non-empty value for `path_uuid` but received {path_uuid!r}") return await self._put( - f"/v2/gen-ai/agents/{path_uuid}/versions" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/agents/{path_uuid}/versions", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/gen-ai/agents/{path_uuid}/versions", path_uuid=path_uuid), body=await async_maybe_transform( { "body_uuid": body_uuid, @@ -254,9 +251,8 @@ async def list( if not uuid: raise ValueError(f"Expected a non-empty value for `uuid` but received {uuid!r}") return await self._get( - f"/v2/gen-ai/agents/{uuid}/versions" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/agents/{uuid}/versions", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/gen-ai/agents/{uuid}/versions", uuid=uuid), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, diff --git a/src/gradient/resources/apps/job_invocations.py b/src/gradient/resources/apps/job_invocations.py index 02bc5a95..feda970a 100644 --- a/src/gradient/resources/apps/job_invocations.py +++ b/src/gradient/resources/apps/job_invocations.py @@ -5,7 +5,7 @@ import httpx from ..._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from ..._utils import maybe_transform, async_maybe_transform +from ..._utils import path_template, maybe_transform, async_maybe_transform from ..._compat import cached_property from ..._resource import SyncAPIResource, AsyncAPIResource from ..._response import ( @@ -86,9 +86,12 @@ def cancel( if not job_invocation_id: raise ValueError(f"Expected a non-empty value for `job_invocation_id` but received {job_invocation_id!r}") return self._post( - f"/v2/apps/{app_id}/job-invocations/{job_invocation_id}/cancel" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/apps/{app_id}/job-invocations/{job_invocation_id}/cancel", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template( + "/v2/apps/{app_id}/job-invocations/{job_invocation_id}/cancel", + app_id=app_id, + job_invocation_id=job_invocation_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -165,9 +168,12 @@ async def cancel( if not job_invocation_id: raise ValueError(f"Expected a non-empty value for `job_invocation_id` but received {job_invocation_id!r}") return await self._post( - f"/v2/apps/{app_id}/job-invocations/{job_invocation_id}/cancel" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/apps/{app_id}/job-invocations/{job_invocation_id}/cancel", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template( + "/v2/apps/{app_id}/job-invocations/{job_invocation_id}/cancel", + app_id=app_id, + job_invocation_id=job_invocation_id, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, diff --git a/src/gradient/resources/billing.py b/src/gradient/resources/billing.py index 8261cfa9..8aaf8b21 100644 --- a/src/gradient/resources/billing.py +++ b/src/gradient/resources/billing.py @@ -9,7 +9,7 @@ from ..types import billing_list_insights_params from .._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from .._utils import maybe_transform, async_maybe_transform +from .._utils import path_template, maybe_transform, async_maybe_transform from .._compat import cached_property from .._resource import SyncAPIResource, AsyncAPIResource from .._response import ( @@ -116,9 +116,13 @@ def list_insights( if not end_date: raise ValueError(f"Expected a non-empty value for `end_date` but received {end_date!r}") return self._get( - f"/v2/billing/{account_urn}/insights/{start_date}/{end_date}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/billing/{account_urn}/insights/{start_date}/{end_date}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template( + "/v2/billing/{account_urn}/insights/{start_date}/{end_date}", + account_urn=account_urn, + start_date=start_date, + end_date=end_date, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -228,9 +232,13 @@ async def list_insights( if not end_date: raise ValueError(f"Expected a non-empty value for `end_date` but received {end_date!r}") return await self._get( - f"/v2/billing/{account_urn}/insights/{start_date}/{end_date}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/billing/{account_urn}/insights/{start_date}/{end_date}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template( + "/v2/billing/{account_urn}/insights/{start_date}/{end_date}", + account_urn=account_urn, + start_date=start_date, + end_date=end_date, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, diff --git a/src/gradient/resources/databases/schema_registry/config.py b/src/gradient/resources/databases/schema_registry/config.py index 825bd2ae..eeba3a8a 100644 --- a/src/gradient/resources/databases/schema_registry/config.py +++ b/src/gradient/resources/databases/schema_registry/config.py @@ -7,7 +7,7 @@ import httpx from ...._types import Body, Query, Headers, NotGiven, not_given -from ...._utils import maybe_transform, async_maybe_transform +from ...._utils import path_template, maybe_transform, async_maybe_transform from ...._compat import cached_property from ...._resource import SyncAPIResource, AsyncAPIResource from ...._response import ( @@ -103,9 +103,11 @@ def retrieve( f"Expected a non-empty value for `database_cluster_uuid` but received {database_cluster_uuid!r}" ) return self._get( - f"/v2/databases/{database_cluster_uuid}/schema-registry/config" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/databases/{database_cluster_uuid}/schema-registry/config", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template( + "/v2/databases/{database_cluster_uuid}/schema-registry/config", + database_cluster_uuid=database_cluster_uuid, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -148,9 +150,11 @@ def update( f"Expected a non-empty value for `database_cluster_uuid` but received {database_cluster_uuid!r}" ) return self._put( - f"/v2/databases/{database_cluster_uuid}/schema-registry/config" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/databases/{database_cluster_uuid}/schema-registry/config", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template( + "/v2/databases/{database_cluster_uuid}/schema-registry/config", + database_cluster_uuid=database_cluster_uuid, + ), body=maybe_transform({"compatibility_level": compatibility_level}, config_update_params.ConfigUpdateParams), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout @@ -193,9 +197,12 @@ def retrieve_subject( if not subject_name: raise ValueError(f"Expected a non-empty value for `subject_name` but received {subject_name!r}") return self._get( - f"/v2/databases/{database_cluster_uuid}/schema-registry/config/{subject_name}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/databases/{database_cluster_uuid}/schema-registry/config/{subject_name}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template( + "/v2/databases/{database_cluster_uuid}/schema-registry/config/{subject_name}", + database_cluster_uuid=database_cluster_uuid, + subject_name=subject_name, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -242,9 +249,12 @@ def update_subject( if not subject_name: raise ValueError(f"Expected a non-empty value for `subject_name` but received {subject_name!r}") return self._put( - f"/v2/databases/{database_cluster_uuid}/schema-registry/config/{subject_name}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/databases/{database_cluster_uuid}/schema-registry/config/{subject_name}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template( + "/v2/databases/{database_cluster_uuid}/schema-registry/config/{subject_name}", + database_cluster_uuid=database_cluster_uuid, + subject_name=subject_name, + ), body=maybe_transform( {"compatibility_level": compatibility_level}, config_update_subject_params.ConfigUpdateSubjectParams ), @@ -332,9 +342,11 @@ async def retrieve( f"Expected a non-empty value for `database_cluster_uuid` but received {database_cluster_uuid!r}" ) return await self._get( - f"/v2/databases/{database_cluster_uuid}/schema-registry/config" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/databases/{database_cluster_uuid}/schema-registry/config", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template( + "/v2/databases/{database_cluster_uuid}/schema-registry/config", + database_cluster_uuid=database_cluster_uuid, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -377,9 +389,11 @@ async def update( f"Expected a non-empty value for `database_cluster_uuid` but received {database_cluster_uuid!r}" ) return await self._put( - f"/v2/databases/{database_cluster_uuid}/schema-registry/config" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/databases/{database_cluster_uuid}/schema-registry/config", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template( + "/v2/databases/{database_cluster_uuid}/schema-registry/config", + database_cluster_uuid=database_cluster_uuid, + ), body=await async_maybe_transform( {"compatibility_level": compatibility_level}, config_update_params.ConfigUpdateParams ), @@ -424,9 +438,12 @@ async def retrieve_subject( if not subject_name: raise ValueError(f"Expected a non-empty value for `subject_name` but received {subject_name!r}") return await self._get( - f"/v2/databases/{database_cluster_uuid}/schema-registry/config/{subject_name}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/databases/{database_cluster_uuid}/schema-registry/config/{subject_name}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template( + "/v2/databases/{database_cluster_uuid}/schema-registry/config/{subject_name}", + database_cluster_uuid=database_cluster_uuid, + subject_name=subject_name, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -473,9 +490,12 @@ async def update_subject( if not subject_name: raise ValueError(f"Expected a non-empty value for `subject_name` but received {subject_name!r}") return await self._put( - f"/v2/databases/{database_cluster_uuid}/schema-registry/config/{subject_name}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/databases/{database_cluster_uuid}/schema-registry/config/{subject_name}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template( + "/v2/databases/{database_cluster_uuid}/schema-registry/config/{subject_name}", + database_cluster_uuid=database_cluster_uuid, + subject_name=subject_name, + ), body=await async_maybe_transform( {"compatibility_level": compatibility_level}, config_update_subject_params.ConfigUpdateSubjectParams ), diff --git a/src/gradient/resources/gpu_droplets/account/keys.py b/src/gradient/resources/gpu_droplets/account/keys.py index 22aa6f0d..87a8e34d 100644 --- a/src/gradient/resources/gpu_droplets/account/keys.py +++ b/src/gradient/resources/gpu_droplets/account/keys.py @@ -7,7 +7,7 @@ import httpx from ...._types import Body, Omit, Query, Headers, NoneType, NotGiven, omit, not_given -from ...._utils import maybe_transform, async_maybe_transform +from ...._utils import path_template, maybe_transform, async_maybe_transform from ...._compat import cached_property from ...._resource import SyncAPIResource, AsyncAPIResource from ...._response import ( @@ -125,9 +125,8 @@ def retrieve( timeout: Override the client-level default timeout for this request, in seconds """ return self._get( - f"/v2/account/keys/{ssh_key_identifier}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/account/keys/{ssh_key_identifier}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/account/keys/{ssh_key_identifier}", ssh_key_identifier=ssh_key_identifier), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -167,9 +166,8 @@ def update( timeout: Override the client-level default timeout for this request, in seconds """ return self._put( - f"/v2/account/keys/{ssh_key_identifier}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/account/keys/{ssh_key_identifier}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/account/keys/{ssh_key_identifier}", ssh_key_identifier=ssh_key_identifier), body=maybe_transform({"name": name}, key_update_params.KeyUpdateParams), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout @@ -257,9 +255,8 @@ def delete( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._delete( - f"/v2/account/keys/{ssh_key_identifier}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/account/keys/{ssh_key_identifier}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/account/keys/{ssh_key_identifier}", ssh_key_identifier=ssh_key_identifier), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -366,9 +363,8 @@ async def retrieve( timeout: Override the client-level default timeout for this request, in seconds """ return await self._get( - f"/v2/account/keys/{ssh_key_identifier}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/account/keys/{ssh_key_identifier}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/account/keys/{ssh_key_identifier}", ssh_key_identifier=ssh_key_identifier), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -408,9 +404,8 @@ async def update( timeout: Override the client-level default timeout for this request, in seconds """ return await self._put( - f"/v2/account/keys/{ssh_key_identifier}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/account/keys/{ssh_key_identifier}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/account/keys/{ssh_key_identifier}", ssh_key_identifier=ssh_key_identifier), body=await async_maybe_transform({"name": name}, key_update_params.KeyUpdateParams), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout @@ -498,9 +493,8 @@ async def delete( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._delete( - f"/v2/account/keys/{ssh_key_identifier}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/account/keys/{ssh_key_identifier}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/account/keys/{ssh_key_identifier}", ssh_key_identifier=ssh_key_identifier), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gradient/resources/gpu_droplets/actions.py b/src/gradient/resources/gpu_droplets/actions.py index dd8e55dc..6e32b846 100644 --- a/src/gradient/resources/gpu_droplets/actions.py +++ b/src/gradient/resources/gpu_droplets/actions.py @@ -8,7 +8,7 @@ import httpx from ..._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from ..._utils import required_args, maybe_transform, async_maybe_transform +from ..._utils import path_template, required_args, maybe_transform, async_maybe_transform from ..._compat import cached_property from ..._resource import SyncAPIResource, AsyncAPIResource from ..._response import ( @@ -98,9 +98,10 @@ def retrieve( timeout: Override the client-level default timeout for this request, in seconds """ return self._get( - f"/v2/droplets/{droplet_id}/actions/{action_id}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/droplets/{droplet_id}/actions/{action_id}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template( + "/v2/droplets/{droplet_id}/actions/{action_id}", droplet_id=droplet_id, action_id=action_id + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -142,9 +143,8 @@ def list( timeout: Override the client-level default timeout for this request, in seconds """ return self._get( - f"/v2/droplets/{droplet_id}/actions" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/droplets/{droplet_id}/actions", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/droplets/{droplet_id}/actions", droplet_id=droplet_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -1000,9 +1000,8 @@ def initiate( timeout: float | httpx.Timeout | None | NotGiven = not_given, ) -> ActionInitiateResponse: return self._post( - f"/v2/droplets/{droplet_id}/actions" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/droplets/{droplet_id}/actions", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/droplets/{droplet_id}/actions", droplet_id=droplet_id), body=maybe_transform( { "type": type, @@ -1092,9 +1091,10 @@ async def retrieve( timeout: Override the client-level default timeout for this request, in seconds """ return await self._get( - f"/v2/droplets/{droplet_id}/actions/{action_id}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/droplets/{droplet_id}/actions/{action_id}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template( + "/v2/droplets/{droplet_id}/actions/{action_id}", droplet_id=droplet_id, action_id=action_id + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -1136,9 +1136,8 @@ async def list( timeout: Override the client-level default timeout for this request, in seconds """ return await self._get( - f"/v2/droplets/{droplet_id}/actions" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/droplets/{droplet_id}/actions", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/droplets/{droplet_id}/actions", droplet_id=droplet_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -1996,9 +1995,8 @@ async def initiate( timeout: float | httpx.Timeout | None | NotGiven = not_given, ) -> ActionInitiateResponse: return await self._post( - f"/v2/droplets/{droplet_id}/actions" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/droplets/{droplet_id}/actions", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/droplets/{droplet_id}/actions", droplet_id=droplet_id), body=await async_maybe_transform( { "type": type, diff --git a/src/gradient/resources/gpu_droplets/autoscale.py b/src/gradient/resources/gpu_droplets/autoscale.py index b529d9da..be92cf2a 100644 --- a/src/gradient/resources/gpu_droplets/autoscale.py +++ b/src/gradient/resources/gpu_droplets/autoscale.py @@ -5,7 +5,7 @@ import httpx from ..._types import Body, Omit, Query, Headers, NoneType, NotGiven, omit, not_given -from ..._utils import maybe_transform, async_maybe_transform +from ..._utils import path_template, maybe_transform, async_maybe_transform from ..._compat import cached_property from ..._resource import SyncAPIResource, AsyncAPIResource from ..._response import ( @@ -136,9 +136,8 @@ def retrieve( if not autoscale_pool_id: raise ValueError(f"Expected a non-empty value for `autoscale_pool_id` but received {autoscale_pool_id!r}") return self._get( - f"/v2/droplets/autoscale/{autoscale_pool_id}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/droplets/autoscale/{autoscale_pool_id}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/droplets/autoscale/{autoscale_pool_id}", autoscale_pool_id=autoscale_pool_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -181,9 +180,8 @@ def update( if not autoscale_pool_id: raise ValueError(f"Expected a non-empty value for `autoscale_pool_id` but received {autoscale_pool_id!r}") return self._put( - f"/v2/droplets/autoscale/{autoscale_pool_id}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/droplets/autoscale/{autoscale_pool_id}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/droplets/autoscale/{autoscale_pool_id}", autoscale_pool_id=autoscale_pool_id), body=maybe_transform( { "config": config, @@ -283,9 +281,8 @@ def delete( raise ValueError(f"Expected a non-empty value for `autoscale_pool_id` but received {autoscale_pool_id!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._delete( - f"/v2/droplets/autoscale/{autoscale_pool_id}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/droplets/autoscale/{autoscale_pool_id}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/droplets/autoscale/{autoscale_pool_id}", autoscale_pool_id=autoscale_pool_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -323,9 +320,10 @@ def delete_dangerous( extra_headers = {"Accept": "*/*", **(extra_headers or {})} extra_headers.update({"X-Dangerous": ("true" if x_dangerous else "false")}) return self._delete( - f"/v2/droplets/autoscale/{autoscale_pool_id}/dangerous" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/droplets/autoscale/{autoscale_pool_id}/dangerous", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template( + "/v2/droplets/autoscale/{autoscale_pool_id}/dangerous", autoscale_pool_id=autoscale_pool_id + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -368,9 +366,8 @@ def list_history( if not autoscale_pool_id: raise ValueError(f"Expected a non-empty value for `autoscale_pool_id` but received {autoscale_pool_id!r}") return self._get( - f"/v2/droplets/autoscale/{autoscale_pool_id}/history" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/droplets/autoscale/{autoscale_pool_id}/history", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/droplets/autoscale/{autoscale_pool_id}/history", autoscale_pool_id=autoscale_pool_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -424,9 +421,8 @@ def list_members( if not autoscale_pool_id: raise ValueError(f"Expected a non-empty value for `autoscale_pool_id` but received {autoscale_pool_id!r}") return self._get( - f"/v2/droplets/autoscale/{autoscale_pool_id}/members" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/droplets/autoscale/{autoscale_pool_id}/members", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/droplets/autoscale/{autoscale_pool_id}/members", autoscale_pool_id=autoscale_pool_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -547,9 +543,8 @@ async def retrieve( if not autoscale_pool_id: raise ValueError(f"Expected a non-empty value for `autoscale_pool_id` but received {autoscale_pool_id!r}") return await self._get( - f"/v2/droplets/autoscale/{autoscale_pool_id}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/droplets/autoscale/{autoscale_pool_id}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/droplets/autoscale/{autoscale_pool_id}", autoscale_pool_id=autoscale_pool_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -592,9 +587,8 @@ async def update( if not autoscale_pool_id: raise ValueError(f"Expected a non-empty value for `autoscale_pool_id` but received {autoscale_pool_id!r}") return await self._put( - f"/v2/droplets/autoscale/{autoscale_pool_id}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/droplets/autoscale/{autoscale_pool_id}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/droplets/autoscale/{autoscale_pool_id}", autoscale_pool_id=autoscale_pool_id), body=await async_maybe_transform( { "config": config, @@ -694,9 +688,8 @@ async def delete( raise ValueError(f"Expected a non-empty value for `autoscale_pool_id` but received {autoscale_pool_id!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._delete( - f"/v2/droplets/autoscale/{autoscale_pool_id}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/droplets/autoscale/{autoscale_pool_id}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/droplets/autoscale/{autoscale_pool_id}", autoscale_pool_id=autoscale_pool_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -734,9 +727,10 @@ async def delete_dangerous( extra_headers = {"Accept": "*/*", **(extra_headers or {})} extra_headers.update({"X-Dangerous": ("true" if x_dangerous else "false")}) return await self._delete( - f"/v2/droplets/autoscale/{autoscale_pool_id}/dangerous" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/droplets/autoscale/{autoscale_pool_id}/dangerous", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template( + "/v2/droplets/autoscale/{autoscale_pool_id}/dangerous", autoscale_pool_id=autoscale_pool_id + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -779,9 +773,8 @@ async def list_history( if not autoscale_pool_id: raise ValueError(f"Expected a non-empty value for `autoscale_pool_id` but received {autoscale_pool_id!r}") return await self._get( - f"/v2/droplets/autoscale/{autoscale_pool_id}/history" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/droplets/autoscale/{autoscale_pool_id}/history", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/droplets/autoscale/{autoscale_pool_id}/history", autoscale_pool_id=autoscale_pool_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -835,9 +828,8 @@ async def list_members( if not autoscale_pool_id: raise ValueError(f"Expected a non-empty value for `autoscale_pool_id` but received {autoscale_pool_id!r}") return await self._get( - f"/v2/droplets/autoscale/{autoscale_pool_id}/members" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/droplets/autoscale/{autoscale_pool_id}/members", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/droplets/autoscale/{autoscale_pool_id}/members", autoscale_pool_id=autoscale_pool_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, diff --git a/src/gradient/resources/gpu_droplets/backups.py b/src/gradient/resources/gpu_droplets/backups.py index a924c93b..79055332 100644 --- a/src/gradient/resources/gpu_droplets/backups.py +++ b/src/gradient/resources/gpu_droplets/backups.py @@ -5,7 +5,7 @@ import httpx from ..._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from ..._utils import maybe_transform, async_maybe_transform +from ..._utils import path_template, maybe_transform, async_maybe_transform from ..._compat import cached_property from ..._resource import SyncAPIResource, AsyncAPIResource from ..._response import ( @@ -90,9 +90,8 @@ def list( timeout: Override the client-level default timeout for this request, in seconds """ return self._get( - f"/v2/droplets/{droplet_id}/backups" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/droplets/{droplet_id}/backups", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/droplets/{droplet_id}/backups", droplet_id=droplet_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -207,9 +206,8 @@ def retrieve_policy( timeout: Override the client-level default timeout for this request, in seconds """ return self._get( - f"/v2/droplets/{droplet_id}/backups/policy" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/droplets/{droplet_id}/backups/policy", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/droplets/{droplet_id}/backups/policy", droplet_id=droplet_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -283,9 +281,8 @@ async def list( timeout: Override the client-level default timeout for this request, in seconds """ return await self._get( - f"/v2/droplets/{droplet_id}/backups" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/droplets/{droplet_id}/backups", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/droplets/{droplet_id}/backups", droplet_id=droplet_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -400,9 +397,8 @@ async def retrieve_policy( timeout: Override the client-level default timeout for this request, in seconds """ return await self._get( - f"/v2/droplets/{droplet_id}/backups/policy" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/droplets/{droplet_id}/backups/policy", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/droplets/{droplet_id}/backups/policy", droplet_id=droplet_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gradient/resources/gpu_droplets/destroy_with_associated_resources.py b/src/gradient/resources/gpu_droplets/destroy_with_associated_resources.py index 04c8f5b3..1d748a69 100644 --- a/src/gradient/resources/gpu_droplets/destroy_with_associated_resources.py +++ b/src/gradient/resources/gpu_droplets/destroy_with_associated_resources.py @@ -5,7 +5,7 @@ import httpx from ..._types import Body, Omit, Query, Headers, NoneType, NotGiven, SequenceNotStr, omit, not_given -from ..._utils import maybe_transform, async_maybe_transform +from ..._utils import path_template, maybe_transform, async_maybe_transform from ..._compat import cached_property from ..._resource import SyncAPIResource, AsyncAPIResource from ..._response import ( @@ -90,9 +90,8 @@ def list( timeout: Override the client-level default timeout for this request, in seconds """ return self._get( - f"/v2/droplets/{droplet_id}/destroy_with_associated_resources" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/droplets/{droplet_id}/destroy_with_associated_resources", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/droplets/{droplet_id}/destroy_with_associated_resources", droplet_id=droplet_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -125,9 +124,10 @@ def check_status( timeout: Override the client-level default timeout for this request, in seconds """ return self._get( - f"/v2/droplets/{droplet_id}/destroy_with_associated_resources/status" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/droplets/{droplet_id}/destroy_with_associated_resources/status", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template( + "/v2/droplets/{droplet_id}/destroy_with_associated_resources/status", droplet_id=droplet_id + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -170,9 +170,10 @@ def delete_dangerous( extra_headers = {"Accept": "*/*", **(extra_headers or {})} extra_headers.update({"X-Dangerous": ("true" if x_dangerous else "false")}) return self._delete( - f"/v2/droplets/{droplet_id}/destroy_with_associated_resources/dangerous" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/droplets/{droplet_id}/destroy_with_associated_resources/dangerous", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template( + "/v2/droplets/{droplet_id}/destroy_with_associated_resources/dangerous", droplet_id=droplet_id + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -233,9 +234,10 @@ def delete_selective( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._delete( - f"/v2/droplets/{droplet_id}/destroy_with_associated_resources/selective" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/droplets/{droplet_id}/destroy_with_associated_resources/selective", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template( + "/v2/droplets/{droplet_id}/destroy_with_associated_resources/selective", droplet_id=droplet_id + ), body=maybe_transform( { "floating_ips": floating_ips, @@ -283,9 +285,8 @@ def retry( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._post( - f"/v2/droplets/{droplet_id}/destroy_with_associated_resources/retry" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/droplets/{droplet_id}/destroy_with_associated_resources/retry", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/droplets/{droplet_id}/destroy_with_associated_resources/retry", droplet_id=droplet_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -357,9 +358,8 @@ async def list( timeout: Override the client-level default timeout for this request, in seconds """ return await self._get( - f"/v2/droplets/{droplet_id}/destroy_with_associated_resources" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/droplets/{droplet_id}/destroy_with_associated_resources", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/droplets/{droplet_id}/destroy_with_associated_resources", droplet_id=droplet_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -392,9 +392,10 @@ async def check_status( timeout: Override the client-level default timeout for this request, in seconds """ return await self._get( - f"/v2/droplets/{droplet_id}/destroy_with_associated_resources/status" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/droplets/{droplet_id}/destroy_with_associated_resources/status", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template( + "/v2/droplets/{droplet_id}/destroy_with_associated_resources/status", droplet_id=droplet_id + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -437,9 +438,10 @@ async def delete_dangerous( extra_headers = {"Accept": "*/*", **(extra_headers or {})} extra_headers.update({"X-Dangerous": ("true" if x_dangerous else "false")}) return await self._delete( - f"/v2/droplets/{droplet_id}/destroy_with_associated_resources/dangerous" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/droplets/{droplet_id}/destroy_with_associated_resources/dangerous", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template( + "/v2/droplets/{droplet_id}/destroy_with_associated_resources/dangerous", droplet_id=droplet_id + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -500,9 +502,10 @@ async def delete_selective( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._delete( - f"/v2/droplets/{droplet_id}/destroy_with_associated_resources/selective" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/droplets/{droplet_id}/destroy_with_associated_resources/selective", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template( + "/v2/droplets/{droplet_id}/destroy_with_associated_resources/selective", droplet_id=droplet_id + ), body=await async_maybe_transform( { "floating_ips": floating_ips, @@ -550,9 +553,8 @@ async def retry( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._post( - f"/v2/droplets/{droplet_id}/destroy_with_associated_resources/retry" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/droplets/{droplet_id}/destroy_with_associated_resources/retry", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/droplets/{droplet_id}/destroy_with_associated_resources/retry", droplet_id=droplet_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gradient/resources/gpu_droplets/firewalls/droplets.py b/src/gradient/resources/gpu_droplets/firewalls/droplets.py index b77bf1dc..6ed202a7 100644 --- a/src/gradient/resources/gpu_droplets/firewalls/droplets.py +++ b/src/gradient/resources/gpu_droplets/firewalls/droplets.py @@ -7,7 +7,7 @@ import httpx from ...._types import Body, Query, Headers, NoneType, NotGiven, not_given -from ...._utils import maybe_transform, async_maybe_transform +from ...._utils import path_template, maybe_transform, async_maybe_transform from ...._compat import cached_property from ...._resource import SyncAPIResource, AsyncAPIResource from ...._response import ( @@ -86,9 +86,8 @@ def add( raise ValueError(f"Expected a non-empty value for `firewall_id` but received {firewall_id!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._post( - f"/v2/firewalls/{firewall_id}/droplets" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/firewalls/{firewall_id}/droplets", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/firewalls/{firewall_id}/droplets", firewall_id=firewall_id), body=maybe_transform({"droplet_ids": droplet_ids}, droplet_add_params.DropletAddParams), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout @@ -132,9 +131,8 @@ def remove( raise ValueError(f"Expected a non-empty value for `firewall_id` but received {firewall_id!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._delete( - f"/v2/firewalls/{firewall_id}/droplets" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/firewalls/{firewall_id}/droplets", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/firewalls/{firewall_id}/droplets", firewall_id=firewall_id), body=maybe_transform({"droplet_ids": droplet_ids}, droplet_remove_params.DropletRemoveParams), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout @@ -207,9 +205,8 @@ async def add( raise ValueError(f"Expected a non-empty value for `firewall_id` but received {firewall_id!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._post( - f"/v2/firewalls/{firewall_id}/droplets" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/firewalls/{firewall_id}/droplets", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/firewalls/{firewall_id}/droplets", firewall_id=firewall_id), body=await async_maybe_transform({"droplet_ids": droplet_ids}, droplet_add_params.DropletAddParams), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout @@ -253,9 +250,8 @@ async def remove( raise ValueError(f"Expected a non-empty value for `firewall_id` but received {firewall_id!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._delete( - f"/v2/firewalls/{firewall_id}/droplets" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/firewalls/{firewall_id}/droplets", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/firewalls/{firewall_id}/droplets", firewall_id=firewall_id), body=await async_maybe_transform({"droplet_ids": droplet_ids}, droplet_remove_params.DropletRemoveParams), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout diff --git a/src/gradient/resources/gpu_droplets/firewalls/firewalls.py b/src/gradient/resources/gpu_droplets/firewalls/firewalls.py index 4367941c..28b9184c 100644 --- a/src/gradient/resources/gpu_droplets/firewalls/firewalls.py +++ b/src/gradient/resources/gpu_droplets/firewalls/firewalls.py @@ -29,7 +29,7 @@ AsyncDropletsResourceWithStreamingResponse, ) from ...._types import Body, Omit, Query, Headers, NoneType, NotGiven, omit, not_given -from ...._utils import maybe_transform, async_maybe_transform +from ...._utils import path_template, maybe_transform, async_maybe_transform from ...._compat import cached_property from ...._resource import SyncAPIResource, AsyncAPIResource from ...._response import ( @@ -171,9 +171,8 @@ def retrieve( if not firewall_id: raise ValueError(f"Expected a non-empty value for `firewall_id` but received {firewall_id!r}") return self._get( - f"/v2/firewalls/{firewall_id}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/firewalls/{firewall_id}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/firewalls/{firewall_id}", firewall_id=firewall_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -213,9 +212,8 @@ def update( if not firewall_id: raise ValueError(f"Expected a non-empty value for `firewall_id` but received {firewall_id!r}") return self._put( - f"/v2/firewalls/{firewall_id}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/firewalls/{firewall_id}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/firewalls/{firewall_id}", firewall_id=firewall_id), body=maybe_transform(firewall, firewall_update_params.FirewallUpdateParams), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout @@ -301,9 +299,8 @@ def delete( raise ValueError(f"Expected a non-empty value for `firewall_id` but received {firewall_id!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._delete( - f"/v2/firewalls/{firewall_id}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/firewalls/{firewall_id}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/firewalls/{firewall_id}", firewall_id=firewall_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -433,9 +430,8 @@ async def retrieve( if not firewall_id: raise ValueError(f"Expected a non-empty value for `firewall_id` but received {firewall_id!r}") return await self._get( - f"/v2/firewalls/{firewall_id}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/firewalls/{firewall_id}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/firewalls/{firewall_id}", firewall_id=firewall_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -475,9 +471,8 @@ async def update( if not firewall_id: raise ValueError(f"Expected a non-empty value for `firewall_id` but received {firewall_id!r}") return await self._put( - f"/v2/firewalls/{firewall_id}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/firewalls/{firewall_id}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/firewalls/{firewall_id}", firewall_id=firewall_id), body=await async_maybe_transform(firewall, firewall_update_params.FirewallUpdateParams), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout @@ -563,9 +558,8 @@ async def delete( raise ValueError(f"Expected a non-empty value for `firewall_id` but received {firewall_id!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._delete( - f"/v2/firewalls/{firewall_id}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/firewalls/{firewall_id}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/firewalls/{firewall_id}", firewall_id=firewall_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gradient/resources/gpu_droplets/firewalls/rules.py b/src/gradient/resources/gpu_droplets/firewalls/rules.py index bea27fe4..337bd371 100644 --- a/src/gradient/resources/gpu_droplets/firewalls/rules.py +++ b/src/gradient/resources/gpu_droplets/firewalls/rules.py @@ -7,7 +7,7 @@ import httpx from ...._types import Body, Omit, Query, Headers, NoneType, NotGiven, omit, not_given -from ...._utils import maybe_transform, async_maybe_transform +from ...._utils import path_template, maybe_transform, async_maybe_transform from ...._compat import cached_property from ...._resource import SyncAPIResource, AsyncAPIResource from ...._response import ( @@ -86,9 +86,8 @@ def add( raise ValueError(f"Expected a non-empty value for `firewall_id` but received {firewall_id!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._post( - f"/v2/firewalls/{firewall_id}/rules" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/firewalls/{firewall_id}/rules", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/firewalls/{firewall_id}/rules", firewall_id=firewall_id), body=maybe_transform( { "inbound_rules": inbound_rules, @@ -138,9 +137,8 @@ def remove( raise ValueError(f"Expected a non-empty value for `firewall_id` but received {firewall_id!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._delete( - f"/v2/firewalls/{firewall_id}/rules" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/firewalls/{firewall_id}/rules", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/firewalls/{firewall_id}/rules", firewall_id=firewall_id), body=maybe_transform( { "inbound_rules": inbound_rules, @@ -219,9 +217,8 @@ async def add( raise ValueError(f"Expected a non-empty value for `firewall_id` but received {firewall_id!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._post( - f"/v2/firewalls/{firewall_id}/rules" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/firewalls/{firewall_id}/rules", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/firewalls/{firewall_id}/rules", firewall_id=firewall_id), body=await async_maybe_transform( { "inbound_rules": inbound_rules, @@ -271,9 +268,8 @@ async def remove( raise ValueError(f"Expected a non-empty value for `firewall_id` but received {firewall_id!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._delete( - f"/v2/firewalls/{firewall_id}/rules" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/firewalls/{firewall_id}/rules", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/firewalls/{firewall_id}/rules", firewall_id=firewall_id), body=await async_maybe_transform( { "inbound_rules": inbound_rules, diff --git a/src/gradient/resources/gpu_droplets/firewalls/tags.py b/src/gradient/resources/gpu_droplets/firewalls/tags.py index c38788be..62fd429e 100644 --- a/src/gradient/resources/gpu_droplets/firewalls/tags.py +++ b/src/gradient/resources/gpu_droplets/firewalls/tags.py @@ -7,7 +7,7 @@ import httpx from ...._types import Body, Query, Headers, NoneType, NotGiven, SequenceNotStr, not_given -from ...._utils import maybe_transform, async_maybe_transform +from ...._utils import path_template, maybe_transform, async_maybe_transform from ...._compat import cached_property from ...._resource import SyncAPIResource, AsyncAPIResource from ...._response import ( @@ -89,9 +89,8 @@ def add( raise ValueError(f"Expected a non-empty value for `firewall_id` but received {firewall_id!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._post( - f"/v2/firewalls/{firewall_id}/tags" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/firewalls/{firewall_id}/tags", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/firewalls/{firewall_id}/tags", firewall_id=firewall_id), body=maybe_transform({"tags": tags}, tag_add_params.TagAddParams), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout @@ -138,9 +137,8 @@ def remove( raise ValueError(f"Expected a non-empty value for `firewall_id` but received {firewall_id!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._delete( - f"/v2/firewalls/{firewall_id}/tags" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/firewalls/{firewall_id}/tags", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/firewalls/{firewall_id}/tags", firewall_id=firewall_id), body=maybe_transform({"tags": tags}, tag_remove_params.TagRemoveParams), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout @@ -216,9 +214,8 @@ async def add( raise ValueError(f"Expected a non-empty value for `firewall_id` but received {firewall_id!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._post( - f"/v2/firewalls/{firewall_id}/tags" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/firewalls/{firewall_id}/tags", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/firewalls/{firewall_id}/tags", firewall_id=firewall_id), body=await async_maybe_transform({"tags": tags}, tag_add_params.TagAddParams), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout @@ -265,9 +262,8 @@ async def remove( raise ValueError(f"Expected a non-empty value for `firewall_id` but received {firewall_id!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._delete( - f"/v2/firewalls/{firewall_id}/tags" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/firewalls/{firewall_id}/tags", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/firewalls/{firewall_id}/tags", firewall_id=firewall_id), body=await async_maybe_transform({"tags": tags}, tag_remove_params.TagRemoveParams), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout diff --git a/src/gradient/resources/gpu_droplets/floating_ips/actions.py b/src/gradient/resources/gpu_droplets/floating_ips/actions.py index 83e0b918..dc798d6d 100644 --- a/src/gradient/resources/gpu_droplets/floating_ips/actions.py +++ b/src/gradient/resources/gpu_droplets/floating_ips/actions.py @@ -7,7 +7,7 @@ import httpx from ...._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from ...._utils import required_args, maybe_transform, async_maybe_transform +from ...._utils import path_template, required_args, maybe_transform, async_maybe_transform from ...._compat import cached_property from ...._resource import SyncAPIResource, AsyncAPIResource from ...._response import ( @@ -159,9 +159,8 @@ def create( if not floating_ip: raise ValueError(f"Expected a non-empty value for `floating_ip` but received {floating_ip!r}") return self._post( - f"/v2/floating_ips/{floating_ip}/actions" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/floating_ips/{floating_ip}/actions", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/floating_ips/{floating_ip}/actions", floating_ip=floating_ip), body=maybe_transform( { "type": type, @@ -203,9 +202,10 @@ def retrieve( if not floating_ip: raise ValueError(f"Expected a non-empty value for `floating_ip` but received {floating_ip!r}") return self._get( - f"/v2/floating_ips/{floating_ip}/actions/{action_id}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/floating_ips/{floating_ip}/actions/{action_id}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template( + "/v2/floating_ips/{floating_ip}/actions/{action_id}", floating_ip=floating_ip, action_id=action_id + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -239,9 +239,8 @@ def list( if not floating_ip: raise ValueError(f"Expected a non-empty value for `floating_ip` but received {floating_ip!r}") return self._get( - f"/v2/floating_ips/{floating_ip}/actions" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/floating_ips/{floating_ip}/actions", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/floating_ips/{floating_ip}/actions", floating_ip=floating_ip), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -383,9 +382,8 @@ async def create( if not floating_ip: raise ValueError(f"Expected a non-empty value for `floating_ip` but received {floating_ip!r}") return await self._post( - f"/v2/floating_ips/{floating_ip}/actions" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/floating_ips/{floating_ip}/actions", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/floating_ips/{floating_ip}/actions", floating_ip=floating_ip), body=await async_maybe_transform( { "type": type, @@ -427,9 +425,10 @@ async def retrieve( if not floating_ip: raise ValueError(f"Expected a non-empty value for `floating_ip` but received {floating_ip!r}") return await self._get( - f"/v2/floating_ips/{floating_ip}/actions/{action_id}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/floating_ips/{floating_ip}/actions/{action_id}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template( + "/v2/floating_ips/{floating_ip}/actions/{action_id}", floating_ip=floating_ip, action_id=action_id + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -463,9 +462,8 @@ async def list( if not floating_ip: raise ValueError(f"Expected a non-empty value for `floating_ip` but received {floating_ip!r}") return await self._get( - f"/v2/floating_ips/{floating_ip}/actions" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/floating_ips/{floating_ip}/actions", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/floating_ips/{floating_ip}/actions", floating_ip=floating_ip), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gradient/resources/gpu_droplets/floating_ips/floating_ips.py b/src/gradient/resources/gpu_droplets/floating_ips/floating_ips.py index 0e65e6aa..fefb3973 100644 --- a/src/gradient/resources/gpu_droplets/floating_ips/floating_ips.py +++ b/src/gradient/resources/gpu_droplets/floating_ips/floating_ips.py @@ -15,7 +15,7 @@ AsyncActionsResourceWithStreamingResponse, ) from ...._types import Body, Omit, Query, Headers, NoneType, NotGiven, omit, not_given -from ...._utils import required_args, maybe_transform, async_maybe_transform +from ...._utils import path_template, required_args, maybe_transform, async_maybe_transform from ...._compat import cached_property from ...._resource import SyncAPIResource, AsyncAPIResource from ...._response import ( @@ -230,9 +230,8 @@ def retrieve( if not floating_ip: raise ValueError(f"Expected a non-empty value for `floating_ip` but received {floating_ip!r}") return self._get( - f"/v2/floating_ips/{floating_ip}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/floating_ips/{floating_ip}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/floating_ips/{floating_ip}", floating_ip=floating_ip), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -317,9 +316,8 @@ def delete( raise ValueError(f"Expected a non-empty value for `floating_ip` but received {floating_ip!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._delete( - f"/v2/floating_ips/{floating_ip}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/floating_ips/{floating_ip}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/floating_ips/{floating_ip}", floating_ip=floating_ip), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -524,9 +522,8 @@ async def retrieve( if not floating_ip: raise ValueError(f"Expected a non-empty value for `floating_ip` but received {floating_ip!r}") return await self._get( - f"/v2/floating_ips/{floating_ip}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/floating_ips/{floating_ip}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/floating_ips/{floating_ip}", floating_ip=floating_ip), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -611,9 +608,8 @@ async def delete( raise ValueError(f"Expected a non-empty value for `floating_ip` but received {floating_ip!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._delete( - f"/v2/floating_ips/{floating_ip}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/floating_ips/{floating_ip}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/floating_ips/{floating_ip}", floating_ip=floating_ip), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gradient/resources/gpu_droplets/gpu_droplets.py b/src/gradient/resources/gpu_droplets/gpu_droplets.py index 5c0b1274..85db7100 100644 --- a/src/gradient/resources/gpu_droplets/gpu_droplets.py +++ b/src/gradient/resources/gpu_droplets/gpu_droplets.py @@ -40,7 +40,7 @@ AsyncBackupsResourceWithStreamingResponse, ) from ..._types import Body, Omit, Query, Headers, NoneType, NotGiven, SequenceNotStr, omit, not_given -from ..._utils import required_args, maybe_transform, async_maybe_transform +from ..._utils import path_template, required_args, maybe_transform, async_maybe_transform from ..._compat import cached_property from .autoscale import ( AutoscaleResource, @@ -680,9 +680,8 @@ def retrieve( timeout: Override the client-level default timeout for this request, in seconds """ return self._get( - f"/v2/droplets/{droplet_id}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/droplets/{droplet_id}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/droplets/{droplet_id}", droplet_id=droplet_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -794,9 +793,8 @@ def delete( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._delete( - f"/v2/droplets/{droplet_id}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/droplets/{droplet_id}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/droplets/{droplet_id}", droplet_id=droplet_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -885,9 +883,8 @@ def list_firewalls( timeout: Override the client-level default timeout for this request, in seconds """ return self._get( - f"/v2/droplets/{droplet_id}/firewalls" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/droplets/{droplet_id}/firewalls", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/droplets/{droplet_id}/firewalls", droplet_id=droplet_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -939,9 +936,8 @@ def list_kernels( timeout: Override the client-level default timeout for this request, in seconds """ return self._get( - f"/v2/droplets/{droplet_id}/kernels" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/droplets/{droplet_id}/kernels", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/droplets/{droplet_id}/kernels", droplet_id=droplet_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -990,9 +986,8 @@ def list_neighbors( timeout: Override the client-level default timeout for this request, in seconds """ return self._get( - f"/v2/droplets/{droplet_id}/neighbors" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/droplets/{droplet_id}/neighbors", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/droplets/{droplet_id}/neighbors", droplet_id=droplet_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -1034,9 +1029,8 @@ def list_snapshots( timeout: Override the client-level default timeout for this request, in seconds """ return self._get( - f"/v2/droplets/{droplet_id}/snapshots" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/droplets/{droplet_id}/snapshots", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/droplets/{droplet_id}/snapshots", droplet_id=droplet_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -1600,9 +1594,8 @@ async def retrieve( timeout: Override the client-level default timeout for this request, in seconds """ return await self._get( - f"/v2/droplets/{droplet_id}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/droplets/{droplet_id}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/droplets/{droplet_id}", droplet_id=droplet_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -1714,9 +1707,8 @@ async def delete( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._delete( - f"/v2/droplets/{droplet_id}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/droplets/{droplet_id}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/droplets/{droplet_id}", droplet_id=droplet_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -1805,9 +1797,8 @@ async def list_firewalls( timeout: Override the client-level default timeout for this request, in seconds """ return await self._get( - f"/v2/droplets/{droplet_id}/firewalls" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/droplets/{droplet_id}/firewalls", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/droplets/{droplet_id}/firewalls", droplet_id=droplet_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -1859,9 +1850,8 @@ async def list_kernels( timeout: Override the client-level default timeout for this request, in seconds """ return await self._get( - f"/v2/droplets/{droplet_id}/kernels" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/droplets/{droplet_id}/kernels", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/droplets/{droplet_id}/kernels", droplet_id=droplet_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -1910,9 +1900,8 @@ async def list_neighbors( timeout: Override the client-level default timeout for this request, in seconds """ return await self._get( - f"/v2/droplets/{droplet_id}/neighbors" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/droplets/{droplet_id}/neighbors", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/droplets/{droplet_id}/neighbors", droplet_id=droplet_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -1954,9 +1943,8 @@ async def list_snapshots( timeout: Override the client-level default timeout for this request, in seconds """ return await self._get( - f"/v2/droplets/{droplet_id}/snapshots" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/droplets/{droplet_id}/snapshots", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/droplets/{droplet_id}/snapshots", droplet_id=droplet_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, diff --git a/src/gradient/resources/gpu_droplets/images/actions.py b/src/gradient/resources/gpu_droplets/images/actions.py index 19c70af8..04ccaf30 100644 --- a/src/gradient/resources/gpu_droplets/images/actions.py +++ b/src/gradient/resources/gpu_droplets/images/actions.py @@ -7,7 +7,7 @@ import httpx from ...._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from ...._utils import required_args, maybe_transform, async_maybe_transform +from ...._utils import path_template, required_args, maybe_transform, async_maybe_transform from ...._compat import cached_property from ...._resource import SyncAPIResource, AsyncAPIResource from ...._response import ( @@ -186,9 +186,8 @@ def create( timeout: float | httpx.Timeout | None | NotGiven = not_given, ) -> Action: return self._post( - f"/v2/images/{image_id}/actions" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/images/{image_id}/actions", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/images/{image_id}/actions", image_id=image_id), body=maybe_transform( { "type": type, @@ -228,9 +227,8 @@ def retrieve( timeout: Override the client-level default timeout for this request, in seconds """ return self._get( - f"/v2/images/{image_id}/actions/{action_id}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/images/{image_id}/actions/{action_id}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/images/{image_id}/actions/{action_id}", image_id=image_id, action_id=action_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -262,9 +260,8 @@ def list( timeout: Override the client-level default timeout for this request, in seconds """ return self._get( - f"/v2/images/{image_id}/actions" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/images/{image_id}/actions", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/images/{image_id}/actions", image_id=image_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -434,9 +431,8 @@ async def create( timeout: float | httpx.Timeout | None | NotGiven = not_given, ) -> Action: return await self._post( - f"/v2/images/{image_id}/actions" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/images/{image_id}/actions", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/images/{image_id}/actions", image_id=image_id), body=await async_maybe_transform( { "type": type, @@ -476,9 +472,8 @@ async def retrieve( timeout: Override the client-level default timeout for this request, in seconds """ return await self._get( - f"/v2/images/{image_id}/actions/{action_id}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/images/{image_id}/actions/{action_id}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/images/{image_id}/actions/{action_id}", image_id=image_id, action_id=action_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -510,9 +505,8 @@ async def list( timeout: Override the client-level default timeout for this request, in seconds """ return await self._get( - f"/v2/images/{image_id}/actions" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/images/{image_id}/actions", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/images/{image_id}/actions", image_id=image_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gradient/resources/gpu_droplets/images/images.py b/src/gradient/resources/gpu_droplets/images/images.py index d9a904cf..b50821c7 100644 --- a/src/gradient/resources/gpu_droplets/images/images.py +++ b/src/gradient/resources/gpu_droplets/images/images.py @@ -16,7 +16,7 @@ AsyncActionsResourceWithStreamingResponse, ) from ...._types import Body, Omit, Query, Headers, NoneType, NotGiven, SequenceNotStr, omit, not_given -from ...._utils import maybe_transform, async_maybe_transform +from ...._utils import path_template, maybe_transform, async_maybe_transform from ...._compat import cached_property from ...._resource import SyncAPIResource, AsyncAPIResource from ...._response import ( @@ -228,9 +228,8 @@ def retrieve( timeout: Override the client-level default timeout for this request, in seconds """ return self._get( - f"/v2/images/{image_id}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/images/{image_id}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/images/{image_id}", image_id=image_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -293,9 +292,8 @@ def update( timeout: Override the client-level default timeout for this request, in seconds """ return self._put( - f"/v2/images/{image_id}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/images/{image_id}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/images/{image_id}", image_id=image_id), body=maybe_transform( { "description": description, @@ -427,9 +425,8 @@ def delete( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._delete( - f"/v2/images/{image_id}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/images/{image_id}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/images/{image_id}", image_id=image_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -630,9 +627,8 @@ async def retrieve( timeout: Override the client-level default timeout for this request, in seconds """ return await self._get( - f"/v2/images/{image_id}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/images/{image_id}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/images/{image_id}", image_id=image_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -695,9 +691,8 @@ async def update( timeout: Override the client-level default timeout for this request, in seconds """ return await self._put( - f"/v2/images/{image_id}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/images/{image_id}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/images/{image_id}", image_id=image_id), body=await async_maybe_transform( { "description": description, @@ -829,9 +824,8 @@ async def delete( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._delete( - f"/v2/images/{image_id}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/images/{image_id}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/images/{image_id}", image_id=image_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gradient/resources/gpu_droplets/load_balancers/droplets.py b/src/gradient/resources/gpu_droplets/load_balancers/droplets.py index 9f4b3e5e..7ccc26c9 100644 --- a/src/gradient/resources/gpu_droplets/load_balancers/droplets.py +++ b/src/gradient/resources/gpu_droplets/load_balancers/droplets.py @@ -7,7 +7,7 @@ import httpx from ...._types import Body, Query, Headers, NoneType, NotGiven, not_given -from ...._utils import maybe_transform, async_maybe_transform +from ...._utils import path_template, maybe_transform, async_maybe_transform from ...._compat import cached_property from ...._resource import SyncAPIResource, AsyncAPIResource from ...._response import ( @@ -89,9 +89,8 @@ def add( raise ValueError(f"Expected a non-empty value for `lb_id` but received {lb_id!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._post( - f"/v2/load_balancers/{lb_id}/droplets" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/load_balancers/{lb_id}/droplets", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/load_balancers/{lb_id}/droplets", lb_id=lb_id), body=maybe_transform({"droplet_ids": droplet_ids}, droplet_add_params.DropletAddParams), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout @@ -135,9 +134,8 @@ def remove( raise ValueError(f"Expected a non-empty value for `lb_id` but received {lb_id!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._delete( - f"/v2/load_balancers/{lb_id}/droplets" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/load_balancers/{lb_id}/droplets", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/load_balancers/{lb_id}/droplets", lb_id=lb_id), body=maybe_transform({"droplet_ids": droplet_ids}, droplet_remove_params.DropletRemoveParams), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout @@ -213,9 +211,8 @@ async def add( raise ValueError(f"Expected a non-empty value for `lb_id` but received {lb_id!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._post( - f"/v2/load_balancers/{lb_id}/droplets" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/load_balancers/{lb_id}/droplets", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/load_balancers/{lb_id}/droplets", lb_id=lb_id), body=await async_maybe_transform({"droplet_ids": droplet_ids}, droplet_add_params.DropletAddParams), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout @@ -259,9 +256,8 @@ async def remove( raise ValueError(f"Expected a non-empty value for `lb_id` but received {lb_id!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._delete( - f"/v2/load_balancers/{lb_id}/droplets" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/load_balancers/{lb_id}/droplets", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/load_balancers/{lb_id}/droplets", lb_id=lb_id), body=await async_maybe_transform({"droplet_ids": droplet_ids}, droplet_remove_params.DropletRemoveParams), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout diff --git a/src/gradient/resources/gpu_droplets/load_balancers/forwarding_rules.py b/src/gradient/resources/gpu_droplets/load_balancers/forwarding_rules.py index 51842e8c..603087f3 100644 --- a/src/gradient/resources/gpu_droplets/load_balancers/forwarding_rules.py +++ b/src/gradient/resources/gpu_droplets/load_balancers/forwarding_rules.py @@ -7,7 +7,7 @@ import httpx from ...._types import Body, Query, Headers, NoneType, NotGiven, not_given -from ...._utils import maybe_transform, async_maybe_transform +from ...._utils import path_template, maybe_transform, async_maybe_transform from ...._compat import cached_property from ...._resource import SyncAPIResource, AsyncAPIResource from ...._response import ( @@ -86,9 +86,8 @@ def add( raise ValueError(f"Expected a non-empty value for `lb_id` but received {lb_id!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._post( - f"/v2/load_balancers/{lb_id}/forwarding_rules" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/load_balancers/{lb_id}/forwarding_rules", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/load_balancers/{lb_id}/forwarding_rules", lb_id=lb_id), body=maybe_transform( {"forwarding_rules": forwarding_rules}, forwarding_rule_add_params.ForwardingRuleAddParams ), @@ -133,9 +132,8 @@ def remove( raise ValueError(f"Expected a non-empty value for `lb_id` but received {lb_id!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._delete( - f"/v2/load_balancers/{lb_id}/forwarding_rules" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/load_balancers/{lb_id}/forwarding_rules", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/load_balancers/{lb_id}/forwarding_rules", lb_id=lb_id), body=maybe_transform( {"forwarding_rules": forwarding_rules}, forwarding_rule_remove_params.ForwardingRuleRemoveParams ), @@ -209,9 +207,8 @@ async def add( raise ValueError(f"Expected a non-empty value for `lb_id` but received {lb_id!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._post( - f"/v2/load_balancers/{lb_id}/forwarding_rules" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/load_balancers/{lb_id}/forwarding_rules", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/load_balancers/{lb_id}/forwarding_rules", lb_id=lb_id), body=await async_maybe_transform( {"forwarding_rules": forwarding_rules}, forwarding_rule_add_params.ForwardingRuleAddParams ), @@ -256,9 +253,8 @@ async def remove( raise ValueError(f"Expected a non-empty value for `lb_id` but received {lb_id!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._delete( - f"/v2/load_balancers/{lb_id}/forwarding_rules" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/load_balancers/{lb_id}/forwarding_rules", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/load_balancers/{lb_id}/forwarding_rules", lb_id=lb_id), body=await async_maybe_transform( {"forwarding_rules": forwarding_rules}, forwarding_rule_remove_params.ForwardingRuleRemoveParams ), diff --git a/src/gradient/resources/gpu_droplets/load_balancers/load_balancers.py b/src/gradient/resources/gpu_droplets/load_balancers/load_balancers.py index 1316036b..27b2d272 100644 --- a/src/gradient/resources/gpu_droplets/load_balancers/load_balancers.py +++ b/src/gradient/resources/gpu_droplets/load_balancers/load_balancers.py @@ -16,7 +16,7 @@ AsyncDropletsResourceWithStreamingResponse, ) from ...._types import Body, Omit, Query, Headers, NoneType, NotGiven, SequenceNotStr, omit, not_given -from ...._utils import required_args, maybe_transform, async_maybe_transform +from ...._utils import path_template, required_args, maybe_transform, async_maybe_transform from ...._compat import cached_property from ...._resource import SyncAPIResource, AsyncAPIResource from ...._response import ( @@ -542,9 +542,8 @@ def retrieve( if not lb_id: raise ValueError(f"Expected a non-empty value for `lb_id` but received {lb_id!r}") return self._get( - f"/v2/load_balancers/{lb_id}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/load_balancers/{lb_id}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/load_balancers/{lb_id}", lb_id=lb_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -917,9 +916,8 @@ def update( if not lb_id: raise ValueError(f"Expected a non-empty value for `lb_id` but received {lb_id!r}") return self._put( - f"/v2/load_balancers/{lb_id}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/load_balancers/{lb_id}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/load_balancers/{lb_id}", lb_id=lb_id), body=maybe_transform( { "forwarding_rules": forwarding_rules, @@ -1037,9 +1035,8 @@ def delete( raise ValueError(f"Expected a non-empty value for `lb_id` but received {lb_id!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._delete( - f"/v2/load_balancers/{lb_id}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/load_balancers/{lb_id}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/load_balancers/{lb_id}", lb_id=lb_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -1077,9 +1074,8 @@ def delete_cache( raise ValueError(f"Expected a non-empty value for `lb_id` but received {lb_id!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._delete( - f"/v2/load_balancers/{lb_id}/cache" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/load_balancers/{lb_id}/cache", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/load_balancers/{lb_id}/cache", lb_id=lb_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -1576,9 +1572,8 @@ async def retrieve( if not lb_id: raise ValueError(f"Expected a non-empty value for `lb_id` but received {lb_id!r}") return await self._get( - f"/v2/load_balancers/{lb_id}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/load_balancers/{lb_id}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/load_balancers/{lb_id}", lb_id=lb_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -1951,9 +1946,8 @@ async def update( if not lb_id: raise ValueError(f"Expected a non-empty value for `lb_id` but received {lb_id!r}") return await self._put( - f"/v2/load_balancers/{lb_id}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/load_balancers/{lb_id}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/load_balancers/{lb_id}", lb_id=lb_id), body=await async_maybe_transform( { "forwarding_rules": forwarding_rules, @@ -2071,9 +2065,8 @@ async def delete( raise ValueError(f"Expected a non-empty value for `lb_id` but received {lb_id!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._delete( - f"/v2/load_balancers/{lb_id}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/load_balancers/{lb_id}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/load_balancers/{lb_id}", lb_id=lb_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -2111,9 +2104,8 @@ async def delete_cache( raise ValueError(f"Expected a non-empty value for `lb_id` but received {lb_id!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._delete( - f"/v2/load_balancers/{lb_id}/cache" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/load_balancers/{lb_id}/cache", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/load_balancers/{lb_id}/cache", lb_id=lb_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gradient/resources/gpu_droplets/snapshots.py b/src/gradient/resources/gpu_droplets/snapshots.py index 12cf20da..27c82a5e 100644 --- a/src/gradient/resources/gpu_droplets/snapshots.py +++ b/src/gradient/resources/gpu_droplets/snapshots.py @@ -8,7 +8,7 @@ import httpx from ..._types import Body, Omit, Query, Headers, NoneType, NotGiven, omit, not_given -from ..._utils import maybe_transform, async_maybe_transform +from ..._utils import path_template, maybe_transform, async_maybe_transform from ..._compat import cached_property from ..._resource import SyncAPIResource, AsyncAPIResource from ..._response import ( @@ -87,9 +87,8 @@ def retrieve( timeout: Override the client-level default timeout for this request, in seconds """ return self._get( - f"/v2/snapshots/{snapshot_id}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/snapshots/{snapshot_id}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/snapshots/{snapshot_id}", snapshot_id=snapshot_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -197,9 +196,8 @@ def delete( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._delete( - f"/v2/snapshots/{snapshot_id}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/snapshots/{snapshot_id}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/snapshots/{snapshot_id}", snapshot_id=snapshot_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -269,9 +267,8 @@ async def retrieve( timeout: Override the client-level default timeout for this request, in seconds """ return await self._get( - f"/v2/snapshots/{snapshot_id}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/snapshots/{snapshot_id}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/snapshots/{snapshot_id}", snapshot_id=snapshot_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -379,9 +376,8 @@ async def delete( """ extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._delete( - f"/v2/snapshots/{snapshot_id}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/snapshots/{snapshot_id}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/snapshots/{snapshot_id}", snapshot_id=snapshot_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gradient/resources/gpu_droplets/volumes/actions.py b/src/gradient/resources/gpu_droplets/volumes/actions.py index 9b145567..2b13a187 100644 --- a/src/gradient/resources/gpu_droplets/volumes/actions.py +++ b/src/gradient/resources/gpu_droplets/volumes/actions.py @@ -8,7 +8,7 @@ import httpx from ...._types import Body, Omit, Query, Headers, NotGiven, SequenceNotStr, omit, not_given -from ...._utils import required_args, maybe_transform, async_maybe_transform +from ...._utils import path_template, required_args, maybe_transform, async_maybe_transform from ...._compat import cached_property from ...._resource import SyncAPIResource, AsyncAPIResource from ...._response import ( @@ -96,9 +96,8 @@ def retrieve( if not volume_id: raise ValueError(f"Expected a non-empty value for `volume_id` but received {volume_id!r}") return self._get( - f"/v2/volumes/{volume_id}/actions/{action_id}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/volumes/{volume_id}/actions/{action_id}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/volumes/{volume_id}/actions/{action_id}", volume_id=volume_id, action_id=action_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -148,9 +147,8 @@ def list( if not volume_id: raise ValueError(f"Expected a non-empty value for `volume_id` but received {volume_id!r}") return self._get( - f"/v2/volumes/{volume_id}/actions" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/volumes/{volume_id}/actions", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/volumes/{volume_id}/actions", volume_id=volume_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -496,9 +494,8 @@ def initiate_by_id( if not volume_id: raise ValueError(f"Expected a non-empty value for `volume_id` but received {volume_id!r}") return self._post( - f"/v2/volumes/{volume_id}/actions" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/volumes/{volume_id}/actions", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/volumes/{volume_id}/actions", volume_id=volume_id), body=maybe_transform( { "droplet_id": droplet_id, @@ -831,9 +828,8 @@ async def retrieve( if not volume_id: raise ValueError(f"Expected a non-empty value for `volume_id` but received {volume_id!r}") return await self._get( - f"/v2/volumes/{volume_id}/actions/{action_id}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/volumes/{volume_id}/actions/{action_id}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/volumes/{volume_id}/actions/{action_id}", volume_id=volume_id, action_id=action_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -883,9 +879,8 @@ async def list( if not volume_id: raise ValueError(f"Expected a non-empty value for `volume_id` but received {volume_id!r}") return await self._get( - f"/v2/volumes/{volume_id}/actions" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/volumes/{volume_id}/actions", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/volumes/{volume_id}/actions", volume_id=volume_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -1231,9 +1226,8 @@ async def initiate_by_id( if not volume_id: raise ValueError(f"Expected a non-empty value for `volume_id` but received {volume_id!r}") return await self._post( - f"/v2/volumes/{volume_id}/actions" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/volumes/{volume_id}/actions", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/volumes/{volume_id}/actions", volume_id=volume_id), body=await async_maybe_transform( { "droplet_id": droplet_id, diff --git a/src/gradient/resources/gpu_droplets/volumes/snapshots.py b/src/gradient/resources/gpu_droplets/volumes/snapshots.py index 8e2d6422..b037c668 100644 --- a/src/gradient/resources/gpu_droplets/volumes/snapshots.py +++ b/src/gradient/resources/gpu_droplets/volumes/snapshots.py @@ -7,7 +7,7 @@ import httpx from ...._types import Body, Omit, Query, Headers, NoneType, NotGiven, SequenceNotStr, omit, not_given -from ...._utils import maybe_transform, async_maybe_transform +from ...._utils import path_template, maybe_transform, async_maybe_transform from ...._compat import cached_property from ...._resource import SyncAPIResource, AsyncAPIResource from ...._response import ( @@ -95,9 +95,8 @@ def create( if not volume_id: raise ValueError(f"Expected a non-empty value for `volume_id` but received {volume_id!r}") return self._post( - f"/v2/volumes/{volume_id}/snapshots" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/volumes/{volume_id}/snapshots", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/volumes/{volume_id}/snapshots", volume_id=volume_id), body=maybe_transform( { "name": name, @@ -138,9 +137,8 @@ def retrieve( if not snapshot_id: raise ValueError(f"Expected a non-empty value for `snapshot_id` but received {snapshot_id!r}") return self._get( - f"/v2/volumes/snapshots/{snapshot_id}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/volumes/snapshots/{snapshot_id}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/volumes/snapshots/{snapshot_id}", snapshot_id=snapshot_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -180,9 +178,8 @@ def list( if not volume_id: raise ValueError(f"Expected a non-empty value for `volume_id` but received {volume_id!r}") return self._get( - f"/v2/volumes/{volume_id}/snapshots" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/volumes/{volume_id}/snapshots", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/volumes/{volume_id}/snapshots", volume_id=volume_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -230,9 +227,8 @@ def delete( raise ValueError(f"Expected a non-empty value for `snapshot_id` but received {snapshot_id!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._delete( - f"/v2/volumes/snapshots/{snapshot_id}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/volumes/snapshots/{snapshot_id}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/volumes/snapshots/{snapshot_id}", snapshot_id=snapshot_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -310,9 +306,8 @@ async def create( if not volume_id: raise ValueError(f"Expected a non-empty value for `volume_id` but received {volume_id!r}") return await self._post( - f"/v2/volumes/{volume_id}/snapshots" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/volumes/{volume_id}/snapshots", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/volumes/{volume_id}/snapshots", volume_id=volume_id), body=await async_maybe_transform( { "name": name, @@ -353,9 +348,8 @@ async def retrieve( if not snapshot_id: raise ValueError(f"Expected a non-empty value for `snapshot_id` but received {snapshot_id!r}") return await self._get( - f"/v2/volumes/snapshots/{snapshot_id}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/volumes/snapshots/{snapshot_id}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/volumes/snapshots/{snapshot_id}", snapshot_id=snapshot_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -395,9 +389,8 @@ async def list( if not volume_id: raise ValueError(f"Expected a non-empty value for `volume_id` but received {volume_id!r}") return await self._get( - f"/v2/volumes/{volume_id}/snapshots" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/volumes/{volume_id}/snapshots", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/volumes/{volume_id}/snapshots", volume_id=volume_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -445,9 +438,8 @@ async def delete( raise ValueError(f"Expected a non-empty value for `snapshot_id` but received {snapshot_id!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._delete( - f"/v2/volumes/snapshots/{snapshot_id}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/volumes/snapshots/{snapshot_id}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/volumes/snapshots/{snapshot_id}", snapshot_id=snapshot_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gradient/resources/gpu_droplets/volumes/volumes.py b/src/gradient/resources/gpu_droplets/volumes/volumes.py index 76b1db6b..ba644434 100644 --- a/src/gradient/resources/gpu_droplets/volumes/volumes.py +++ b/src/gradient/resources/gpu_droplets/volumes/volumes.py @@ -16,7 +16,7 @@ AsyncActionsResourceWithStreamingResponse, ) from ...._types import Body, Omit, Query, Headers, NoneType, NotGiven, SequenceNotStr, omit, not_given -from ...._utils import required_args, maybe_transform, async_maybe_transform +from ...._utils import path_template, required_args, maybe_transform, async_maybe_transform from .snapshots import ( SnapshotsResource, AsyncSnapshotsResource, @@ -359,9 +359,8 @@ def retrieve( if not volume_id: raise ValueError(f"Expected a non-empty value for `volume_id` but received {volume_id!r}") return self._get( - f"/v2/volumes/{volume_id}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/volumes/{volume_id}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/volumes/{volume_id}", volume_id=volume_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -492,9 +491,8 @@ def delete( raise ValueError(f"Expected a non-empty value for `volume_id` but received {volume_id!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._delete( - f"/v2/volumes/{volume_id}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/volumes/{volume_id}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/volumes/{volume_id}", volume_id=volume_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -888,9 +886,8 @@ async def retrieve( if not volume_id: raise ValueError(f"Expected a non-empty value for `volume_id` but received {volume_id!r}") return await self._get( - f"/v2/volumes/{volume_id}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/volumes/{volume_id}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/volumes/{volume_id}", volume_id=volume_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -1021,9 +1018,8 @@ async def delete( raise ValueError(f"Expected a non-empty value for `volume_id` but received {volume_id!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._delete( - f"/v2/volumes/{volume_id}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/volumes/{volume_id}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/volumes/{volume_id}", volume_id=volume_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gradient/resources/inference/api_keys.py b/src/gradient/resources/inference/api_keys.py index 045c6f41..c4dc0850 100644 --- a/src/gradient/resources/inference/api_keys.py +++ b/src/gradient/resources/inference/api_keys.py @@ -5,7 +5,7 @@ import httpx from ..._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from ..._utils import maybe_transform, async_maybe_transform +from ..._utils import path_template, maybe_transform, async_maybe_transform from ..._compat import cached_property from ..._resource import SyncAPIResource, AsyncAPIResource from ..._response import ( @@ -118,9 +118,8 @@ def update( if not path_api_key_uuid: raise ValueError(f"Expected a non-empty value for `path_api_key_uuid` but received {path_api_key_uuid!r}") return self._put( - f"/v2/gen-ai/models/api_keys/{path_api_key_uuid}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/models/api_keys/{path_api_key_uuid}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/gen-ai/models/api_keys/{path_api_key_uuid}", path_api_key_uuid=path_api_key_uuid), body=maybe_transform( { "body_api_key_uuid": body_api_key_uuid, @@ -209,9 +208,8 @@ def delete( if not api_key_uuid: raise ValueError(f"Expected a non-empty value for `api_key_uuid` but received {api_key_uuid!r}") return self._delete( - f"/v2/gen-ai/models/api_keys/{api_key_uuid}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/models/api_keys/{api_key_uuid}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/gen-ai/models/api_keys/{api_key_uuid}", api_key_uuid=api_key_uuid), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -245,9 +243,8 @@ def update_regenerate( if not api_key_uuid: raise ValueError(f"Expected a non-empty value for `api_key_uuid` but received {api_key_uuid!r}") return self._put( - f"/v2/gen-ai/models/api_keys/{api_key_uuid}/regenerate" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/models/api_keys/{api_key_uuid}/regenerate", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/gen-ai/models/api_keys/{api_key_uuid}/regenerate", api_key_uuid=api_key_uuid), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -348,9 +345,8 @@ async def update( if not path_api_key_uuid: raise ValueError(f"Expected a non-empty value for `path_api_key_uuid` but received {path_api_key_uuid!r}") return await self._put( - f"/v2/gen-ai/models/api_keys/{path_api_key_uuid}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/models/api_keys/{path_api_key_uuid}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/gen-ai/models/api_keys/{path_api_key_uuid}", path_api_key_uuid=path_api_key_uuid), body=await async_maybe_transform( { "body_api_key_uuid": body_api_key_uuid, @@ -439,9 +435,8 @@ async def delete( if not api_key_uuid: raise ValueError(f"Expected a non-empty value for `api_key_uuid` but received {api_key_uuid!r}") return await self._delete( - f"/v2/gen-ai/models/api_keys/{api_key_uuid}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/models/api_keys/{api_key_uuid}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/gen-ai/models/api_keys/{api_key_uuid}", api_key_uuid=api_key_uuid), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -475,9 +470,8 @@ async def update_regenerate( if not api_key_uuid: raise ValueError(f"Expected a non-empty value for `api_key_uuid` but received {api_key_uuid!r}") return await self._put( - f"/v2/gen-ai/models/api_keys/{api_key_uuid}/regenerate" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/models/api_keys/{api_key_uuid}/regenerate", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/gen-ai/models/api_keys/{api_key_uuid}/regenerate", api_key_uuid=api_key_uuid), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gradient/resources/knowledge_bases/data_sources.py b/src/gradient/resources/knowledge_bases/data_sources.py index 5c6eafd2..e04f473d 100644 --- a/src/gradient/resources/knowledge_bases/data_sources.py +++ b/src/gradient/resources/knowledge_bases/data_sources.py @@ -8,7 +8,7 @@ import httpx from ..._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from ..._utils import maybe_transform, async_maybe_transform +from ..._utils import path_template, maybe_transform, async_maybe_transform from ..._compat import cached_property from ..._resource import SyncAPIResource, AsyncAPIResource from ..._response import ( @@ -120,9 +120,11 @@ def create( f"Expected a non-empty value for `path_knowledge_base_uuid` but received {path_knowledge_base_uuid!r}" ) return self._post( - f"/v2/gen-ai/knowledge_bases/{path_knowledge_base_uuid}/data_sources" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/knowledge_bases/{path_knowledge_base_uuid}/data_sources", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template( + "/v2/gen-ai/knowledge_bases/{path_knowledge_base_uuid}/data_sources", + path_knowledge_base_uuid=path_knowledge_base_uuid, + ), body=maybe_transform( { "aws_data_source": aws_data_source, @@ -200,9 +202,12 @@ def update( f"Expected a non-empty value for `path_data_source_uuid` but received {path_data_source_uuid!r}" ) return self._put( - f"/v2/gen-ai/knowledge_bases/{path_knowledge_base_uuid}/data_sources/{path_data_source_uuid}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/knowledge_bases/{path_knowledge_base_uuid}/data_sources/{path_data_source_uuid}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template( + "/v2/gen-ai/knowledge_bases/{path_knowledge_base_uuid}/data_sources/{path_data_source_uuid}", + path_knowledge_base_uuid=path_knowledge_base_uuid, + path_data_source_uuid=path_data_source_uuid, + ), body=maybe_transform( { "chunking_algorithm": chunking_algorithm, @@ -253,9 +258,10 @@ def list( f"Expected a non-empty value for `knowledge_base_uuid` but received {knowledge_base_uuid!r}" ) return self._get( - f"/v2/gen-ai/knowledge_bases/{knowledge_base_uuid}/data_sources" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/knowledge_bases/{knowledge_base_uuid}/data_sources", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template( + "/v2/gen-ai/knowledge_bases/{knowledge_base_uuid}/data_sources", knowledge_base_uuid=knowledge_base_uuid + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -304,9 +310,12 @@ def delete( if not data_source_uuid: raise ValueError(f"Expected a non-empty value for `data_source_uuid` but received {data_source_uuid!r}") return self._delete( - f"/v2/gen-ai/knowledge_bases/{knowledge_base_uuid}/data_sources/{data_source_uuid}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/knowledge_bases/{knowledge_base_uuid}/data_sources/{data_source_uuid}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template( + "/v2/gen-ai/knowledge_bases/{knowledge_base_uuid}/data_sources/{data_source_uuid}", + knowledge_base_uuid=knowledge_base_uuid, + data_source_uuid=data_source_uuid, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -437,9 +446,11 @@ async def create( f"Expected a non-empty value for `path_knowledge_base_uuid` but received {path_knowledge_base_uuid!r}" ) return await self._post( - f"/v2/gen-ai/knowledge_bases/{path_knowledge_base_uuid}/data_sources" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/knowledge_bases/{path_knowledge_base_uuid}/data_sources", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template( + "/v2/gen-ai/knowledge_bases/{path_knowledge_base_uuid}/data_sources", + path_knowledge_base_uuid=path_knowledge_base_uuid, + ), body=await async_maybe_transform( { "aws_data_source": aws_data_source, @@ -517,9 +528,12 @@ async def update( f"Expected a non-empty value for `path_data_source_uuid` but received {path_data_source_uuid!r}" ) return await self._put( - f"/v2/gen-ai/knowledge_bases/{path_knowledge_base_uuid}/data_sources/{path_data_source_uuid}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/knowledge_bases/{path_knowledge_base_uuid}/data_sources/{path_data_source_uuid}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template( + "/v2/gen-ai/knowledge_bases/{path_knowledge_base_uuid}/data_sources/{path_data_source_uuid}", + path_knowledge_base_uuid=path_knowledge_base_uuid, + path_data_source_uuid=path_data_source_uuid, + ), body=await async_maybe_transform( { "chunking_algorithm": chunking_algorithm, @@ -570,9 +584,10 @@ async def list( f"Expected a non-empty value for `knowledge_base_uuid` but received {knowledge_base_uuid!r}" ) return await self._get( - f"/v2/gen-ai/knowledge_bases/{knowledge_base_uuid}/data_sources" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/knowledge_bases/{knowledge_base_uuid}/data_sources", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template( + "/v2/gen-ai/knowledge_bases/{knowledge_base_uuid}/data_sources", knowledge_base_uuid=knowledge_base_uuid + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -621,9 +636,12 @@ async def delete( if not data_source_uuid: raise ValueError(f"Expected a non-empty value for `data_source_uuid` but received {data_source_uuid!r}") return await self._delete( - f"/v2/gen-ai/knowledge_bases/{knowledge_base_uuid}/data_sources/{data_source_uuid}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/knowledge_bases/{knowledge_base_uuid}/data_sources/{data_source_uuid}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template( + "/v2/gen-ai/knowledge_bases/{knowledge_base_uuid}/data_sources/{data_source_uuid}", + knowledge_base_uuid=knowledge_base_uuid, + data_source_uuid=data_source_uuid, + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/gradient/resources/knowledge_bases/indexing_jobs.py b/src/gradient/resources/knowledge_bases/indexing_jobs.py index 47db5b10..6f22ebf4 100644 --- a/src/gradient/resources/knowledge_bases/indexing_jobs.py +++ b/src/gradient/resources/knowledge_bases/indexing_jobs.py @@ -8,7 +8,7 @@ import httpx from ..._types import Body, Omit, Query, Headers, NotGiven, SequenceNotStr, omit, not_given -from ..._utils import maybe_transform, async_maybe_transform +from ..._utils import path_template, maybe_transform, async_maybe_transform from ..._compat import cached_property from ..._resource import SyncAPIResource, AsyncAPIResource from ..._response import ( @@ -132,9 +132,8 @@ def retrieve( if not uuid: raise ValueError(f"Expected a non-empty value for `uuid` but received {uuid!r}") return self._get( - f"/v2/gen-ai/indexing_jobs/{uuid}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/indexing_jobs/{uuid}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/gen-ai/indexing_jobs/{uuid}", uuid=uuid), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -217,9 +216,10 @@ def retrieve_data_sources( if not indexing_job_uuid: raise ValueError(f"Expected a non-empty value for `indexing_job_uuid` but received {indexing_job_uuid!r}") return self._get( - f"/v2/gen-ai/indexing_jobs/{indexing_job_uuid}/data_sources" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/indexing_jobs/{indexing_job_uuid}/data_sources", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template( + "/v2/gen-ai/indexing_jobs/{indexing_job_uuid}/data_sources", indexing_job_uuid=indexing_job_uuid + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -253,9 +253,10 @@ def retrieve_signed_url( if not indexing_job_uuid: raise ValueError(f"Expected a non-empty value for `indexing_job_uuid` but received {indexing_job_uuid!r}") return self._get( - f"/v2/gen-ai/indexing_jobs/{indexing_job_uuid}/details_signed_url" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/indexing_jobs/{indexing_job_uuid}/details_signed_url", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template( + "/v2/gen-ai/indexing_jobs/{indexing_job_uuid}/details_signed_url", indexing_job_uuid=indexing_job_uuid + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -292,9 +293,8 @@ def update_cancel( if not path_uuid: raise ValueError(f"Expected a non-empty value for `path_uuid` but received {path_uuid!r}") return self._put( - f"/v2/gen-ai/indexing_jobs/{path_uuid}/cancel" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/indexing_jobs/{path_uuid}/cancel", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/gen-ai/indexing_jobs/{path_uuid}/cancel", path_uuid=path_uuid), body=maybe_transform( {"body_uuid": body_uuid}, indexing_job_update_cancel_params.IndexingJobUpdateCancelParams ), @@ -504,9 +504,8 @@ async def retrieve( if not uuid: raise ValueError(f"Expected a non-empty value for `uuid` but received {uuid!r}") return await self._get( - f"/v2/gen-ai/indexing_jobs/{uuid}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/indexing_jobs/{uuid}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/gen-ai/indexing_jobs/{uuid}", uuid=uuid), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -589,9 +588,10 @@ async def retrieve_data_sources( if not indexing_job_uuid: raise ValueError(f"Expected a non-empty value for `indexing_job_uuid` but received {indexing_job_uuid!r}") return await self._get( - f"/v2/gen-ai/indexing_jobs/{indexing_job_uuid}/data_sources" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/indexing_jobs/{indexing_job_uuid}/data_sources", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template( + "/v2/gen-ai/indexing_jobs/{indexing_job_uuid}/data_sources", indexing_job_uuid=indexing_job_uuid + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -625,9 +625,10 @@ async def retrieve_signed_url( if not indexing_job_uuid: raise ValueError(f"Expected a non-empty value for `indexing_job_uuid` but received {indexing_job_uuid!r}") return await self._get( - f"/v2/gen-ai/indexing_jobs/{indexing_job_uuid}/details_signed_url" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/indexing_jobs/{indexing_job_uuid}/details_signed_url", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template( + "/v2/gen-ai/indexing_jobs/{indexing_job_uuid}/details_signed_url", indexing_job_uuid=indexing_job_uuid + ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -664,9 +665,8 @@ async def update_cancel( if not path_uuid: raise ValueError(f"Expected a non-empty value for `path_uuid` but received {path_uuid!r}") return await self._put( - f"/v2/gen-ai/indexing_jobs/{path_uuid}/cancel" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/indexing_jobs/{path_uuid}/cancel", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/gen-ai/indexing_jobs/{path_uuid}/cancel", path_uuid=path_uuid), body=await async_maybe_transform( {"body_uuid": body_uuid}, indexing_job_update_cancel_params.IndexingJobUpdateCancelParams ), diff --git a/src/gradient/resources/knowledge_bases/knowledge_bases.py b/src/gradient/resources/knowledge_bases/knowledge_bases.py index dd4c3a8f..03953ecb 100644 --- a/src/gradient/resources/knowledge_bases/knowledge_bases.py +++ b/src/gradient/resources/knowledge_bases/knowledge_bases.py @@ -23,7 +23,7 @@ omit, not_given, ) -from ..._utils import maybe_transform, async_maybe_transform +from ..._utils import path_template, maybe_transform, async_maybe_transform from ..._compat import cached_property from ..._resource import SyncAPIResource, AsyncAPIResource from ..._response import ( diff --git a/src/gradient/resources/models/providers/anthropic.py b/src/gradient/resources/models/providers/anthropic.py index ce44fe06..15d1d3f0 100644 --- a/src/gradient/resources/models/providers/anthropic.py +++ b/src/gradient/resources/models/providers/anthropic.py @@ -5,7 +5,7 @@ import httpx from ...._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from ...._utils import maybe_transform, async_maybe_transform +from ...._utils import path_template, maybe_transform, async_maybe_transform from ...._compat import cached_property from ...._resource import SyncAPIResource, AsyncAPIResource from ...._response import ( @@ -128,9 +128,8 @@ def retrieve( if not api_key_uuid: raise ValueError(f"Expected a non-empty value for `api_key_uuid` but received {api_key_uuid!r}") return self._get( - f"/v2/gen-ai/anthropic/keys/{api_key_uuid}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/anthropic/keys/{api_key_uuid}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/gen-ai/anthropic/keys/{api_key_uuid}", api_key_uuid=api_key_uuid), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -173,9 +172,8 @@ def update( if not path_api_key_uuid: raise ValueError(f"Expected a non-empty value for `path_api_key_uuid` but received {path_api_key_uuid!r}") return self._put( - f"/v2/gen-ai/anthropic/keys/{path_api_key_uuid}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/anthropic/keys/{path_api_key_uuid}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/gen-ai/anthropic/keys/{path_api_key_uuid}", path_api_key_uuid=path_api_key_uuid), body=maybe_transform( { "api_key": api_key, @@ -266,9 +264,8 @@ def delete( if not api_key_uuid: raise ValueError(f"Expected a non-empty value for `api_key_uuid` but received {api_key_uuid!r}") return self._delete( - f"/v2/gen-ai/anthropic/keys/{api_key_uuid}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/anthropic/keys/{api_key_uuid}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/gen-ai/anthropic/keys/{api_key_uuid}", api_key_uuid=api_key_uuid), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -307,9 +304,8 @@ def list_agents( if not uuid: raise ValueError(f"Expected a non-empty value for `uuid` but received {uuid!r}") return self._get( - f"/v2/gen-ai/anthropic/keys/{uuid}/agents" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/anthropic/keys/{uuid}/agents", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/gen-ai/anthropic/keys/{uuid}/agents", uuid=uuid), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -424,9 +420,8 @@ async def retrieve( if not api_key_uuid: raise ValueError(f"Expected a non-empty value for `api_key_uuid` but received {api_key_uuid!r}") return await self._get( - f"/v2/gen-ai/anthropic/keys/{api_key_uuid}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/anthropic/keys/{api_key_uuid}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/gen-ai/anthropic/keys/{api_key_uuid}", api_key_uuid=api_key_uuid), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -469,9 +464,8 @@ async def update( if not path_api_key_uuid: raise ValueError(f"Expected a non-empty value for `path_api_key_uuid` but received {path_api_key_uuid!r}") return await self._put( - f"/v2/gen-ai/anthropic/keys/{path_api_key_uuid}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/anthropic/keys/{path_api_key_uuid}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/gen-ai/anthropic/keys/{path_api_key_uuid}", path_api_key_uuid=path_api_key_uuid), body=await async_maybe_transform( { "api_key": api_key, @@ -562,9 +556,8 @@ async def delete( if not api_key_uuid: raise ValueError(f"Expected a non-empty value for `api_key_uuid` but received {api_key_uuid!r}") return await self._delete( - f"/v2/gen-ai/anthropic/keys/{api_key_uuid}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/anthropic/keys/{api_key_uuid}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/gen-ai/anthropic/keys/{api_key_uuid}", api_key_uuid=api_key_uuid), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -603,9 +596,8 @@ async def list_agents( if not uuid: raise ValueError(f"Expected a non-empty value for `uuid` but received {uuid!r}") return await self._get( - f"/v2/gen-ai/anthropic/keys/{uuid}/agents" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/anthropic/keys/{uuid}/agents", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/gen-ai/anthropic/keys/{uuid}/agents", uuid=uuid), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, diff --git a/src/gradient/resources/models/providers/openai.py b/src/gradient/resources/models/providers/openai.py index e048a32f..fd7e7bd3 100644 --- a/src/gradient/resources/models/providers/openai.py +++ b/src/gradient/resources/models/providers/openai.py @@ -5,7 +5,7 @@ import httpx from ...._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from ...._utils import maybe_transform, async_maybe_transform +from ...._utils import path_template, maybe_transform, async_maybe_transform from ...._compat import cached_property from ...._resource import SyncAPIResource, AsyncAPIResource from ...._response import ( @@ -127,9 +127,8 @@ def retrieve( if not api_key_uuid: raise ValueError(f"Expected a non-empty value for `api_key_uuid` but received {api_key_uuid!r}") return self._get( - f"/v2/gen-ai/openai/keys/{api_key_uuid}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/openai/keys/{api_key_uuid}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/gen-ai/openai/keys/{api_key_uuid}", api_key_uuid=api_key_uuid), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -172,9 +171,8 @@ def update( if not path_api_key_uuid: raise ValueError(f"Expected a non-empty value for `path_api_key_uuid` but received {path_api_key_uuid!r}") return self._put( - f"/v2/gen-ai/openai/keys/{path_api_key_uuid}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/openai/keys/{path_api_key_uuid}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/gen-ai/openai/keys/{path_api_key_uuid}", path_api_key_uuid=path_api_key_uuid), body=maybe_transform( { "api_key": api_key, @@ -264,9 +262,8 @@ def delete( if not api_key_uuid: raise ValueError(f"Expected a non-empty value for `api_key_uuid` but received {api_key_uuid!r}") return self._delete( - f"/v2/gen-ai/openai/keys/{api_key_uuid}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/openai/keys/{api_key_uuid}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/gen-ai/openai/keys/{api_key_uuid}", api_key_uuid=api_key_uuid), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -305,9 +302,8 @@ def retrieve_agents( if not uuid: raise ValueError(f"Expected a non-empty value for `uuid` but received {uuid!r}") return self._get( - f"/v2/gen-ai/openai/keys/{uuid}/agents" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/openai/keys/{uuid}/agents", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/gen-ai/openai/keys/{uuid}/agents", uuid=uuid), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -421,9 +417,8 @@ async def retrieve( if not api_key_uuid: raise ValueError(f"Expected a non-empty value for `api_key_uuid` but received {api_key_uuid!r}") return await self._get( - f"/v2/gen-ai/openai/keys/{api_key_uuid}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/openai/keys/{api_key_uuid}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/gen-ai/openai/keys/{api_key_uuid}", api_key_uuid=api_key_uuid), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -466,9 +461,8 @@ async def update( if not path_api_key_uuid: raise ValueError(f"Expected a non-empty value for `path_api_key_uuid` but received {path_api_key_uuid!r}") return await self._put( - f"/v2/gen-ai/openai/keys/{path_api_key_uuid}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/openai/keys/{path_api_key_uuid}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/gen-ai/openai/keys/{path_api_key_uuid}", path_api_key_uuid=path_api_key_uuid), body=await async_maybe_transform( { "api_key": api_key, @@ -558,9 +552,8 @@ async def delete( if not api_key_uuid: raise ValueError(f"Expected a non-empty value for `api_key_uuid` but received {api_key_uuid!r}") return await self._delete( - f"/v2/gen-ai/openai/keys/{api_key_uuid}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/openai/keys/{api_key_uuid}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/gen-ai/openai/keys/{api_key_uuid}", api_key_uuid=api_key_uuid), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -599,9 +592,8 @@ async def retrieve_agents( if not uuid: raise ValueError(f"Expected a non-empty value for `uuid` but received {uuid!r}") return await self._get( - f"/v2/gen-ai/openai/keys/{uuid}/agents" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/gen-ai/openai/keys/{uuid}/agents", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/gen-ai/openai/keys/{uuid}/agents", uuid=uuid), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, diff --git a/src/gradient/resources/nfs/nfs.py b/src/gradient/resources/nfs/nfs.py index ec50bdf8..432e131e 100644 --- a/src/gradient/resources/nfs/nfs.py +++ b/src/gradient/resources/nfs/nfs.py @@ -8,7 +8,7 @@ from ...types import nf_list_params, nf_create_params, nf_delete_params, nf_retrieve_params, nf_initiate_action_params from ..._types import Body, Omit, Query, Headers, NoneType, NotGiven, SequenceNotStr, omit, not_given -from ..._utils import required_args, maybe_transform, async_maybe_transform +from ..._utils import path_template, required_args, maybe_transform, async_maybe_transform from ..._compat import cached_property from .snapshots import ( SnapshotsResource, @@ -148,9 +148,8 @@ def retrieve( if not nfs_id: raise ValueError(f"Expected a non-empty value for `nfs_id` but received {nfs_id!r}") return self._get( - f"/v2/nfs/{nfs_id}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/nfs/{nfs_id}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/nfs/{nfs_id}", nfs_id=nfs_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -234,9 +233,8 @@ def delete( raise ValueError(f"Expected a non-empty value for `nfs_id` but received {nfs_id!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._delete( - f"/v2/nfs/{nfs_id}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/nfs/{nfs_id}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/nfs/{nfs_id}", nfs_id=nfs_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -485,9 +483,8 @@ def initiate_action( if not nfs_id: raise ValueError(f"Expected a non-empty value for `nfs_id` but received {nfs_id!r}") return self._post( - f"/v2/nfs/{nfs_id}/actions" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/nfs/{nfs_id}/actions", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/nfs/{nfs_id}/actions", nfs_id=nfs_id), body=maybe_transform( { "type": type, @@ -617,9 +614,8 @@ async def retrieve( if not nfs_id: raise ValueError(f"Expected a non-empty value for `nfs_id` but received {nfs_id!r}") return await self._get( - f"/v2/nfs/{nfs_id}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/nfs/{nfs_id}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/nfs/{nfs_id}", nfs_id=nfs_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -703,9 +699,8 @@ async def delete( raise ValueError(f"Expected a non-empty value for `nfs_id` but received {nfs_id!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._delete( - f"/v2/nfs/{nfs_id}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/nfs/{nfs_id}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/nfs/{nfs_id}", nfs_id=nfs_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -954,9 +949,8 @@ async def initiate_action( if not nfs_id: raise ValueError(f"Expected a non-empty value for `nfs_id` but received {nfs_id!r}") return await self._post( - f"/v2/nfs/{nfs_id}/actions" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/nfs/{nfs_id}/actions", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/nfs/{nfs_id}/actions", nfs_id=nfs_id), body=await async_maybe_transform( { "type": type, diff --git a/src/gradient/resources/nfs/snapshots.py b/src/gradient/resources/nfs/snapshots.py index 209e7da9..335b1a7c 100644 --- a/src/gradient/resources/nfs/snapshots.py +++ b/src/gradient/resources/nfs/snapshots.py @@ -5,7 +5,7 @@ import httpx from ..._types import Body, Omit, Query, Headers, NoneType, NotGiven, omit, not_given -from ..._utils import maybe_transform, async_maybe_transform +from ..._utils import path_template, maybe_transform, async_maybe_transform from ..._compat import cached_property from ..._resource import SyncAPIResource, AsyncAPIResource from ..._response import ( @@ -79,9 +79,8 @@ def retrieve( if not nfs_snapshot_id: raise ValueError(f"Expected a non-empty value for `nfs_snapshot_id` but received {nfs_snapshot_id!r}") return self._get( - f"/v2/nfs/snapshots/{nfs_snapshot_id}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/nfs/snapshots/{nfs_snapshot_id}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/nfs/snapshots/{nfs_snapshot_id}", nfs_snapshot_id=nfs_snapshot_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -181,9 +180,8 @@ def delete( raise ValueError(f"Expected a non-empty value for `nfs_snapshot_id` but received {nfs_snapshot_id!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return self._delete( - f"/v2/nfs/snapshots/{nfs_snapshot_id}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/nfs/snapshots/{nfs_snapshot_id}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/nfs/snapshots/{nfs_snapshot_id}", nfs_snapshot_id=nfs_snapshot_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -252,9 +250,8 @@ async def retrieve( if not nfs_snapshot_id: raise ValueError(f"Expected a non-empty value for `nfs_snapshot_id` but received {nfs_snapshot_id!r}") return await self._get( - f"/v2/nfs/snapshots/{nfs_snapshot_id}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/nfs/snapshots/{nfs_snapshot_id}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/nfs/snapshots/{nfs_snapshot_id}", nfs_snapshot_id=nfs_snapshot_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -354,9 +351,8 @@ async def delete( raise ValueError(f"Expected a non-empty value for `nfs_snapshot_id` but received {nfs_snapshot_id!r}") extra_headers = {"Accept": "*/*", **(extra_headers or {})} return await self._delete( - f"/v2/nfs/snapshots/{nfs_snapshot_id}" - if self._client._base_url_overridden - else f"https://api.digitalocean.com/v2/nfs/snapshots/{nfs_snapshot_id}", + ("https://api.digitalocean.com" if not self._client._base_url_overridden else "") + + path_template("/v2/nfs/snapshots/{nfs_snapshot_id}", nfs_snapshot_id=nfs_snapshot_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, diff --git a/tests/test_utils/test_path.py b/tests/test_utils/test_path.py new file mode 100644 index 00000000..30373dff --- /dev/null +++ b/tests/test_utils/test_path.py @@ -0,0 +1,89 @@ +from __future__ import annotations + +from typing import Any + +import pytest + +from gradient._utils._path import path_template + + +@pytest.mark.parametrize( + "template, kwargs, expected", + [ + ("/v1/{id}", dict(id="abc"), "/v1/abc"), + ("/v1/{a}/{b}", dict(a="x", b="y"), "/v1/x/y"), + ("/v1/{a}{b}/path/{c}?val={d}#{e}", dict(a="x", b="y", c="z", d="u", e="v"), "/v1/xy/path/z?val=u#v"), + ("/{w}/{w}", dict(w="echo"), "/echo/echo"), + ("/v1/static", {}, "/v1/static"), + ("", {}, ""), + ("/v1/?q={n}&count=10", dict(n=42), "/v1/?q=42&count=10"), + ("/v1/{v}", dict(v=None), "/v1/null"), + ("/v1/{v}", dict(v=True), "/v1/true"), + ("/v1/{v}", dict(v=False), "/v1/false"), + ("/v1/{v}", dict(v=".hidden"), "/v1/.hidden"), # dot prefix ok + ("/v1/{v}", dict(v="file.txt"), "/v1/file.txt"), # dot in middle ok + ("/v1/{v}", dict(v="..."), "/v1/..."), # triple dot ok + ("/v1/{a}{b}", dict(a=".", b="txt"), "/v1/.txt"), # dot var combining with adjacent to be ok + ("/items?q={v}#{f}", dict(v=".", f=".."), "/items?q=.#.."), # dots in query/fragment are fine + ( + "/v1/{a}?query={b}", + dict(a="../../other/endpoint", b="a&bad=true"), + "/v1/..%2F..%2Fother%2Fendpoint?query=a%26bad%3Dtrue", + ), + ("/v1/{val}", dict(val="a/b/c"), "/v1/a%2Fb%2Fc"), + ("/v1/{val}", dict(val="a/b/c?query=value"), "/v1/a%2Fb%2Fc%3Fquery=value"), + ("/v1/{val}", dict(val="a/b/c?query=value&bad=true"), "/v1/a%2Fb%2Fc%3Fquery=value&bad=true"), + ("/v1/{val}", dict(val="%20"), "/v1/%2520"), # escapes escape sequences in input + # Query: slash and ? are safe, # is not + ("/items?q={v}", dict(v="a/b"), "/items?q=a/b"), + ("/items?q={v}", dict(v="a?b"), "/items?q=a?b"), + ("/items?q={v}", dict(v="a#b"), "/items?q=a%23b"), + ("/items?q={v}", dict(v="a b"), "/items?q=a%20b"), + # Fragment: slash and ? are safe + ("/docs#{v}", dict(v="a/b"), "/docs#a/b"), + ("/docs#{v}", dict(v="a?b"), "/docs#a?b"), + # Path: slash, ? and # are all encoded + ("/v1/{v}", dict(v="a/b"), "/v1/a%2Fb"), + ("/v1/{v}", dict(v="a?b"), "/v1/a%3Fb"), + ("/v1/{v}", dict(v="a#b"), "/v1/a%23b"), + # same var encoded differently by component + ( + "/v1/{v}?q={v}#{v}", + dict(v="a/b?c#d"), + "/v1/a%2Fb%3Fc%23d?q=a/b?c%23d#a/b?c%23d", + ), + ("/v1/{val}", dict(val="x?admin=true"), "/v1/x%3Fadmin=true"), # query injection + ("/v1/{val}", dict(val="x#admin"), "/v1/x%23admin"), # fragment injection + ], +) +def test_interpolation(template: str, kwargs: dict[str, Any], expected: str) -> None: + assert path_template(template, **kwargs) == expected + + +def test_missing_kwarg_raises_key_error() -> None: + with pytest.raises(KeyError, match="org_id"): + path_template("/v1/{org_id}") + + +@pytest.mark.parametrize( + "template, kwargs", + [ + ("{a}/path", dict(a=".")), + ("{a}/path", dict(a="..")), + ("/v1/{a}", dict(a=".")), + ("/v1/{a}", dict(a="..")), + ("/v1/{a}/path", dict(a=".")), + ("/v1/{a}/path", dict(a="..")), + ("/v1/{a}{b}", dict(a=".", b=".")), # adjacent vars → ".." + ("/v1/{a}.", dict(a=".")), # var + static → ".." + ("/v1/{a}{b}", dict(a="", b=".")), # empty + dot → "." + ("/v1/%2e/{x}", dict(x="ok")), # encoded dot in static text + ("/v1/%2e./{x}", dict(x="ok")), # mixed encoded ".." in static + ("/v1/.%2E/{x}", dict(x="ok")), # mixed encoded ".." in static + ("/v1/{v}?q=1", dict(v="..")), + ("/v1/{v}#frag", dict(v="..")), + ], +) +def test_dot_segment_rejected(template: str, kwargs: dict[str, Any]) -> None: + with pytest.raises(ValueError, match="dot-segment"): + path_template(template, **kwargs) From 4eb14403bd1939447bd79a71dc83c9f55a1f7830 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Wed, 15 Jul 2026 15:24:38 +0000 Subject: [PATCH 2/2] release: 3.12.2 --- .release-please-manifest.json | 2 +- CHANGELOG.md | 8 ++++++++ pyproject.toml | 2 +- src/gradient/_version.py | 2 +- 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 98828ad7..e17ca4d2 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "3.12.1" + ".": "3.12.2" } \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 7f479f9e..ea4bccf9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## 3.12.2 (2026-07-15) + +Full Changelog: [v3.12.1...v3.12.2](https://github.com/digitalocean/gradient-python/compare/v3.12.1...v3.12.2) + +### Bug Fixes + +* sanitize endpoint path params ([4ec7473](https://github.com/digitalocean/gradient-python/commit/4ec747324174ed90aab55a4a6d1df7c7912e443d)) + ## 3.12.1 (2026-03-16) Full Changelog: [v3.12.0...v3.12.1](https://github.com/digitalocean/gradient-python/compare/v3.12.0...v3.12.1) diff --git a/pyproject.toml b/pyproject.toml index 8a39bc9b..2a605832 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "gradient" -version = "3.12.1" +version = "3.12.2" description = "The official Python library for the Gradient API" dynamic = ["readme"] license = "Apache-2.0" diff --git a/src/gradient/_version.py b/src/gradient/_version.py index df3741c3..b8d85e9e 100644 --- a/src/gradient/_version.py +++ b/src/gradient/_version.py @@ -1,4 +1,4 @@ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. __title__ = "gradient" -__version__ = "3.12.1" # x-release-please-version +__version__ = "3.12.2" # x-release-please-version