mirror of
https://github.com/kuhyx/WUT_Computer_Science.git
synced 2026-11-10 22:07:10 +01:00
The note in TODO-refactor-remaining.md said ERSMS's four were structural and that a fix "would rewrite both models". Both halves were wrong. flask-sqlalchemy 3.1.1 does ship py.typed; the real blocker was that `class User(db.Model)` is attribute access, which mypy cannot resolve in a base-class position. backend/models.py now declares a named DeclarativeBase with SQLAlchemy 2.0 Mapped[] columns. The Model mixin goes away with the base, so the six legacy Model.query call sites became db.session selects and the two table names are spelled out rather than derived. Verified by driving the real routes through Flask's test client with Firebase stubbed out -- 16 scenarios covering every one of the six call sites, plus both CREATE TABLE statements, byte-identical to the submitted version. That harness caught the one thing review would not have: mapped_column(ForeignKey( "user.uid")) silently infers VARCHAR(80) from the referenced column, which had changed the submitted `user_id INTEGER`. An explicit Integer puts it back. app.py went over the 250-line cap on the way, hence the split; models.py takes the shebang + exec bit that NLP's nine import-only modules already use, since __init__.py would make `from models import` unresolvable to mypy while it still works at runtime. backend/Dockerfile copied only app.py, so it needed the new file too. PSD's two are pyflink's MapFunction and KeyedProcessFunction, which ship no types and are not installed in that venv at all -- a hand-written .pyi would assert an API nothing here can check. A [[tool.mypy.overrides]] scoped to that one module turns off disallow_subclassing_any and nothing else. ERSMS 4 -> 0, PSD 2 -> 0, under --strict. ruff and ruff format clean. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0172dj34FDpao6wsix8ZuCzE
125 lines
4.4 KiB
TOML
125 lines
4.4 KiB
TOML
# Python tooling for the whole archive. There is no package here to build --
|
|
# this file exists so ruff, mypy and coverage read one configuration instead of
|
|
# 25 course directories each guessing.
|
|
#
|
|
# The `exclude` and `omit` lists below are MIRRORS of gates/vendored.txt.
|
|
# Edit that manifest and re-run `./run.sh sync-vendored`; never edit a mirror
|
|
# on its own, or the gates start disagreeing about what is kuhy's code.
|
|
|
|
[tool.ruff]
|
|
target-version = "py310"
|
|
line-length = 88
|
|
include = ["*.py", "**/*.py", "*.ipynb", "**/*.ipynb"]
|
|
|
|
exclude = [
|
|
# --- machine-generated, never authored ---
|
|
".git",
|
|
".venv",
|
|
"__pycache__",
|
|
"build",
|
|
"dist",
|
|
"node_modules",
|
|
# --- mirrors of gates/vendored.txt ---
|
|
"Programming/EGUI/lab2/lab2/wwwroot/lib",
|
|
"Programming/E-PSYOPS/theProject/Assets/TextMesh Pro",
|
|
"Programming/E-PSYOPS/theProject/Assets/TutorialInfo",
|
|
"NotProgramming/EMISY/componentSchematic",
|
|
"NotProgramming/EMISY/schematic",
|
|
"Programming/EOPSY/lab3/task3/work",
|
|
"Programming/EOPSY/lab4/task4/work",
|
|
"Programming/TRAK/sightpy",
|
|
]
|
|
|
|
[tool.ruff.lint]
|
|
select = ["ALL"]
|
|
|
|
# The only rules turned off, and why. There are no per-file-ignores: the
|
|
# coursework is held to the same bar as the tooling, because git history is
|
|
# what preserves the version that was handed in.
|
|
ignore = [
|
|
# Pairwise-contradictory docstring rules -- ruff ships both halves of each
|
|
# pair in ALL and you must pick one. These match the rest of the fleet.
|
|
"D203", # ...vs D211, we take D211 (no blank line before class docstring)
|
|
"D213", # ...vs D212, we take D212 (summary on the first line)
|
|
# Disabled on the formatter's own advice: the formatter already decides
|
|
# both of these, and leaving them on makes the two tools fight.
|
|
# https://docs.astral.sh/ruff/formatter/#conflicting-lint-rules
|
|
"COM812", # missing trailing comma
|
|
"ISC001", # single-line implicit string concatenation
|
|
# A known false-positive generator: it cannot see that an argument list was
|
|
# validated upstream. https://github.com/astral-sh/ruff/issues/4045
|
|
"S603", # subprocess call without shell=True
|
|
# Ruff began enforcing this outside preview in 0.16; no repo in this fleet
|
|
# carries copyright headers, and stamping one onto 137 university
|
|
# assignments would be asserting a licence that was never claimed.
|
|
"CPY001", # missing copyright notice
|
|
]
|
|
|
|
fixable = ["ALL"]
|
|
unfixable = []
|
|
|
|
[tool.mypy]
|
|
strict = true
|
|
exclude = [
|
|
"^\\.venv/",
|
|
"^build/",
|
|
"^Programming/EGUI/lab2/lab2/wwwroot/lib/",
|
|
"^Programming/E-PSYOPS/theProject/Assets/TextMesh Pro/",
|
|
"^Programming/E-PSYOPS/theProject/Assets/TutorialInfo/",
|
|
"^NotProgramming/EMISY/componentSchematic/",
|
|
"^NotProgramming/EMISY/schematic/",
|
|
"^Programming/EOPSY/lab3/task3/work/",
|
|
"^Programming/EOPSY/lab4/task4/work/",
|
|
"^Programming/TRAK/sightpy/",
|
|
]
|
|
|
|
# Third-party packages that ship neither stubs nor a py.typed marker. This is
|
|
# not a suppression of our own code: without it mypy cannot import them at all
|
|
# and reports nothing else about the file that uses them.
|
|
[[tool.mypy.overrides]]
|
|
module = [
|
|
"Imath.*",
|
|
"OpenEXR.*",
|
|
"OpenGL.*",
|
|
"matplotlib.*",
|
|
"keras.*",
|
|
"tensorflow.*",
|
|
"sklearn.*",
|
|
"seaborn.*",
|
|
"kafka.*",
|
|
"pyflink.*",
|
|
"pandas.*",
|
|
"psycopg2.*",
|
|
"firebase_admin.*",
|
|
]
|
|
ignore_missing_imports = true
|
|
|
|
# pyflink ships no types AND is not installed in Programming/PSD/.venv, so
|
|
# `MapFunction` and `KeyedProcessFunction` are `Any` and --strict (which
|
|
# implies disallow_subclassing_any) refuses to subclass them. Scoped to the one
|
|
# module that has to subclass them; everything else in PSD is clean under
|
|
# --strict. A hand-written .pyi was the alternative and is worse: it would
|
|
# assert an API that nothing here can check against.
|
|
[[tool.mypy.overrides]]
|
|
module = ["temperature_anomaly_detector"]
|
|
disallow_subclassing_any = false
|
|
|
|
[tool.coverage.run]
|
|
branch = true
|
|
omit = [
|
|
"*/.venv/*",
|
|
"*/build/*",
|
|
"Programming/EGUI/lab2/lab2/wwwroot/lib/*",
|
|
"Programming/E-PSYOPS/theProject/Assets/TextMesh Pro/*",
|
|
"Programming/E-PSYOPS/theProject/Assets/TutorialInfo/*",
|
|
"NotProgramming/EMISY/componentSchematic/*",
|
|
"NotProgramming/EMISY/schematic/*",
|
|
"Programming/EOPSY/lab3/task3/work/*",
|
|
"Programming/EOPSY/lab4/task4/work/*",
|
|
"Programming/TRAK/sightpy/*",
|
|
]
|
|
|
|
[tool.coverage.report]
|
|
show_missing = true
|
|
skip_covered = false
|