Developer Guide =============== This page documents how to maintain and develop GOATS. Trunk-Based Development ----------------------- GOATS follows `trunk-based development `_, where all changes are integrated into a single shared branch (``main``) frequently. Key practices: - Developers work in short-lived branches (typically < 1-3 day). - All changes are merged back into ``main`` after passing CI. - No long-lived feature branches. - Feature flags may be used for incomplete or experimental features. This encourages rapid integration, reduces merge conflicts, and supports continuous delivery. Code Style and Standards ------------------------ Python Version ~~~~~~~~~~~~~~ GOATS requires **Python 3.12**. All code must be compatible with this version. This is dictated by DRAGONS. Docstring Style ~~~~~~~~~~~~~~~ - Follow the `numpydoc `_ style guide for all public modules, classes, functions, and methods. - Docstring content is validated using ``numpydoc`` checks, configured in ``pyproject.toml``. Formatting ~~~~~~~~~~ GOATS uses `Ruff `_ for both linting and formatting. To format and lint code manually: .. code-block:: bash ruff check . ruff format . Excluded Paths ~~~~~~~~~~~~~~ Certain directories are excluded from linting and formatting. These exclusions are defined in ``pyproject.toml`` under ``[tool.ruff]``. ``numpydoc`` also excludes private methods and ``__init__`` definitions from required docstring validation. Pre-commit Hooks ---------------- GOATS uses pre-commit hooks to ensure consistent code quality and prevent common mistakes before commits are made. Set Up ``pre-commit`` ~~~~~~~~~~~~~~~~~~~~~ Install ``pre-commit`` using ``uv``: .. code-block:: bash uv tool install pre-commit --with pre-commit-uv .. note:: You may be prompted to add ``~/.local/bin`` to your ``PATH``. ``uv`` installs tools there by default. Install the hooks defined in ``.pre-commit-config.yaml``: .. code-block:: bash pre-commit install Once installed, ``pre-commit`` will automatically run the configured hooks each time you commit changes. This helps catch formatting issues, docstring violations, and other problems before code is committed. Hook Summary ~~~~~~~~~~~~ The following hooks are enabled in ``.pre-commit-config.yaml``: - ``ruff-check``: Runs Ruff linter on Python files. - ``ruff-format``: Formats code using Ruff's formatter. - ``trailing-whitespace``: Removes trailing whitespace. - ``end-of-file-fixer``: Ensures files end with a single newline. - ``name-tests-test``: Enforces ``test_`` prefix for test functions. - ``no-commit-to-branch``: Blocks commits directly to the ``main`` branch. - ``check-yaml``: Validates YAML files. - ``check-json``: Validates JSON files. - ``check-toml``: Validates TOML files. - ``check-docstring-first``: Ensures first statement is a docstring. - ``check-case-conflict``: Detects filename case conflicts. - ``pretty-format-json``: Reformats JSON files with consistent indentation. - ``debug-statements``: Blocks committed ``print()``. - ``detect-private-key``: Prevents committing private keys. - ``forbid-submodules``: Disallows Git submodules. - ``uv-lock``: Ensures ``uv``-managed lockfile stays updated. Notes ~~~~~ - Hooks are configured in ``.pre-commit-config.yaml``. - Some hooks exclude files in ``docs/``, ``migrations/``, ``static/``, or ``templates/``. - Run all hooks manually: .. code-block:: bash pre-commit run --all-files - Update hook versions: .. code-block:: bash pre-commit autoupdate Changelog Management -------------------- GOATS uses `towncrier `_ to manage release changelogs from structured news fragments. Writing News Fragments ~~~~~~~~~~~~~~~~~~~~~~ Each pull request should include a news fragment saved to ``doc/changes`` using the naming format ``..rst``. Supported types: - ``new`` - new feature - ``bugfix`` - bug fix - ``change`` - behavior change - ``perf`` - performance improvement - ``doc`` - documentation - ``other`` - miscellaneous Example: ``42.bugfix.rst`` Best practices: - Use the Jira ticket title as a starting point. - Write in past tense, using active voice. - Keep it short and user-facing. - Use one file per PR; update as needed. Previewing and Building ~~~~~~~~~~~~~~~~~~~~~~~ - Preview changes: .. code-block:: bash towncrier build --draft .. note:: Building and appending the changelog is automatically handled by the ``Build Release`` GitHub workflow.