diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 6b7b74c..da59f99 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "0.3.0" + ".": "0.4.0" } \ No newline at end of file diff --git a/.stats.yml b/.stats.yml index d4f19f2..bc3166c 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 32 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/dedalus-labs/dedalus-8618662d24c795caf31ecb2b62c603c5cb1002386003f3a40854664da766eef4.yml -openapi_spec_hash: 4dd9388612970bff30995d2a4f53fa59 -config_hash: 1459e41df47cbb91484141371c74dba9 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/dedalus-labs/dedalus-a63ad804ae8ee532d57afae307595dae02d2a6924f83657430b3579193560775.yml +openapi_spec_hash: ccb02923079d91569a17162c88da590b +config_hash: 0e31b0b75cafdbc25febc2b7ca219799 diff --git a/CHANGELOG.md b/CHANGELOG.md index 09496f8..f7ec47b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## 0.4.0 (2026-05-12) + +Full Changelog: [v0.3.0...v0.4.0](https://github.com/dedalus-labs/dedalus-python/compare/v0.3.0...v0.4.0) + +### Features + +* **api:** add usage endpoints/autosleep ([3ebb476](https://github.com/dedalus-labs/dedalus-python/commit/3ebb476fd66187dce852e6efc8c5ea80d095e0dd)) + ## 0.3.0 (2026-05-12) Full Changelog: [v0.2.0...v0.3.0](https://github.com/dedalus-labs/dedalus-python/compare/v0.2.0...v0.3.0) diff --git a/api.md b/api.md index 4e35082..0f1d5dd 100644 --- a/api.md +++ b/api.md @@ -1,24 +1,22 @@ -# Orgs - -## Usage +# Usage Types: ```python -from dedalus_sdk.types.orgs import ( +from dedalus_sdk.types import ( + MachineComputeUsage, + MachineComputeUsageRow, MachineStorageUsage, - MachineStorageUsageEvidence, - MachineUsage, - MachineUsageEvidence, + MachineStorageUsageRow, OrgUsage, ) ``` Methods: -- client.orgs.usage.retrieve(\*, org_id, \*\*params) -> OrgUsage -- client.orgs.usage.get_machine_storage_usage(\*, org_id, \*\*params) -> MachineStorageUsage -- client.orgs.usage.get_machine_usage(\*, org_id, \*\*params) -> MachineUsage +- client.usage.retrieve(\*\*params) -> OrgUsage +- client.usage.machine_compute(\*\*params) -> MachineComputeUsage +- client.usage.machine_storage(\*\*params) -> MachineStorageUsage # Machines diff --git a/pyproject.toml b/pyproject.toml index e76fef6..9fa189c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "dedalus-sdk" -version = "0.3.0" +version = "0.4.0" description = "The official Python library for the Dedalus API" dynamic = ["readme"] license = "MIT" diff --git a/src/dedalus_sdk/_client.py b/src/dedalus_sdk/_client.py index 899c34c..c6dc994 100644 --- a/src/dedalus_sdk/_client.py +++ b/src/dedalus_sdk/_client.py @@ -37,8 +37,8 @@ ) if TYPE_CHECKING: - from .resources import orgs, machines - from .resources.orgs.orgs import OrgsResource, AsyncOrgsResource + from .resources import usage, machines + from .resources.usage import UsageResource, AsyncUsageResource from .resources.machines.machines import MachinesResource, AsyncMachinesResource __all__ = ["Timeout", "Transport", "ProxiesTypes", "RequestOptions", "Dedalus", "AsyncDedalus", "Client", "AsyncClient"] @@ -135,10 +135,10 @@ def __init__( self._default_stream_cls = Stream @cached_property - def orgs(self) -> OrgsResource: - from .resources.orgs import OrgsResource + def usage(self) -> UsageResource: + from .resources.usage import UsageResource - return OrgsResource(self) + return UsageResource(self) @cached_property def machines(self) -> MachinesResource: @@ -384,10 +384,10 @@ def __init__( self._default_stream_cls = AsyncStream @cached_property - def orgs(self) -> AsyncOrgsResource: - from .resources.orgs import AsyncOrgsResource + def usage(self) -> AsyncUsageResource: + from .resources.usage import AsyncUsageResource - return AsyncOrgsResource(self) + return AsyncUsageResource(self) @cached_property def machines(self) -> AsyncMachinesResource: @@ -549,10 +549,10 @@ def __init__(self, client: Dedalus) -> None: self._client = client @cached_property - def orgs(self) -> orgs.OrgsResourceWithRawResponse: - from .resources.orgs import OrgsResourceWithRawResponse + def usage(self) -> usage.UsageResourceWithRawResponse: + from .resources.usage import UsageResourceWithRawResponse - return OrgsResourceWithRawResponse(self._client.orgs) + return UsageResourceWithRawResponse(self._client.usage) @cached_property def machines(self) -> machines.MachinesResourceWithRawResponse: @@ -568,10 +568,10 @@ def __init__(self, client: AsyncDedalus) -> None: self._client = client @cached_property - def orgs(self) -> orgs.AsyncOrgsResourceWithRawResponse: - from .resources.orgs import AsyncOrgsResourceWithRawResponse + def usage(self) -> usage.AsyncUsageResourceWithRawResponse: + from .resources.usage import AsyncUsageResourceWithRawResponse - return AsyncOrgsResourceWithRawResponse(self._client.orgs) + return AsyncUsageResourceWithRawResponse(self._client.usage) @cached_property def machines(self) -> machines.AsyncMachinesResourceWithRawResponse: @@ -587,10 +587,10 @@ def __init__(self, client: Dedalus) -> None: self._client = client @cached_property - def orgs(self) -> orgs.OrgsResourceWithStreamingResponse: - from .resources.orgs import OrgsResourceWithStreamingResponse + def usage(self) -> usage.UsageResourceWithStreamingResponse: + from .resources.usage import UsageResourceWithStreamingResponse - return OrgsResourceWithStreamingResponse(self._client.orgs) + return UsageResourceWithStreamingResponse(self._client.usage) @cached_property def machines(self) -> machines.MachinesResourceWithStreamingResponse: @@ -606,10 +606,10 @@ def __init__(self, client: AsyncDedalus) -> None: self._client = client @cached_property - def orgs(self) -> orgs.AsyncOrgsResourceWithStreamingResponse: - from .resources.orgs import AsyncOrgsResourceWithStreamingResponse + def usage(self) -> usage.AsyncUsageResourceWithStreamingResponse: + from .resources.usage import AsyncUsageResourceWithStreamingResponse - return AsyncOrgsResourceWithStreamingResponse(self._client.orgs) + return AsyncUsageResourceWithStreamingResponse(self._client.usage) @cached_property def machines(self) -> machines.AsyncMachinesResourceWithStreamingResponse: diff --git a/src/dedalus_sdk/_version.py b/src/dedalus_sdk/_version.py index 5167202..ff44f48 100644 --- a/src/dedalus_sdk/_version.py +++ b/src/dedalus_sdk/_version.py @@ -1,4 +1,4 @@ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. __title__ = "dedalus_sdk" -__version__ = "0.3.0" # x-release-please-version +__version__ = "0.4.0" # x-release-please-version diff --git a/src/dedalus_sdk/resources/__init__.py b/src/dedalus_sdk/resources/__init__.py index 5b131fd..5365a1e 100644 --- a/src/dedalus_sdk/resources/__init__.py +++ b/src/dedalus_sdk/resources/__init__.py @@ -1,12 +1,12 @@ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. -from .orgs import ( - OrgsResource, - AsyncOrgsResource, - OrgsResourceWithRawResponse, - AsyncOrgsResourceWithRawResponse, - OrgsResourceWithStreamingResponse, - AsyncOrgsResourceWithStreamingResponse, +from .usage import ( + UsageResource, + AsyncUsageResource, + UsageResourceWithRawResponse, + AsyncUsageResourceWithRawResponse, + UsageResourceWithStreamingResponse, + AsyncUsageResourceWithStreamingResponse, ) from .machines import ( MachinesResource, @@ -18,12 +18,12 @@ ) __all__ = [ - "OrgsResource", - "AsyncOrgsResource", - "OrgsResourceWithRawResponse", - "AsyncOrgsResourceWithRawResponse", - "OrgsResourceWithStreamingResponse", - "AsyncOrgsResourceWithStreamingResponse", + "UsageResource", + "AsyncUsageResource", + "UsageResourceWithRawResponse", + "AsyncUsageResourceWithRawResponse", + "UsageResourceWithStreamingResponse", + "AsyncUsageResourceWithStreamingResponse", "MachinesResource", "AsyncMachinesResource", "MachinesResourceWithRawResponse", diff --git a/src/dedalus_sdk/resources/orgs/__init__.py b/src/dedalus_sdk/resources/orgs/__init__.py deleted file mode 100644 index beaab70..0000000 --- a/src/dedalus_sdk/resources/orgs/__init__.py +++ /dev/null @@ -1,33 +0,0 @@ -# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. - -from .orgs import ( - OrgsResource, - AsyncOrgsResource, - OrgsResourceWithRawResponse, - AsyncOrgsResourceWithRawResponse, - OrgsResourceWithStreamingResponse, - AsyncOrgsResourceWithStreamingResponse, -) -from .usage import ( - UsageResource, - AsyncUsageResource, - UsageResourceWithRawResponse, - AsyncUsageResourceWithRawResponse, - UsageResourceWithStreamingResponse, - AsyncUsageResourceWithStreamingResponse, -) - -__all__ = [ - "UsageResource", - "AsyncUsageResource", - "UsageResourceWithRawResponse", - "AsyncUsageResourceWithRawResponse", - "UsageResourceWithStreamingResponse", - "AsyncUsageResourceWithStreamingResponse", - "OrgsResource", - "AsyncOrgsResource", - "OrgsResourceWithRawResponse", - "AsyncOrgsResourceWithRawResponse", - "OrgsResourceWithStreamingResponse", - "AsyncOrgsResourceWithStreamingResponse", -] diff --git a/src/dedalus_sdk/resources/orgs/orgs.py b/src/dedalus_sdk/resources/orgs/orgs.py deleted file mode 100644 index ed577bb..0000000 --- a/src/dedalus_sdk/resources/orgs/orgs.py +++ /dev/null @@ -1,102 +0,0 @@ -# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. - -from __future__ import annotations - -from .usage import ( - UsageResource, - AsyncUsageResource, - UsageResourceWithRawResponse, - AsyncUsageResourceWithRawResponse, - UsageResourceWithStreamingResponse, - AsyncUsageResourceWithStreamingResponse, -) -from ..._compat import cached_property -from ..._resource import SyncAPIResource, AsyncAPIResource - -__all__ = ["OrgsResource", "AsyncOrgsResource"] - - -class OrgsResource(SyncAPIResource): - @cached_property - def usage(self) -> UsageResource: - return UsageResource(self._client) - - @cached_property - def with_raw_response(self) -> OrgsResourceWithRawResponse: - """ - This property can be used as a prefix for any HTTP method call to return - the raw response object instead of the parsed content. - - For more information, see https://www.github.com/dedalus-labs/dedalus-python#accessing-raw-response-data-eg-headers - """ - return OrgsResourceWithRawResponse(self) - - @cached_property - def with_streaming_response(self) -> OrgsResourceWithStreamingResponse: - """ - An alternative to `.with_raw_response` that doesn't eagerly read the response body. - - For more information, see https://www.github.com/dedalus-labs/dedalus-python#with_streaming_response - """ - return OrgsResourceWithStreamingResponse(self) - - -class AsyncOrgsResource(AsyncAPIResource): - @cached_property - def usage(self) -> AsyncUsageResource: - return AsyncUsageResource(self._client) - - @cached_property - def with_raw_response(self) -> AsyncOrgsResourceWithRawResponse: - """ - This property can be used as a prefix for any HTTP method call to return - the raw response object instead of the parsed content. - - For more information, see https://www.github.com/dedalus-labs/dedalus-python#accessing-raw-response-data-eg-headers - """ - return AsyncOrgsResourceWithRawResponse(self) - - @cached_property - def with_streaming_response(self) -> AsyncOrgsResourceWithStreamingResponse: - """ - An alternative to `.with_raw_response` that doesn't eagerly read the response body. - - For more information, see https://www.github.com/dedalus-labs/dedalus-python#with_streaming_response - """ - return AsyncOrgsResourceWithStreamingResponse(self) - - -class OrgsResourceWithRawResponse: - def __init__(self, orgs: OrgsResource) -> None: - self._orgs = orgs - - @cached_property - def usage(self) -> UsageResourceWithRawResponse: - return UsageResourceWithRawResponse(self._orgs.usage) - - -class AsyncOrgsResourceWithRawResponse: - def __init__(self, orgs: AsyncOrgsResource) -> None: - self._orgs = orgs - - @cached_property - def usage(self) -> AsyncUsageResourceWithRawResponse: - return AsyncUsageResourceWithRawResponse(self._orgs.usage) - - -class OrgsResourceWithStreamingResponse: - def __init__(self, orgs: OrgsResource) -> None: - self._orgs = orgs - - @cached_property - def usage(self) -> UsageResourceWithStreamingResponse: - return UsageResourceWithStreamingResponse(self._orgs.usage) - - -class AsyncOrgsResourceWithStreamingResponse: - def __init__(self, orgs: AsyncOrgsResource) -> None: - self._orgs = orgs - - @cached_property - def usage(self) -> AsyncUsageResourceWithStreamingResponse: - return AsyncUsageResourceWithStreamingResponse(self._orgs.usage) diff --git a/src/dedalus_sdk/resources/orgs/usage.py b/src/dedalus_sdk/resources/usage.py similarity index 71% rename from src/dedalus_sdk/resources/orgs/usage.py rename to src/dedalus_sdk/resources/usage.py index dd9bf29..b55009d 100644 --- a/src/dedalus_sdk/resources/orgs/usage.py +++ b/src/dedalus_sdk/resources/usage.py @@ -4,21 +4,21 @@ import httpx -from ..._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from ..._utils import path_template, maybe_transform, async_maybe_transform -from ..._compat import cached_property -from ..._resource import SyncAPIResource, AsyncAPIResource -from ..._response import ( +from ..types import usage_retrieve_params, usage_machine_compute_params, usage_machine_storage_params +from .._types import Body, Omit, Query, Headers, NotGiven, omit, not_given +from .._utils import maybe_transform, async_maybe_transform +from .._compat import cached_property +from .._resource import SyncAPIResource, AsyncAPIResource +from .._response import ( to_raw_response_wrapper, to_streamed_response_wrapper, async_to_raw_response_wrapper, async_to_streamed_response_wrapper, ) -from ...types.orgs import usage_retrieve_params, usage_get_machine_usage_params, usage_get_machine_storage_usage_params -from ..._base_client import make_request_options -from ...types.orgs.org_usage import OrgUsage -from ...types.orgs.machine_usage import MachineUsage -from ...types.orgs.machine_storage_usage import MachineStorageUsage +from .._base_client import make_request_options +from ..types.org_usage import OrgUsage +from ..types.machine_compute_usage import MachineComputeUsage +from ..types.machine_storage_usage import MachineStorageUsage __all__ = ["UsageResource", "AsyncUsageResource"] @@ -46,7 +46,6 @@ def with_streaming_response(self) -> UsageResourceWithStreamingResponse: def retrieve( self, *, - org_id: str, period_start: str | Omit = omit, # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. # The extra values given here take precedence over values defined on the client or passed to this method. @@ -55,11 +54,12 @@ def retrieve( extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, ) -> OrgUsage: - """ - Get org billed machine usage + """Get usage summary Args: - period_start: Billing period start (YYYY-MM-DD). Defaults to first of current month. + period_start: Billing period start (YYYY-MM-DD). + + Defaults to first of current month. extra_headers: Send extra headers @@ -69,10 +69,8 @@ def retrieve( timeout: Override the client-level default timeout for this request, in seconds """ - if not org_id: - raise ValueError(f"Expected a non-empty value for `org_id` but received {org_id!r}") return self._get( - path_template("/v1/orgs/{org_id}/usage", org_id=org_id), + "/v1/usage", options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -83,10 +81,10 @@ def retrieve( cast_to=OrgUsage, ) - def get_machine_storage_usage( + def machine_compute( self, *, - org_id: str, + granularity: str | Omit = omit, machine_id: str | Omit = omit, period_end: str | Omit = omit, period_start: str | Omit = omit, @@ -96,16 +94,18 @@ def get_machine_storage_usage( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> MachineStorageUsage: + ) -> MachineComputeUsage: """ - List machine storage usage evidence + List machine compute usage breakdown Args: + granularity: Usage breakdown granularity: hour or day. Defaults to hour. + machine_id: Optional machine ID filter. - period_end: Last UTC evidence date to include (YYYY-MM-DD). Defaults to current time. + period_end: Last UTC usage date to include (YYYY-MM-DD). Defaults to current time. - period_start: Evidence period start (YYYY-MM-DD). Defaults to first of current month. + period_start: Usage period start (YYYY-MM-DD). Defaults to first of current month. extra_headers: Send extra headers @@ -115,10 +115,8 @@ def get_machine_storage_usage( timeout: Override the client-level default timeout for this request, in seconds """ - if not org_id: - raise ValueError(f"Expected a non-empty value for `org_id` but received {org_id!r}") return self._get( - path_template("/v1/orgs/{org_id}/usage/storage/machines", org_id=org_id), + "/v1/usage/machines/compute", options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -126,21 +124,20 @@ def get_machine_storage_usage( timeout=timeout, query=maybe_transform( { + "granularity": granularity, "machine_id": machine_id, "period_end": period_end, "period_start": period_start, }, - usage_get_machine_storage_usage_params.UsageGetMachineStorageUsageParams, + usage_machine_compute_params.UsageMachineComputeParams, ), ), - cast_to=MachineStorageUsage, + cast_to=MachineComputeUsage, ) - def get_machine_usage( + def machine_storage( self, *, - org_id: str, - granularity: str | Omit = omit, machine_id: str | Omit = omit, period_end: str | Omit = omit, period_start: str | Omit = omit, @@ -150,18 +147,16 @@ def get_machine_usage( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> MachineUsage: + ) -> MachineStorageUsage: """ - List machine usage evidence + List machine storage usage breakdown Args: - granularity: Evidence granularity: hour or day. Defaults to hour. - machine_id: Optional machine ID filter. - period_end: Last UTC evidence date to include (YYYY-MM-DD). Defaults to current time. + period_end: Last UTC usage date to include (YYYY-MM-DD). Defaults to current time. - period_start: Evidence period start (YYYY-MM-DD). Defaults to first of current month. + period_start: Usage period start (YYYY-MM-DD). Defaults to first of current month. extra_headers: Send extra headers @@ -171,10 +166,8 @@ def get_machine_usage( timeout: Override the client-level default timeout for this request, in seconds """ - if not org_id: - raise ValueError(f"Expected a non-empty value for `org_id` but received {org_id!r}") return self._get( - path_template("/v1/orgs/{org_id}/usage/machines", org_id=org_id), + "/v1/usage/machines/storage", options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -182,15 +175,14 @@ def get_machine_usage( timeout=timeout, query=maybe_transform( { - "granularity": granularity, "machine_id": machine_id, "period_end": period_end, "period_start": period_start, }, - usage_get_machine_usage_params.UsageGetMachineUsageParams, + usage_machine_storage_params.UsageMachineStorageParams, ), ), - cast_to=MachineUsage, + cast_to=MachineStorageUsage, ) @@ -217,7 +209,6 @@ def with_streaming_response(self) -> AsyncUsageResourceWithStreamingResponse: async def retrieve( self, *, - org_id: str, period_start: str | Omit = omit, # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. # The extra values given here take precedence over values defined on the client or passed to this method. @@ -226,11 +217,12 @@ async def retrieve( extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, ) -> OrgUsage: - """ - Get org billed machine usage + """Get usage summary Args: - period_start: Billing period start (YYYY-MM-DD). Defaults to first of current month. + period_start: Billing period start (YYYY-MM-DD). + + Defaults to first of current month. extra_headers: Send extra headers @@ -240,10 +232,8 @@ async def retrieve( timeout: Override the client-level default timeout for this request, in seconds """ - if not org_id: - raise ValueError(f"Expected a non-empty value for `org_id` but received {org_id!r}") return await self._get( - path_template("/v1/orgs/{org_id}/usage", org_id=org_id), + "/v1/usage", options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -256,10 +246,10 @@ async def retrieve( cast_to=OrgUsage, ) - async def get_machine_storage_usage( + async def machine_compute( self, *, - org_id: str, + granularity: str | Omit = omit, machine_id: str | Omit = omit, period_end: str | Omit = omit, period_start: str | Omit = omit, @@ -269,16 +259,18 @@ async def get_machine_storage_usage( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> MachineStorageUsage: + ) -> MachineComputeUsage: """ - List machine storage usage evidence + List machine compute usage breakdown Args: + granularity: Usage breakdown granularity: hour or day. Defaults to hour. + machine_id: Optional machine ID filter. - period_end: Last UTC evidence date to include (YYYY-MM-DD). Defaults to current time. + period_end: Last UTC usage date to include (YYYY-MM-DD). Defaults to current time. - period_start: Evidence period start (YYYY-MM-DD). Defaults to first of current month. + period_start: Usage period start (YYYY-MM-DD). Defaults to first of current month. extra_headers: Send extra headers @@ -288,10 +280,8 @@ async def get_machine_storage_usage( timeout: Override the client-level default timeout for this request, in seconds """ - if not org_id: - raise ValueError(f"Expected a non-empty value for `org_id` but received {org_id!r}") return await self._get( - path_template("/v1/orgs/{org_id}/usage/storage/machines", org_id=org_id), + "/v1/usage/machines/compute", options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -299,21 +289,20 @@ async def get_machine_storage_usage( timeout=timeout, query=await async_maybe_transform( { + "granularity": granularity, "machine_id": machine_id, "period_end": period_end, "period_start": period_start, }, - usage_get_machine_storage_usage_params.UsageGetMachineStorageUsageParams, + usage_machine_compute_params.UsageMachineComputeParams, ), ), - cast_to=MachineStorageUsage, + cast_to=MachineComputeUsage, ) - async def get_machine_usage( + async def machine_storage( self, *, - org_id: str, - granularity: str | Omit = omit, machine_id: str | Omit = omit, period_end: str | Omit = omit, period_start: str | Omit = omit, @@ -323,18 +312,16 @@ async def get_machine_usage( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> MachineUsage: + ) -> MachineStorageUsage: """ - List machine usage evidence + List machine storage usage breakdown Args: - granularity: Evidence granularity: hour or day. Defaults to hour. - machine_id: Optional machine ID filter. - period_end: Last UTC evidence date to include (YYYY-MM-DD). Defaults to current time. + period_end: Last UTC usage date to include (YYYY-MM-DD). Defaults to current time. - period_start: Evidence period start (YYYY-MM-DD). Defaults to first of current month. + period_start: Usage period start (YYYY-MM-DD). Defaults to first of current month. extra_headers: Send extra headers @@ -344,10 +331,8 @@ async def get_machine_usage( timeout: Override the client-level default timeout for this request, in seconds """ - if not org_id: - raise ValueError(f"Expected a non-empty value for `org_id` but received {org_id!r}") return await self._get( - path_template("/v1/orgs/{org_id}/usage/machines", org_id=org_id), + "/v1/usage/machines/storage", options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -355,15 +340,14 @@ async def get_machine_usage( timeout=timeout, query=await async_maybe_transform( { - "granularity": granularity, "machine_id": machine_id, "period_end": period_end, "period_start": period_start, }, - usage_get_machine_usage_params.UsageGetMachineUsageParams, + usage_machine_storage_params.UsageMachineStorageParams, ), ), - cast_to=MachineUsage, + cast_to=MachineStorageUsage, ) @@ -374,11 +358,11 @@ def __init__(self, usage: UsageResource) -> None: self.retrieve = to_raw_response_wrapper( usage.retrieve, ) - self.get_machine_storage_usage = to_raw_response_wrapper( - usage.get_machine_storage_usage, + self.machine_compute = to_raw_response_wrapper( + usage.machine_compute, ) - self.get_machine_usage = to_raw_response_wrapper( - usage.get_machine_usage, + self.machine_storage = to_raw_response_wrapper( + usage.machine_storage, ) @@ -389,11 +373,11 @@ def __init__(self, usage: AsyncUsageResource) -> None: self.retrieve = async_to_raw_response_wrapper( usage.retrieve, ) - self.get_machine_storage_usage = async_to_raw_response_wrapper( - usage.get_machine_storage_usage, + self.machine_compute = async_to_raw_response_wrapper( + usage.machine_compute, ) - self.get_machine_usage = async_to_raw_response_wrapper( - usage.get_machine_usage, + self.machine_storage = async_to_raw_response_wrapper( + usage.machine_storage, ) @@ -404,11 +388,11 @@ def __init__(self, usage: UsageResource) -> None: self.retrieve = to_streamed_response_wrapper( usage.retrieve, ) - self.get_machine_storage_usage = to_streamed_response_wrapper( - usage.get_machine_storage_usage, + self.machine_compute = to_streamed_response_wrapper( + usage.machine_compute, ) - self.get_machine_usage = to_streamed_response_wrapper( - usage.get_machine_usage, + self.machine_storage = to_streamed_response_wrapper( + usage.machine_storage, ) @@ -419,9 +403,9 @@ def __init__(self, usage: AsyncUsageResource) -> None: self.retrieve = async_to_streamed_response_wrapper( usage.retrieve, ) - self.get_machine_storage_usage = async_to_streamed_response_wrapper( - usage.get_machine_storage_usage, + self.machine_compute = async_to_streamed_response_wrapper( + usage.machine_compute, ) - self.get_machine_usage = async_to_streamed_response_wrapper( - usage.get_machine_usage, + self.machine_storage = async_to_streamed_response_wrapper( + usage.machine_storage, ) diff --git a/src/dedalus_sdk/types/__init__.py b/src/dedalus_sdk/types/__init__.py index f4d8525..446e783 100644 --- a/src/dedalus_sdk/types/__init__.py +++ b/src/dedalus_sdk/types/__init__.py @@ -3,14 +3,22 @@ from __future__ import annotations from .machine import Machine as Machine +from .org_usage import OrgUsage as OrgUsage from .machine_list import MachineList as MachineList from .lifecycle_status import LifecycleStatus as LifecycleStatus from .machine_list_item import MachineListItem as MachineListItem from .machine_list_params import MachineListParams as MachineListParams +from .machine_compute_usage import MachineComputeUsage as MachineComputeUsage from .machine_create_params import MachineCreateParams as MachineCreateParams +from .machine_storage_usage import MachineStorageUsage as MachineStorageUsage from .machine_update_params import MachineUpdateParams as MachineUpdateParams +from .usage_retrieve_params import UsageRetrieveParams as UsageRetrieveParams from .websocket_reconnection import ( ReconnectingEvent as ReconnectingEvent, ReconnectingOverrides as ReconnectingOverrides, ) +from .machine_compute_usage_row import MachineComputeUsageRow as MachineComputeUsageRow +from .machine_storage_usage_row import MachineStorageUsageRow as MachineStorageUsageRow +from .usage_machine_compute_params import UsageMachineComputeParams as UsageMachineComputeParams +from .usage_machine_storage_params import UsageMachineStorageParams as UsageMachineStorageParams from .websocket_connection_options import WebSocketConnectionOptions as WebSocketConnectionOptions diff --git a/src/dedalus_sdk/types/machine_compute_usage.py b/src/dedalus_sdk/types/machine_compute_usage.py new file mode 100644 index 0000000..d762f4f --- /dev/null +++ b/src/dedalus_sdk/types/machine_compute_usage.py @@ -0,0 +1,23 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from typing import List, Optional +from datetime import datetime + +from .._models import BaseModel +from .machine_compute_usage_row import MachineComputeUsageRow + +__all__ = ["MachineComputeUsage"] + + +class MachineComputeUsage(BaseModel): + granularity: str + """Usage breakdown granularity used for rows: hour or day.""" + + period_end: datetime + """Exclusive usage period end.""" + + period_start: datetime + """Inclusive usage period start.""" + + rows: Optional[List[MachineComputeUsageRow]] = None + """Machine-level compute usage breakdown rows.""" diff --git a/src/dedalus_sdk/types/orgs/machine_usage_evidence.py b/src/dedalus_sdk/types/machine_compute_usage_row.py similarity index 73% rename from src/dedalus_sdk/types/orgs/machine_usage_evidence.py rename to src/dedalus_sdk/types/machine_compute_usage_row.py index 805d147..dad85a9 100644 --- a/src/dedalus_sdk/types/orgs/machine_usage_evidence.py +++ b/src/dedalus_sdk/types/machine_compute_usage_row.py @@ -3,23 +3,23 @@ from typing import List, Optional from datetime import datetime -from ..._models import BaseModel +from .._models import BaseModel -__all__ = ["MachineUsageEvidence"] +__all__ = ["MachineComputeUsageRow"] -class MachineUsageEvidence(BaseModel): +class MachineComputeUsageRow(BaseModel): awake_seconds: int """Machine-awake seconds in this bucket.""" bucket_end: datetime - """Exclusive evidence bucket end.""" + """Exclusive usage bucket end.""" bucket_start: datetime - """Inclusive evidence bucket start.""" + """Inclusive usage bucket start.""" cpu_millicore_seconds: int - """Requested vCPU millicores multiplied by active CPU seconds.""" + """Requested vCPU millicores multiplied by guest-owned active CPU seconds.""" last_window_end: datetime """Latest raw window_end represented by this row.""" @@ -28,10 +28,10 @@ class MachineUsageEvidence(BaseModel): """Machine identifier.""" memory_mib_seconds: int - """Requested memory MiB multiplied by awake seconds.""" + """Requested memory MiB multiplied by running allocation seconds.""" org_metering_bucket_ids: Optional[List[str]] = None - """Org compute bucket IDs this evidence row contributes to.""" + """Org compute bucket IDs this row contributes to.""" requested_memory_mib: int """Requested memory for this shape, in MiB.""" @@ -52,7 +52,7 @@ class MachineUsageEvidence(BaseModel): """Stripe memory meter event identifiers linked to those org buckets.""" window_count: int - """Raw usage windows compacted into this evidence row.""" + """Raw usage windows compacted into this row.""" latest_stripe_emitted_at: Optional[datetime] = None """Latest Stripe emission timestamp for linked org buckets, when emitted.""" diff --git a/src/dedalus_sdk/types/machine_storage_usage.py b/src/dedalus_sdk/types/machine_storage_usage.py new file mode 100644 index 0000000..795d271 --- /dev/null +++ b/src/dedalus_sdk/types/machine_storage_usage.py @@ -0,0 +1,20 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from typing import List, Optional +from datetime import datetime + +from .._models import BaseModel +from .machine_storage_usage_row import MachineStorageUsageRow + +__all__ = ["MachineStorageUsage"] + + +class MachineStorageUsage(BaseModel): + period_end: datetime + """Exclusive usage period end.""" + + period_start: datetime + """Inclusive usage period start.""" + + rows: Optional[List[MachineStorageUsageRow]] = None + """Machine-level storage usage breakdown rows.""" diff --git a/src/dedalus_sdk/types/orgs/machine_storage_usage_evidence.py b/src/dedalus_sdk/types/machine_storage_usage_row.py similarity index 72% rename from src/dedalus_sdk/types/orgs/machine_storage_usage_evidence.py rename to src/dedalus_sdk/types/machine_storage_usage_row.py index f38c2b2..88becc2 100644 --- a/src/dedalus_sdk/types/orgs/machine_storage_usage_evidence.py +++ b/src/dedalus_sdk/types/machine_storage_usage_row.py @@ -3,17 +3,17 @@ from typing import Optional from datetime import datetime -from ..._models import BaseModel +from .._models import BaseModel -__all__ = ["MachineStorageUsageEvidence"] +__all__ = ["MachineStorageUsageRow"] -class MachineStorageUsageEvidence(BaseModel): +class MachineStorageUsageRow(BaseModel): bucket_end: datetime - """Exclusive evidence bucket end.""" + """Exclusive usage bucket end.""" bucket_start: datetime - """Inclusive evidence bucket start.""" + """Inclusive usage bucket start.""" logical_storage_bytes: int """Machine logical bytes observed for storage allocation.""" @@ -22,7 +22,7 @@ class MachineStorageUsageEvidence(BaseModel): """Machine identifier.""" org_metering_bucket_id: str - """Org storage bucket ID this evidence row contributes to.""" + """Org storage bucket ID this row contributes to.""" storage_mib_seconds: int """Allocated logical MiB-seconds for this machine.""" diff --git a/src/dedalus_sdk/types/orgs/org_usage.py b/src/dedalus_sdk/types/org_usage.py similarity index 77% rename from src/dedalus_sdk/types/orgs/org_usage.py rename to src/dedalus_sdk/types/org_usage.py index d61ee23..482c546 100644 --- a/src/dedalus_sdk/types/orgs/org_usage.py +++ b/src/dedalus_sdk/types/org_usage.py @@ -1,6 +1,6 @@ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. -from ..._models import BaseModel +from .._models import BaseModel __all__ = ["OrgUsage"] @@ -11,8 +11,8 @@ class OrgUsage(BaseModel): billed_cpu_millicore_seconds: int """ - Closed requested vCPU millicores multiplied by active CPU seconds for the - period. + Closed requested vCPU millicores multiplied by guest-owned active CPU seconds + for the period. """ billed_logical_storage_mib_seconds: int @@ -22,7 +22,10 @@ class OrgUsage(BaseModel): """ billed_memory_mib_seconds: int - """Closed requested memory MiB multiplied by awake seconds for the period.""" + """ + Closed requested memory MiB multiplied by running allocation seconds for the + period. + """ included_storage_gib: int """Plan-included storage in GiB, used as a local guardrail only.""" diff --git a/src/dedalus_sdk/types/orgs/__init__.py b/src/dedalus_sdk/types/orgs/__init__.py deleted file mode 100644 index d788a05..0000000 --- a/src/dedalus_sdk/types/orgs/__init__.py +++ /dev/null @@ -1,14 +0,0 @@ -# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. - -from __future__ import annotations - -from .org_usage import OrgUsage as OrgUsage -from .machine_usage import MachineUsage as MachineUsage -from .machine_storage_usage import MachineStorageUsage as MachineStorageUsage -from .usage_retrieve_params import UsageRetrieveParams as UsageRetrieveParams -from .machine_usage_evidence import MachineUsageEvidence as MachineUsageEvidence -from .machine_storage_usage_evidence import MachineStorageUsageEvidence as MachineStorageUsageEvidence -from .usage_get_machine_usage_params import UsageGetMachineUsageParams as UsageGetMachineUsageParams -from .usage_get_machine_storage_usage_params import ( - UsageGetMachineStorageUsageParams as UsageGetMachineStorageUsageParams, -) diff --git a/src/dedalus_sdk/types/orgs/machine_storage_usage.py b/src/dedalus_sdk/types/orgs/machine_storage_usage.py deleted file mode 100644 index 60d25f4..0000000 --- a/src/dedalus_sdk/types/orgs/machine_storage_usage.py +++ /dev/null @@ -1,20 +0,0 @@ -# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. - -from typing import List, Optional -from datetime import datetime - -from ..._models import BaseModel -from .machine_storage_usage_evidence import MachineStorageUsageEvidence - -__all__ = ["MachineStorageUsage"] - - -class MachineStorageUsage(BaseModel): - period_end: datetime - """Exclusive evidence period end.""" - - period_start: datetime - """Inclusive evidence period start.""" - - rows: Optional[List[MachineStorageUsageEvidence]] = None - """Machine-level storage usage evidence rows.""" diff --git a/src/dedalus_sdk/types/orgs/machine_usage.py b/src/dedalus_sdk/types/orgs/machine_usage.py deleted file mode 100644 index 0f40345..0000000 --- a/src/dedalus_sdk/types/orgs/machine_usage.py +++ /dev/null @@ -1,23 +0,0 @@ -# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. - -from typing import List, Optional -from datetime import datetime - -from ..._models import BaseModel -from .machine_usage_evidence import MachineUsageEvidence - -__all__ = ["MachineUsage"] - - -class MachineUsage(BaseModel): - granularity: str - """Evidence granularity used for rows: hour or day.""" - - period_end: datetime - """Exclusive evidence period end.""" - - period_start: datetime - """Inclusive evidence period start.""" - - rows: Optional[List[MachineUsageEvidence]] = None - """Machine-level usage evidence rows.""" diff --git a/src/dedalus_sdk/types/orgs/usage_get_machine_storage_usage_params.py b/src/dedalus_sdk/types/orgs/usage_get_machine_storage_usage_params.py deleted file mode 100644 index 1e8b263..0000000 --- a/src/dedalus_sdk/types/orgs/usage_get_machine_storage_usage_params.py +++ /dev/null @@ -1,20 +0,0 @@ -# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. - -from __future__ import annotations - -from typing_extensions import Required, TypedDict - -__all__ = ["UsageGetMachineStorageUsageParams"] - - -class UsageGetMachineStorageUsageParams(TypedDict, total=False): - org_id: Required[str] - - machine_id: str - """Optional machine ID filter.""" - - period_end: str - """Last UTC evidence date to include (YYYY-MM-DD). Defaults to current time.""" - - period_start: str - """Evidence period start (YYYY-MM-DD). Defaults to first of current month.""" diff --git a/src/dedalus_sdk/types/orgs/usage_get_machine_usage_params.py b/src/dedalus_sdk/types/orgs/usage_get_machine_usage_params.py deleted file mode 100644 index bafc90c..0000000 --- a/src/dedalus_sdk/types/orgs/usage_get_machine_usage_params.py +++ /dev/null @@ -1,23 +0,0 @@ -# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. - -from __future__ import annotations - -from typing_extensions import Required, TypedDict - -__all__ = ["UsageGetMachineUsageParams"] - - -class UsageGetMachineUsageParams(TypedDict, total=False): - org_id: Required[str] - - granularity: str - """Evidence granularity: hour or day. Defaults to hour.""" - - machine_id: str - """Optional machine ID filter.""" - - period_end: str - """Last UTC evidence date to include (YYYY-MM-DD). Defaults to current time.""" - - period_start: str - """Evidence period start (YYYY-MM-DD). Defaults to first of current month.""" diff --git a/src/dedalus_sdk/types/usage_machine_compute_params.py b/src/dedalus_sdk/types/usage_machine_compute_params.py new file mode 100644 index 0000000..9cc30c0 --- /dev/null +++ b/src/dedalus_sdk/types/usage_machine_compute_params.py @@ -0,0 +1,21 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from __future__ import annotations + +from typing_extensions import TypedDict + +__all__ = ["UsageMachineComputeParams"] + + +class UsageMachineComputeParams(TypedDict, total=False): + granularity: str + """Usage breakdown granularity: hour or day. Defaults to hour.""" + + machine_id: str + """Optional machine ID filter.""" + + period_end: str + """Last UTC usage date to include (YYYY-MM-DD). Defaults to current time.""" + + period_start: str + """Usage period start (YYYY-MM-DD). Defaults to first of current month.""" diff --git a/src/dedalus_sdk/types/usage_machine_storage_params.py b/src/dedalus_sdk/types/usage_machine_storage_params.py new file mode 100644 index 0000000..35d8e07 --- /dev/null +++ b/src/dedalus_sdk/types/usage_machine_storage_params.py @@ -0,0 +1,18 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from __future__ import annotations + +from typing_extensions import TypedDict + +__all__ = ["UsageMachineStorageParams"] + + +class UsageMachineStorageParams(TypedDict, total=False): + machine_id: str + """Optional machine ID filter.""" + + period_end: str + """Last UTC usage date to include (YYYY-MM-DD). Defaults to current time.""" + + period_start: str + """Usage period start (YYYY-MM-DD). Defaults to first of current month.""" diff --git a/src/dedalus_sdk/types/orgs/usage_retrieve_params.py b/src/dedalus_sdk/types/usage_retrieve_params.py similarity index 80% rename from src/dedalus_sdk/types/orgs/usage_retrieve_params.py rename to src/dedalus_sdk/types/usage_retrieve_params.py index 429b805..5170bf1 100644 --- a/src/dedalus_sdk/types/orgs/usage_retrieve_params.py +++ b/src/dedalus_sdk/types/usage_retrieve_params.py @@ -2,13 +2,11 @@ from __future__ import annotations -from typing_extensions import Required, TypedDict +from typing_extensions import TypedDict __all__ = ["UsageRetrieveParams"] class UsageRetrieveParams(TypedDict, total=False): - org_id: Required[str] - period_start: str """Billing period start (YYYY-MM-DD). Defaults to first of current month.""" diff --git a/tests/api_resources/orgs/__init__.py b/tests/api_resources/orgs/__init__.py deleted file mode 100644 index fd8019a..0000000 --- a/tests/api_resources/orgs/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. diff --git a/tests/api_resources/orgs/test_usage.py b/tests/api_resources/orgs/test_usage.py deleted file mode 100644 index 1d6d9d1..0000000 --- a/tests/api_resources/orgs/test_usage.py +++ /dev/null @@ -1,314 +0,0 @@ -# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. - -from __future__ import annotations - -import os -from typing import Any, cast - -import pytest - -from dedalus_sdk import Dedalus, AsyncDedalus -from tests.utils import assert_matches_type -from dedalus_sdk.types.orgs import ( - OrgUsage, - MachineUsage, - MachineStorageUsage, -) - -base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010") - - -class TestUsage: - parametrize = pytest.mark.parametrize("client", [False, True], indirect=True, ids=["loose", "strict"]) - - @parametrize - def test_method_retrieve(self, client: Dedalus) -> None: - usage = client.orgs.usage.retrieve( - org_id="org_id", - ) - assert_matches_type(OrgUsage, usage, path=["response"]) - - @parametrize - def test_method_retrieve_with_all_params(self, client: Dedalus) -> None: - usage = client.orgs.usage.retrieve( - org_id="org_id", - period_start="period_start", - ) - assert_matches_type(OrgUsage, usage, path=["response"]) - - @parametrize - def test_raw_response_retrieve(self, client: Dedalus) -> None: - response = client.orgs.usage.with_raw_response.retrieve( - org_id="org_id", - ) - - assert response.is_closed is True - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - usage = response.parse() - assert_matches_type(OrgUsage, usage, path=["response"]) - - @parametrize - def test_streaming_response_retrieve(self, client: Dedalus) -> None: - with client.orgs.usage.with_streaming_response.retrieve( - org_id="org_id", - ) as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - - usage = response.parse() - assert_matches_type(OrgUsage, usage, path=["response"]) - - assert cast(Any, response.is_closed) is True - - @parametrize - def test_path_params_retrieve(self, client: Dedalus) -> None: - with pytest.raises(ValueError, match=r"Expected a non-empty value for `org_id` but received ''"): - client.orgs.usage.with_raw_response.retrieve( - org_id="", - ) - - @parametrize - def test_method_get_machine_storage_usage(self, client: Dedalus) -> None: - usage = client.orgs.usage.get_machine_storage_usage( - org_id="org_id", - ) - assert_matches_type(MachineStorageUsage, usage, path=["response"]) - - @parametrize - def test_method_get_machine_storage_usage_with_all_params(self, client: Dedalus) -> None: - usage = client.orgs.usage.get_machine_storage_usage( - org_id="org_id", - machine_id="machine_id", - period_end="period_end", - period_start="period_start", - ) - assert_matches_type(MachineStorageUsage, usage, path=["response"]) - - @parametrize - def test_raw_response_get_machine_storage_usage(self, client: Dedalus) -> None: - response = client.orgs.usage.with_raw_response.get_machine_storage_usage( - org_id="org_id", - ) - - assert response.is_closed is True - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - usage = response.parse() - assert_matches_type(MachineStorageUsage, usage, path=["response"]) - - @parametrize - def test_streaming_response_get_machine_storage_usage(self, client: Dedalus) -> None: - with client.orgs.usage.with_streaming_response.get_machine_storage_usage( - org_id="org_id", - ) as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - - usage = response.parse() - assert_matches_type(MachineStorageUsage, usage, path=["response"]) - - assert cast(Any, response.is_closed) is True - - @parametrize - def test_path_params_get_machine_storage_usage(self, client: Dedalus) -> None: - with pytest.raises(ValueError, match=r"Expected a non-empty value for `org_id` but received ''"): - client.orgs.usage.with_raw_response.get_machine_storage_usage( - org_id="", - ) - - @parametrize - def test_method_get_machine_usage(self, client: Dedalus) -> None: - usage = client.orgs.usage.get_machine_usage( - org_id="org_id", - ) - assert_matches_type(MachineUsage, usage, path=["response"]) - - @parametrize - def test_method_get_machine_usage_with_all_params(self, client: Dedalus) -> None: - usage = client.orgs.usage.get_machine_usage( - org_id="org_id", - granularity="granularity", - machine_id="machine_id", - period_end="period_end", - period_start="period_start", - ) - assert_matches_type(MachineUsage, usage, path=["response"]) - - @parametrize - def test_raw_response_get_machine_usage(self, client: Dedalus) -> None: - response = client.orgs.usage.with_raw_response.get_machine_usage( - org_id="org_id", - ) - - assert response.is_closed is True - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - usage = response.parse() - assert_matches_type(MachineUsage, usage, path=["response"]) - - @parametrize - def test_streaming_response_get_machine_usage(self, client: Dedalus) -> None: - with client.orgs.usage.with_streaming_response.get_machine_usage( - org_id="org_id", - ) as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - - usage = response.parse() - assert_matches_type(MachineUsage, usage, path=["response"]) - - assert cast(Any, response.is_closed) is True - - @parametrize - def test_path_params_get_machine_usage(self, client: Dedalus) -> None: - with pytest.raises(ValueError, match=r"Expected a non-empty value for `org_id` but received ''"): - client.orgs.usage.with_raw_response.get_machine_usage( - org_id="", - ) - - -class TestAsyncUsage: - parametrize = pytest.mark.parametrize( - "async_client", [False, True, {"http_client": "aiohttp"}], indirect=True, ids=["loose", "strict", "aiohttp"] - ) - - @parametrize - async def test_method_retrieve(self, async_client: AsyncDedalus) -> None: - usage = await async_client.orgs.usage.retrieve( - org_id="org_id", - ) - assert_matches_type(OrgUsage, usage, path=["response"]) - - @parametrize - async def test_method_retrieve_with_all_params(self, async_client: AsyncDedalus) -> None: - usage = await async_client.orgs.usage.retrieve( - org_id="org_id", - period_start="period_start", - ) - assert_matches_type(OrgUsage, usage, path=["response"]) - - @parametrize - async def test_raw_response_retrieve(self, async_client: AsyncDedalus) -> None: - response = await async_client.orgs.usage.with_raw_response.retrieve( - org_id="org_id", - ) - - assert response.is_closed is True - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - usage = await response.parse() - assert_matches_type(OrgUsage, usage, path=["response"]) - - @parametrize - async def test_streaming_response_retrieve(self, async_client: AsyncDedalus) -> None: - async with async_client.orgs.usage.with_streaming_response.retrieve( - org_id="org_id", - ) as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - - usage = await response.parse() - assert_matches_type(OrgUsage, usage, path=["response"]) - - assert cast(Any, response.is_closed) is True - - @parametrize - async def test_path_params_retrieve(self, async_client: AsyncDedalus) -> None: - with pytest.raises(ValueError, match=r"Expected a non-empty value for `org_id` but received ''"): - await async_client.orgs.usage.with_raw_response.retrieve( - org_id="", - ) - - @parametrize - async def test_method_get_machine_storage_usage(self, async_client: AsyncDedalus) -> None: - usage = await async_client.orgs.usage.get_machine_storage_usage( - org_id="org_id", - ) - assert_matches_type(MachineStorageUsage, usage, path=["response"]) - - @parametrize - async def test_method_get_machine_storage_usage_with_all_params(self, async_client: AsyncDedalus) -> None: - usage = await async_client.orgs.usage.get_machine_storage_usage( - org_id="org_id", - machine_id="machine_id", - period_end="period_end", - period_start="period_start", - ) - assert_matches_type(MachineStorageUsage, usage, path=["response"]) - - @parametrize - async def test_raw_response_get_machine_storage_usage(self, async_client: AsyncDedalus) -> None: - response = await async_client.orgs.usage.with_raw_response.get_machine_storage_usage( - org_id="org_id", - ) - - assert response.is_closed is True - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - usage = await response.parse() - assert_matches_type(MachineStorageUsage, usage, path=["response"]) - - @parametrize - async def test_streaming_response_get_machine_storage_usage(self, async_client: AsyncDedalus) -> None: - async with async_client.orgs.usage.with_streaming_response.get_machine_storage_usage( - org_id="org_id", - ) as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - - usage = await response.parse() - assert_matches_type(MachineStorageUsage, usage, path=["response"]) - - assert cast(Any, response.is_closed) is True - - @parametrize - async def test_path_params_get_machine_storage_usage(self, async_client: AsyncDedalus) -> None: - with pytest.raises(ValueError, match=r"Expected a non-empty value for `org_id` but received ''"): - await async_client.orgs.usage.with_raw_response.get_machine_storage_usage( - org_id="", - ) - - @parametrize - async def test_method_get_machine_usage(self, async_client: AsyncDedalus) -> None: - usage = await async_client.orgs.usage.get_machine_usage( - org_id="org_id", - ) - assert_matches_type(MachineUsage, usage, path=["response"]) - - @parametrize - async def test_method_get_machine_usage_with_all_params(self, async_client: AsyncDedalus) -> None: - usage = await async_client.orgs.usage.get_machine_usage( - org_id="org_id", - granularity="granularity", - machine_id="machine_id", - period_end="period_end", - period_start="period_start", - ) - assert_matches_type(MachineUsage, usage, path=["response"]) - - @parametrize - async def test_raw_response_get_machine_usage(self, async_client: AsyncDedalus) -> None: - response = await async_client.orgs.usage.with_raw_response.get_machine_usage( - org_id="org_id", - ) - - assert response.is_closed is True - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - usage = await response.parse() - assert_matches_type(MachineUsage, usage, path=["response"]) - - @parametrize - async def test_streaming_response_get_machine_usage(self, async_client: AsyncDedalus) -> None: - async with async_client.orgs.usage.with_streaming_response.get_machine_usage( - org_id="org_id", - ) as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - - usage = await response.parse() - assert_matches_type(MachineUsage, usage, path=["response"]) - - assert cast(Any, response.is_closed) is True - - @parametrize - async def test_path_params_get_machine_usage(self, async_client: AsyncDedalus) -> None: - with pytest.raises(ValueError, match=r"Expected a non-empty value for `org_id` but received ''"): - await async_client.orgs.usage.with_raw_response.get_machine_usage( - org_id="", - ) diff --git a/tests/api_resources/test_usage.py b/tests/api_resources/test_usage.py new file mode 100644 index 0000000..ca8aa7e --- /dev/null +++ b/tests/api_resources/test_usage.py @@ -0,0 +1,230 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from __future__ import annotations + +import os +from typing import Any, cast + +import pytest + +from dedalus_sdk import Dedalus, AsyncDedalus +from tests.utils import assert_matches_type +from dedalus_sdk.types import ( + OrgUsage, + MachineComputeUsage, + MachineStorageUsage, +) + +base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010") + + +class TestUsage: + parametrize = pytest.mark.parametrize("client", [False, True], indirect=True, ids=["loose", "strict"]) + + @parametrize + def test_method_retrieve(self, client: Dedalus) -> None: + usage = client.usage.retrieve() + assert_matches_type(OrgUsage, usage, path=["response"]) + + @parametrize + def test_method_retrieve_with_all_params(self, client: Dedalus) -> None: + usage = client.usage.retrieve( + period_start="period_start", + ) + assert_matches_type(OrgUsage, usage, path=["response"]) + + @parametrize + def test_raw_response_retrieve(self, client: Dedalus) -> None: + response = client.usage.with_raw_response.retrieve() + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + usage = response.parse() + assert_matches_type(OrgUsage, usage, path=["response"]) + + @parametrize + def test_streaming_response_retrieve(self, client: Dedalus) -> None: + with client.usage.with_streaming_response.retrieve() as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + usage = response.parse() + assert_matches_type(OrgUsage, usage, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + def test_method_machine_compute(self, client: Dedalus) -> None: + usage = client.usage.machine_compute() + assert_matches_type(MachineComputeUsage, usage, path=["response"]) + + @parametrize + def test_method_machine_compute_with_all_params(self, client: Dedalus) -> None: + usage = client.usage.machine_compute( + granularity="granularity", + machine_id="machine_id", + period_end="period_end", + period_start="period_start", + ) + assert_matches_type(MachineComputeUsage, usage, path=["response"]) + + @parametrize + def test_raw_response_machine_compute(self, client: Dedalus) -> None: + response = client.usage.with_raw_response.machine_compute() + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + usage = response.parse() + assert_matches_type(MachineComputeUsage, usage, path=["response"]) + + @parametrize + def test_streaming_response_machine_compute(self, client: Dedalus) -> None: + with client.usage.with_streaming_response.machine_compute() as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + usage = response.parse() + assert_matches_type(MachineComputeUsage, usage, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + def test_method_machine_storage(self, client: Dedalus) -> None: + usage = client.usage.machine_storage() + assert_matches_type(MachineStorageUsage, usage, path=["response"]) + + @parametrize + def test_method_machine_storage_with_all_params(self, client: Dedalus) -> None: + usage = client.usage.machine_storage( + machine_id="machine_id", + period_end="period_end", + period_start="period_start", + ) + assert_matches_type(MachineStorageUsage, usage, path=["response"]) + + @parametrize + def test_raw_response_machine_storage(self, client: Dedalus) -> None: + response = client.usage.with_raw_response.machine_storage() + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + usage = response.parse() + assert_matches_type(MachineStorageUsage, usage, path=["response"]) + + @parametrize + def test_streaming_response_machine_storage(self, client: Dedalus) -> None: + with client.usage.with_streaming_response.machine_storage() as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + usage = response.parse() + assert_matches_type(MachineStorageUsage, usage, path=["response"]) + + assert cast(Any, response.is_closed) is True + + +class TestAsyncUsage: + parametrize = pytest.mark.parametrize( + "async_client", [False, True, {"http_client": "aiohttp"}], indirect=True, ids=["loose", "strict", "aiohttp"] + ) + + @parametrize + async def test_method_retrieve(self, async_client: AsyncDedalus) -> None: + usage = await async_client.usage.retrieve() + assert_matches_type(OrgUsage, usage, path=["response"]) + + @parametrize + async def test_method_retrieve_with_all_params(self, async_client: AsyncDedalus) -> None: + usage = await async_client.usage.retrieve( + period_start="period_start", + ) + assert_matches_type(OrgUsage, usage, path=["response"]) + + @parametrize + async def test_raw_response_retrieve(self, async_client: AsyncDedalus) -> None: + response = await async_client.usage.with_raw_response.retrieve() + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + usage = await response.parse() + assert_matches_type(OrgUsage, usage, path=["response"]) + + @parametrize + async def test_streaming_response_retrieve(self, async_client: AsyncDedalus) -> None: + async with async_client.usage.with_streaming_response.retrieve() as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + usage = await response.parse() + assert_matches_type(OrgUsage, usage, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + async def test_method_machine_compute(self, async_client: AsyncDedalus) -> None: + usage = await async_client.usage.machine_compute() + assert_matches_type(MachineComputeUsage, usage, path=["response"]) + + @parametrize + async def test_method_machine_compute_with_all_params(self, async_client: AsyncDedalus) -> None: + usage = await async_client.usage.machine_compute( + granularity="granularity", + machine_id="machine_id", + period_end="period_end", + period_start="period_start", + ) + assert_matches_type(MachineComputeUsage, usage, path=["response"]) + + @parametrize + async def test_raw_response_machine_compute(self, async_client: AsyncDedalus) -> None: + response = await async_client.usage.with_raw_response.machine_compute() + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + usage = await response.parse() + assert_matches_type(MachineComputeUsage, usage, path=["response"]) + + @parametrize + async def test_streaming_response_machine_compute(self, async_client: AsyncDedalus) -> None: + async with async_client.usage.with_streaming_response.machine_compute() as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + usage = await response.parse() + assert_matches_type(MachineComputeUsage, usage, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + async def test_method_machine_storage(self, async_client: AsyncDedalus) -> None: + usage = await async_client.usage.machine_storage() + assert_matches_type(MachineStorageUsage, usage, path=["response"]) + + @parametrize + async def test_method_machine_storage_with_all_params(self, async_client: AsyncDedalus) -> None: + usage = await async_client.usage.machine_storage( + machine_id="machine_id", + period_end="period_end", + period_start="period_start", + ) + assert_matches_type(MachineStorageUsage, usage, path=["response"]) + + @parametrize + async def test_raw_response_machine_storage(self, async_client: AsyncDedalus) -> None: + response = await async_client.usage.with_raw_response.machine_storage() + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + usage = await response.parse() + assert_matches_type(MachineStorageUsage, usage, path=["response"]) + + @parametrize + async def test_streaming_response_machine_storage(self, async_client: AsyncDedalus) -> None: + async with async_client.usage.with_streaming_response.machine_storage() as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + usage = await response.parse() + assert_matches_type(MachineStorageUsage, usage, path=["response"]) + + assert cast(Any, response.is_closed) is True