mqtt, http, influx and delay carried the prototype's annotations and were excluded wholesale. Annotating them leaves nothing to exclude: what the two untyped dependencies need is an implicit-reexport allowance for influxdb_client and the import-site ignore croniter already gets elsewhere. InfluxDbNode.inject now takes the durable flag its supertype passes, and the cron loop reads its stop event once instead of dereferencing a field that stop_cron() may have cleared. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01H7LwYgJfpkbLCTeiAf8U4A
107 lines
2.9 KiB
TOML
107 lines
2.9 KiB
TOML
[project]
|
|
name = "app"
|
|
version = "0.1.0"
|
|
description = ""
|
|
# Capped below 3.14: the MCP SDK wants a newer starlette there than the
|
|
# pinned sentry-sdk allows. Lift it when sentry-sdk moves to 2.x.
|
|
requires-python = ">=3.10,<3.14"
|
|
dependencies = [
|
|
"fastapi[standard]<1.0.0,>=0.114.2",
|
|
"python-multipart<1.0.0,>=0.0.7",
|
|
"email-validator<3.0.0.0,>=2.1.0.post1",
|
|
"tenacity<9.0.0,>=8.2.3",
|
|
"pydantic>2.0",
|
|
"emails<1.0,>=0.6",
|
|
"jinja2<4.0.0,>=3.1.4",
|
|
"alembic<2.0.0,>=1.12.1",
|
|
"httpx<1.0.0,>=0.25.1",
|
|
"psycopg[binary]<4.0.0,>=3.1.13",
|
|
"sqlmodel<1.0.0,>=0.0.21",
|
|
"pydantic-settings<3.0.0,>=2.2.1",
|
|
"sentry-sdk[fastapi]<2.0.0,>=1.40.6",
|
|
"pyjwt<3.0.0,>=2.8.0",
|
|
"pwdlib[argon2,bcrypt]>=0.3.0",
|
|
"numpy>=2.2.6",
|
|
"redis>=7.1.0",
|
|
"cryptography>=44.0.0",
|
|
"aiomqtt>=2.0.0",
|
|
"influxdb-client[async]>=1.40.0",
|
|
"croniter>=1.3.0",
|
|
"mcp>=1.29,<2",
|
|
]
|
|
|
|
[dependency-groups]
|
|
dev = [
|
|
"pytest<8.0.0,>=7.4.3",
|
|
"mypy<2.0.0,>=1.8.0",
|
|
"ruff<1.0.0,>=0.2.2",
|
|
"prek>=0.2.24,<1.0.0",
|
|
"coverage<8.0.0,>=7.4.3",
|
|
]
|
|
|
|
[build-system]
|
|
requires = ["hatchling"]
|
|
build-backend = "hatchling.build"
|
|
|
|
[tool.mypy]
|
|
strict = true
|
|
exclude = ["venv", ".venv", "alembic"]
|
|
# influxdb_client's Point builder carries no annotations; calling it is not a
|
|
# reason to stop checking the caller (app/flow/nodes/influx.py).
|
|
untyped_calls_exclude = ["influxdb_client"]
|
|
|
|
# Every module is checked strictly. influxdb_client is typed but re-exports its
|
|
# names implicitly, which strict mode refuses to follow. (croniter, the other
|
|
# untyped dependency, is ignored at its two import sites.)
|
|
[[tool.mypy.overrides]]
|
|
module = ["influxdb_client"]
|
|
implicit_reexport = true
|
|
|
|
|
|
[tool.ruff]
|
|
target-version = "py310"
|
|
exclude = ["alembic"]
|
|
|
|
[tool.ruff.lint]
|
|
select = [
|
|
"E", # pycodestyle errors
|
|
"W", # pycodestyle warnings
|
|
"F", # pyflakes
|
|
"I", # isort
|
|
"B", # flake8-bugbear
|
|
"C4", # flake8-comprehensions
|
|
"UP", # pyupgrade
|
|
"ARG001", # unused arguments in functions
|
|
"T201", # print statements are not allowed
|
|
]
|
|
ignore = [
|
|
"E501", # line too long, handled by black
|
|
"B008", # do not perform function calls in argument defaults
|
|
"W191", # indentation contains tabs
|
|
"B904", # Allow raising exceptions without from e, for HTTPException
|
|
]
|
|
|
|
[tool.ruff.lint.per-file-ignores]
|
|
# Node functions take `params` whether or not they use it — that is the
|
|
# contract the engine calls them with.
|
|
"app/flow/nodes.py" = ["ARG001", "ARG002"]
|
|
"tests/flow/*" = ["ARG001"]
|
|
# Printing is what this one is about: node code is user code, and `print` is
|
|
# how it says things.
|
|
"tests/flow/test_logs.py" = ["ARG001", "T201"]
|
|
|
|
[tool.ruff.lint.pyupgrade]
|
|
# Preserve types, even if a file imports `from __future__ import annotations`.
|
|
keep-runtime-typing = true
|
|
|
|
[tool.coverage.run]
|
|
source = ["app"]
|
|
dynamic_context = "test_function"
|
|
|
|
[tool.coverage.report]
|
|
show_missing = true
|
|
sort = "-Cover"
|
|
|
|
[tool.coverage.html]
|
|
show_contexts = true
|