{"library":"manifestoo-core","title":"Manifestoo Core","description":"Manifestoo Core is a Python library designed to reason about Odoo addons manifests. It provides functionalities to detect the Odoo series from an addon's version, offer information about core Odoo Community Edition and Enterprise Edition addons for various Odoo versions, and convert Odoo manifest metadata into Python Packaging Metadata. The library is actively maintained with frequent updates, currently at version 1.15.1, often aligned with new Odoo versions and manifest specifications.","language":"python","status":"active","last_verified":"Mon May 18","install":{"commands":["pip install manifestoo-core"],"cli":{"name":"manifestoo","version":"sh: 1: manifestoo: not found"}},"imports":["from manifestoo_core.addon import Addon","from manifestoo_core.odoo_series import 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"],"auth":{"required":false,"env_vars":[]},"quickstart":{"code":"from pathlib import Path\nfrom manifestoo_core.addon import Addon, AddonNotFound\nfrom manifestoo_core.odoo_series import OdooEdition, OdooSeries\nfrom manifestoo_core.core_addons import get_core_addons, is_core_addon, get_core_addon_license\nfrom manifestoo_core.metadata import metadata_from_addon_dir, MetadataOptions\nimport os\n\n# Create a dummy addon directory for demonstration\naddon_path = Path(\"./my_test_addon\")\naddon_path.mkdir(exist_ok=True)\nmanifest_content = '{\"name\": \"My Test Addon\", \"version\": \"16.0.1.0.0\", \"depends\": [\"base\", \"sale\"], \"license\": \"LGPL-3\"}'\n(addon_path / \"__manifest__.py\").write_text(manifest_content)\n\n# Example 1: Parse an addon manifest\ntry:\n    addon = Addon.from_addon_dir(addon_path)\n    print(f\"Addon Name: {addon.name}\")\n    print(f\"Addon Version: {addon.version}\")\n    print(f\"Detected Odoo Series: {addon.odoo_series}\")\n    print(f\"Dependencies: {addon.depends}\")\nexcept AddonNotFound:\n    print(f\"No valid Odoo addon found at {addon_path}\")\n\n# Example 2: Check core Odoo addons\nseries = OdooSeries.from_str(\"16.0\")\ncore_addons = get_core_addons(series, OdooEdition.CE)\nprint(f\"\\nSample core CE addons for {series.value}: {list(core_addons)[:3]}\")\nprint(f\"'sale' is core for {series.value} CE: {is_core_addon('sale', series, OdooEdition.CE)}\")\n\n# Example 3: Generate Python Package Metadata\nmetadata = metadata_from_addon_dir(addon_path)\nprint(f\"\\nGenerated Package Name: {metadata['Name']}\")\nprint(f\"Generated Package Version: {metadata['Version']}\")\n\n# Clean up dummy addon\n(addon_path / \"__manifest__.py\").unlink()\naddon_path.rmdir()","lang":"python","description":"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.","tag":null,"tag_description":null,"last_tested":null,"results":[]},"compatibility":{"tag":null,"tag_description":null,"last_tested":"2026-05-18","installed_version":"1.15.2","pypi_latest":"1.15.2","is_stale":false,"summary":{"python_range":"3.10–3.9","success_rate":100,"avg_install_s":1.7,"avg_import_s":0.02,"wheel_type":"wheel"},"results":[{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"manifestoo-core","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.02,"mem_mb":1.6,"disk_size":"18.9M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"manifestoo-core","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":1.6,"import_time_s":0.02,"mem_mb":1.6,"disk_size":"19M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"manifestoo-core","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.04,"mem_mb":1.8,"disk_size":"20.8M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"manifestoo-core","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":1.7,"import_time_s":0.03,"mem_mb":1.8,"disk_size":"21M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"manifestoo-core","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.03,"mem_mb":1.5,"disk_size":"12.7M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"manifestoo-core","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":1.6,"import_time_s":0.03,"mem_mb":1.5,"disk_size":"13M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"manifestoo-core","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.02,"mem_mb":1.5,"disk_size":"12.4M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"manifestoo-core","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":1.6,"import_time_s":0.02,"mem_mb":1.3,"disk_size":"13M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"manifestoo-core","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.02,"mem_mb":1.5,"disk_size":"18.3M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"manifestoo-core","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":1.9,"import_time_s":0.02,"mem_mb":1.5,"disk_size":"19M"}]}}