Contributing
============
Thank you for your interest in contributing to **sphinx-autodoc-toml**! This guide covers everything you need to know to contribute effectively.
We welcome all types of contributions:
* Bug reports and feature requests
* Documentation improvements
* Code contributions (bug fixes, new features, refactoring)
* Test improvements
* Requirements and specifications
Developer Experience Philosophy
-------------------------------
This project treats **developer experience as a first-class concern**, similar to "platform as a product" thinking. We aim to:
* Minimize friction and setup time
* Provide fast feedback loops
* Maintain clear documentation
* Use consistent, predictable workflows
* Dogfood our own tools
See :doc:`requirements/developer-experience` for our complete DX requirements.
Getting Started
---------------
Prerequisites
~~~~~~~~~~~~~
You need two tools installed:
* `uv `_ - Fast Python package manager
* `hatch `_ - Task runner and environment manager
Installation
^^^^^^^^^^^^
.. code-block:: bash
# Install uv
curl -LsSf https://astral.sh/uv/install.sh | sh
# Install hatch
uv tool install hatch
Clone and Setup
~~~~~~~~~~~~~~~
.. code-block:: bash
# Clone the repository
git clone https://github.com/calvingiles/autodoc-toml.git
cd autodoc-toml
# Set up development environment (installs pre-commit hooks)
hatch run setup
That's it! The ``hatch run setup`` command installs pre-commit hooks that automatically run quality checks before each commit.
Development Workflow
--------------------
Making Changes
~~~~~~~~~~~~~~
1. **Create a branch** for your changes:
.. code-block:: bash
git checkout -b feature/your-feature-name
2. **Make your changes** following our coding standards (see below)
3. **Run tests** to verify your changes:
.. code-block:: bash
hatch run test:run
4. **Run linting** to check code quality:
.. code-block:: bash
hatch run lint:all
5. **Commit your changes** (pre-commit hooks will run automatically):
.. code-block:: bash
git add .
git commit -m "Description of your changes"
6. **Push and create a pull request**:
.. code-block:: bash
git push origin feature/your-feature-name
Requirements Traceability
~~~~~~~~~~~~~~~~~~~~~~~~~
**CRITICAL**: This project maintains a complete traceability chain from requirements through specifications to tests. When making changes, you **MUST** keep this chain synchronized.
The Three-Level Chain
^^^^^^^^^^^^^^^^^^^^^
.. code-block:: text
Requirements (R_*) → Specifications (S_*) → Tests (T_*)
(WHAT) (HOW) (VERIFY)
1. **Requirements** (``R_*``): Define WHAT the system needs to do
* Location: ``docs/requirements/*.md``
* Example: ``R_PARSE_001`` - "The system MUST parse TOML files"
2. **Specifications** (``S_*``): Define HOW requirements are implemented
* Location: Implementation docstrings, ``pyproject.toml`` doc-comments, workflow files
* Example: ``S_PARSER_005`` - "The parser MUST use tomlkit"
* Links to: One or more requirements
3. **Tests** (``T_*``): VERIFY specifications are correct
* Location: Test docstrings
* Example: ``T_PARSER_001`` - "Verify parser extracts doc-comments"
* Links to: One or more specifications
When Adding Features
^^^^^^^^^^^^^^^^^^^^^
1. **First**: Create requirement(s) in ``docs/requirements/``
2. **Second**: Add specification(s) to implementation docstrings
3. **Third**: Add test(s) with sphinx-needs directives
4. **Finally**: Link them: ``Test :links: Spec``, ``Spec :links: Requirement``
Example:
.. code-block:: markdown
# In docs/requirements/core-features.md
```{req} The parser MUST support inline tables.
:id: R_PARSE_008
:status: planned
:tags: parser, toml
:links: S_PARSER_011
```
.. code-block:: python
# In src/sphinx_autodoc_toml/parser.py
"""
.. spec:: The parser MUST recognize TOML inline table syntax.
:id: S_PARSER_011
:status: implemented
:tags: parser, toml
:links: R_PARSE_008
"""
.. code-block:: python
# In tests/test_parser.py
"""
.. test:: Verify parser handles inline tables correctly.
:id: T_PARSER_010
:status: implemented
:tags: parser, toml
:links: S_PARSER_011
"""
For complete guidelines, see ``CLAUDE.md`` in the repository root.
Common Development Tasks
------------------------
Running Tests
~~~~~~~~~~~~~
.. code-block:: bash
# Run all tests with coverage
hatch run test:run
# Generate HTML coverage report
hatch run test:cov
# Open coverage report
open htmlcov/index.html # macOS
xdg-open htmlcov/index.html # Linux
Code Quality
~~~~~~~~~~~~
.. code-block:: bash
# Run all quality checks (linting + formatting + type checking)
hatch run lint:all
# Individual checks
hatch run lint:check # Ruff linting
hatch run lint:format-check # Check formatting
hatch run lint:typing # MyPy type checking
# Auto-fix formatting issues
hatch run lint:format
Pre-commit Hooks
~~~~~~~~~~~~~~~~
Pre-commit hooks run automatically before each commit. To run them manually:
.. code-block:: bash
# Run on all files
pre-commit run --all-files
# Run on staged files only
pre-commit run
Documentation
~~~~~~~~~~~~~
.. code-block:: bash
# Build documentation
hatch run docs:build
# Clean build artifacts
hatch run docs:clean
# View documentation
open docs/_build/html/index.html # macOS
xdg-open docs/_build/html/index.html # Linux
Building Packages
~~~~~~~~~~~~~~~~~
.. code-block:: bash
# Build wheel and source distribution
hatch build
# Output will be in dist/
Dependency Management
~~~~~~~~~~~~~~~~~~~~~
Dependencies are locked in ``uv.lock`` for reproducible builds:
.. code-block:: bash
# Update lock file with latest compatible versions
uv lock
# Sync environment with lock file
uv sync
The lock file is committed to version control to ensure consistency.
Code Standards
--------------
Style Guidelines
~~~~~~~~~~~~~~~~
* **Line length**: Maximum 100 characters
* **Formatting**: Use ``ruff format`` (runs automatically via pre-commit)
* **Linting**: Follow ``ruff`` rules (E, F, I, N, W, UP)
* **Type hints**: All functions must have type annotations
* **Docstrings**: All public functions/classes must have docstrings
Testing Guidelines
~~~~~~~~~~~~~~~~~~
* Keep tests focused on a single behavior
* Use descriptive test names
* Include sphinx-needs ``.. test::`` directives
* Add ``Implements: T_XXX_YYY`` comments
* Test both success and failure cases
* Aim for >80% code coverage
Documentation Standards
~~~~~~~~~~~~~~~~~~~~~~~
* All public APIs must be documented
* Complex logic should have inline comments explaining "why"
* Update sphinx-needs specs when implementation changes
* Use the autodoc-toml directive to document ``pyproject.toml``
Submitting Pull Requests
-------------------------
Before Submitting
~~~~~~~~~~~~~~~~~
1. Ensure all tests pass: ``hatch run test:run``
2. Ensure linting passes: ``hatch run lint:all``
3. Update documentation if needed
4. Add requirements/specs/tests following the traceability chain
5. Write a clear PR description explaining your changes
PR Review Process
~~~~~~~~~~~~~~~~~
1. GitHub Actions will run all CI checks
2. Maintainers will review your code
3. Address any feedback or requested changes
4. Once approved, your PR will be merged
After Merge
~~~~~~~~~~~
When your PR is merged to ``main``:
* A development version is automatically published to TestPyPI
* The workflow will comment on your PR with installation instructions
* You can test your changes: ``pip install --index-url https://test.pypi.org/simple/ sphinx-autodoc-toml``
Release Process
---------------
For maintainers: see `RELEASING.md `_ for complete instructions on:
* Configuring PyPI Trusted Publishing
* Creating stable releases
* Publishing to PyPI
* Version numbering guidelines
Development versions are published automatically to TestPyPI on every push to ``main``.
Getting Help
------------
* **Questions**: Open a `GitHub Discussion `_
* **Bug Reports**: File an `Issue `_
* **Documentation**: Check the docs at https://calvingiles.github.io/autodoc-toml/
Code of Conduct
---------------
This project follows the standard open source code of conduct:
* Be respectful and inclusive
* Welcome newcomers
* Focus on what's best for the community
* Show empathy toward others
Thank you for contributing!