Contributing¶
Development Setup¶
git clone https://github.com/faulander/pyjira.git
cd pyjira
uv sync --all-extras
Run Tests¶
uv run pytest # run all tests
uv run pytest -v # verbose output
uv run pytest -x # stop on first failure
uv run pytest -k search # run only search tests
Tests use respx to mock httpx requests. No real Jira instance is needed.
Build Documentation¶
uv pip install -r docs/requirements.txt
sphinx-build -b html docs/source docs/build/html
Open docs/build/html/index.html to preview.
Project Structure¶
src/pyjira/
__init__.py # Public API exports
client.py # JiraClient, AsyncJiraClient
auth.py # httpx.BasicAuth wrapper
config.py # JiraConfig dataclass
exceptions.py # Exception hierarchy + raise_for_response()
pagination.py # Paginator, AsyncPaginator
models/ # Pydantic v2 models (23 files)
resources/ # API resource classes (23 files, sync + async)
tests/ # Test suite
docs/ # Sphinx documentation
Conventions¶
2-space indentation
Single quotes for strings
from __future__ import annotationsin every fileTYPE_CHECKINGguard for httpx importsAll model fields are optional (
| None = None)camelCase JSON aliases via
Field(alias='...')Every HTTP call followed by
raise_for_response(response)Dual sync/async pattern: every resource has
FooResourceandAsyncFooResource
Adding a New Resource¶
Create a model file in
src/pyjira/models/with Pydantic v2 modelsCreate a resource file in
src/pyjira/resources/with sync + async classesExport models from
src/pyjira/models/__init__.pyExport resources from
src/pyjira/resources/__init__.pyWire the resource into
JiraClientandAsyncJiraClientinsrc/pyjira/client.pyAdd public exports to
src/pyjira/__init__.pyWrite tests in
tests/