Install & Compatibility
Where this runs
tested against v1.15.2 · pip install
no network on importno background threads
Install × environment matrix
Each cell = how many times install + import succeeded across repeated harness runs. Partial = flaky.
glibc = Debian/Ubuntu slim · musl = Alpine Linux
muslpy 3.10–3.920 runs
installs and imports cleanly · install 0.0s · import 0.027s · 18.9MB
glibcpy 3.10–3.920 runs
installs and imports cleanly · install 1.7s · import 0.024s · 19MB
17MB installed
● package 17MB
Code
Verified usage
Verified import paths — ran on the pinned version, not inferred.
Addon
✓ from manifestoo_core.addon import Addon
OdooSeries
✓ from manifestoo_core.odoo_series import OdooSeries
get_core_addons, is_core_addon, get_core_addon_license
✓ from manifestoo_core.core_addons import get_core_addons, is_core_addon, get_core_addon_license
metadata_from_addon_dir, MetadataOptions
✓ from manifestoo_core.metadata import metadata_from_addon_dir, MetadataOptions
This quickstart demonstrates how to parse an Odoo addon's manifest, query information about core Odoo addons for a specific series and edition, and generate Python package metadata from an Odoo addon directory. It creates a temporary dummy addon for illustration.
from pathlib import Path
from manifestoo_core.addon import Addon, AddonNotFound
from manifestoo_core.odoo_series import OdooEdition, OdooSeries
from manifestoo_core.core_addons import get_core_addons, is_core_addon, get_core_addon_license
from manifestoo_core.metadata import metadata_from_addon_dir, MetadataOptions
import os
# Create a dummy addon directory for demonstration
addon_path = Path("./my_test_addon")
addon_path.mkdir(exist_ok=True)
manifest_content = '{"name": "My Test Addon", "version": "16.0.1.0.0", "depends": ["base", "sale"], "license": "LGPL-3"}'
(addon_path / "__manifest__.py").write_text(manifest_content)
# Example 1: Parse an addon manifest
try:
addon = Addon.from_addon_dir(addon_path)
print(f"Addon Name: {addon.name}")
print(f"Addon Version: {addon.version}")
print(f"Detected Odoo Series: {addon.odoo_series}")
print(f"Dependencies: {addon.depends}")
except AddonNotFound:
print(f"No valid Odoo addon found at {addon_path}")
# Example 2: Check core Odoo addons
series = OdooSeries.from_str("16.0")
core_addons = get_core_addons(series, OdooEdition.CE)
print(f"\nSample core CE addons for {series.value}: {list(core_addons)[:3]}")
print(f"'sale' is core for {series.value} CE: {is_core_addon('sale', series, OdooEdition.CE)}")
# Example 3: Generate Python Package Metadata
metadata = metadata_from_addon_dir(addon_path)
print(f"\nGenerated Package Name: {metadata['Name']}")
print(f"Generated Package Version: {metadata['Version']}")
# Clean up dummy addon
(addon_path / "__manifest__.py").unlink()
addon_path.rmdir()
manifestoo --version
Errors
Common errors & fixes
manifestoo_core.addon.AddonNotFound: No valid Odoo addon found in directory
The specified directory does not contain a valid Odoo addon (e.g., missing `__manifest__.py` file or it's malformed).
fixVerify that the `__manifest__.py` file exists in the directory you are trying to parse and that its content is a valid JSON dictionary as expected by Odoo. Ensure the directory path is correct.
TypeError: 'version' keyword argument must be a string, not 'NoneType'
This error can occur if an Odoo addon manifest is missing the 'version' key, or if `manifestoo-core` is attempting to process an invalid or incomplete manifest.
fixEnsure all Odoo addon manifests processed by `manifestoo-core` contain a valid 'version' key with a string value, e.g., `"version": "16.0.1.0.0"`.
Upgrade
Version history
1.15.2latest on PyPI · released Apr 29, 2026
Audit
Dependencies
pythonrequiredRequires Python 3.7 or newer.