Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion swanlab/api/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ def get_logger(log_level: str = "info") -> SwanLog:

def handle_response(resp: requests.Response) -> ApiResponse:
try:
data = resp.json()
data = resp.json() if resp.content else {}
except (json.decoder.JSONDecodeError, requests.JSONDecodeError):
return ApiResponse[str](
code=resp.status_code,
Expand Down Expand Up @@ -126,6 +126,11 @@ def post(self, url: str, data: Union[dict, list], params: dict) -> ApiResponse:
resp = self.__session.post(self.base_url + url, json=data, params=params)
return handle_response(resp)

def delete(self, url: str, params: dict) -> ApiResponse:
self.__before_request()
resp = self.__session.delete(self.base_url + url, params=params)
return handle_response(resp)

class OpenApiService:
def __init__(self, http: ApiHTTP):
self.http: ApiHTTP = http
Expand Down
16 changes: 16 additions & 0 deletions swanlab/api/experiment.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,22 @@ def get_experiment(
resp.data = ExperimentAPI.parse(resp.data)
return resp

def delete_experiment(
self,
username: str,
projname: str,
exp_id: str
):
"""
删除实验

Args:
username (str): 工作空间名
projname (str): 项目名
exp_id (str): 实验CUID
"""
return self.http.delete(f"/project/{username}/{projname}/runs/{exp_id}", params={})

def list_experiments(
self,
username: str,
Expand Down
46 changes: 46 additions & 0 deletions swanlab/api/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,30 @@ def get_experiment(
username=username if username else self.http.username, projname=project, exp_id=exp_id
)

def delete_experiment(
self,
project: str,
exp_id: str,
username: str = ""
) -> ApiResponse[None]:
"""
删除实验
Args:
project (str): 项目名
exp_id (str): 实验CUID
username (str): 工作空间名, 默认为用户个人空间
Returns:
ApiResponse[None]:
- code (int): HTTP 状态码
- errmsg (str): 错误信息, 仅在请求有错误时非空
- data (None): 无数据返回
"""
return self.experiment.delete_experiment(
username=username if username else self.http.username, projname=project, exp_id=exp_id
)

def list_experiments(
self,
project: str,
Expand All @@ -109,6 +133,28 @@ def list_experiments(
username=username if username else self.http.username
)

def delete_project(
self,
project: str,
username: str = ""
) -> ApiResponse[None]:
"""
删除一个项目
Args:
project (str): 项目名
username (str): 工作空间名, 默认为用户个人空间
Returns:
ApiResponse[None]:
- code (int): HTTP 状态码
- errmsg (str): 错误信息, 仅在请求有错误时非空
- data (None): 无数据返回
"""
return self.project.delete_project(
username=username if username else self.http.username, project=project
)

def list_projects(
self,
username: str = "",
Expand Down
12 changes: 12 additions & 0 deletions swanlab/api/project.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,18 @@ def parse(cls, body: dict, detail=True) -> Project:
project_parser["count"] = body.get("_count") or {}
return Project.model_validate(project_parser)

def delete_project(
self, username: str, project: str
) -> ApiResponse[None]:
"""
删除一个项目
Args:
username (str): 工作空间名
project (str): 项目名
"""
return self.http.delete(f"/project/{username}/{project}", params={})

def list_projects(
self, username: str, detail = True, page: int = 1, size: int = 10
) -> ApiResponse[Pagination[Project]]:
Expand Down
11 changes: 11 additions & 0 deletions test/unit/api/test_experiment.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,3 +51,14 @@ def test_get_summary():
assert isinstance(res, ApiResponse)
if res.code == 200:
assert isinstance(res.data, dict)

@pytest.mark.skipif(T.is_skip_cloud_test, reason="skip cloud test")
def test_delete_experiment():
"""
删除一个实验
"""
api = OpenApi()
exp_cuid = "test_cuid"
res = api.delete_experiment(project="test_project", exp_id=exp_cuid)
assert isinstance(res, ApiResponse)
assert res.code in [204, 404]
11 changes: 11 additions & 0 deletions test/unit/api/test_project.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,3 +27,14 @@ def test_list_projects():
assert isinstance(resp.data, list)
for item in resp.data:
assert isinstance(item, Project)

@pytest.mark.skipif(T.is_skip_cloud_test, reason="skip cloud test")
def test_delete_project():
"""
测试删除一个项目
"""
api = OpenApi()
project_name = "test_project"
resp = api.delete_project(project=project_name)
assert isinstance(resp, ApiResponse)
assert resp.code in [204, 404]