Skip to content

Commit 10481f1

Browse files
feat(api): add create from template
1 parent cb36cd8 commit 10481f1

File tree

6 files changed

+223
-2
lines changed

6 files changed

+223
-2
lines changed

.stats.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
configured_endpoints: 55
1+
configured_endpoints: 56
22
openapi_spec_hash: ef178c3ce0c31f0785212f1138ee8eee
3-
config_hash: 48c3812186c899cdef23cc8de76bd2aa
3+
config_hash: 9e0ed146f9f6e6d1884a4c0589d6f1c2

api.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,7 @@ Methods:
153153
- <code title="put /api/projects/{project_id}">client.projects.<a href="./src/codex/resources/projects/projects.py">update</a>(project_id, \*\*<a href="src/codex/types/project_update_params.py">params</a>) -> <a href="./src/codex/types/project_return_schema.py">ProjectReturnSchema</a></code>
154154
- <code title="get /api/projects/">client.projects.<a href="./src/codex/resources/projects/projects.py">list</a>(\*\*<a href="src/codex/types/project_list_params.py">params</a>) -> <a href="./src/codex/types/project_list_response.py">ProjectListResponse</a></code>
155155
- <code title="delete /api/projects/{project_id}">client.projects.<a href="./src/codex/resources/projects/projects.py">delete</a>(project_id) -> None</code>
156+
- <code title="post /api/projects/create-from-template">client.projects.<a href="./src/codex/resources/projects/projects.py">create_from_template</a>(\*\*<a href="src/codex/types/project_create_from_template_params.py">params</a>) -> <a href="./src/codex/types/project_return_schema.py">ProjectReturnSchema</a></code>
156157
- <code title="post /api/projects/{project_id}/detect">client.projects.<a href="./src/codex/resources/projects/projects.py">detect</a>(project_id, \*\*<a href="src/codex/types/project_detect_params.py">params</a>) -> <a href="./src/codex/types/project_detect_response.py">ProjectDetectResponse</a></code>
157158
- <code title="get /api/projects/{project_id}/export">client.projects.<a href="./src/codex/resources/projects/projects.py">export</a>(project_id) -> object</code>
158159
- <code title="post /api/projects/{project_id}/notifications">client.projects.<a href="./src/codex/resources/projects/projects.py">invite_sme</a>(project_id, \*\*<a href="src/codex/types/project_invite_sme_params.py">params</a>) -> <a href="./src/codex/types/project_invite_sme_response.py">ProjectInviteSmeResponse</a></code>

src/codex/resources/projects/projects.py

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
project_validate_params,
2424
project_invite_sme_params,
2525
project_retrieve_analytics_params,
26+
project_create_from_template_params,
2627
)
2728
from ..._types import Body, Omit, Query, Headers, NoneType, NotGiven, SequenceNotStr, omit, not_given
2829
from ..._utils import maybe_transform, strip_not_given, async_maybe_transform
@@ -316,6 +317,55 @@ def delete(
316317
cast_to=NoneType,
317318
)
318319

