From 6778f1842c6c1dd05c77d298c0b130515d26b165 Mon Sep 17 00:00:00 2001 From: "Laurent Mignon (ACSONE)" Date: Fri, 27 Mar 2026 09:23:16 +0100 Subject: [PATCH] Add new option 'additional_dependencies' used to specify additional dependencies that are not declared in the addons manifests. --- README.rst | 8 ++++++++ setuptools_odoo/core.py | 12 ++++++++++++ setuptools_odoo/setup_keywords.py | 6 ++++++ tests/data/setup_reusable_addons/addon4/setup.py | 1 + tests/test_setup_keywords.py | 1 + 5 files changed, 28 insertions(+) diff --git a/README.rst b/README.rst index 7b9f1edd..20401368 100644 --- a/README.rst +++ b/README.rst @@ -268,6 +268,14 @@ The following keys are supported: external dependencies. Its value must be a dictionary with one ``python`` key, with value a dictionary mapping python external dependencies to a python package requirement specifier or list of specifiers. + * ``additional_dependencies``, used to specify additional dependencies that are not + declared in the addons manifests. Its value must be a list of package requirement + specifiers. A typical use case is when you want to ensure that an auto installable + addon linked to your addon is installed into the python path at the same time as + your addon, but you don't want to declare it as a dependency in the manifest to + avoid it being installed in Odoo. In this way you ensure that it all the + dependencies of the auto installed addon are satisfied, it will be available + and installed in Odoo. * ``odoo_version_override``, used to specify which Odoo series to use (8.0, 9.0, 10.0, 11.0, ...) in case an addon version does not start with the Odoo series number. Use this only as a last resort, if you have no way to diff --git a/setuptools_odoo/core.py b/setuptools_odoo/core.py index ba90e5f4..35f7fc86 100644 --- a/setuptools_odoo/core.py +++ b/setuptools_odoo/core.py @@ -262,6 +262,7 @@ def _get_install_requires( no_depends=None, depends_override=None, external_dependencies_override=None, + additional_dependencies=None, ): install_requires = [] # dependency on Odoo @@ -295,6 +296,9 @@ def _get_install_requires( install_requires.extend(dep) else: install_requires.append(dep) + # additional dependencies passed as options + if additional_dependencies: + install_requires.extend(additional_dependencies) return sorted(install_requires) @@ -304,6 +308,7 @@ def get_install_requires_odoo_addon( depends_override=None, external_dependencies_override=None, odoo_version_override=None, + additional_dependencies=None, ): """Get the list of requirements for an addon""" manifest = read_manifest(addon_dir) @@ -316,6 +321,7 @@ def get_install_requires_odoo_addon( no_depends, depends_override, external_dependencies_override, + additional_dependencies, ) @@ -444,6 +450,7 @@ def get_addon_metadata( odoo_version_override=None, # type: str post_version_strategy_override=None, # type: str precomputed_metadata_path=None, # type: str + additional_dependencies=None, # type: list[str] ): # type: (...) -> Message """ @@ -466,6 +473,7 @@ def get_addon_metadata( odoo_version_override=odoo_version_override, post_version_strategy_override=post_version_strategy_override, precomputed_metadata_path=precomputed_metadata_path, + additional_dependencies=additional_dependencies, ) meta = Message() @@ -502,6 +510,7 @@ def get_addon_setuptools_keywords( odoo_version_override=None, post_version_strategy_override=None, precomputed_metadata_path=None, + additional_dependencies=None, ): manifest = read_manifest(addon_dir) if precomputed_metadata_path and os.path.exists(precomputed_metadata_path): @@ -526,6 +535,7 @@ def get_addon_setuptools_keywords( depends_override=depends_override, external_dependencies_override=external_dependencies_override, odoo_version_override=odoo_version_override, + additional_dependencies=additional_dependencies, ) setup_keywords = { "name": make_pkg_name(odoo_version_info, addon_name), @@ -553,6 +563,7 @@ def prepare_odoo_addon( external_dependencies_override=None, odoo_version_override=None, post_version_strategy_override=None, + additional_dependencies=None, ): addons_dir, addons_ns = _find_addons_dir() potential_addons = os.listdir(addons_dir) @@ -590,6 +601,7 @@ def prepare_odoo_addon( odoo_version_override=odoo_version_override, post_version_strategy_override=post_version_strategy_override, precomputed_metadata_path="./PKG-INFO", + additional_dependencies=additional_dependencies, ) diff --git a/setuptools_odoo/setup_keywords.py b/setuptools_odoo/setup_keywords.py index 33b2e111..e88953d3 100644 --- a/setuptools_odoo/setup_keywords.py +++ b/setuptools_odoo/setup_keywords.py @@ -40,11 +40,13 @@ def _parse_options(value): external_dependencies_override = {} odoo_version_override = None post_version_strategy_override = None + additional_dependencies = None if isinstance(value, dict): depends_override = value.get("depends_override", {}) external_dependencies_override = value.get("external_dependencies_override", {}) odoo_version_override = value.get("odoo_version_override") post_version_strategy_override = value.get("post_version_strategy_override") + additional_dependencies = value.get("additional_dependencies", None) if os.environ.get("SETUPTOOLS_ODOO_POST_VERSION_STRATEGY_OVERRIDE"): post_version_strategy_override = os.environ[ "SETUPTOOLS_ODOO_POST_VERSION_STRATEGY_OVERRIDE" @@ -54,6 +56,7 @@ def _parse_options(value): external_dependencies_override, odoo_version_override, post_version_strategy_override, + additional_dependencies, ) @@ -63,12 +66,14 @@ def odoo_addon(dist, attr, value): external_dependencies_override, odoo_version_override, post_version_strategy_override, + additional_dependencies, ) = _parse_options(value) setup_keywords = prepare_odoo_addon( depends_override=depends_override, external_dependencies_override=external_dependencies_override, odoo_version_override=odoo_version_override, post_version_strategy_override=post_version_strategy_override, + additional_dependencies=additional_dependencies, ) _set_dist_keywords(dist, setup_keywords) if compat_editable_wheel is not None: @@ -81,6 +86,7 @@ def odoo_addons(dist, attr, value): external_dependencies_override, odoo_version_override, _, + _, ) = _parse_options(value) setup_keywords = prepare_odoo_addons( depends_override=depends_override, diff --git a/tests/data/setup_reusable_addons/addon4/setup.py b/tests/data/setup_reusable_addons/addon4/setup.py index 40f408d9..66b963af 100644 --- a/tests/data/setup_reusable_addons/addon4/setup.py +++ b/tests/data/setup_reusable_addons/addon4/setup.py @@ -11,5 +11,6 @@ 'astropy': 'astropy>=1.0', }, }, + 'additional_dependencies': ['odoo8-addon-addon4-extra-dep>=8.0.1.0.0'] }, ) diff --git a/tests/test_setup_keywords.py b/tests/test_setup_keywords.py index a4821cbe..a430ee56 100644 --- a/tests/test_setup_keywords.py +++ b/tests/test_setup_keywords.py @@ -139,6 +139,7 @@ def test_odoo_addon4(self): for r in [ "astropy>=1.0", "odoo8-addon-addon1>=8.0.3.0.0", + "odoo8-addon-addon4-extra-dep>=8.0.1.0.0", "odoo>=8.0a,<9.0a", "python-dateutil", ]