diff --git a/.gitignore b/.gitignore index 65a5a36..d82b4cb 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ todo/target/ .vscode/ +.lingma/ \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 03acd03..0089a5f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,9 +1,19 @@ -# Журнал изменений - Все заметные изменения проекта будут документироваться в этом файле. Формат основан на [Keep a Changelog](https://keepachangelog.com/ru/1.0.0/), -и этот проект придерживается [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +и этот проект придерживается [Semantic Versioning](https://semver.org/spec/v2.0.0.html) + +## [2.1.0] - 2025-06-01 + +### Добавлено +- Команда `search <текст>` для поиска задач по тексту (реализован класс `SearchCommand`) +- Метод `search(String query)` в `TaskService` для поддержки поиска задач +- Рефакторинг: вынесение общего функционала отображения задач в отдельный метод `formatWithTable()` в классе `ListCommand` + +### Изменено +- Обновлены внутренние зависимости между компонентами CLI (`SearchCommand`, `ListCommand`) и моделью данных (`Task`, `SimpleTask`) +- Добавлена обработка минимальной длины поискового запроса (3 символа) в `SearchCommand`# Журнал изменений + ## [2.0.0] - 2025-05-29 @@ -11,4 +21,4 @@ - Базовая функциональность для управления задачами - Команды: create, list, delete - Консольный интерфейс для взаимодействия с приложением -- In-memory хранилище задач \ No newline at end of file +- In-memory хранилище задач \ No newline at end of file diff --git a/README.md b/README.md index 54efe8b..b771189 100644 --- a/README.md +++ b/README.md @@ -19,6 +19,7 @@ java -jar ./target/todo.jar - `list` - Показать список всех задач - `complete ` - Отметить задачу как выполненную - `delete ` - Удалить задачу +- `search <текст>` - Найти задачи по тексту - `exit` - Выйти из приложения ## Структура проекта @@ -28,7 +29,7 @@ java -jar ./target/todo.jar - `cli` - Компоненты интерфейса командной строки ## Версии -Актуальная версия: 2.0 +Актуальная версия: 2.1 ## Лицензия -[MIT](LICENSE) \ No newline at end of file +[MIT](LICENSE) \ No newline at end of file diff --git a/todo/pom.xml b/todo/pom.xml index f5a8185..3058f16 100644 --- a/todo/pom.xml +++ b/todo/pom.xml @@ -6,7 +6,7 @@ ru.kamask.pet todo - 2.0-SNAPSHOT + 2.1 24 diff --git a/todo/src/main/java/ru/kamask/pet/todo/cli/CliEngine.java b/todo/src/main/java/ru/kamask/pet/todo/cli/CliEngine.java index dd39b15..f345398 100644 --- a/todo/src/main/java/ru/kamask/pet/todo/cli/CliEngine.java +++ b/todo/src/main/java/ru/kamask/pet/todo/cli/CliEngine.java @@ -21,7 +21,7 @@ public class CliEngine { } public void start() throws IOException { - System.out.println("\nДобро пожаловать в Список задач 2.0!"); + System.out.println("\nДобро пожаловать в Список задач 2.1!"); System.out.println("Введите help для просмтора доступных команд или exit для выхода."); while (true) { System.out.print("\ntodo> "); @@ -46,6 +46,7 @@ public class CliEngine { registerCommand(new CreateCommand()); registerCommand(new ListCommand()); registerCommand(new CompleteCommand()); + registerCommand(new SearchCommand()); registerCommand(new DeleteCommand()); } diff --git a/todo/src/main/java/ru/kamask/pet/todo/cli/ListCommand.java b/todo/src/main/java/ru/kamask/pet/todo/cli/ListCommand.java index 102837c..80b2fc5 100644 --- a/todo/src/main/java/ru/kamask/pet/todo/cli/ListCommand.java +++ b/todo/src/main/java/ru/kamask/pet/todo/cli/ListCommand.java @@ -1,5 +1,6 @@ package ru.kamask.pet.todo.cli; +import java.util.List; import java.util.Optional; import ru.kamask.pet.todo.model.SimpleTask; @@ -17,18 +18,8 @@ public class ListCommand implements Command { if (args.length > 0) return Optional.of(Command.errorMessage); - String template = "%-2s | %-30s | %s\n"; - String res = ""; - res += String.format(template, "ID", "Название задачи", "Статус"); - res += "-".repeat(50) + "\n"; - - if (service.list().size() == 0) - return Optional.of(res + "\nСписок задач пуст."); - - for (Task task : service.list()) { - SimpleTask.Data data = ((SimpleTask) task).data(); - res += String.format(template, data.id(), data.title(), data.done() ? "выполнено" : "не выполнено"); - } + var res = formatWithTable(service.list(), "Список задач пуст."); + return Optional.of(res); } @@ -36,4 +27,21 @@ public class ListCommand implements Command { public String usage() { return String.format(templateUsage, name(), "Список всех задач."); } + + String formatWithTable(List tasks, String msgIfEmpty){ + String template = "%-2s | %-30s | %s\n"; + String res = ""; + res += String.format(template, "ID", "Название задачи", "Статус"); + res += "-".repeat(50) + "\n"; + + if (tasks.size() == 0) + return res + "\n" + msgIfEmpty; + + for (Task task : tasks) { + SimpleTask.Data data = ((SimpleTask) task).data(); + res += String.format(template, data.id(), data.title(), data.done() ? "выполнено" : "не выполнено"); + } + + return res; + } } diff --git a/todo/src/main/java/ru/kamask/pet/todo/cli/SearchCommand.java b/todo/src/main/java/ru/kamask/pet/todo/cli/SearchCommand.java new file mode 100644 index 0000000..ae4ede6 --- /dev/null +++ b/todo/src/main/java/ru/kamask/pet/todo/cli/SearchCommand.java @@ -0,0 +1,30 @@ +package ru.kamask.pet.todo.cli; + +import java.util.Optional; + +import ru.kamask.pet.todo.service.TaskService; + +public class SearchCommand implements Command { + @Override + public String name() { + return "search"; + } + + @Override + public String usage() { + return String.format(templateUsage, name() + " <текст>", "Поиск задач по тексту (минимум 3 символа)"); + } + + @Override + public Optional handle(String[] args, TaskService service) { + if (args.length != 1) + return Optional.of(Command.errorMessage); + if (args[0].length() < 3) + return Optional.of("Длина запроса должна быть не менее 3 символов."); + + var matchTask = service.search(args[0]); + var res = new ListCommand().formatWithTable(matchTask, "Не найдено задач, соответствующих запросу."); + + return Optional.of(res); + } +} diff --git a/todo/src/main/java/ru/kamask/pet/todo/service/TaskService.java b/todo/src/main/java/ru/kamask/pet/todo/service/TaskService.java index 29fd8dd..e8e0498 100644 --- a/todo/src/main/java/ru/kamask/pet/todo/service/TaskService.java +++ b/todo/src/main/java/ru/kamask/pet/todo/service/TaskService.java @@ -42,4 +42,10 @@ public class TaskService { public boolean has(int id) { return repo.has(id); } + + public List search(String query) { + return repo.findAll().stream() + .filter(task -> ((SimpleTask) task).data().title().contains(query)) + .toList(); + } }