Metadata-Version: 2.4
Name: polytropos
Version: 3.1.0
Summary: A build backend for Odoo modules supporting multiple versions
Author: Polytropos Team
License: LGPL-3
License-File: LICENSE.md
Classifier: Development Status :: 3 - Alpha
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Requires-Python: >=3.11
Requires-Dist: packaging>=24.0
Provides-Extra: build
Requires-Dist: pathspec>=0.12; extra == 'build'
Requires-Dist: whool>=1.3; extra == 'build'
Provides-Extra: cli
Requires-Dist: plumbum>=1.8; extra == 'cli'
Description-Content-Type: text/markdown

# Polytropos

![Polytropos logo](https://gitlab.com/moduon/polytropos/-/raw/main/docs/img/logo.svg?ref_type=heads)

Polytropos is a Python build backend for Odoo modules that enables writing code once and
using it across multiple Odoo versions.

## Features

-   **Multi-version support**: Write your module once, target multiple Odoo releases
-   **Conditional manifests**: Configure different manifest values per Odoo version, to
    let you include or exclude XML files per version (views, assets or other data)
-   **Editable installs**: Develop in editable mode with full version support
-   **PEP 517 compliant**: Works with any PEP 517 compatible frontend

## Quick Example

Replace your module's `__manifest__.py` with this `pyproject.toml` file:

```toml title="pyproject.toml"
[build-system]
requires = ["polytropos[build]"]
build-backend = "polytropos.build"

[project]
name = "odoo-addon-my-module"
version = "1.0.0"
dependencies = [
    "odoo>=17.0" # Specify supported Odoo versions here
]

[tool.polytropos]
default_odoo_release = "18.0"

# All versions have this data
[[tool.polytropos.manifest]]
depends = ["base"]
data = ["data/views.xml"]

# In Odoo 18+, there are special permissions
[[tool.polytropos.manifest]]
releases = ">=18"
data = ["security/ir.model.access.csv"]
```

Then, inside the module folder:

```shell
# Don't forget the module must be a Python package
touch __init__.py

# Build wheels for different odoo releases
uv build --sdist
uv build --wheel --config-setting odoo_release=17.0
uv build --wheel --config-setting odoo_release=18.0
uv build --wheel --config-setting odoo_release=19.0

# List wheels
ls -1 dist/
my_module-1.0.0.tar.gz
odoo_addon_my_module-17.0.1.0.0-py3-none-any.whl
odoo_addon_my_module-18.0.1.0.0-py3-none-any.whl
odoo_addon_my_module-19.0.1.0.0-py3-none-any.whl
```

Single branch, single code, multiple releases! 🤯

## Installation

Python will auto-install the build backend when you build a module.

But yes, you can install a small CLI with:

```bash
pip install polytropos[cli]
```

For development, the recommended tool you need is
[uv](https://docs.astral.sh/uv/#installation). Then:

```shell
uvx polytropos[cli] --help-all
```

## Why Polytropos?

Odoo modules traditionally require separate codebases for each version. Polytropos
solves this by generating version-specific code at build time, allowing you to maintain
a single codebase.

If your product is the combination of Odoo + its release, you probably won't need
Polytropos.

If your product are Odoo addons, and you want to provide the same product to your
customers regardless of the Odoo version they're running, then you will benefit a lot by
Polytropos.

## Examples

Check out the
[examples folder](https://gitlab.com/moduon/polytropos/-/tree/main/examples) for
real-world modules with views, models, and tests that exercise the conditional logic.

## Credits

[![Moduon logo](https://www.moduon.team/web/image/743407-d585653d/logo_moduon_menu_136x40.svg)](https://www.moduon.team/)

Polytropos is developed and maintained by **Moduon**. Need a professional Odoo partner?
[**Contact us**](https://www.moduon.team/odoo-sin-ansiedad).
