Skip to content

Commit de29040

Browse files
fix(cloud): use PATCH /cloud/v1/projects
1 parent 27c74a2 commit de29040

File tree

6 files changed

+76
-108
lines changed

6 files changed

+76
-108
lines changed

.stats.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
configured_endpoints: 640
22
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gcore%2Fgcore-4b7fbbd83aa47dd18d0cfe4f58c2e0394926d5d42c6d44253ffc2e37014da93a.yml
33
openapi_spec_hash: 7b964677a4d29ed874df07b3f14f74f6
4-
config_hash: ac70ccdbdb0bdc6b94d25b9d561d553f
4+
config_hash: ef6fa8ea607ea31853ae3f4ff506ac7e

api.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ from gcore.types.cloud import Project
6767
Methods:
6868

6969
- <code title="post /cloud/v1/projects">client.cloud.projects.<a href="./src/gcore/resources/cloud/projects.py">create</a>(\*\*<a href="src/gcore/types/cloud/project_create_params.py">params</a>) -> <a href="./src/gcore/types/cloud/project.py">Project</a></code>
70-
- <code title="put /cloud/v1/projects/{project_id}">client.cloud.projects.<a href="./src/gcore/resources/cloud/projects.py">update</a>(\*, project_id, \*\*<a href="src/gcore/types/cloud/project_update_params.py">params</a>) -> <a href="./src/gcore/types/cloud/project.py">Project</a></code>
70+
- <code title="patch /cloud/v1/projects/{project_id}">client.cloud.projects.<a href="./src/gcore/resources/cloud/projects.py">update</a>(\*, project_id, \*\*<a href="src/gcore/types/cloud/project_update_params.py">params</a>) -> <a href="./src/gcore/types/cloud/project.py">Project</a></code>
7171
- <code title="get /cloud/v1/projects">client.cloud.projects.<a href="./src/gcore/resources/cloud/projects.py">list</a>(\*\*<a href="src/gcore/types/cloud/project_list_params.py">params</a>) -> <a href="./src/gcore/types/cloud/project.py">SyncOffsetPage[Project]</a></code>
7272
- <code title="delete /cloud/v1/projects/{project_id}">client.cloud.projects.<a href="./src/gcore/resources/cloud/projects.py">delete</a>(\*, project_id) -> <a href="./src/gcore/types/cloud/task_id_list.py">TaskIDList</a></code>
7373
- <code title="get /cloud/v1/projects/{project_id}">client.cloud.projects.<a href="./src/gcore/resources/cloud/projects.py">get</a>(\*, project_id) -> <a href="./src/gcore/types/cloud/project.py">Project</a></code>

src/gcore/resources/cloud/projects.py

Lines changed: 28 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
from __future__ import annotations
44

5-
import typing_extensions
65
from typing import Optional
76
from typing_extensions import Literal
87

@@ -92,32 +91,31 @@ def create(
9291
cast_to=Project,
9392
)
9493

