diff --git a/.release-please-manifest.json b/.release-please-manifest.json index fe87cd917..cc51f6f8e 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "0.43.0" + ".": "0.44.0" } \ No newline at end of file diff --git a/.stats.yml b/.stats.yml index 157020e88..a8ec4169e 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 657 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gcore%2Fgcore-ba1eb162beed31f03386720005830bdaad3be08b9e08a07b2f10a2dd124648b8.yml -openapi_spec_hash: 416a4779f456d266b805fef5a54cfbc7 -config_hash: d2defa3f4caff86ec6f4b8890f74b295 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gcore%2Fgcore-8c3bd3792724737d30da0f0200f0c589f9942ea3a028fcc9bcd56f3490ffc29a.yml +openapi_spec_hash: 7b184f4e52554b89cadf11b43f395583 +config_hash: aa5a9dd05b6324fcb454d0694e5901a3 diff --git a/CHANGELOG.md b/CHANGELOG.md index 26bac9aeb..6c917e1bf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,20 @@ # Changelog +## 0.44.0 (2026-04-27) + +Full Changelog: [v0.43.0...v0.44.0](https://github.com/G-Core/gcore-python/compare/v0.43.0...v0.44.0) + +### Features + +* **api:** aggregated API specs update ([5b07224](https://github.com/G-Core/gcore-python/commit/5b07224ecfcad18c39a2ae1c45fddb2b4ea811f6)) +* **api:** aggregated API specs update ([9900f97](https://github.com/G-Core/gcore-python/commit/9900f97b05e97b4f42c7d3a041f32e5a628f0614)) +* **storage:** support TF for ssh keys ([b4a70d5](https://github.com/G-Core/gcore-python/commit/b4a70d5fb797121f21daaa7da9026daae9173360)) + + +### Chores + +* **internal:** more robust bootstrap script ([8915d9b](https://github.com/G-Core/gcore-python/commit/8915d9b82e1f7f529f8aa930b047ce1bb3b32e08)) + ## 0.43.0 (2026-04-22) Full Changelog: [v0.42.0...v0.43.0](https://github.com/G-Core/gcore-python/compare/v0.42.0...v0.43.0) diff --git a/pyproject.toml b/pyproject.toml index 3118811dd..92c24b561 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "gcore" -version = "0.43.0" +version = "0.44.0" description = "The official Python library for the gcore API" dynamic = ["readme"] license = "Apache-2.0" diff --git a/scripts/bootstrap b/scripts/bootstrap index b430fee36..fe8451e4f 100755 --- a/scripts/bootstrap +++ b/scripts/bootstrap @@ -4,7 +4,7 @@ set -e cd "$(dirname "$0")/.." -if [ -f "Brewfile" ] && [ "$(uname -s)" = "Darwin" ] && [ "$SKIP_BREW" != "1" ] && [ -t 0 ]; then +if [ -f "Brewfile" ] && [ "$(uname -s)" = "Darwin" ] && [ "${SKIP_BREW:-}" != "1" ] && [ -t 0 ]; then brew bundle check >/dev/null 2>&1 || { echo -n "==> Install Homebrew dependencies? (y/N): " read -r response diff --git a/src/gcore/_version.py b/src/gcore/_version.py index 8f9eb5688..43e6ba1de 100644 --- a/src/gcore/_version.py +++ b/src/gcore/_version.py @@ -1,4 +1,4 @@ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. __title__ = "gcore" -__version__ = "0.43.0" # x-release-please-version +__version__ = "0.44.0" # x-release-please-version diff --git a/src/gcore/resources/cloud/api.md b/src/gcore/resources/cloud/api.md index bfdb6c927..2f1e734b0 100644 --- a/src/gcore/resources/cloud/api.md +++ b/src/gcore/resources/cloud/api.md @@ -508,7 +508,6 @@ Types: ```python from gcore.types.cloud.inference import ( InferenceDeployment, - InferenceDeploymentAPIKey, Probe, ProbeConfig, ProbeExec, @@ -1191,12 +1190,12 @@ Methods: Types: ```python -from gcore.types.cloud.databases.postgres import PgConfValidation +from gcore.types.cloud.databases.postgres import CustomConfigurationValidateResponse ``` Methods: -- client.cloud.databases.postgres.custom_configurations.validate(\*, project_id, region_id, \*\*params) -> PgConfValidation +- client.cloud.databases.postgres.custom_configurations.validate(\*, project_id, region_id, \*\*params) -> CustomConfigurationValidateResponse ## VolumeSnapshots diff --git a/src/gcore/resources/cloud/databases/postgres/clusters/clusters.py b/src/gcore/resources/cloud/databases/postgres/clusters/clusters.py index d4a91cca7..fc39f3035 100644 --- a/src/gcore/resources/cloud/databases/postgres/clusters/clusters.py +++ b/src/gcore/resources/cloud/databases/postgres/clusters/clusters.py @@ -82,6 +82,10 @@ def create( Create a new PostgreSQL cluster with the specified configuration. Args: + project_id: Project ID + + region_id: Region ID + cluster_name: PostgreSQL cluster name flavor: Instance RAM and CPU @@ -151,6 +155,12 @@ def update( Update the configuration of an existing PostgreSQL cluster. Args: + project_id: Project ID + + region_id: Region ID + + cluster_name: Cluster name + flavor: New instance RAM and CPU high_availability: New High Availability settings @@ -204,6 +214,7 @@ def list( project_id: int | None = None, region_id: int | None = None, limit: int | Omit = omit, + name: str | Omit = omit, offset: int | 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. @@ -218,8 +229,14 @@ def list( filtered by search query and paginated. Args: + project_id: Project ID + + region_id: Region ID + limit: Maximum number of clusters to return + name: Filter clusters by name + offset: Number of clusters to skip extra_headers: Send extra headers @@ -247,6 +264,7 @@ def list( query=maybe_transform( { "limit": limit, + "name": name, "offset": offset, }, cluster_list_params.ClusterListParams, @@ -272,6 +290,12 @@ def delete( Delete a PostgreSQL cluster and all its associated resources. Args: + project_id: Project ID + + region_id: Region ID + + cluster_name: Cluster name + extra_headers: Send extra headers extra_query: Add additional query parameters to the request @@ -316,6 +340,12 @@ def get( Get detailed information about a specific PostgreSQL cluster. Args: + project_id: Project ID + + region_id: Region ID + + cluster_name: Cluster name + extra_headers: Send extra headers extra_query: Add additional query parameters to the request @@ -392,6 +422,10 @@ async def create( Create a new PostgreSQL cluster with the specified configuration. Args: + project_id: Project ID + + region_id: Region ID + cluster_name: PostgreSQL cluster name flavor: Instance RAM and CPU @@ -461,6 +495,12 @@ async def update( Update the configuration of an existing PostgreSQL cluster. Args: + project_id: Project ID + + region_id: Region ID + + cluster_name: Cluster name + flavor: New instance RAM and CPU high_availability: New High Availability settings @@ -514,6 +554,7 @@ def list( project_id: int | None = None, region_id: int | None = None, limit: int | Omit = omit, + name: str | Omit = omit, offset: int | 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. @@ -528,8 +569,14 @@ def list( filtered by search query and paginated. Args: + project_id: Project ID + + region_id: Region ID + limit: Maximum number of clusters to return + name: Filter clusters by name + offset: Number of clusters to skip extra_headers: Send extra headers @@ -557,6 +604,7 @@ def list( query=maybe_transform( { "limit": limit, + "name": name, "offset": offset, }, cluster_list_params.ClusterListParams, @@ -582,6 +630,12 @@ async def delete( Delete a PostgreSQL cluster and all its associated resources. Args: + project_id: Project ID + + region_id: Region ID + + cluster_name: Cluster name + extra_headers: Send extra headers extra_query: Add additional query parameters to the request @@ -626,6 +680,12 @@ async def get( Get detailed information about a specific PostgreSQL cluster. Args: + project_id: Project ID + + region_id: Region ID + + cluster_name: Cluster name + extra_headers: Send extra headers extra_query: Add additional query parameters to the request diff --git a/src/gcore/resources/cloud/databases/postgres/clusters/user_credentials.py b/src/gcore/resources/cloud/databases/postgres/clusters/user_credentials.py index b9792dc80..3f5620b5d 100644 --- a/src/gcore/resources/cloud/databases/postgres/clusters/user_credentials.py +++ b/src/gcore/resources/cloud/databases/postgres/clusters/user_credentials.py @@ -60,6 +60,14 @@ def get( can only be used once per user. Args: + project_id: Project ID + + region_id: Region ID + + cluster_name: Cluster name + + username: Username + extra_headers: Send extra headers extra_query: Add additional query parameters to the request @@ -108,6 +116,14 @@ def regenerate( Generate new credentials for a specific user in a PostgreSQL cluster. Args: + project_id: Project ID + + region_id: Region ID + + cluster_name: Cluster name + + username: Username + extra_headers: Send extra headers extra_query: Add additional query parameters to the request @@ -179,6 +195,14 @@ async def get( can only be used once per user. Args: + project_id: Project ID + + region_id: Region ID + + cluster_name: Cluster name + + username: Username + extra_headers: Send extra headers extra_query: Add additional query parameters to the request @@ -227,6 +251,14 @@ async def regenerate( Generate new credentials for a specific user in a PostgreSQL cluster. Args: + project_id: Project ID + + region_id: Region ID + + cluster_name: Cluster name + + username: Username + extra_headers: Send extra headers extra_query: Add additional query parameters to the request diff --git a/src/gcore/resources/cloud/databases/postgres/configurations.py b/src/gcore/resources/cloud/databases/postgres/configurations.py index 6905b471c..3aca941ce 100644 --- a/src/gcore/resources/cloud/databases/postgres/configurations.py +++ b/src/gcore/resources/cloud/databases/postgres/configurations.py @@ -56,6 +56,10 @@ def get( Get all available PostgreSQL configurations for the specified region. Args: + project_id: Project ID + + region_id: Region ID + extra_headers: Send extra headers extra_query: Add additional query parameters to the request @@ -117,6 +121,10 @@ async def get( Get all available PostgreSQL configurations for the specified region. Args: + project_id: Project ID + + region_id: Region ID + extra_headers: Send extra headers extra_query: Add additional query parameters to the request diff --git a/src/gcore/resources/cloud/databases/postgres/custom_configurations.py b/src/gcore/resources/cloud/databases/postgres/custom_configurations.py index d55243cbb..c4701fe80 100644 --- a/src/gcore/resources/cloud/databases/postgres/custom_configurations.py +++ b/src/gcore/resources/cloud/databases/postgres/custom_configurations.py @@ -16,7 +16,9 @@ ) from ....._base_client import make_request_options from .....types.cloud.databases.postgres import custom_configuration_validate_params -from .....types.cloud.databases.postgres.pg_conf_validation import PgConfValidation +from .....types.cloud.databases.postgres.custom_configuration_validate_response import ( + CustomConfigurationValidateResponse, +) __all__ = ["CustomConfigurationsResource", "AsyncCustomConfigurationsResource"] @@ -54,11 +56,15 @@ def validate( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> PgConfValidation: + ) -> CustomConfigurationValidateResponse: """ Validate a custom PostgreSQL configuration file. Args: + project_id: Project ID + + region_id: Region ID + pg_conf: PostgreSQL configuration version: PostgreSQL version @@ -91,7 +97,7 @@ def validate( options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), - cast_to=PgConfValidation, + cast_to=CustomConfigurationValidateResponse, ) @@ -128,11 +134,15 @@ async def validate( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> PgConfValidation: + ) -> CustomConfigurationValidateResponse: """ Validate a custom PostgreSQL configuration file. Args: + project_id: Project ID + + region_id: Region ID + pg_conf: PostgreSQL configuration version: PostgreSQL version @@ -165,7 +175,7 @@ async def validate( options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), - cast_to=PgConfValidation, + cast_to=CustomConfigurationValidateResponse, ) diff --git a/src/gcore/resources/cloud/load_balancers/pools/pools.py b/src/gcore/resources/cloud/load_balancers/pools/pools.py index 330079daf..b9b7c824d 100644 --- a/src/gcore/resources/cloud/load_balancers/pools/pools.py +++ b/src/gcore/resources/cloud/load_balancers/pools/pools.py @@ -318,6 +318,7 @@ def list( limit: int | Omit = omit, listener_id: str | Omit = omit, load_balancer_id: str | Omit = omit, + name: str | Omit = omit, offset: int | 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. @@ -342,6 +343,8 @@ def list( load_balancer_id: Load Balancer ID + name: Filter by name + offset: Optional. Offset value is used to exclude the first set of records from the result @@ -370,6 +373,7 @@ def list( "limit": limit, "listener_id": listener_id, "load_balancer_id": load_balancer_id, + "name": name, "offset": offset, }, pool_list_params.PoolListParams, @@ -924,6 +928,7 @@ async def list( limit: int | Omit = omit, listener_id: str | Omit = omit, load_balancer_id: str | Omit = omit, + name: str | Omit = omit, offset: int | 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. @@ -948,6 +953,8 @@ async def list( load_balancer_id: Load Balancer ID + name: Filter by name + offset: Optional. Offset value is used to exclude the first set of records from the result @@ -976,6 +983,7 @@ async def list( "limit": limit, "listener_id": listener_id, "load_balancer_id": load_balancer_id, + "name": name, "offset": offset, }, pool_list_params.PoolListParams, diff --git a/src/gcore/resources/iam/users.py b/src/gcore/resources/iam/users.py index 91d1fb682..66f064687 100644 --- a/src/gcore/resources/iam/users.py +++ b/src/gcore/resources/iam/users.py @@ -53,11 +53,11 @@ def update( self, user_id: int, *, - auth_types: List[AuthType], - email: str, - lang: UserLanguage, - name: Optional[str], - phone: Optional[str], + auth_types: List[AuthType] | Omit = omit, + email: str | Omit = omit, + lang: UserLanguage | Omit = omit, + name: Optional[str] | Omit = omit, + phone: Optional[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. extra_headers: Headers | None = None, @@ -310,11 +310,11 @@ async def update( self, user_id: int, *, - auth_types: List[AuthType], - email: str, - lang: UserLanguage, - name: Optional[str], - phone: Optional[str], + auth_types: List[AuthType] | Omit = omit, + email: str | Omit = omit, + lang: UserLanguage | Omit = omit, + name: Optional[str] | Omit = omit, + phone: Optional[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. extra_headers: Headers | None = None, diff --git a/src/gcore/resources/storage/api.md b/src/gcore/resources/storage/api.md index 29087ffb4..7d0df0d85 100644 --- a/src/gcore/resources/storage/api.md +++ b/src/gcore/resources/storage/api.md @@ -47,12 +47,12 @@ Methods: Types: ```python -from gcore.types.storage.object_storages import Bucket, BucketCreated +from gcore.types.storage.object_storages import Bucket ``` Methods: -- client.storage.object_storages.buckets.create(storage_id, \*\*params) -> BucketCreated +- client.storage.object_storages.buckets.create(storage_id, \*\*params) -> Bucket - client.storage.object_storages.buckets.update(bucket_name, \*, storage_id, \*\*params) -> Bucket - client.storage.object_storages.buckets.list(storage_id, \*\*params) -> SyncOffsetPage[Bucket] - client.storage.object_storages.buckets.delete(bucket_name, \*, storage_id) -> None diff --git a/src/gcore/resources/storage/object_storages/buckets.py b/src/gcore/resources/storage/object_storages/buckets.py index c647cbc9c..f29a71c35 100644 --- a/src/gcore/resources/storage/object_storages/buckets.py +++ b/src/gcore/resources/storage/object_storages/buckets.py @@ -18,7 +18,6 @@ from ...._base_client import AsyncPaginator, make_request_options from ....types.storage.object_storages import bucket_list_params, bucket_create_params, bucket_update_params from ....types.storage.object_storages.bucket import Bucket -from ....types.storage.object_storages.bucket_created import BucketCreated __all__ = ["BucketsResource", "AsyncBucketsResource"] @@ -54,7 +53,7 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> BucketCreated: + ) -> Bucket: """ Creates a new bucket within an S3-compatible storage. @@ -75,7 +74,7 @@ def create( options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), - cast_to=BucketCreated, + cast_to=Bucket, ) def update( @@ -296,7 +295,7 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> BucketCreated: + ) -> Bucket: """ Creates a new bucket within an S3-compatible storage. @@ -317,7 +316,7 @@ async def create( options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), - cast_to=BucketCreated, + cast_to=Bucket, ) async def update( diff --git a/src/gcore/resources/storage/ssh_keys.py b/src/gcore/resources/storage/ssh_keys.py index 63d01cf72..7564eb1ff 100644 --- a/src/gcore/resources/storage/ssh_keys.py +++ b/src/gcore/resources/storage/ssh_keys.py @@ -23,6 +23,10 @@ class SSHKeysResource(SyncAPIResource): + """ + SSH keys enable secure access to SFTP storage by associating public keys with user accounts for authentication. + """ + @cached_property def with_raw_response(self) -> SSHKeysResourceWithRawResponse: """ @@ -207,6 +211,10 @@ def get( class AsyncSSHKeysResource(AsyncAPIResource): + """ + SSH keys enable secure access to SFTP storage by associating public keys with user accounts for authentication. + """ + @cached_property def with_raw_response(self) -> AsyncSSHKeysResourceWithRawResponse: """ diff --git a/src/gcore/resources/storage/storage.py b/src/gcore/resources/storage/storage.py index b81116c08..dd2c6cf29 100644 --- a/src/gcore/resources/storage/storage.py +++ b/src/gcore/resources/storage/storage.py @@ -64,6 +64,9 @@ def sftp_storages(self) -> SftpStoragesResource: @cached_property def ssh_keys(self) -> SSHKeysResource: + """ + SSH keys enable secure access to SFTP storage by associating public keys with user accounts for authentication. + """ return SSHKeysResource(self._client) @cached_property @@ -106,6 +109,9 @@ def sftp_storages(self) -> AsyncSftpStoragesResource: @cached_property def ssh_keys(self) -> AsyncSSHKeysResource: + """ + SSH keys enable secure access to SFTP storage by associating public keys with user accounts for authentication. + """ return AsyncSSHKeysResource(self._client) @cached_property @@ -151,6 +157,9 @@ def sftp_storages(self) -> SftpStoragesResourceWithRawResponse: @cached_property def ssh_keys(self) -> SSHKeysResourceWithRawResponse: + """ + SSH keys enable secure access to SFTP storage by associating public keys with user accounts for authentication. + """ return SSHKeysResourceWithRawResponse(self._storage.ssh_keys) @cached_property @@ -177,6 +186,9 @@ def sftp_storages(self) -> AsyncSftpStoragesResourceWithRawResponse: @cached_property def ssh_keys(self) -> AsyncSSHKeysResourceWithRawResponse: + """ + SSH keys enable secure access to SFTP storage by associating public keys with user accounts for authentication. + """ return AsyncSSHKeysResourceWithRawResponse(self._storage.ssh_keys) @cached_property @@ -203,6 +215,9 @@ def sftp_storages(self) -> SftpStoragesResourceWithStreamingResponse: @cached_property def ssh_keys(self) -> SSHKeysResourceWithStreamingResponse: + """ + SSH keys enable secure access to SFTP storage by associating public keys with user accounts for authentication. + """ return SSHKeysResourceWithStreamingResponse(self._storage.ssh_keys) @cached_property @@ -229,6 +244,9 @@ def sftp_storages(self) -> AsyncSftpStoragesResourceWithStreamingResponse: @cached_property def ssh_keys(self) -> AsyncSSHKeysResourceWithStreamingResponse: + """ + SSH keys enable secure access to SFTP storage by associating public keys with user accounts for authentication. + """ return AsyncSSHKeysResourceWithStreamingResponse(self._storage.ssh_keys) @cached_property diff --git a/src/gcore/types/cloud/databases/postgres/__init__.py b/src/gcore/types/cloud/databases/postgres/__init__.py index e4449e2be..d33446a05 100644 --- a/src/gcore/types/cloud/databases/postgres/__init__.py +++ b/src/gcore/types/cloud/databases/postgres/__init__.py @@ -3,10 +3,12 @@ from __future__ import annotations from .postgres_cluster import PostgresCluster as PostgresCluster -from .pg_conf_validation import PgConfValidation as PgConfValidation from .cluster_list_params import ClusterListParams as ClusterListParams from .cluster_create_params import ClusterCreateParams as ClusterCreateParams from .cluster_update_params import ClusterUpdateParams as ClusterUpdateParams from .postgres_cluster_short import PostgresClusterShort as PostgresClusterShort from .postgres_configuration import PostgresConfiguration as PostgresConfiguration from .custom_configuration_validate_params import CustomConfigurationValidateParams as CustomConfigurationValidateParams +from .custom_configuration_validate_response import ( + CustomConfigurationValidateResponse as CustomConfigurationValidateResponse, +) diff --git a/src/gcore/types/cloud/databases/postgres/cluster_create_params.py b/src/gcore/types/cloud/databases/postgres/cluster_create_params.py index f5a9e1050..acc7dd9ab 100644 --- a/src/gcore/types/cloud/databases/postgres/cluster_create_params.py +++ b/src/gcore/types/cloud/databases/postgres/cluster_create_params.py @@ -22,8 +22,10 @@ class ClusterCreateParams(TypedDict, total=False): project_id: int + """Project ID""" region_id: int + """Region ID""" cluster_name: Required[str] """PostgreSQL cluster name""" diff --git a/src/gcore/types/cloud/databases/postgres/cluster_list_params.py b/src/gcore/types/cloud/databases/postgres/cluster_list_params.py index 301f22e49..55b3dc985 100644 --- a/src/gcore/types/cloud/databases/postgres/cluster_list_params.py +++ b/src/gcore/types/cloud/databases/postgres/cluster_list_params.py @@ -9,11 +9,16 @@ class ClusterListParams(TypedDict, total=False): project_id: int + """Project ID""" region_id: int + """Region ID""" limit: int """Maximum number of clusters to return""" + name: str + """Filter clusters by name""" + offset: int """Number of clusters to skip""" diff --git a/src/gcore/types/cloud/databases/postgres/cluster_update_params.py b/src/gcore/types/cloud/databases/postgres/cluster_update_params.py index 9ae130ff9..521cca57d 100644 --- a/src/gcore/types/cloud/databases/postgres/cluster_update_params.py +++ b/src/gcore/types/cloud/databases/postgres/cluster_update_params.py @@ -22,8 +22,10 @@ class ClusterUpdateParams(TypedDict, total=False): project_id: int + """Project ID""" region_id: int + """Region ID""" databases: Iterable[Database] diff --git a/src/gcore/types/cloud/databases/postgres/custom_configuration_validate_params.py b/src/gcore/types/cloud/databases/postgres/custom_configuration_validate_params.py index 2cd791ae1..a90c0dbda 100644 --- a/src/gcore/types/cloud/databases/postgres/custom_configuration_validate_params.py +++ b/src/gcore/types/cloud/databases/postgres/custom_configuration_validate_params.py @@ -9,8 +9,10 @@ class CustomConfigurationValidateParams(TypedDict, total=False): project_id: int + """Project ID""" region_id: int + """Region ID""" pg_conf: Required[str] """PostgreSQL configuration""" diff --git a/src/gcore/types/cloud/databases/postgres/pg_conf_validation.py b/src/gcore/types/cloud/databases/postgres/custom_configuration_validate_response.py similarity index 70% rename from src/gcore/types/cloud/databases/postgres/pg_conf_validation.py rename to src/gcore/types/cloud/databases/postgres/custom_configuration_validate_response.py index 8e4ae2322..995a4a141 100644 --- a/src/gcore/types/cloud/databases/postgres/pg_conf_validation.py +++ b/src/gcore/types/cloud/databases/postgres/custom_configuration_validate_response.py @@ -4,10 +4,10 @@ from ....._models import BaseModel -__all__ = ["PgConfValidation"] +__all__ = ["CustomConfigurationValidateResponse"] -class PgConfValidation(BaseModel): +class CustomConfigurationValidateResponse(BaseModel): errors: List[str] """Errors list""" diff --git a/src/gcore/types/cloud/load_balancers/pool_list_params.py b/src/gcore/types/cloud/load_balancers/pool_list_params.py index fe83828f1..b8750a56a 100644 --- a/src/gcore/types/cloud/load_balancers/pool_list_params.py +++ b/src/gcore/types/cloud/load_balancers/pool_list_params.py @@ -26,6 +26,9 @@ class PoolListParams(TypedDict, total=False): load_balancer_id: str """Load Balancer ID""" + name: str + """Filter by name""" + offset: int """Optional. diff --git a/src/gcore/types/iam/user_update_params.py b/src/gcore/types/iam/user_update_params.py index 751444f57..24103a5a7 100644 --- a/src/gcore/types/iam/user_update_params.py +++ b/src/gcore/types/iam/user_update_params.py @@ -3,7 +3,7 @@ from __future__ import annotations from typing import List, Optional -from typing_extensions import Required, TypedDict +from typing_extensions import TypedDict from .auth_type import AuthType from .user_language import UserLanguage @@ -12,20 +12,20 @@ class UserUpdateParams(TypedDict, total=False): - auth_types: Required[List[AuthType]] + auth_types: List[AuthType] """System field. List of auth types available for the account.""" - email: Required[str] + email: str """User's email address.""" - lang: Required[UserLanguage] + lang: UserLanguage """User's language. Defines language of the control panel and email messages. """ - name: Required[Optional[str]] + name: Optional[str] """User's name.""" - phone: Required[Optional[str]] + phone: Optional[str] """User's phone.""" diff --git a/src/gcore/types/storage/object_storages/__init__.py b/src/gcore/types/storage/object_storages/__init__.py index 5ea385edf..5bce0f48d 100644 --- a/src/gcore/types/storage/object_storages/__init__.py +++ b/src/gcore/types/storage/object_storages/__init__.py @@ -4,7 +4,6 @@ from .bucket import Bucket as Bucket from .access_key import AccessKey as AccessKey -from .bucket_created import BucketCreated as BucketCreated from .access_key_created import AccessKeyCreated as AccessKeyCreated from .bucket_list_params import BucketListParams as BucketListParams from .bucket_create_params import BucketCreateParams as BucketCreateParams diff --git a/src/gcore/types/storage/object_storages/bucket_created.py b/src/gcore/types/storage/object_storages/bucket_created.py deleted file mode 100644 index f5d7fb064..000000000 --- a/src/gcore/types/storage/object_storages/bucket_created.py +++ /dev/null @@ -1,51 +0,0 @@ -# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. - -from typing import List - -from ...._models import BaseModel - -__all__ = ["BucketCreated", "Cors", "Lifecycle", "Policy"] - - -class Cors(BaseModel): - allowed_origins: List[str] - """ - Web domains allowed to make direct browser requests to this bucket (e.g., - "https://myapp.com"). Use "\\**" to allow any origin. - """ - - -class Lifecycle(BaseModel): - expiration_days: int - """Days after upload before objects are automatically deleted. - - For example, 30 means files are removed 30 days after creation. - """ - - -class Policy(BaseModel): - is_public: bool - """When true, anyone can download objects without credentials. - - When false, all requests require valid S3 authentication. - """ - - -class BucketCreated(BaseModel): - cors: Cors - - lifecycle: Lifecycle - - name: str - """Globally unique bucket name within the storage. - - Used as the path prefix when accessing objects via S3 API. - """ - - policy: Policy - - storage_id: int - """Parent storage this bucket belongs to. - - Use this ID in the URL path for bucket operations. - """ diff --git a/src/gcore/types/storage/s3_storage.py b/src/gcore/types/storage/s3_storage.py index b0b3e0b7a..cba2d7b1c 100644 --- a/src/gcore/types/storage/s3_storage.py +++ b/src/gcore/types/storage/s3_storage.py @@ -18,11 +18,18 @@ class S3Storage(BaseModel): created_at: datetime """ISO 8601 timestamp when the storage was created""" + full_name: str + """ + Read-only internal full name of the storage, composed as "{`client_id`}-{name}". + Used internally by the backend. Clients should continue to identify the storage + by `name`. + """ + location_name: str """Geographic location code where the storage is provisioned""" name: str - """User-defined name for the storage instance""" + """User-defined name for the storage instance, as supplied at creation time.""" provisioning_status: Literal["creating", "active", "updating", "deleting", "deleted"] """Lifecycle status of the storage. Use this to check readiness before operations.""" diff --git a/src/gcore/types/storage/s3_storage_created.py b/src/gcore/types/storage/s3_storage_created.py index fab9e2ce9..a9b13739f 100644 --- a/src/gcore/types/storage/s3_storage_created.py +++ b/src/gcore/types/storage/s3_storage_created.py @@ -36,11 +36,18 @@ class S3StorageCreated(BaseModel): created_at: datetime """ISO 8601 timestamp when the storage was created""" + full_name: str + """ + Read-only internal full name of the storage, composed as "{`client_id`}-{name}". + Used internally by the backend. Clients should continue to identify the storage + by `name`. + """ + location_name: str """Geographic location code where the storage is provisioned""" name: str - """User-defined name for the storage instance""" + """User-defined name for the storage instance, as supplied at creation time.""" provisioning_status: Literal["creating", "active", "updating", "deleting", "deleted"] """Lifecycle status of the storage. Use this to check readiness before operations.""" diff --git a/src/gcore/types/storage/sftp_storage.py b/src/gcore/types/storage/sftp_storage.py index 3e37778c4..69c2f6a50 100644 --- a/src/gcore/types/storage/sftp_storage.py +++ b/src/gcore/types/storage/sftp_storage.py @@ -22,6 +22,14 @@ class SftpStorage(BaseModel): expires: str """Duration when the storage will expire. Null if no expiration is set.""" + full_name: str + """ + Read-only internal full name of the storage, composed as "{`client_id`}-{name}". + Used by the SFTP backend as the login username. Clients should use this value + when connecting but should continue to identify the storage by `name` in their + own configuration. + """ + has_custom_config_file: bool """Whether this storage uses a custom configuration file""" @@ -35,7 +43,7 @@ class SftpStorage(BaseModel): """Geographic location code where the storage is provisioned""" name: str - """User-defined name for the storage instance""" + """User-defined name for the storage instance, as supplied at creation time.""" provisioning_status: Literal["creating", "active", "updating", "deleting", "deleted"] """Lifecycle status of the storage. Use this to check readiness before operations.""" diff --git a/tests/api_resources/cloud/databases/postgres/test_clusters.py b/tests/api_resources/cloud/databases/postgres/test_clusters.py index 224aa6139..5dec55d32 100644 --- a/tests/api_resources/cloud/databases/postgres/test_clusters.py +++ b/tests/api_resources/cloud/databases/postgres/test_clusters.py @@ -251,6 +251,7 @@ def test_method_list_with_all_params(self, client: Gcore) -> None: project_id=0, region_id=0, limit=0, + name="name", offset=0, ) assert_matches_type(SyncOffsetPage[PostgresClusterShort], cluster, path=["response"]) @@ -608,6 +609,7 @@ async def test_method_list_with_all_params(self, async_client: AsyncGcore) -> No project_id=0, region_id=0, limit=0, + name="name", offset=0, ) assert_matches_type(AsyncOffsetPage[PostgresClusterShort], cluster, path=["response"]) diff --git a/tests/api_resources/cloud/databases/postgres/test_custom_configurations.py b/tests/api_resources/cloud/databases/postgres/test_custom_configurations.py index 1f6935d3b..129a97816 100644 --- a/tests/api_resources/cloud/databases/postgres/test_custom_configurations.py +++ b/tests/api_resources/cloud/databases/postgres/test_custom_configurations.py @@ -9,7 +9,9 @@ from gcore import Gcore, AsyncGcore from tests.utils import assert_matches_type -from gcore.types.cloud.databases.postgres import PgConfValidation +from gcore.types.cloud.databases.postgres import ( + CustomConfigurationValidateResponse, +) base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010") @@ -25,7 +27,7 @@ def test_method_validate(self, client: Gcore) -> None: pg_conf="\nlisten_addresses = 'localhost'\nport = 5432\nmax_connections = 100\nshared_buffers = 128MB\nlogging_collector = on", version="15", ) - assert_matches_type(PgConfValidation, custom_configuration, path=["response"]) + assert_matches_type(CustomConfigurationValidateResponse, custom_configuration, path=["response"]) @parametrize def test_raw_response_validate(self, client: Gcore) -> None: @@ -39,7 +41,7 @@ def test_raw_response_validate(self, client: Gcore) -> None: assert response.is_closed is True assert response.http_request.headers.get("X-Stainless-Lang") == "python" custom_configuration = response.parse() - assert_matches_type(PgConfValidation, custom_configuration, path=["response"]) + assert_matches_type(CustomConfigurationValidateResponse, custom_configuration, path=["response"]) @parametrize def test_streaming_response_validate(self, client: Gcore) -> None: @@ -53,7 +55,7 @@ def test_streaming_response_validate(self, client: Gcore) -> None: assert response.http_request.headers.get("X-Stainless-Lang") == "python" custom_configuration = response.parse() - assert_matches_type(PgConfValidation, custom_configuration, path=["response"]) + assert_matches_type(CustomConfigurationValidateResponse, custom_configuration, path=["response"]) assert cast(Any, response.is_closed) is True @@ -71,7 +73,7 @@ async def test_method_validate(self, async_client: AsyncGcore) -> None: pg_conf="\nlisten_addresses = 'localhost'\nport = 5432\nmax_connections = 100\nshared_buffers = 128MB\nlogging_collector = on", version="15", ) - assert_matches_type(PgConfValidation, custom_configuration, path=["response"]) + assert_matches_type(CustomConfigurationValidateResponse, custom_configuration, path=["response"]) @parametrize async def test_raw_response_validate(self, async_client: AsyncGcore) -> None: @@ -85,7 +87,7 @@ async def test_raw_response_validate(self, async_client: AsyncGcore) -> None: assert response.is_closed is True assert response.http_request.headers.get("X-Stainless-Lang") == "python" custom_configuration = await response.parse() - assert_matches_type(PgConfValidation, custom_configuration, path=["response"]) + assert_matches_type(CustomConfigurationValidateResponse, custom_configuration, path=["response"]) @parametrize async def test_streaming_response_validate(self, async_client: AsyncGcore) -> None: @@ -99,6 +101,6 @@ async def test_streaming_response_validate(self, async_client: AsyncGcore) -> No assert response.http_request.headers.get("X-Stainless-Lang") == "python" custom_configuration = await response.parse() - assert_matches_type(PgConfValidation, custom_configuration, path=["response"]) + assert_matches_type(CustomConfigurationValidateResponse, custom_configuration, path=["response"]) assert cast(Any, response.is_closed) is True diff --git a/tests/api_resources/cloud/load_balancers/test_pools.py b/tests/api_resources/cloud/load_balancers/test_pools.py index 6a1819999..98272d03d 100644 --- a/tests/api_resources/cloud/load_balancers/test_pools.py +++ b/tests/api_resources/cloud/load_balancers/test_pools.py @@ -236,6 +236,7 @@ def test_method_list_with_all_params(self, client: Gcore) -> None: limit=1000, listener_id="00000000-0000-4000-8000-000000000000", load_balancer_id="00000000-0000-4000-8000-000000000000", + name="lb-pool-name", offset=0, ) assert_matches_type(LoadBalancerPoolList, pool, path=["response"]) @@ -583,6 +584,7 @@ async def test_method_list_with_all_params(self, async_client: AsyncGcore) -> No limit=1000, listener_id="00000000-0000-4000-8000-000000000000", load_balancer_id="00000000-0000-4000-8000-000000000000", + name="lb-pool-name", offset=0, ) assert_matches_type(LoadBalancerPoolList, pool, path=["response"]) diff --git a/tests/api_resources/iam/test_users.py b/tests/api_resources/iam/test_users.py index 092329009..64dd08a5c 100644 --- a/tests/api_resources/iam/test_users.py +++ b/tests/api_resources/iam/test_users.py @@ -25,6 +25,13 @@ class TestUsers: @pytest.mark.skip(reason="IMP-1903: OpenAPI spec PATCH requires PUT-only fields") @parametrize def test_method_update(self, client: Gcore) -> None: + user = client.iam.users.update( + user_id=0, + ) + assert_matches_type(User, user, path=["response"]) + + @parametrize + def test_method_update_with_all_params(self, client: Gcore) -> None: user = client.iam.users.update( user_id=0, auth_types=["password"], @@ -40,11 +47,6 @@ def test_method_update(self, client: Gcore) -> None: def test_raw_response_update(self, client: Gcore) -> None: response = client.iam.users.with_raw_response.update( user_id=0, - auth_types=["password"], - email="dev@stainless.com", - lang="de", - name="name", - phone="phone", ) assert response.is_closed is True @@ -57,11 +59,6 @@ def test_raw_response_update(self, client: Gcore) -> None: def test_streaming_response_update(self, client: Gcore) -> None: with client.iam.users.with_streaming_response.update( user_id=0, - auth_types=["password"], - email="dev@stainless.com", - lang="de", - name="name", - phone="phone", ) as response: assert not response.is_closed assert response.http_request.headers.get("X-Stainless-Lang") == "python" @@ -233,6 +230,13 @@ class TestAsyncUsers: @pytest.mark.skip(reason="IMP-1903: OpenAPI spec PATCH requires PUT-only fields") @parametrize async def test_method_update(self, async_client: AsyncGcore) -> None: + user = await async_client.iam.users.update( + user_id=0, + ) + assert_matches_type(User, user, path=["response"]) + + @parametrize + async def test_method_update_with_all_params(self, async_client: AsyncGcore) -> None: user = await async_client.iam.users.update( user_id=0, auth_types=["password"], @@ -248,11 +252,6 @@ async def test_method_update(self, async_client: AsyncGcore) -> None: async def test_raw_response_update(self, async_client: AsyncGcore) -> None: response = await async_client.iam.users.with_raw_response.update( user_id=0, - auth_types=["password"], - email="dev@stainless.com", - lang="de", - name="name", - phone="phone", ) assert response.is_closed is True @@ -265,11 +264,6 @@ async def test_raw_response_update(self, async_client: AsyncGcore) -> None: async def test_streaming_response_update(self, async_client: AsyncGcore) -> None: async with async_client.iam.users.with_streaming_response.update( user_id=0, - auth_types=["password"], - email="dev@stainless.com", - lang="de", - name="name", - phone="phone", ) as response: assert not response.is_closed assert response.http_request.headers.get("X-Stainless-Lang") == "python" diff --git a/tests/api_resources/storage/object_storages/test_buckets.py b/tests/api_resources/storage/object_storages/test_buckets.py index ce667ec48..5bae6c0e5 100644 --- a/tests/api_resources/storage/object_storages/test_buckets.py +++ b/tests/api_resources/storage/object_storages/test_buckets.py @@ -10,10 +10,7 @@ from gcore import Gcore, AsyncGcore from tests.utils import assert_matches_type from gcore.pagination import SyncOffsetPage, AsyncOffsetPage -from gcore.types.storage.object_storages import ( - Bucket, - BucketCreated, -) +from gcore.types.storage.object_storages import Bucket base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010") @@ -27,7 +24,7 @@ def test_method_create(self, client: Gcore) -> None: storage_id=0, name="my-new-bucket", ) - assert_matches_type(BucketCreated, bucket, path=["response"]) + assert_matches_type(Bucket, bucket, path=["response"]) @parametrize def test_raw_response_create(self, client: Gcore) -> None: @@ -39,7 +36,7 @@ def test_raw_response_create(self, client: Gcore) -> None: assert response.is_closed is True assert response.http_request.headers.get("X-Stainless-Lang") == "python" bucket = response.parse() - assert_matches_type(BucketCreated, bucket, path=["response"]) + assert_matches_type(Bucket, bucket, path=["response"]) @parametrize def test_streaming_response_create(self, client: Gcore) -> None: @@ -51,7 +48,7 @@ def test_streaming_response_create(self, client: Gcore) -> None: assert response.http_request.headers.get("X-Stainless-Lang") == "python" bucket = response.parse() - assert_matches_type(BucketCreated, bucket, path=["response"]) + assert_matches_type(Bucket, bucket, path=["response"]) assert cast(Any, response.is_closed) is True @@ -244,7 +241,7 @@ async def test_method_create(self, async_client: AsyncGcore) -> None: storage_id=0, name="my-new-bucket", ) - assert_matches_type(BucketCreated, bucket, path=["response"]) + assert_matches_type(Bucket, bucket, path=["response"]) @parametrize async def test_raw_response_create(self, async_client: AsyncGcore) -> None: @@ -256,7 +253,7 @@ async def test_raw_response_create(self, async_client: AsyncGcore) -> None: assert response.is_closed is True assert response.http_request.headers.get("X-Stainless-Lang") == "python" bucket = await response.parse() - assert_matches_type(BucketCreated, bucket, path=["response"]) + assert_matches_type(Bucket, bucket, path=["response"]) @parametrize async def test_streaming_response_create(self, async_client: AsyncGcore) -> None: @@ -268,7 +265,7 @@ async def test_streaming_response_create(self, async_client: AsyncGcore) -> None assert response.http_request.headers.get("X-Stainless-Lang") == "python" bucket = await response.parse() - assert_matches_type(BucketCreated, bucket, path=["response"]) + assert_matches_type(Bucket, bucket, path=["response"]) assert cast(Any, response.is_closed) is True