.. _changelog:
Changelog
=========
All notable changes to pyaota will be documented in this file.
The format is based on `Keep a Changelog `_,
and this project adheres to `Semantic Versioning `_.
[0.4.0] - 2026-03-24
--------------------
Added
~~~~~
* **Interactive grading** (``--interactive`` flag on ``grade``) -- when a QR
code, student-ID field, or answer bubble cannot be read automatically, pyaota
pauses and prompts the operator at the terminal to supply the missing value.
For unanswered questions a matplotlib window displays the bubble row so the
operator can confirm or override the detected answer. See :doc:`grading`
for full details.
[0.3.0] - 2026-02-27
--------------------
Added
~~~~~
* **Compact MCQ choice layout** -- choices are automatically arranged in two
columns when all choice texts are short enough (``_choices_columns`` helper).
* **True/False question simplification** -- T/F questions no longer render a
separate choices block; the stem is prefixed with bold ``True (T) / False (F)``.
* **T/F correct-answer highlighting** -- in ``compile-dump`` the correct answer
for T/F questions is visually indicated with a filled circle (``\correctlabel``),
consistent with MCQ behaviour.
* **Greedy topic redistribution** -- ``get_random_selection`` no longer errors
when a topic has fewer questions than the uniform quota; available questions
are redistributed across better-stocked topics so the total count is always met.
* ``--font-size {10pt,11pt,12pt}`` option on ``build`` and ``compile-dump``
(default ``12pt``).
* ``--question-spacing `` option on ``build`` and ``compile-dump``
(default ``24pt``).
* ``--bubble-font-size `` option on ``build`` and ``make-answersheet``
(default ``8.0``); uses an absolute ``\fontsize`` command so bubble text is
unaffected by the document class font size.
* ``--odd-page-answersheet`` flag on ``build`` and ``make-answersheet``; inserts
a blank filler page when needed so the answer sheet always lands on an
odd-numbered (right-hand) page for double-sided printing.
* ``--rasterize`` flag on ``build`` and ``make-answersheet``; post-processes the
compiled PDF by rasterizing it at 300 DPI (via ``pdf2image`` + Pillow) to
improve compatibility with printer RIPs that struggle with complex TikZ paths.
* Full command line is now echoed at ``DEBUG`` level to the diagnostic log at
startup.
Fixed
~~~~~
* Excess vertical space between a code-block stem and the choices list in MCQs
(cancelled the implicit ``belowskip`` of the ``lstlisting`` environment with
``\vspace{-\medskipamount}``).
* Answer sheet page always renders at 12 pt regardless of the ``--font-size``
setting, since the layout dimensions are absolute.
[0.2.0] - 2026-01-26
--------------------
Added
~~~~~
* serialization of answer sheet layouts to JSON
[0.1.0] - 2026-01-26
--------------------
* Initial release of pyaota
Breaking Changes Policy
-----------------------
pyaota follows semantic versioning:
* **MAJOR** version (X.0.0): Incompatible API changes
* **MINOR** version (0.X.0): New functionality, backwards-compatible
* **PATCH** version (0.0.X): Bug fixes, backwards-compatible
Deprecation Warnings
--------------------
No features are currently deprecated.
When features are deprecated, they will:
1. Remain functional in current MAJOR version
2. Issue ``DeprecationWarning`` when used
3. Include migration instructions in warning message
4. Be documented in this changelog
5. Be removed in next MAJOR version
Contributing to Changelog
--------------------------
When contributing changes:
1. Add entry under ``[Unreleased]`` section
2. Use appropriate subsection (Added/Changed/Deprecated/Removed/Fixed/Security)
3. Write concise, user-focused descriptions
4. Link to relevant issue/PR numbers
5. Maintainers will organize entries during release
Example entry::
[Unreleased]
------------
Added
~~~~~
* New equestion type: OCR short answer
* something else
Fixed
~~~~~
* poorly formatted answer sheet resutls
See Also
--------
* `GitHub Contributing Guide `_ - How to contribute
* `GitHub Releases `_ - Release notes
* `GitHub Issues `_ - Bug reports and feature requests