Repository navigation
v0.7.3
Fixed
-
A refused test is now said once, and no green tick closes it. 0.7.0 added
a line naming the blocking check; 0.7.1 added a second one to fix a wrong
reason, without removing the first. Measured on the lab VM with 0.7.2, a
refusal printed the refusal twice, in two wordings, "fix it, then submit
again" three times counting the score line, and closed on
✔ Attempt saved. Continue with dsoxlab run <lab>…in green, which a
beginner reads as a pass. Both versions were measured on their own function,
and never on what the learner sees. The two lines are merged into one that
carries the percentage, the pass mark, the fact that it is cleared, and the
names of the blocking checks; the closing line no longer wears the colour of
success and names what is left to do; and the score line falls silent on a
refusal, where it said "re-submit if needed" — needed is exactly what it
is. -
The relation between the score and the pass mark is computed, not assumed.
This trap has now bitten three times, always the same way: a message that
states a comparison instead of making it. 0.7.0 wrote "80% of the scale,
below the 75% pass mark" in front of a mark that was cleared; 0.7.1 fixed
it by freezing the other direction; and the first writing of this very version
therefore printed, measured on the lab VM, "you scored 20% of the scale,
which clears the 75% pass mark". A refusal on a blocking check happens both
above and below the mark, so the message now picks its wording from
pct >= threshold, and the below case says that two things are missing —
without which a learner fixes the requirement and stays refused on the total. -
The name read from pytest's output is the test function's, not its class'.
The nodeid was read with::(\w+), which takes the first segment: a test
inside a class yielded the class name. Silent consequence, and the worse of
the two: anexam_blocking_checksnaming such a test would never have
matched, and the critical requirement would have been disarmed without a
word — exactly the defect that field exists to close. Measured against real
pytest output for the three forms of test. -
An assertion message is no longer lost on a parametrized or class-based
test. TheFAILURESsection header takes three shapes
(Class.test,test,test[case]), and the pattern recognised only the
middle one: the other two matched nothing, so their message was dropped. This
was not theoretical — three catalogue labs useparametrize, and the lost
message is the bilingual sentence the lab author wrote for the learner. A
parametrized test now yields the message of the first failing case. -
cleanandresetoutside a terminal say why, instead ofAborted.
typer.confirm(abort=True)answered two words with no subject and no next
move, and nothing named--yes, which is the answer. A CI run or a
dsoxlab clean < /dev/nullread a refusal whose cause was nowhere. The
message now names the reason and the option, and the exit code is 2.
Removed
- The
exam_blocking_failedkey, in both languages: its content is merged into
the single refusal message. A test keeps it from coming back.