diff --git a/.vscode/settings.json b/.vscode/settings.json index 8150718..6e80a92 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -2,5 +2,6 @@ "editor.tabSize": 4, "python.linting.enabled": true, "python.linting.pylintEnabled": true, - "python.linting.mypyEnabled": true + "python.linting.mypyEnabled": true, + "python.formatting.provider": "none" } \ No newline at end of file diff --git a/taskipy/exceptions.py b/taskipy/exceptions.py index 10eccfa..affdd4e 100644 --- a/taskipy/exceptions.py +++ b/taskipy/exceptions.py @@ -81,6 +81,16 @@ def __str__(self): ) +class EmptyTasksSectionError(TaskipyError): + exit_code = 127 + + def __str__(self): + return ( + 'no tasks found. create your first task ' + 'by adding it to your pyproject.toml file under [tool.taskipy.tasks]' + ) + + class CircularVariableError(TaskipyError): exit_code = 127 diff --git a/taskipy/help.py b/taskipy/list.py similarity index 88% rename from taskipy/help.py rename to taskipy/list.py index 77e3645..50e95aa 100644 --- a/taskipy/help.py +++ b/taskipy/list.py @@ -4,15 +4,19 @@ from typing import List from taskipy.task import Task +from taskipy.exceptions import EmptyTasksSectionError -class HelpFormatter: +class TasksListFormatter: def __init__(self, tasks: List[Task]): self.__tasks = tasks def print(self, line_width=shutil.get_terminal_size().columns): colorama.init() + if not self.__tasks: + raise EmptyTasksSectionError() + tasks_col = [task.name for task in self.__tasks] longest_item_in_tasks_col = len(max(tasks_col, key=len)) diff --git a/taskipy/task_runner.py b/taskipy/task_runner.py index bf5a3f2..0a72225 100644 --- a/taskipy/task_runner.py +++ b/taskipy/task_runner.py @@ -9,7 +9,7 @@ import psutil # type: ignore from taskipy.exceptions import CircularVariableError, TaskNotFoundError, MalformedTaskError -from taskipy.help import HelpFormatter +from taskipy.list import TasksListFormatter from taskipy.pyproject import PyProject from taskipy.task import Task from taskipy.variable import Variable @@ -28,7 +28,7 @@ def __init__(self, cwd: Union[str, Path]): def list(self): """lists tasks to stdout""" - formatter = HelpFormatter(self.__project.tasks.values()) + formatter = TasksListFormatter(self.__project.tasks.values()) formatter.print() def run(self, task_name: str, args: List[str]) -> int: diff --git a/tests/test_taskipy.py b/tests/test_taskipy.py index 7b67fd3..4b9b347 100644 --- a/tests/test_taskipy.py +++ b/tests/test_taskipy.py @@ -221,6 +221,24 @@ def test_running_task_list_with_arg(self): self.assertTerminalTextEqual(expected, stdout.strip()) self.assertEqual(exit_code, 0) + def test_running_task_list_no_tasks(self): + py_project_toml = ''' + [tool.taskipy.tasks] + ''' + cwd = self.create_test_dir_with_py_project_toml(py_project_toml) + exit_code, stdout, _ = self.run_task('--list', cwd=cwd) + + self.assertTerminalTextEqual('no tasks found. create your first task by adding it to your pyproject.toml file under [tool.taskipy.tasks]', stdout.strip()) + self.assertEqual(exit_code, 127) + + def test_running_task_list_no_tasks_section(self): + py_project_toml = '' + cwd = self.create_test_dir_with_py_project_toml(py_project_toml) + exit_code, stdout, _ = self.run_task('--list', cwd=cwd) + + self.assertTerminalTextEqual('no tasks found. add a [tool.taskipy.tasks] section to your pyproject.toml', stdout.strip()) + self.assertEqual(exit_code, 127) + class TaskDescriptionTestCase(TaskipyTestCase): def test_running_task_with_description(self):