Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion .dockerignore
Original file line number Diff line number Diff line change
Expand Up @@ -33,4 +33,6 @@ docker-compose.yml
.dockerignore

# TO DO folder
todo/
todo/
# Виртуальное окружение uv
.venv/
19 changes: 9 additions & 10 deletions .github/workflows/ci-cd.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,30 +27,29 @@ jobs:
- name: Checkout
uses: actions/checkout@v4

- name: Установка Python
uses: actions/setup-python@v5
- name: Установка uv
uses: astral-sh/setup-uv@v5
with:
python-version: "3.11"
cache: pip
cache-dependency-path: requirements-dev.txt
enable-cache: true

- name: Установка зависимостей
run: pip install -r requirements-dev.txt
run: uv sync --frozen

- name: Проверка форматирования (black)
run: black --check src tests
run: uv run black --check src tests

- name: Проверка импортов (isort)
run: isort --check-only src tests
run: uv run isort --check-only src tests

- name: Линтер (flake8)
run: flake8 .
run: uv run flake8 .

- name: Проверка типов (mypy)
run: mypy
run: uv run mypy

- name: Тесты (pytest)
run: pytest -q
run: uv run pytest -q

deploy:
name: Деплой на Raspberry Pi
Expand Down
9 changes: 7 additions & 2 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,17 +1,22 @@
FROM python:3.11.9-bookworm

COPY --from=ghcr.io/astral-sh/uv:0.9.14 /uv /uvx /usr/local/bin/

WORKDIR /app

RUN apt update && \
apt install -y ffmpeg && \
apt clean && \
rm -rf /var/lib/apt/lists/*

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# Зависимости ставятся отдельным слоем: пересборка только при
# изменении pyproject.toml или uv.lock, а не при каждом коммите
COPY pyproject.toml uv.lock ./
RUN uv sync --frozen --no-dev

COPY . .

ENV PATH="/app/.venv/bin:$PATH"
ENV PYTHONPATH=/app/src

EXPOSE 8001 8080
Expand Down
18 changes: 9 additions & 9 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -112,16 +112,16 @@ docker compose up -d

## ⚙️ CI/CD

Каждый pull request проходит проверки на GitHub-hosted раннере: `black`, `isort`, `flake8`, `mypy` (strict-уровень) и `pytest`. Пуш в `main` дополнительно запускает деплой на self-hosted раннере: сборка образов, перезапуск `docker compose` и healthcheck обоих сервисов. Конфигурация — в [`.github/workflows/ci-cd.yml`](.github/workflows/ci-cd.yml).
Каждый pull request проходит проверки на GitHub-hosted раннере (`uv sync --frozen`): `black`, `isort`, `flake8`, `mypy` (strict-уровень) и `pytest`. Пуш в `main` дополнительно запускает деплой на self-hosted раннере: сборка образов, перезапуск `docker compose` и healthcheck обоих сервисов. Конфигурация — в [`.github/workflows/ci-cd.yml`](.github/workflows/ci-cd.yml).

## 💻 Локальная разработка

### Установка зависимостей
Проект использует [uv](https://docs.astral.sh/uv/):
```bash
python -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -r requirements-dev.txt
uv sync
```
Команда создаст `.venv` и установит все зависимости, включая инструменты разработки, строго по `uv.lock`.

### Запуск сервисов
```bash
Expand All @@ -134,11 +134,11 @@ python -m src.dlna_stream_server.main

### Проверки перед коммитом
```bash
./.venv/bin/python -m black src tests
./.venv/bin/python -m isort src tests
./.venv/bin/python -m flake8 .
./.venv/bin/python -m mypy
./.venv/bin/python -m pytest
uv run black src tests
uv run isort src tests
uv run flake8 .
uv run mypy
uv run pytest
```

## ⚡ Требования
Expand Down
34 changes: 34 additions & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,3 +1,37 @@
[project]
name = "ya2dlna-streaming"
version = "1.0.0"
description = "Стриминг музыки с Яндекс Станции на DLNA-устройства (Ruark R5)"
requires-python = ">=3.11"
dependencies = [
"aiohttp==3.11.18",
"fastapi==0.115.11",
"injector==0.22.0",
"pydantic==2.10.6",
"pydantic-settings==2.8.1",
"upnpclient==1.0.3",
"uvicorn==0.34.0",
"yandex-music==3.0.0",
"zeroconf==0.146.1",
]

[dependency-groups]
dev = [
"black",
"flake8",
"flake8-bugbear",
"flake8-docstrings",
"flake8-isort",
"isort",
"mypy",
"pytest==8.3.5",
"pytest-asyncio==0.26.0",
]

[tool.uv]
# Проект не собирается как пакет: uv управляет только зависимостями
package = false

[tool.black]
line-length = 79
target-version = ['py311']
Expand Down
11 changes: 0 additions & 11 deletions requirements-dev.txt

This file was deleted.

9 changes: 0 additions & 9 deletions requirements.txt

This file was deleted.

Loading
Loading