@@ -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
|
||||||
@@ -1,87 +1,47 @@
|
|||||||
# 🌱 Farm Automation System
|
# Контрольные работы: Игорь
|
||||||
|
|
||||||
Учебный проект для практики работы с Git: слияние конфликтов и интерактивный ребейз.
|
Добро пожаловать в рабочее пространство для выполнения контрольных работ. В этом репозитории мы учимся писать чистый, качественный и работающий код, используя современные инструменты разработки.
|
||||||
|
|
||||||
## Описание проекта
|
## 🛠 Технологический стек
|
||||||
|
* **Язык**: Python
|
||||||
|
* **Автоматизация (CI)**: Gitea Actions
|
||||||
|
* **Контроль качества**: Ruff (линтер)
|
||||||
|
* **Стандарты коммитов**: Commitizen
|
||||||
|
|
||||||
Простая система автоматизации гидропонной фермы на Python с использованием ООП:
|
## 📋 Статус проверок
|
||||||
|
[](https://gitea.dimong.ru/Dimong4/Igor-kr/actions)
|
||||||
- **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
|
|
||||||
|
### 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-среде.
|
||||||
@@ -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}")
|
|
||||||
@@ -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
|
||||||
@@ -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"
|
||||||
|
]
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
ruff
|
||||||
|
commitizen
|
||||||
|
parameterized
|
||||||
|
pre_commit
|
||||||
Reference in New Issue
Block a user