diff --git a/.github/workflows/do_we_love_dima.yaml b/.github/workflows/do_we_love_dima.yaml new file mode 100644 index 0000000..381989f --- /dev/null +++ b/.github/workflows/do_we_love_dima.yaml @@ -0,0 +1,16 @@ +name: Do we love Dima? + +on: + push + +jobs: + example-job: + name: Do we love Dima? + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v2 + + - name: Show love for Dima + run: | + echo "Yes, we love Dima!" diff --git a/docs/UML.png b/docs/UML.png new file mode 100644 index 0000000..059d16e Binary files /dev/null and b/docs/UML.png differ diff --git a/docs/architecture_scheme.png b/docs/architecture_scheme.png new file mode 100644 index 0000000..e1764ee Binary files /dev/null and b/docs/architecture_scheme.png differ diff --git a/docs/design_document.md b/docs/design_document.md new file mode 100644 index 0000000..b69f812 --- /dev/null +++ b/docs/design_document.md @@ -0,0 +1,79 @@ +# Введение +## Назначение +Документ описывает архитектуру CLI-приложения в соответствии с IEEE 42010:2011 с целью обеспечения согласованности разработки, поддержки и расширения. +## Заинтересованные стороны +- Разработчики +- Пользователи + +# Архитектурное описание +## Архитектурные представления +### Контекст системы +Приложение взаимодействует с: +- Пользователем (ввод команд) +- Операционной системой (выполнение внешних команд) +- Файловой системой (чтение и запись файлов) + +### Логическое представление +Элементы архитектуры: +| Компонент | Описание | +|----------------|--------------------------------------------------------------------------| +| Environment | Хранит переменные окружения (map[string]string). | +| InputHandler | Считывает ввод в цикле, передает строки в Parser. | +| Parser | Разбивает команды на executor, подставляет переменные. | +| Executor | Запускает команды: встроенные (map[string]func) или внешние (os.Exec()). | + +### Поведенческое представление +Взаимодействие элементов: +- InputHandler → Parser : Передача сырой командной строки. +- Environment → Parser : Передача запрашиваемых переменных окружения. +- Parser → Executor : Передача очереди команд с аргументами. +- Executor → Environment : Обновление переменных окружения. + +### Представления разработки +- Диаграмма компонентов ([UML](UML.png) Component Diagram). +- Диаграмма последовательности ([Sequence Diagram](sequence_diagram.png)). + +# Сопроводительная документация +## Руководство разработчика +### Executor: добавление встроенных команд +- Откройте файл internal/executor/commands.go +- Добавьте функцию с сигнатурой func(cmd parseline.Command, *bytes.Buffer) (*bytes.Buffer, error). Она должна принимать буфер, выполнять логику и возвращать модифицированный буфер или ошибку. +- Зарегистрируйте команду в функции newCommands. + +### Environment +Управление переменными окружения. Требования: +- Реализовать конструктор для инициализации пустого хранилища переменных. +- Реализовать метод Set для установки переменной. +- Реализовать метод Get для получения значения переменной; если переменная не существует, вернуть ошибку. + +### InputHandler +Считывает ввод пользователя и передает Parser. Требования: +- Реализовать бесконечный цикл для ввода через стандартный поток. +- Передавать полученную строку в Parser. + +### Parser +Обрабатывает ввод на команды и аргументы, заменяет переменные окружения и строит pipeline. Требования: +- Разбивать строку на команды по символу |. +- Отделять имя команды от аргументов. +- Заменять переменные окружения из Environment. +- Возвращать структуру данных для последовательности команд. + +### Executor +Выполняет команды последовательно. Требования: +- Принимать pipeline из Parser. +- Выполнять команды с использованием executor. +- Передавать результат в качестве входных данных для следующей команды. +- Выводить результат в конец выполнения в стандартный вывод и сообщать InputHandler. + +## Руководство пользователя +- Встроенные команды: cat, echo, exit, pwd, wc. +- Команды объединяются в pipeline через |. +- Переменные не сохраняются между запусками. +- Встроенные команды поддерживают базовую функциональность. + +## Тестирование +### Юнит-Тестирование +Необходимо для каждого компонента. + +### Интеграционное тестирование +Тестирует pipeline полностью, проверяя корректность взаимодействия команд. diff --git a/docs/job_description.md b/docs/job_description.md new file mode 100644 index 0000000..66da0c6 --- /dev/null +++ b/docs/job_description.md @@ -0,0 +1,18 @@ +# Объекты + +# Environment +Инициализируем при запуске приложения переменными окружения, подгрузка переменных с прошлого запуска пока не подразумевается. Хранит переменные в виде map[string]string. Обладает геттером и сеттером. + +# InputHanlder +Занимается тем, что считывает строки пользователя в бесконечном цикле. Далее эти строки передаются Parser. + +# Parser +Подставляем переменные окружения. Разбиваем строку по пайпам, отделяем команду от аргументов, добавляем в очередь вызовов. + +# Executor +Идем по очереди. Получаем buffer с прошлого вызова, и вызываем запуск новой команды. После запуска последней команды, отправляет buffer в stdout и отчитывается перед InputHandler об окончании обработки команды. + +Далее запускает переданную команду, добавляет/обновляет переменные откружения. +Имеет поле map[string]func(buffer)buffer для хранения команд. В случае отсутствия собственной реализации, выполняет запуск команды через os.Exec(). Парсинг аргументов происходит внутри самой команды. В случае отсутствия собственной реализации функции, парсинг не производиться. + +Наша реализация CLI предполагает использование дополнительного потока только для обработки внешних сигналов(например: interrupt). Однако команды, запускаемые нашим CLI, могут использовать многопоточность без дополнительные ограничений от CLI. diff --git a/docs/sequence_diagram.png b/docs/sequence_diagram.png new file mode 100644 index 0000000..6300664 Binary files /dev/null and b/docs/sequence_diagram.png differ