320+
def create_from_template(
321+
self,
322+
*,
323+
organization_id: str,
324+
template_project_id: str | Omit = omit,
325+
description: Optional[str] | Omit = omit,
326+
name: Optional[str] | Omit = omit,
327+
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
328+
# The extra values given here take precedence over values defined on the client or passed to this method.
329+
extra_headers: Headers | None = None,
330+
extra_query: Query | None = None,
331+
extra_body: Body | None = None,
332+
timeout: float | httpx.Timeout | None | NotGiven = not_given,
333+
) -> ProjectReturnSchema:
334+
"""
335+
Create a new project from a template project.
336+
337+
Args:
338+
extra_headers: Send extra headers
339+
340+
extra_query: Add additional query parameters to the request
341+
342+
extra_body: Add additional JSON properties to the request
343+
344+
timeout: Override the client-level default timeout for this request, in seconds
345+
"""
346+
return self._post(
347+
"/api/projects/create-from-template",
348+
body=maybe_transform(
349+
{
350+
"organization_id": organization_id,
351+
"description": description,
352+
"name": name,
353+
},
354+
project_create_from_template_params.ProjectCreateFromTemplateParams,
355+
),
356+
options=make_request_options(
357+
extra_headers=extra_headers,
358+
extra_query=extra_query,
359+
extra_body=extra_body,
360+
timeout=timeout,
361+
query=maybe_transform(
362+
{"template_project_id": template_project_id},
363+
project_create_from_template_params.ProjectCreateFromTemplateParams,
364+
),
365+
),
366+
cast_to=ProjectReturnSchema,
367+
)
368+
319369
def detect(
320370
self,
321371
project_id: str,
@@ -1089,6 +1139,55 @@ async def delete(
10891139
cast_to=NoneType,
10901140
)
10911141

1142+
async def create_from_template(
1143+
self,
1144+
*,
1145+
organization_id: str,
1146+
template_project_id: str | Omit = omit,
1147+
description: Optional[str] | Omit = omit,
1148+
name: Optional[str] | Omit = omit,
1149+
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
1150+
# The extra values given here take precedence over values defined on the client or passed to this method.
1151+
extra_headers: Headers | None = None,
1152+
extra_query: Query | None = None,
1153+
extra_body: Body | None = None,
1154+
timeout: float | httpx.Timeout | None | NotGiven = not_given,
1155+
) -> ProjectReturnSchema:
1156+
"""
1157+
Create a new project from a template project.
1158+
1159+
Args:
1160+
extra_headers: Send extra headers
1161+
1162+
extra_query: Add additional query parameters to the request
1163+
1164+
extra_body: Add additional JSON properties to the request
1165+
1166+
timeout: Override the client-level default timeout for this request, in seconds
1167+
"""
1168+
return await self._post(
1169+
"/api/projects/create-from-template",
1170+
body=await async_maybe_transform(
1171+
{
1172+
"organization_id": organization_id,
1173+
"description": description,
1174+
"name": name,
1175+
},
1176+
project_create_from_template_params.ProjectCreateFromTemplateParams,
1177+
),
1178+
options=make_request_options(
1179+
extra_headers=extra_headers,
1180+
extra_query=extra_query,
1181+
extra_body=extra_body,
1182+
timeout=timeout,
1183+
query=await async_maybe_transform(
1184+
{"template_project_id": template_project_id},
1185+
project_create_from_template_params.ProjectCreateFromTemplateParams,
1186+
),
1187+
),
1188+
cast_to=ProjectReturnSchema,
1189+
)
1190+
10921191
async def detect(
10931192
self,
10941193
project_id: str,
@@ -1635,6 +1734,9 @@ def __init__(self, projects: ProjectsResource) -> None:
16351734
self.delete = to_raw_response_wrapper(
16361735
projects.delete,
16371736
)
1737+
self.create_from_template = to_raw_response_wrapper(
1738+
projects.create_from_template,
1739+
)
16381740
self.detect = to_raw_response_wrapper(
16391741
projects.detect,
16401742
)
@@ -1687,6 +1789,9 @@ def __init__(self, projects: AsyncProjectsResource) -> None:
16871789
self.delete = async_to_raw_response_wrapper(
16881790
projects.delete,
16891791
)
1792+
self.create_from_template = async_to_raw_response_wrapper(
1793+
projects.create_from_template,
1794+
)
16901795
self.detect = async_to_raw_response_wrapper(
16911796
projects.detect,
16921797
)
@@ -1739,6 +1844,9 @@ def __init__(self, projects: ProjectsResource) -> None:
17391844
self.delete = to_streamed_response_wrapper(
17401845
projects.delete,
17411846
)
1847+
self.create_from_template = to_streamed_response_wrapper(
1848+
projects.create_from_template,
1849+
)
17421850
self.detect = to_streamed_response_wrapper(
17431851
projects.detect,
17441852
)
@@ -1791,6 +1899,9 @@ def __init__(self, projects: AsyncProjectsResource) -> None:
17911899
self.delete = async_to_streamed_response_wrapper(
17921900
projects.delete,
17931901
)
1902+
self.create_from_template = async_to_streamed_response_wrapper(
1903+
projects.create_from_template,
1904+
)
17941905
self.detect = async_to_streamed_response_wrapper(
17951906
projects.detect,
17961907
)

src/codex/types/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
from .user_activate_account_params import UserActivateAccountParams as UserActivateAccountParams
2020
from .project_retrieve_analytics_params import ProjectRetrieveAnalyticsParams as ProjectRetrieveAnalyticsParams
2121
from .organization_list_members_response import OrganizationListMembersResponse as OrganizationListMembersResponse
22+
from .project_create_from_template_params import ProjectCreateFromTemplateParams as ProjectCreateFromTemplateParams
2223
from .project_retrieve_analytics_response import ProjectRetrieveAnalyticsResponse as ProjectRetrieveAnalyticsResponse
2324
from .organization_retrieve_permissions_response import (
2425
OrganizationRetrievePermissionsResponse as OrganizationRetrievePermissionsResponse,
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2+
3+
from __future__ import annotations
4+
5+
from typing import Optional
6+
from typing_extensions import Required, TypedDict
7+
8+
__all__ = ["ProjectCreateFromTemplateParams"]
9+
10+
11+
class ProjectCreateFromTemplateParams(TypedDict, total=False):
12+
organization_id: Required[str]
13+
14+
template_project_id: str
15+
16+
description: Optional[str]
17+
18+
name: Optional[str]

tests/api_resources/test_projects.py

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -439,6 +439,51 @@ def test_path_params_delete(self, client: Codex) -> None:
439439
"",
440440
)
441441

442+
@pytest.mark.skip(reason="Prism tests are disabled")
443+
@parametrize
444+
def test_method_create_from_template(self, client: Codex) -> None:
445+
project = client.projects.create_from_template(
446+
organization_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
447+
)
448+
assert_matches_type(ProjectReturnSchema, project, path=["response"])
449+
450+
@pytest.mark.skip(reason="Prism tests are disabled")
451+
@parametrize
452+
def test_method_create_from_template_with_all_params(self, client: Codex) -> None:
453+
project = client.projects.create_from_template(
454+
organization_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
455+
template_project_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
456+
description="description",
457+
name="name",
458+
)
459+
assert_matches_type(ProjectReturnSchema, project, path=["response"])
460+
461+
@pytest.mark.skip(reason="Prism tests are disabled")
462+
@parametrize
463+
def test_raw_response_create_from_template(self, client: Codex) -> None:
464+
response = client.projects.with_raw_response.create_from_template(
465+
organization_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
466+
)
467+
468+
assert response.is_closed is True
469+
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
470+
project = response.parse()
471+
assert_matches_type(ProjectReturnSchema, project, path=["response"])
472+
473+
@pytest.mark.skip(reason="Prism tests are disabled")
474+
@parametrize
475+
def test_streaming_response_create_from_template(self, client: Codex) -> None:
476+
with client.projects.with_streaming_response.create_from_template(
477+
organization_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
478+
) as response:
479+
assert not response.is_closed
480+
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
481+
482+
project = response.parse()
483+
assert_matches_type(ProjectReturnSchema, project, path=["response"])
484+
485+
assert cast(Any, response.is_closed) is True
486+
442487
@pytest.mark.skip(reason="Prism tests are disabled")
443488
@parametrize
444489
def test_method_detect(self, client: Codex) -> None:
@@ -1329,6 +1374,51 @@ async def test_path_params_delete(self, async_client: AsyncCodex) -> None:
13291374
"",
13301375
)
13311376

1377+
@pytest.mark.skip(reason="Prism tests are disabled")
1378+
@parametrize
1379+
async def test_method_create_from_template(self, async_client: AsyncCodex) -> None:
1380+
project = await async_client.projects.create_from_template(
1381+
organization_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
1382+
)
1383+
assert_matches_type(ProjectReturnSchema, project, path=["response"])
1384+
1385+
@pytest.mark.skip(reason="Prism tests are disabled")
1386+
@parametrize
1387+
async def test_method_create_from_template_with_all_params(self, async_client: AsyncCodex) -> None:
1388+
project = await async_client.projects.create_from_template(
1389+
organization_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
1390+
template_project_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
1391+
description="description",
1392+
name="name",
1393+
)
1394+
assert_matches_type(ProjectReturnSchema, project, path=["response"])
1395+
1396+
@pytest.mark.skip(reason="Prism tests are disabled")
1397+
@parametrize
1398+
async def test_raw_response_create_from_template(self, async_client: AsyncCodex) -> None:
1399+
response = await async_client.projects.with_raw_response.create_from_template(
1400+
organization_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
1401+
)
1402+
1403+
assert response.is_closed is True
1404+
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
1405+
project = await response.parse()
1406+
assert_matches_type(ProjectReturnSchema, project, path=["response"])
1407+
1408+
@pytest.mark.skip(reason="Prism tests are disabled")
1409+
@parametrize
1410+
async def test_streaming_response_create_from_template(self, async_client: AsyncCodex) -> None:
1411+
async with async_client.projects.with_streaming_response.create_from_template(
1412+
organization_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
1413+
) as response:
1414+
assert not response.is_closed
1415+
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
1416+
1417+
project = await response.parse()
1418+
assert_matches_type(ProjectReturnSchema, project, path=["response"])
1419+
1420+
assert cast(Any, response.is_closed) is True
1421+
13321422
@pytest.mark.skip(reason="Prism tests are disabled")
13331423
@parametrize
13341424
async def test_method_detect(self, async_client: AsyncCodex) -> None:

0 commit comments

Comments
 (0)