Releasing ========= GASFIR uses **hatchling** as its build backend and publishes to both **TestPyPI** and **PyPI** via GitLab CI/CD. Version Numbering ----------------- Versions follow `SemVer `_: ``MAJOR.MINOR.PATCH``. The version is defined **only** in ``pyproject.toml``:: [project] version = "0.9.0" ``src/gasfir/__init__.py`` reads it at import time via ``importlib.metadata`` so there is a single source of truth. Release Process --------------- 1. Update ``pyproject.toml`` to the new version. 2. Update ``CHANGELOG.md`` — move items from *Unreleased* to the new version section with today's date. 3. Commit with message ``chore: release vX.Y.Z``. 4. Push and open a merge request into ``main``. 5. After the MR is merged, tag ``main``:: git tag vX.Y.Z git push origin vX.Y.Z CI Publishing Rules ------------------- .. list-table:: :header-rows: 1 * - Tag / branch - Published to - Approval required * - ``main`` (no tag) - TestPyPI - No * - ``vX.Y.Z-alpha``, ``-beta``, ``-rc`` - TestPyPI - No * - ``vX.Y.Z`` (stable) - PyPI - **Yes — manual approval in GitLab** Verifying the TestPyPI Release ------------------------------- Install from TestPyPI to verify before the production release:: pip install --index-url https://test.pypi.org/simple/ \ --extra-index-url https://pypi.org/simple/ \ gasfir==X.Y.Z