95-
@typing_extensions.deprecated("deprecated")
9694
def update(
9795
self,
9896
*,
9997
project_id: int | None = None,
100-
name: str,
101-
description: Optional[str] | Omit = omit,
98+
description: str | Omit = omit,
99+
name: str | Omit = omit,
102100
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
103101
# The extra values given here take precedence over values defined on the client or passed to this method.
104102
extra_headers: Headers | None = None,
105103
extra_query: Query | None = None,
106104
extra_body: Body | None = None,
107105
timeout: float | httpx.Timeout | None | NotGiven = not_given,
108106
) -> Project:
109-
"""Update project.
110-
111-
Depricated: Use PATCH /v1/projects/{project_id} instead Update
112-
project name and description.
107+
"""
108+
This endpoint allows partial updates of a project (such as its name or
109+
description). Only the fields explicitly provided in the request body will be
110+
updated.
113111
114112
Args:
115113
project_id: Project ID
116114
117-
name: Name of the entity, following a specific format.
118-
119115
description: Description of the project.
120116
117+
name: Name of the entity, following a specific format.
118+
121119
extra_headers: Send extra headers
122120
123121
extra_query: Add additional query parameters to the request
@@ -128,12 +126,12 @@ def update(
128126
"""
129127
if project_id is None:
130128
project_id = self._client._get_cloud_project_id_path_param()
131-
return self._put(
129+
return self._patch(
132130
f"/cloud/v1/projects/{project_id}",
133131
body=maybe_transform(
134132
{
135-
"name": name,
136133
"description": description,
134+
"name": name,
137135
},
138136
project_update_params.ProjectUpdateParams,
139137
),
@@ -348,32 +346,31 @@ async def create(
348346
cast_to=Project,
349347
)
350348

351-
@typing_extensions.deprecated("deprecated")
352349
async def update(
353350
self,
354351
*,
355352
project_id: int | None = None,
356-
name: str,
357-
description: Optional[str] | Omit = omit,
353+
description: str | Omit = omit,
354+
name: str | Omit = omit,
358355
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
359356
# The extra values given here take precedence over values defined on the client or passed to this method.
360357
extra_headers: Headers | None = None,
361358
extra_query: Query | None = None,
362359
extra_body: Body | None = None,
363360
timeout: float | httpx.Timeout | None | NotGiven = not_given,
364361
) -> Project:
365-
"""Update project.
366-
367-
Depricated: Use PATCH /v1/projects/{project_id} instead Update
368-
project name and description.
362+
"""
363+
This endpoint allows partial updates of a project (such as its name or
364+
description). Only the fields explicitly provided in the request body will be
365+
updated.
369366
370367
Args:
371368
project_id: Project ID
372369
373-
name: Name of the entity, following a specific format.
374-
375370
description: Description of the project.
376371
372+
name: Name of the entity, following a specific format.
373+
377374
extra_headers: Send extra headers
378375
379376
extra_query: Add additional query parameters to the request
@@ -384,12 +381,12 @@ async def update(
384381
"""
385382
if project_id is None:
386383
project_id = self._client._get_cloud_project_id_path_param()
387-
return await self._put(
384+
return await self._patch(
388385
f"/cloud/v1/projects/{project_id}",
389386
body=await async_maybe_transform(
390387
{
391-
"name": name,
392388
"description": description,
389+
"name": name,
393390
},
394391
project_update_params.ProjectUpdateParams,
395392
),
@@ -546,10 +543,8 @@ def __init__(self, projects: ProjectsResource) -> None:
546543
self.create = to_raw_response_wrapper(
547544
projects.create,
548545
)
549-
self.update = ( # pyright: ignore[reportDeprecated]
550-
to_raw_response_wrapper(
551-
projects.update, # pyright: ignore[reportDeprecated],
552-
)
546+
self.update = to_raw_response_wrapper(
547+
projects.update,
553548
)
554549
self.list = to_raw_response_wrapper(
555550
projects.list,
@@ -569,10 +564,8 @@ def __init__(self, projects: AsyncProjectsResource) -> None:
569564
self.create = async_to_raw_response_wrapper(
570565
projects.create,
571566
)
572-
self.update = ( # pyright: ignore[reportDeprecated]
573-
async_to_raw_response_wrapper(
574-
projects.update, # pyright: ignore[reportDeprecated],
575-
)
567+
self.update = async_to_raw_response_wrapper(
568+
projects.update,
576569
)
577570
self.list = async_to_raw_response_wrapper(
578571
projects.list,
@@ -592,10 +585,8 @@ def __init__(self, projects: ProjectsResource) -> None:
592585
self.create = to_streamed_response_wrapper(
593586
projects.create,
594587
)
595-
self.update = ( # pyright: ignore[reportDeprecated]
596-
to_streamed_response_wrapper(
597-
projects.update, # pyright: ignore[reportDeprecated],
598-
)
588+
self.update = to_streamed_response_wrapper(
589+
projects.update,
599590
)
600591
self.list = to_streamed_response_wrapper(
601592
projects.list,
@@ -615,10 +606,8 @@ def __init__(self, projects: AsyncProjectsResource) -> None:
615606
self.create = async_to_streamed_response_wrapper(
616607
projects.create,
617608
)
618-
self.update = ( # pyright: ignore[reportDeprecated]
619-
async_to_streamed_response_wrapper(
620-
projects.update, # pyright: ignore[reportDeprecated],
621-
)
609+
self.update = async_to_streamed_response_wrapper(
610+
projects.update,
622611
)
623612
self.list = async_to_streamed_response_wrapper(
624613
projects.list,

src/gcore/types/cloud/project_update_params.py

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@
22

33
from __future__ import annotations
44

5-
from typing import Optional
6-
from typing_extensions import Required, TypedDict
5+
from typing_extensions import TypedDict
76

87
__all__ = ["ProjectUpdateParams"]
98

@@ -12,8 +11,8 @@ class ProjectUpdateParams(TypedDict, total=False):
1211
project_id: int
1312
"""Project ID"""
1413

15-
name: Required[str]
16-
"""Name of the entity, following a specific format."""
17-
18-
description: Optional[str]
14+
description: str
1915
"""Description of the project."""
16+
17+
name: str
18+
"""Name of the entity, following a specific format."""

tests/api_resources/cloud/test_projects.py

Lines changed: 37 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,6 @@
1212
from gcore.pagination import SyncOffsetPage, AsyncOffsetPage
1313
from gcore.types.cloud import Project, TaskIDList
1414

15-
# pyright: reportDeprecated=false
16-
1715
base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
1816

1917

@@ -61,32 +59,25 @@ def test_streaming_response_create(self, client: Gcore) -> None:
6159

6260
@parametrize
6361
def test_method_update(self, client: Gcore) -> None:
64-
with pytest.warns(DeprecationWarning):
65-
project = client.cloud.projects.update(
66-
project_id=4,
67-
name="my-project",
68-
)
69-
62+
project = client.cloud.projects.update(
63+
project_id=4,
64+
)
7065
assert_matches_type(Project, project, path=["response"])
7166

7267
@parametrize
7368
def test_method_update_with_all_params(self, client: Gcore) -> None:
74-
with pytest.warns(DeprecationWarning):
75-
project = client.cloud.projects.update(
76-
project_id=4,
77-
name="my-project",
78-
description="Project description",
79-
)
80-
69+
project = client.cloud.projects.update(
70+
project_id=4,
71+
description="Project description",
72+
name="my-project",
73+
)
8174
assert_matches_type(Project, project, path=["response"])
8275

8376
@parametrize
8477
def test_raw_response_update(self, client: Gcore) -> None:
85-
with pytest.warns(DeprecationWarning):
86-
response = client.cloud.projects.with_raw_response.update(
87-
project_id=4,
88-
name="my-project",
89-
)
78+
response = client.cloud.projects.with_raw_response.update(
79+
project_id=4,
80+
)
9081

9182
assert response.is_closed is True
9283
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
@@ -95,16 +86,14 @@ def test_raw_response_update(self, client: Gcore) -> None:
9586

9687
@parametrize
9788
def test_streaming_response_update(self, client: Gcore) -> None:
98-
with pytest.warns(DeprecationWarning):
99-
with client.cloud.projects.with_streaming_response.update(
100-
project_id=4,
101-
name="my-project",
102-
) as response:
103-
assert not response.is_closed
104-
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
89+
with client.cloud.projects.with_streaming_response.update(
90+
project_id=4,
91+
) as response:
92+
assert not response.is_closed
93+
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
10594

106-
project = response.parse()
107-
assert_matches_type(Project, project, path=["response"])
95+
project = response.parse()
96+
assert_matches_type(Project, project, path=["response"])
10897

10998
assert cast(Any, response.is_closed) is True
11099

@@ -254,32 +243,25 @@ async def test_streaming_response_create(self, async_client: AsyncGcore) -> None
254243

255244
@parametrize
256245
async def test_method_update(self, async_client: AsyncGcore) -> None:
257-
with pytest.warns(DeprecationWarning):
258-
project = await async_client.cloud.projects.update(
259-
project_id=4,
260-
name="my-project",
261-
)
262-
246+
project = await async_client.cloud.projects.update(
247+
project_id=4,
248+
)
263249
assert_matches_type(Project, project, path=["response"])
264250

265251
@parametrize
266252
async def test_method_update_with_all_params(self, async_client: AsyncGcore) -> None:
267-
with pytest.warns(DeprecationWarning):
268-
project = await async_client.cloud.projects.update(
269-
project_id=4,
270-
name="my-project",
271-
description="Project description",
272-
)
273-
253+
project = await async_client.cloud.projects.update(
254+
project_id=4,
255+
description="Project description",
256+
name="my-project",
257+
)
274258
assert_matches_type(Project, project, path=["response"])
275259

276260
@parametrize
277261
async def test_raw_response_update(self, async_client: AsyncGcore) -> None:
278-
with pytest.warns(DeprecationWarning):
279-
response = await async_client.cloud.projects.with_raw_response.update(
280-
project_id=4,
281-
name="my-project",
282-
)
262+
response = await async_client.cloud.projects.with_raw_response.update(
263+
project_id=4,
264+
)
283265

284266
assert response.is_closed is True
285267
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
@@ -288,16 +270,14 @@ async def test_raw_response_update(self, async_client: AsyncGcore) -> None:
288270

289271
@parametrize
290272
async def test_streaming_response_update(self, async_client: AsyncGcore) -> None:
291-
with pytest.warns(DeprecationWarning):
292-
async with async_client.cloud.projects.with_streaming_response.update(
293-
project_id=4,
294-
name="my-project",
295-
) as response:
296-
assert not response.is_closed
297-
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
298-
299-
project = await response.parse()
300-
assert_matches_type(Project, project, path=["response"])
273+
async with async_client.cloud.projects.with_streaming_response.update(
274+
project_id=4,
275+
) as response:
276+
assert not response.is_closed
277+
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
278+
279+
project = await response.parse()
280+
assert_matches_type(Project, project, path=["response"])
301281

302282
assert cast(Any, response.is_closed) is True
303283

tests/test_client.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -377,11 +377,11 @@ def test_default_query_option(self) -> None:
377377
def test_cloud_project_id_client_params(self, client: Gcore) -> None:
378378
# Test with base client (no custom params)
379379
with pytest.raises(ValueError, match="Missing cloud_project_id argument;"):
380-
client.cloud.projects.update(name="my-project")
380+
client.cloud.projects.update()
381381

382382
client = Gcore(base_url=base_url, api_key=api_key, _strict_response_validation=True, cloud_project_id=0)
383383
with client as c2:
384-
c2.cloud.projects.update(name="my-project")
384+
c2.cloud.projects.update()
385385

386386
def test_cloud_region_id_client_params(self, client: Gcore) -> None:
387387
# Test with base client (no custom params)
@@ -1216,11 +1216,11 @@ async def test_default_query_option(self) -> None:
12161216
async def test_cloud_project_id_client_params(self, async_client: AsyncGcore) -> None:
12171217
# Test with base client (no custom params)
12181218
with pytest.raises(ValueError, match="Missing cloud_project_id argument;"):
1219-
await async_client.cloud.projects.update(name="my-project")
1219+
await async_client.cloud.projects.update()
12201220

12211221
client = AsyncGcore(base_url=base_url, api_key=api_key, _strict_response_validation=True, cloud_project_id=0)
12221222
async with client as c2:
1223-
await c2.cloud.projects.update(name="my-project")
1223+
await c2.cloud.projects.update()
12241224

12251225
async def test_cloud_region_id_client_params(self, async_client: AsyncGcore) -> None:
12261226
# Test with base client (no custom params)

0 commit comments

Comments
 (0)