Contributing¶
Contributions are welcome! Please feel free to submit a Pull Request.
Development Setup¶
- Fork the repository
- Clone your fork:
- Install development dependencies:
- Create a feature branch:
Code Quality¶
Run all checks before submitting:
# Linting
uv run ruff check .
# Auto-fix lint issues
uv run ruff check --fix .
# Formatting
uv run ruff format .
# Type checking
uv run mypy src/vodoo
Code Style¶
- Python 3.12+ with strict mypy typing
- ruff for linting and formatting (line length: 100)
- All functions must have type hints
- Use
Pathobjects for file operations - Use Rich for terminal output
- Google-style docstrings for all public functions
Project Structure¶
vodoo/
├── src/vodoo/
│ ├── __init__.py # Public API exports
│ ├── main.py # CLI entry point (Typer)
│ ├── client.py # OdooClient (sync) + namespace wiring
│ ├── transport.py # Sync transport (JSON-RPC / JSON-2, httpx)
│ ├── config.py # Pydantic configuration
│ ├── exceptions.py # Exception hierarchy (incl. Odoo server errors)
│ ├── auth.py # Authentication / sudo
│ ├── _domain.py # DomainNamespace base class (CRUD, messaging, tags, attachments)
│ ├── base.py # Field constants, display helpers
│ ├── helpdesk.py # HelpdeskNamespace (DomainNamespace subclass)
│ ├── project_tasks.py # TaskNamespace
│ ├── projects.py # ProjectNamespace
│ ├── crm.py # CrmNamespace
│ ├── knowledge.py # KnowledgeNamespace
│ ├── generic.py # GenericNamespace
│ ├── security.py # SecurityNamespace
│ ├── timer.py # TimerNamespace
│ └── aio/ # Async API (mirrors sync modules)
│ ├── __init__.py # AsyncOdooClient export
│ ├── client.py # AsyncOdooClient + namespace wiring
│ ├── transport.py # Async transport (httpx)
│ ├── auth.py # Async auth / sudo
│ ├── _domain.py # AsyncDomainNamespace base class
│ ├── helpdesk.py # Async HelpdeskNamespace
│ ├── project_tasks.py # Async TaskNamespace
│ ├── projects.py
│ ├── crm.py # Async CrmNamespace
│ ├── knowledge.py # Async KnowledgeNamespace
│ ├── generic.py # Async GenericNamespace
│ ├── security.py # Async SecurityNamespace
│ └── timer.py # Async TimerNamespace
├── tests/integration/ # Docker-based integration tests
├── docs/ # MkDocs documentation
├── mkdocs.yml # MkDocs Material + mike versioning
└── pyproject.toml
Versioning¶
The version is derived from git tags via hatch-vcs — there is no hardcoded version string anywhere.
pyproject.tomlusesdynamic = ["version"]__init__.pyreads the version at runtime viaimportlib.metadata_version.pyis auto-generated at build time (gitignored)
To release: just create a tag and push it. See Releasing below.
Submitting Changes¶
- Commit your changes:
git commit -am 'Add some feature' - Push to your branch:
git push origin feature/my-new-feature - Open a Pull Request against
main
Building Documentation¶
# Install doc dependencies
uv sync --extra docs
# Serve locally with hot-reload
uv run mkdocs serve
# Build static site
uv run mkdocs build
# Build in strict mode (fails on warnings)
uv run mkdocs build --strict
Documentation is versioned with mike and deployed to GitHub Pages on each release.
Releasing¶
- Create and push a git tag:
git tag vX.Y.Z && git push origin vX.Y.Z - Create a GitHub release from the tag
- GitHub Actions automatically: builds package → publishes to PyPI → deploys versioned docs
Reporting Issues¶
Please report issues at: github.com/julian-r/vodoo/issues