1+ from __future__ import annotations
2+
3+ from collections .abc import Mapping
14from typing import Any
25
3- from ...models .releases import CreateReleaseLabel , ReleaseLabel
6+ from ...models .releases import (
7+ CreateReleaseLabel ,
8+ PaginatedReleaseLabelResponse ,
9+ ReleaseLabel ,
10+ UpdateReleaseLabel ,
11+ )
412from ..base_resource import BaseResource
513
614
715class ReleaseLabels (BaseResource ):
8- """API client for managing release labels."""
16+ """API client for managing workspace-level release labels."""
917
1018 def __init__ (self , config : Any ) -> None :
1119 super ().__init__ (config , "/workspaces/" )
1220
13- def list (self , workspace_slug : str ) -> list [ReleaseLabel ]:
14- """List all release labels in the workspace.
21+ def list (
22+ self , workspace_slug : str , params : Mapping [str , Any ] | None = None
23+ ) -> PaginatedReleaseLabelResponse :
24+ """List release labels in the workspace (paginated).
25+
26+ Returns one page (20 by default). Pass `per_page`/`cursor` in params and
27+ follow `next_cursor` to page through the rest.
1528
1629 Args:
1730 workspace_slug: The workspace slug identifier
31+ params: Optional query parameters, e.g. `per_page`, `cursor`
1832 """
19- response = self ._get (f"{ workspace_slug } /releases/labels/" )
20- return [ReleaseLabel .model_validate (item ) for item in response ]
33+ response = self ._get (f"{ workspace_slug } /releases/labels/" , params = params )
34+ return PaginatedReleaseLabelResponse .model_validate (response )
35+
36+ def retrieve (self , workspace_slug : str , label_id : str ) -> ReleaseLabel :
37+ """Retrieve a release label by ID.
38+
39+ Args:
40+ workspace_slug: The workspace slug identifier
41+ label_id: UUID of the release label
42+ """
43+ response = self ._get (f"{ workspace_slug } /releases/labels/{ label_id } /" )
44+ return ReleaseLabel .model_validate (response )
2145
2246 def create (self , workspace_slug : str , data : CreateReleaseLabel ) -> ReleaseLabel :
2347 """Create a new release label in the workspace.
@@ -31,3 +55,29 @@ def create(self, workspace_slug: str, data: CreateReleaseLabel) -> ReleaseLabel:
3155 data .model_dump (exclude_none = True ),
3256 )
3357 return ReleaseLabel .model_validate (response )
58+
59+ def update (self , workspace_slug : str , label_id : str , data : UpdateReleaseLabel ) -> ReleaseLabel :
60+ """Update a release label by ID.
61+
62+ Args:
63+ workspace_slug: The workspace slug identifier
64+ label_id: UUID of the release label
65+ data: Updated label data
66+ """
67+ response = self ._patch (
68+ f"{ workspace_slug } /releases/labels/{ label_id } /" ,
69+ data .model_dump (exclude_none = True ),
70+ )
71+ return ReleaseLabel .model_validate (response )
72+
73+ def delete (self , workspace_slug : str , label_id : str ) -> None :
74+ """Delete a release label by ID.
75+
76+ This deletes the label itself from the workspace. To only detach a label
77+ from a release, use `client.releases.item_labels.delete`.
78+
79+ Args:
80+ workspace_slug: The workspace slug identifier
81+ label_id: UUID of the release label
82+ """
83+ return self ._delete (f"{ workspace_slug } /releases/labels/{ label_id } /" )
0 commit comments