diff --git a/CHANGELOG.md b/CHANGELOG.md index c552438..9e87f97 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `TodoistAPIAsync` now performs true async HTTP I/O with `httpx2.AsyncClient`. - Support for Python 3.14. +- `add_project` and `update_project` accept the `table` view style. ### Removed diff --git a/tests/test_api_projects.py b/tests/test_api_projects.py index 212d430..13480cd 100644 --- a/tests/test_api_projects.py +++ b/tests/test_api_projects.py @@ -160,12 +160,13 @@ async def test_add_project_minimal( @pytest.mark.asyncio +@pytest.mark.parametrize("view_style", ["board", "table"]) async def test_add_project_full( todoist_api: TodoistAPI, todoist_api_async: TodoistAPIAsync, respx_mock: respx.MockRouter, default_project_response: dict[str, Any], - default_project: Project, + view_style: str, ) -> None: project_name = "A Project" args: dict[str, Any] = { @@ -173,8 +174,9 @@ async def test_add_project_full( "parent_id": "3Ty8VQXxpwv28PK3", "color": "red", "is_favorite": True, - "view_style": "board", + "view_style": view_style, } + project_response = default_project_response | {"view_style": view_style} mock_route( respx_mock, @@ -182,19 +184,19 @@ async def test_add_project_full( url=f"{DEFAULT_API_URL}/projects", request_headers=api_headers(), request_json={"name": project_name} | args, - response_json=default_project_response, + response_json=project_response, response_status=200, ) new_project = todoist_api.add_project(name=project_name, **args) assert len(respx_mock.calls) == 1 - assert new_project == default_project + assert new_project == Project.from_dict(project_response) new_project = await todoist_api_async.add_project(name=project_name, **args) assert len(respx_mock.calls) == 2 - assert new_project == default_project + assert new_project == Project.from_dict(project_response) @pytest.mark.asyncio diff --git a/todoist_api_python/api.py b/todoist_api_python/api.py index f74ce59..a0c4af3 100644 --- a/todoist_api_python/api.py +++ b/todoist_api_python/api.py @@ -740,7 +740,7 @@ def add_project( :param parent_id: The ID of the parent project. Set to null for root projects. :param color: The color of the project icon. :param is_favorite: Whether the project is a favorite. - :param view_style: A string value (either 'list' or 'board', default is 'list'). + :param view_style: 'list', 'board', 'calendar' or 'table' (default is 'list'). :return: The newly created project. :raises httpx2.HTTPStatusError: If the API request fails. :raises TypeError: If the API response is not a valid Project dictionary. @@ -788,7 +788,7 @@ def update_project( :param description: Description for the project (up to 1024 characters). :param color: The color of the project icon. :param is_favorite: Whether the project is a favorite. - :param view_style: A string value (either 'list' or 'board'). + :param view_style: 'list', 'board', 'calendar' or 'table'. :param order: Position of the project among projects with the same parent. :param collapsed: Whether the project's sub-projects are collapsed. :return: the updated Project. diff --git a/todoist_api_python/api_async.py b/todoist_api_python/api_async.py index fd086eb..8f3e106 100644 --- a/todoist_api_python/api_async.py +++ b/todoist_api_python/api_async.py @@ -760,7 +760,7 @@ async def add_project( :param parent_id: The ID of the parent project. Set to null for root projects. :param color: The color of the project icon. :param is_favorite: Whether the project is a favorite. - :param view_style: A string value (either 'list' or 'board', default is 'list'). + :param view_style: 'list', 'board', 'calendar' or 'table' (default is 'list'). :return: The newly created project. :raises httpx2.HTTPStatusError: If the API request fails. :raises TypeError: If the API response is not a valid Project dictionary. @@ -808,7 +808,7 @@ async def update_project( :param description: Description for the project (up to 1024 characters). :param color: The color of the project icon. :param is_favorite: Whether the project is a favorite. - :param view_style: A string value (either 'list' or 'board'). + :param view_style: 'list', 'board', 'calendar' or 'table'. :param order: Position of the project among projects with the same parent. :param collapsed: Whether the project's sub-projects are collapsed. :return: the updated Project. diff --git a/todoist_api_python/models.py b/todoist_api_python/models.py index 55364f7..2bd99f6 100644 --- a/todoist_api_python/models.py +++ b/todoist_api_python/models.py @@ -9,7 +9,7 @@ from todoist_api_python._core.endpoints import INBOX_URL, get_project_url, get_task_url -ViewStyle = Literal["list", "board", "calendar"] +ViewStyle = Literal["list", "board", "calendar", "table"] DurationUnit = Literal["minute", "day"] ReminderType = Literal["relative", "absolute"] ReminderService = Literal["email", "push"] diff --git a/todoist_api_python/types.py b/todoist_api_python/types.py index 02c0d7c..a01db09 100644 --- a/todoist_api_python/types.py +++ b/todoist_api_python/types.py @@ -35,7 +35,7 @@ ] ViewStyle = Annotated[ str, - Predicate(lambda value: value in ("list", "board", "calendar")), + Predicate(lambda value: value in ("list", "board", "calendar", "table")), ] __all__ = ["ColorString", "LanguageCode", "ViewStyle"]