mirror of
https://github.com/kuhyx/WUT_Computer_Science.git
synced 2026-11-10 18:47:11 +01:00
152 ruff findings to 0 across twelve files, and mypy --strict is clean on all of them but one -- see the end. The course is marked unrunnable because it wants Kafka and Flink, so the verification is what can be run without them. Ten of the twelve modules now import cleanly against a venv with confluent-kafka, kafka-python and flask; the two pyflink ones are skipped. That check did not exist before, because four of these files WERE their own side effect: - `kafka/generate_and_send.py` and `kafka/kafka_consumer.py` ran their `while True:` loop at module level. Importing either never returns; I gave up after twelve seconds of rdkafka connection failures. - `zin1/producent.py` built a KafkaProducer at module level and raised NoBrokersAvailable on import. - `flink/anomaly_detector.py` called `env.execute()` at module level. Each is a `main()` behind a `__main__` guard now, so importing one is free and running it is unchanged. `webinterface.py` called `json.loads` and never imported json, so the first message on the topic would have raised NameError. mypy then found three more of the same shape: confluent-kafka's `msg.error()` and `msg.value()` both return Optional, and the code dereferenced them straight away. They are narrowed to locals now, which also stops `msg.error()` being called twice per message. A malformed alarm with no timestamp is skipped with a warning instead of dividing None by 1000. Two SLF001 findings were reads of `KafkaError._PARTITION_EOF`. That leading underscore is confluent-kafka's own naming and there is no public alias, but `KafkaError.name()` is public and returns exactly that string -- checked against the installed library, where code() is -191 and name() is "_PARTITION_EOF". Flask's `debug=True` is now opt-in via FLASK_DEBUG, because the debug console executes arbitrary code. The ten `random` calls are simulation, not crypto, so S311 is not a real vulnerability -- but `secrets.SystemRandom()` is a drop-in with the same methods and no rule to argue with, so that is what they use. Behaviour is checked, not assumed: the sensor still returns a location in 1..10 and a temperature in -20..40, the thresholds still classify -15 as too cold, 40 as too hot and 20 as normal, transactions still carry a four-digit card id, and TemperatureReading survives a to_dict/from_dict round trip. **Two mypy errors remain and are deliberate.** `--strict` implies `disallow_subclassing_any`, and the Flink job must subclass pyflink's MapFunction and KeyedProcessFunction, which ship no types. Fixing it means weakening strict globally or writing an override for our own module. Neither is worth it, so the two are reported in TODO-refactor-remaining.md rather than hidden. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
112 lines
3.8 KiB
TOML
112 lines
3.8 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.*",
|
|
]
|
|
ignore_missing_imports = true
|
|
|
|
[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
|