[project] name = "kadence-backend" version = "0.1.0" description = "Pomodoro timer, todo aggregation, website/app blocking and daily Telegram reports." requires-python = ">=3.12" dependencies = [ "fastapi>=0.115", "uvicorn[standard]>=0.30", "sqlalchemy>=2.0", "psycopg[binary]>=3.2", "pydantic>=2.8", "pydantic-settings>=2.4", "httpx>=0.27", "beautifulsoup4>=4.12", "apscheduler>=3.10,<4", "python-dotenv>=1.0", "tzdata>=2024.1", ] [project.optional-dependencies] dev = ["pytest>=8.0", "ruff>=0.6"] [project.scripts] kadence = "app.cli:main" [build-system] requires = ["hatchling"] build-backend = "hatchling.build" [tool.hatch.build.targets.wheel] packages = ["app"] [tool.ruff] line-length = 90 target-version = "py312" # Named rather than left to whatever the installed ruff defaults to, because CI # runs this and a silent default change should not turn a push red. `format` is # deliberately not enforced: the layout here is hand-set in places (comment # tables, the DNS wire-format structs) and a formatter would flatten it. [tool.ruff.lint] select = ["E", "F", "I", "UP", "SIM", "B", "RUF"] ignore = [ # FastAPI's whole dependency idiom is a call in a default argument. "B008", # A line-length cap on comments and docstrings is for a formatter to decide. "E501", # The reports and the bot speak Russian as well as English, and the typography # is deliberate (× for counts, – in the laundry source's labels). "Ambiguous # character" is the wrong complaint about a string the user is meant to read. "RUF001", ] [tool.pytest.ini_options] pythonpath = ["."] testpaths = ["tests"]