From b14f14147f87c06b71bb688904e83c28f60f3a31 Mon Sep 17 00:00:00 2001 From: Dmitry Belan Date: Tue, 14 Jul 2026 17:07:21 +0300 Subject: [PATCH] feat: add CI gitea --- .gitea/workflows/ci.yaml | 34 ++++++++++ README.md | 122 ++++++++++++----------------------- analyzer.py | 9 --- farm_core/README.md | 87 +++++++++++++++++++++++++ main.py => farm_core/main.py | 0 pyproject.toml | 54 ++++++++++++++++ requirements/test.txt | 4 ++ 7 files changed, 220 insertions(+), 90 deletions(-) create mode 100644 .gitea/workflows/ci.yaml delete mode 100644 analyzer.py create mode 100644 farm_core/README.md rename main.py => farm_core/main.py (100%) create mode 100644 pyproject.toml create mode 100644 requirements/test.txt diff --git a/.gitea/workflows/ci.yaml b/.gitea/workflows/ci.yaml new file mode 100644 index 0000000..c5faca9 --- /dev/null +++ b/.gitea/workflows/ci.yaml @@ -0,0 +1,34 @@ +name: CI Check + +on: [push, pull_request] + +jobs: + lint-and-check: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + # Важно для commitizen, чтобы подтянуть историю всех коммитов + fetch-depth: 0 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '3.12' + + - name: Install dependencies + run: | + pip install ruff commitizen + + - name: Run Ruff Check + # Ruff автоматически подхватит настройки из pyproject.toml + run: ruff check . + + - name: Run Ruff Format Check + # Проверка соответствия стилю + run: ruff format --check . + + - name: Check Commit Convention + # Проверка всех новых коммитов в PR или последней пуш-сессии + run: cz check --rev-range HEAD~1..HEAD \ No newline at end of file diff --git a/README.md b/README.md index fc05c70..30e9393 100644 --- a/README.md +++ b/README.md @@ -1,87 +1,47 @@ -# 🌱 Farm Automation System +# Контрольные работы: Игорь -Учебный проект для практики работы с Git: слияние конфликтов и интерактивный ребейз. +Добро пожаловать в рабочее пространство для выполнения контрольных работ. В этом репозитории мы учимся писать чистый, качественный и работающий код, используя современные инструменты разработки. -## Описание проекта +## 🛠 Технологический стек +* **Язык**: Python +* **Автоматизация (CI)**: Gitea Actions +* **Контроль качества**: Ruff (линтер) +* **Стандарты коммитов**: Commitizen -Простая система автоматизации гидропонной фермы на Python с использованием ООП: - -- **BioCulture** — класс биокультуры со стадиями роста ("Зеленый" → "Красный") -- **HydroponicModule** — модуль, управляющий несколькими культурами -- **FarmAgent** — агент-оператор для управления модулем и сбора урожая - -## Структура проекта - -``` -Igor-kr/ -├── main.py # Точка входа -├── farm_core/ -│ ├── __init__.py -│ ├── module.py # Классы BioCulture и HydroponicModule -│ └── agent.py # Класс FarmAgent -└── README.md -``` - -## Ветки - -- **main** — базовая заготовка со "сломанным" методом `grow()` (вызывает `NotImplementedError`) -- **feature-api** — рабочая реализация метода `grow()` и новая функция `harvest()` - -## 🎯 Практические задания - -### Задание 1: Разрешение конфликтов при слиянии - -**Цель:** Научиться разрешать merge conflicts. - -**Шаги:** - -1. Убедитесь, что вы на ветке `main` -2. Попытайтесь слить ветку `feature-api` -3. **Ожидаемый результат:** Конфликт в файле `farm_core/module.py` в методе `grow()`: - - В `main`: `raise NotImplementedError("Рост не реализован в main!")` - - В `feature-api`: `self._stage = "Красный"` -4. Откройте файл `farm_core/module.py` и разрешите конфликт -5. Завершите слияние - -### Задание 2: Интерактивный ребейз (очистка истории) - -**Цель:** Научиться объединять "мусорные" коммиты в один чистый коммит. - -**Шаги:** - -1. Переключитесь на ветку `feature-api` -2. Посмотрите на историю коммитов (вы увидите три мусорных коммита: done, fix2, fix) -3. Запустите интерактивный ребейз для последних 3 коммитов -4. Объедините три мусорных коммита в один -5. Проверьте результат — вместо трех мусорных коммитов должен быть один чистый коммит - -### Задание 3 (дополнительно): Проверка работы кода - -1. Переключитесь на `main` после успешного слияния -2. Допишите в `main.py` цикл для проверки работы: - ```python - for culture in module.cultures: - culture.grow() - - print(f"Готово к сбору: {agent.harvest()} культур(ы)") - ``` -3. Запустите код - -**Ожидаемый вывод:** -``` -Инструкция: pH 6.0 -Готово к сбору: 3 культур(ы) -``` - -## ✅ Критерии успешного выполнения - -- [ ] Конфликт в `module.py` успешно разрешен -- [ ] Метод `grow()` работает корректно (изменяет стадию на "Красный") -- [ ] Три мусорных коммита объединены в один -- [ ] История коммитов чистая и понятная -- [ ] Код запускается без ошибок +## 📋 Статус проверок +[![Gitea Actions Status](https://gitea.dimong.ru/Dimong4/Igor-kr/actions/workflows/ci.yaml/badge.svg)](https://gitea.dimong.ru/Dimong4/Igor-kr/actions) --- -**Автор:** Dmitry Belan -**Дата:** 2026-07-01 +## 🚀 Как работать с этим репозиторием + +### 1. Подготовка окружения +Перед началом работы убедись, что у тебя установлены: +* **Git** — для управления версиями. +* **Python 3.x** — для написания кода. +* **pip** — для установки зависимостей. + +### 2. Установка зависимостей +Если твое решение требует дополнительных библиотек: +1. Создай файл `requirements.txt` в корне проекта. +2. Установи зависимости командой: `pip install -r requirements.txt`. +3. Обязательно добавь все используемые библиотеки в `requirements.txt`, чтобы они корректно работали в среде автоматической проверки. + +### 3. Рабочий процесс (Workflow) +1. **Создай новую ветку** для своей работы: `git checkout -b task-name`. +2. **Пиши код** и проверяй его локально. +3. **Сделай коммит**, соблюдая правила (Commitizen): `git commit -m "feat: добавил решение задачи №1"`. +4. **Отправь изменения** в репозиторий: `git push origin task-name`. + +### 4. Проверка и сдача +* После `push` перейди на страницу репозитория во вкладку **Actions**. +* Если горит **зеленая галочка ✅** — работа прошла автоматический контроль качества. +* Если **красный крестик ❌** — открой логи задачи, исправь замечания линтера и запушь исправления. +* После успеха создай **Pull Request** из своей ветки в `main` для финальной проверки. + +--- + +## 🎓 Правила +* **Чистота кода**: Игнорирование предупреждений линтера `Ruff` недопустимо. +* **Ветка main**: Прямые пуши в `main` запрещены. Ветка защищена правилами CI/CD. +* **Ответственность**: Ты несешь ответственность за свой код и его работоспособность в CI-среде. \ No newline at end of file diff --git a/analyzer.py b/analyzer.py deleted file mode 100644 index d755824..0000000 --- a/analyzer.py +++ /dev/null @@ -1,9 +0,0 @@ -temperatures = [37, 48, 30, 29, 41, -30, -29, -90] -number_ice = 0 -for i in (temperatures): - if i >= 0: - print(i) - else: - number_ice += 1 - -print(f"Number ice Day: {number_ice}") diff --git a/farm_core/README.md b/farm_core/README.md new file mode 100644 index 0000000..fc05c70 --- /dev/null +++ b/farm_core/README.md @@ -0,0 +1,87 @@ +# 🌱 Farm Automation System + +Учебный проект для практики работы с Git: слияние конфликтов и интерактивный ребейз. + +## Описание проекта + +Простая система автоматизации гидропонной фермы на Python с использованием ООП: + +- **BioCulture** — класс биокультуры со стадиями роста ("Зеленый" → "Красный") +- **HydroponicModule** — модуль, управляющий несколькими культурами +- **FarmAgent** — агент-оператор для управления модулем и сбора урожая + +## Структура проекта + +``` +Igor-kr/ +├── main.py # Точка входа +├── farm_core/ +│ ├── __init__.py +│ ├── module.py # Классы BioCulture и HydroponicModule +│ └── agent.py # Класс FarmAgent +└── README.md +``` + +## Ветки + +- **main** — базовая заготовка со "сломанным" методом `grow()` (вызывает `NotImplementedError`) +- **feature-api** — рабочая реализация метода `grow()` и новая функция `harvest()` + +## 🎯 Практические задания + +### Задание 1: Разрешение конфликтов при слиянии + +**Цель:** Научиться разрешать merge conflicts. + +**Шаги:** + +1. Убедитесь, что вы на ветке `main` +2. Попытайтесь слить ветку `feature-api` +3. **Ожидаемый результат:** Конфликт в файле `farm_core/module.py` в методе `grow()`: + - В `main`: `raise NotImplementedError("Рост не реализован в main!")` + - В `feature-api`: `self._stage = "Красный"` +4. Откройте файл `farm_core/module.py` и разрешите конфликт +5. Завершите слияние + +### Задание 2: Интерактивный ребейз (очистка истории) + +**Цель:** Научиться объединять "мусорные" коммиты в один чистый коммит. + +**Шаги:** + +1. Переключитесь на ветку `feature-api` +2. Посмотрите на историю коммитов (вы увидите три мусорных коммита: done, fix2, fix) +3. Запустите интерактивный ребейз для последних 3 коммитов +4. Объедините три мусорных коммита в один +5. Проверьте результат — вместо трех мусорных коммитов должен быть один чистый коммит + +### Задание 3 (дополнительно): Проверка работы кода + +1. Переключитесь на `main` после успешного слияния +2. Допишите в `main.py` цикл для проверки работы: + ```python + for culture in module.cultures: + culture.grow() + + print(f"Готово к сбору: {agent.harvest()} культур(ы)") + ``` +3. Запустите код + +**Ожидаемый вывод:** +``` +Инструкция: pH 6.0 +Готово к сбору: 3 культур(ы) +``` + +## ✅ Критерии успешного выполнения + +- [ ] Конфликт в `module.py` успешно разрешен +- [ ] Метод `grow()` работает корректно (изменяет стадию на "Красный") +- [ ] Три мусорных коммита объединены в один +- [ ] История коммитов чистая и понятная +- [ ] Код запускается без ошибок + +--- + +**Автор:** Dmitry Belan +**Дата:** 2026-07-01 diff --git a/main.py b/farm_core/main.py similarity index 100% rename from main.py rename to farm_core/main.py diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..fd61a0f --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,54 @@ +[tool.commitizen] +name = "cz_conventional_commits" +tag_format = "0" +version_scheme = "semver" +version = "0.0.1" +update_changelog_on_bump = true +major_version_zero = true + +[tool.ruff] +line-length = 80 +exclude = [ + ".git", + "__pycache__", + "build", + "dist", + ".venv", + "venv", + ".mypy_cache", + ".pytest_cache", +] + +[tool.ruff.lint] +select = ["E", "F", "W", "N", "I", "Q", "T20"] +ignore = ["N802", "T201", "T001"] + +[tool.ruff.lint.flake8-quotes] +inline-quotes = "double" +multiline-quotes = "double" +docstring-quotes = "double" + +# Аналог import-order-style = "google" +[tool.ruff.lint.isort] +known-first-party = [] + +[tool.flake8] +max-line-length = 80 +import-order-style = "google" +inline-quotes = "double" +multiline-quotes = "double" +docstring-quotes = "double" + +# Записываем ignore как строку, если их несколько, или список +ignore = "N802,T201,T001" + +exclude = [ + ".git", + "__pycache__", + "build", + "dist", + ".venv", + "venv", + ".mypy_cache", + ".pytest_cache" +] \ No newline at end of file diff --git a/requirements/test.txt b/requirements/test.txt new file mode 100644 index 0000000..355c4c8 --- /dev/null +++ b/requirements/test.txt @@ -0,0 +1,4 @@ +ruff +commitizen +parameterized +pre_commit \ No newline at end of file