6b0fca0100
Participant and Group are now pydantic BaseModels. Group.hosts can form cycles between groups, so it's kept as a private, non-persisted live list (set via set_hosts()/add_host()) backed by a serializable host_uuids field, re-linked via resolve_hosts() after a reload. A new Plan model (src/tatami/plan.py) bundles groups, the after-party group, and the event config (course_times, organizer_contacts, info_text, spreadsheet_id) and supports save()/load() to/from JSON. tatami_masterplan's __main__ now saves to masterplan.json (PLAN_FILE env var to override) on first run and loads it on later runs instead of recomputing, so the plan can be hand-edited (move a member between groups, change a course, fill in spreadsheet_id) and picked up on rerun without hitting the Routes API again. spreadsheet_id moves out of .env (GOOGLE_SHEETS_SPREADSHEET_ID) onto the plan itself, since it's part of the plan rather than a secret.
38 lines
865 B
TOML
38 lines
865 B
TOML
[project]
|
|
name = "tatami"
|
|
version = "0.1.0"
|
|
description = "Tool for Arranging Tasty Appointments, Meetings & Invitations"
|
|
readme = "README.md"
|
|
requires-python = ">=3.13"
|
|
dependencies = [
|
|
"gspread>=6.2.1",
|
|
"numpy>=2.2.4",
|
|
"pandas>=2.2.3",
|
|
"pandas-stubs>=2.2.3.250308",
|
|
"pydantic>=2.13.4",
|
|
"python-dotenv>=1.2.2",
|
|
"requests>=2.32.3",
|
|
"tqdm>=4.67.1",
|
|
"types-requests>=2.32.0.20250328",
|
|
"types-tqdm>=4.67.0.20250404",
|
|
]
|
|
|
|
[dependency-groups]
|
|
dev = [
|
|
"mypy>=1.15.0",
|
|
"pytest>=9.1.1",
|
|
"ruff>=0.11.5",
|
|
]
|
|
|
|
[build-system]
|
|
requires = ["hatchling"]
|
|
build-backend = "hatchling.build"
|
|
|
|
[tool.pytest.ini_options]
|
|
testpaths = ["tests"]
|
|
# Deselect live API tests by default; run them with `pytest -m e2e`.
|
|
addopts = "-q -m 'not e2e'"
|
|
markers = [
|
|
"e2e: live tests that call the real Google Routes API (opt-in, costs quota)",
|
|
]
|