| 1 |
Packages, modules, functions, variables, classes and constants follow PEP 8 casing (snake_case, PascalCase, UPPER_SNAKE) |
Pass |
export, create_scores_frame, export_frame, main, EXIT_OK, COLUMN_STUDENTS follow PEP 8 casing; the private helpers start with _. |
| 2 |
Names state purpose in the domain's language; no unexplained abbreviations, no single-letter names outside tiny scopes |
Pass |
Names state purpose (_print_csv_part, _print_pandas_part, PANDAS_MISSING_MESSAGE); data_dict and scores are the lecture's names. |
| 3 |
Code is produced by the project's formatter and passes its linter with no unexplained suppressions |
Pass |
ruff check and ruff format --check exit 0. The only suppressions are the two # noqa: E402 after pytest.importorskip("pandas") in the test modules, explained by the guard. |
| 4 |
Every function and method signature is type-annotated, including -> None |
Pass |
Every function is annotated: create_scores_frame() -> DataFrame, export_frame(...) -> None, `main(argv: Sequence[str] |
| 5 |
No bare except:, no swallowed exceptions; specific exceptions are raised and the cause is kept (raise ... from) |
Pass |
main catches ImportError only when error.name == "pandas" and re-raises every other one; nothing is swallowed. |
| 6 |
No mutable default arguments and no shadowed builtins |
Pass |
The defaults are immutable (EXPORT_FILE_NAME, None); no builtin is shadowed. |
| 7 |
Files, locks and connections are managed with context managers |
N-A |
The modules open no file themselves; DataFrame.to_csv opens and closes the file. |
| 8 |
Public modules, classes and functions have docstrings that say what, not how |
Pass |
Module docstrings and Doxygen @brief, @param, @return, @throws on every function, private helpers included; doxygen Doxyfile exits 0 with no warnings. |
| 9 |
Logging uses logging, not print; no secrets or personal data in log output |
Pass |
The print calls of __main__ are the program's output, the purpose of the command (as in the lectures); the missing-extra diagnostic goes to stderr; no secret or personal data is printed. There is no logging to replace. |
| 10 |
Classes and operations trace to the Design Class Diagram they implement; deviations are recorded |
Pass |
No Design Class Diagram exists (a learning project of this size, recorded in the open issues of PP-001); the functions trace to the second lecture and to the tasks of MIL-004. |
| 11 |
Tests exist for new behaviour, are named for the behaviour, and do not depend on order or the network |
Pass |
tests/test_export.py and tests/test_main.py cover the Go/No-Go criteria of MIL-004: the frame's columns and values, the round trip through tmp_path, the default name only in the temporary working folder, the printed results, no file without --export, the missing-pandas path; pytest reports 39 passed; none depends on order or the network. |
| 12 |
Type checker runs in strict mode without errors; Any is justified in a comment |
Pass |
python -m mypy runs with strict = true: no issues in 12 source files; no new Any. |
| 13 |
Dependencies are declared and pinned in the project's dependency file, none unused |
Pass |
No dependency added; pandas stays in the extras and is imported only in analysis and export; __main__ imports them inside a function so the csv part runs without it. |
| 14 |
Each piece of knowledge (a business rule, constant, format, validation or query) is defined in one place; code is merged only where it expresses the same knowledge, not where it merely looks alike |
Pass |
The lecture's dictionary values, column names, the day and the message are constants in constants.py; the export name is defined once. |
| 15 |
Imports point inward: business-rule modules import no framework, database, UI or delivery-mechanism code, and there are no import cycles |
Pass |
__main__ (delivery) imports csv_reader, analysis, export and constants; none of them imports __main__; no cycle. |
| 16 |
SOLID holds: a class or module has one reason to change; new behaviour is added by extension, not by editing a type test in several places; subclasses honour the contract of their base; protocols are narrow; high-level code depends on protocols or abstract types and receives its implementations |
Pass |
create_scores_frame, export_frame and main each have one reason to change; the printing is split into small helpers; no class hierarchy. |