Skip to content
Draft
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
10 changes: 5 additions & 5 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,14 @@ jobs:
DJANGO_SETTINGS_MODULE: pythonie.settings.tests
steps:
- uses: actions/checkout@v2
- name: Set Up Python 3.12
- name: Set Up Python 3.13
uses: actions/setup-python@v2
with:
python-version: "3.12"
python-version: "3.13"
- name: Install the dependencies
run: |
python -m pip install --upgrade pip setuptools uv
python -m uv pip install -r requirements/main.txt -r requirements/dev.txt
python -m pip install --upgrade pip uv
uv sync
- name: Run the tests
run: |
python pythonie/manage.py test pythonie --verbosity=2
uv run python pythonie/manage.py test pythonie --verbosity=2
1 change: 1 addition & 0 deletions .tool-versions
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
python 3.13.9
task 3.37.2
uv 0.9.18
57 changes: 46 additions & 11 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,8 @@ Always specify settings module: `--settings=pythonie.settings.dev` (or `tests`,
# Setup
python3 -m venv pythonie-venv
source pythonie-venv/bin/activate
pip install -r requirements.txt
pip install uv
uv sync

# Database
python pythonie/manage.py migrate --settings=pythonie.settings.dev
Expand Down Expand Up @@ -128,32 +129,66 @@ task code:check

### Dependency Management

Uses `uv` for fast Python package management. Dependencies are defined in `.in` files and compiled to `.txt` files:
Uses `uv` with `pyproject.toml` for dependency management. Dependencies are defined in `pyproject.toml` and locked in `uv.lock`:

```bash
# Recompile all dependencies
task dependencies:compute
# or: toast deps:compute
**Structure:**
- `pyproject.toml` - Dependency specifications (edit this to add/remove dependencies)
- `uv.lock` - Locked versions (auto-generated, commit to git)
- `requirements.txt` - Auto-generated for Heroku deployment

# Check outdated packages
task dependencies:outdated
**Common Commands:**

```bash
# Update lock file after changing pyproject.toml
task dependencies:lock

# Upgrade all dependencies
task dependencies:upgrade

# Upgrade only Wagtail
task dependencies:upgrade:wagtail

# Upgrade specific package
task dependencies:upgrade:package PACKAGE=django

# Install dependencies (development)
task dependencies:sync

# Install production dependencies only
task dependencies:sync:production

# Generate requirements.txt for Heroku
task dependencies:export

# Check outdated packages
task dependencies:outdated

# Check for security vulnerabilities
task dependencies:security

# Show dependencies tree
task dependencies:tree
```

**Adding a New Dependency:**

1. Edit `pyproject.toml` to add the dependency:
```toml
dependencies = [
"new-package",
# ...
]
```

2. Update lock and generate requirements.txt:
```bash
task dependencies:lock
task dependencies:export
```

3. Commit both files:
```bash
git add pyproject.toml uv.lock requirements.txt
git commit -m "Add new-package dependency"
```

### Database Operations (Heroku)

```bash
Expand Down
3 changes: 2 additions & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,8 @@ python3.13 -m venv pythonie-venv
source pythonie-venv/bin/activate

# Install dependencies
pip install -r requirements/dev.txt
pip install uv
uv sync

# Run migrations
python pythonie/manage.py migrate --settings=pythonie.settings.dev
Expand Down
5 changes: 3 additions & 2 deletions DEVELOPMENT.md
Original file line number Diff line number Diff line change
Expand Up @@ -168,7 +168,8 @@ python3.13 -m venv pythonie-venv
source pythonie-venv/bin/activate

# 2. Install dependencies
pip install -r requirements/dev.txt
pip install uv
uv sync

# 3. Migrate database
python pythonie/manage.py migrate --settings=pythonie.settings.dev
Expand Down Expand Up @@ -685,7 +686,7 @@ echo "django-debug-toolbar" >> requirements/main.in
uv pip compile requirements/main.in -o requirements/main.txt

# Install
pip install -r requirements/dev.txt
uv sync
```

### Database Migrations
Expand Down
13 changes: 5 additions & 8 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,13 @@ RUN --mount=type=cache,target=/var/cache/apt \
apt install -y --no-install-recommends \
build-essential gcc neovim fish less iputils-ping postgresql-client \
ack
ADD requirements/main.txt \
requirements/dev.txt \
requirements/production.txt \
./requirements/

# Copy dependency specification files
COPY pyproject.toml uv.lock README.md ./

RUN --mount=type=cache,target=/root/.cache \
pip install -U pip uv ruff && \
python -m uv pip install \
-r requirements/main.txt \
-r requirements/dev.txt \
-r requirements/production.txt aws
uv sync --group production --no-install-project

FROM compile-stage AS tests-stage

4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ If you prefer to develop without Docker:
3. Ensure you are running Python 3.13: `python -V` should output `Python 3.13.x`
4. Create a virtualenv: `python3 -m venv pythonie-venv`
5. Activate the virtualenv: `source pythonie-venv/bin/activate`
6. Install dependencies: `pip install -r requirements.txt` (or `uv pip install -r requirements.txt`)
6. Install uv and dependencies: `pip install uv && uv sync`
7. Set up the database: `python pythonie/manage.py migrate --settings=pythonie.settings.dev`
8. Generate sample data: `python pythonie/manage.py generate_sample_data --settings=pythonie.settings.dev`
9. Create a superuser: `python pythonie/manage.py createsuperuser --settings=pythonie.settings.dev`
Expand Down Expand Up @@ -259,7 +259,7 @@ This project uses several tools to streamline development:

### Import Errors or Module Not Found
- Rebuild Docker image: `task docker:build`
- Reinstall dependencies: `pip install -r requirements.txt`
- Reinstall dependencies: `uv sync`

## Contributing

Expand Down
47 changes: 27 additions & 20 deletions Taskfile.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -135,40 +135,49 @@ tasks:
cmds:
- docker compose run --rm web python pythonie/manage.py collectstatic

dependencies:compute:
desc: Compute the dependencies
dependencies:lock:
desc: Update uv.lock file from pyproject.toml
cmds:
- toast deps:compute
- uv lock

dependencies:outdated:
desc: List the outdated dependencies
dependencies:upgrade:
desc: Upgrade all dependencies
cmds:
- toast deps:outdated
- uv lock --upgrade

dependencies:upgrade:
desc: Upgrade the dependencies
dependencies:sync:
desc: Install dependencies from lock file (development)
cmds:
- toast deps:upgrade
- uv sync

dependencies:upgrade:django:
desc: Upgrade Django to the latest compatible version
dependencies:sync:production:
desc: Install production dependencies only
cmds:
- toast deps:upgrade:django
- uv sync --no-dev --group production

dependencies:upgrade:wagtail:
desc: Upgrade Wagtail to the latest compatible version
dependencies:export:
desc: Export uv.lock to requirements.txt for Heroku
cmds:
- toast deps:upgrade:wagtail
- uv export --no-dev --group production -o requirements.txt
- uv export --group dev --group production -o requirements-dev.txt
- |
echo "# AUTO-GENERATED from pyproject.toml - DO NOT EDIT" | cat - requirements.txt > temp && mv temp requirements.txt
echo "# AUTO-GENERATED from pyproject.toml - DO NOT EDIT" | cat - requirements-dev.txt > temp && mv temp requirements-dev.txt

dependencies:outdated:
desc: List the outdated dependencies
cmds:
- toast deps:outdated

dependencies:security:
desc: Check dependencies for known security vulnerabilities
cmds:
- toast deps:security
- uv run pip-audit

dependencies:tree:
desc: Show the dependencies tree
cmds:
- toast deps:tree
- uv tree

docker:build:
desc: Build the docker image
Expand Down Expand Up @@ -213,9 +222,7 @@ tasks:
dependencies:upgrade:package:
desc: "Upgrade a specific package (usage: task dependencies:upgrade:package PACKAGE=django)"
cmds:
- python -m uv pip compile --upgrade-package $PACKAGE --output-file requirements/main.txt requirements/main.in
- python -m uv pip compile --upgrade-package $PACKAGE --output-file requirements/dev.txt requirements/dev.in
- python -m uv pip compile --upgrade-package $PACKAGE --output-file requirements/production.txt requirements/production.in
- uv lock --upgrade-package {{.PACKAGE}}

tests:
desc: Run all tests
Expand Down
135 changes: 135 additions & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,135 @@
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"

[project]
name = "pythonie"
version = "2025.12.23"
description = "Python Ireland website - Django/Wagtail CMS for python.ie and pycon.ie"
readme = "README.md"
requires-python = ">=3.13.0"
license = {text = "MIT"}
authors = [{name = "Python Ireland", email = "info@python.ie"}]
keywords = ["django", "wagtail", "cms", "python-ireland", "pycon"]
classifiers = [
"Development Status :: 5 - Production/Stable",
"Framework :: Django :: 5.2",
"Framework :: Wagtail :: 7",
"Programming Language :: Python :: 3.13",
"License :: OSI Approved :: MIT License",
]

# Main production dependencies (from requirements/main.in)
dependencies = [
"Delorean",
"Django>=5.2.0,<5.3", # Reste sur Django 5.2.x
"Willow",
"boto3",
"colander",
"defusedxml",
"dj-database-url",
"dj-static",
"django-compressor",
"django-extensions",
"django-libsass",
"django-modelcluster",
"django-storages",
"django-taggit",
"gunicorn",
"pandas",
"pydantic",
"python-dateutil",
"pytz",
"redis",
"requests>=2.32.5",
"wagtail>=7.2.0,<7.3", # Wagtail 7.2.x compatible avec Django 5.2
"whitenoise",
]

# PEP 735 Dependency Groups
[dependency-groups]
# Development dependencies (from requirements/dev.in)
dev = [
"coverage",
"django-debug-toolbar",
"factory-boy",
"fakeredis",
"isort",
"model_mommy",
"pip-audit",
"pipdeptree",
"ruff",
"uv",
]

# Production-specific dependencies (from requirements/production.in)
production = [
"psycopg[binary]",
]

# Tool configurations
[tool.ruff]
target-version = "py313"
line-length = 88
exclude = [
"migrations",
".venv",
"venv",
"pythonie-venv",
".git",
"__pycache__",
]

[tool.ruff.lint]
select = [
"E", # pycodestyle errors
"F", # pyflakes
"I", # isort
"N", # pep8-naming
"W", # pycodestyle warnings
"UP", # pyupgrade
"DJ", # django-specific rules
]
ignore = [
"E501", # Line too long (handled by formatter)
]

[tool.ruff.lint.isort]
known-first-party = ["pythonie", "core", "meetups", "speakers", "sponsors"]
section-order = ["future", "standard-library", "third-party", "django", "wagtail", "first-party", "local-folder"]

[tool.ruff.lint.isort.sections]
"django" = ["django"]
"wagtail" = ["wagtail"]

[tool.ruff.format]
quote-style = "double"
indent-style = "space"
skip-magic-trailing-comma = false
line-ending = "auto"

[tool.coverage.run]
source = ["pythonie"]
omit = [
"*/migrations/*",
"*/tests/*",
"*/test_*.py",
"*/__pycache__/*",
"*/venv/*",
"*/.venv/*",
]

[tool.coverage.report]
exclude_lines = [
"pragma: no cover",
"def __repr__",
"raise AssertionError",
"raise NotImplementedError",
"if __name__ == .__main__.:",
]

[tool.django-stubs]
django_settings_module = "pythonie.settings.dev"

[tool.hatchling.build.targets.wheel]
packages = ["pythonie"]
Loading