Files
Yamtrack/docs/development.md
David Davis e6765fa636 Migrate to uv (#1434)
* init uv project

* fix workflow for uv

* updated docs

* update dependabot to use uv

* lock python version

* fix python version

* update uv deps

* Address PR review feedback

- Match dependency versions to dev branch (Django 5.2.13, allauth 65.15.1,
  health-check 4.2.2 with [celery,redis] extras, ruff 0.15.10, fakeredis[lua])
- Remove unused django-decorator-include
- Restore single-line ruff ignore array (unrelated whitespace)
- Drop description/readme; mark as non-package via [tool.uv]
- Install supervisor via apk in Dockerfile
- Fix CI: use 'uv run playwright install'; drop unused --all-extras
- README: set `dynamic = ["version"]` to avoid declaring version

Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com>

* Fix container startup after switch to uv base image

- Dockerfile: prepend /.venv/bin to PATH so python/gunicorn/celery
  resolve directly (entrypoint.sh and supervisord.conf invoke them by
  name).
- entrypoint.sh: drop hardcoded /usr/local/bin/ prefix for supervisord;
  apk installs it to /usr/bin/supervisord, so let PATH resolve it.
- uv.lock: regenerated after pyproject.toml switched to dynamic version.

Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com>

* Add mkdocs and supervisor as uv deps; lint pyproject.toml

- Add a 'docs' dependency group with mkdocs and its plugins; switch
  build-docs.yml to use uv and remove docs/requirements.txt.
- Add supervisor to project deps so it ships in /.venv/bin instead of
  via apk in the Docker image.
- Add validate-pyproject and pyproject-fmt as dev deps and pre-commit
  hooks; reformat pyproject.toml accordingly.
- Drop unused dynamic version metadata (app version comes from the
  VERSION env var, not package metadata).

Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com>

* Move uv virtualenv into /yamtrack workdir

Set WORKDIR before copying pyproject.toml and uv.lock so the
uv-managed virtualenv is created at /yamtrack/.venv. Update PATH
accordingly and ignore .venv in .dockerignore.

Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com>

* Pin Python version to 3.12

Add .python-version so uv (and pyenv) consistently select the
same interpreter when creating the virtualenv.

Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com>

* Enable uv bytecode compilation in Docker image

Set UV_COMPILE_BYTECODE=1 so uv precompiles .pyc files during
'uv sync'. This trades a small build-time cost for faster
container/worker startup since Python doesn't have to compile
modules on first import.

Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com>

* Use multi-stage Docker build to slim the runtime image

Build the virtualenv with uv in a builder stage based on
ghcr.io/astral-sh/uv:python3.12-alpine, then copy /yamtrack/.venv
into a clean python:3.12-alpine final stage. The final image no
longer carries the uv binary or its build cache, and collectstatic
runs via 'python manage.py' since the venv is on PATH.

Set UV_LINK_MODE=copy in the builder so packages are copied (not
symlinked from a cache that the final stage will not see).

Reduces image size by roughly 150 MB in local testing.

Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com>

* Drop validate-pyproject and pyproject-fmt; revert pyproject formatting

Remove the validate-pyproject and pyproject-fmt pre-commit hooks
and dev dependencies, and revert the cosmetic pyproject.toml
formatting that pyproject-fmt had applied (e.g. nested
[tool.ruff.lint.*] tables and tight list spacing) to match the
dev branch style.

Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com>

* Pin Alpine version and preserve bytecode in Docker build

- Pin both builder and final stages to alpine3.21 for reproducibility
  and binary compatibility between the virtualenv and runtime image.
- Stop deleting __pycache__ after uv sync so the bytecode compiled via
  UV_COMPILE_BYTECODE=1 is actually shipped, giving faster startup and
  avoiding runtime compilation on read-only filesystems.

Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com>

* Add django-tailwind-cli for Tailwind integration

Replaces the standalone tailwindcss CLI workflow with django-tailwind-cli,
which downloads and manages the standalone Tailwind binary itself. The
output path (static/css/main.css) is preserved so base.html and the
production build are unchanged.

Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com>

* Split dev dependency group into lint and test

The dev group now includes both via include-group, preserving the existing
'uv sync' behavior while allowing lint-only or test-only installs.

Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com>

* Revert "Add django-tailwind-cli for Tailwind integration"

This reverts commit 3796e53e347b81784e69fa0328c4e3d35be90d55.

Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com>

* Add back pinning version to `0.0.0`

Using `dynamic`, uv tries to build an egg every time dependencies are
added/removed.

* Switch docs group from mkdocs to zensical

Upstream migrated documentation tooling from mkdocs to zensical. Replace
the mkdocs-* plugins in the docs dependency group with zensical and the
squidfunk fork of mike that zensical expects.

Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com>

---------

Co-authored-by: Eddi <75438446+minerop5000@users.noreply.github.com>
Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com>
Co-authored-by: David Davis <86290+daviddavis@users.noreply.github.com>
2026-05-17 14:58:53 +02:00

121 lines
2.2 KiB
Markdown

# Development
This page covers working on Yamtrack from source.
## Prerequisites
- [uv](https://docs.astral.sh/uv/getting-started/installation/)
- [tailwindcss CLI](https://tailwindcss.com/docs/installation/tailwind-cli) (install with `npm install -g tailwindcss @tailwindcss/cli`)
- Docker
- Redis
## General setup
### Clone the repository
```bash
git clone https://github.com/FuzzyGrim/Yamtrack.git
cd Yamtrack
```
### Start Redis
If you do not already have Redis running locally, start it with Docker:
```bash
docker run -d --name redis -p 6379:6379 --restart unless-stopped redis:8-alpine
```
### Install dependencies
uv manages the Python environment and dependencies:
```bash
uv sync
uv run pre-commit install
```
Installing the development dependencies includes pre-commit. After `uv run pre-commit install`, the hooks run automatically before each commit. You can also run the full hook set manually:
```bash
uv run pre-commit run --all-files
```
### Configure environment values
Create a `.env` file in the repository root:
```bash
TMDB_API=API_KEY
MAL_API=API_KEY
IGDB_ID=IGDB_ID
IGDB_SECRET=IGDB_SECRET
STEAM_API_KEY=STEAM_API_SECRET
BGG_API_TOKEN=BGG_API_TOKEN
SECRET=SECRET
DEBUG=True
```
See [Environment Variables](env-variables.md) for the full list of supported settings.
### Prepare the database
```bash
cd src
uv run manage.py migrate
```
### Run the app
Run the Django development server:
```bash
cd src
uv run manage.py runserver
```
Run the Celery worker with the scheduler in another terminal:
```bash
cd src
uv run celery -A config worker --beat --scheduler django --loglevel DEBUG
```
Run Tailwind in another terminal:
```bash
cd src
tailwindcss -i ./static/css/input.css -o ./static/css/tailwind.css --watch
```
Open the development server at:
```text
http://localhost:8000
```
## Documentation
Install the docs dependency group, then serve the docs from the current checkout:
```bash
uv sync --group docs
uv run zensical serve
```
## Testing
Run the Django test suite from the `src` directory:
```bash
cd src
uv run manage.py test --parallel
```
To run tests for a specific app or test module, pass the test label after `test`:
```bash
cd src
uv run manage.py test app.tests --parallel
```