From d4c13b0f8f4534657f6148be63327c04b7b161e1 Mon Sep 17 00:00:00 2001 From: Manuela Kuhn <36827019+manuelakuhn@users.noreply.github.com> Date: Sun, 18 Sep 2022 01:02:30 +0200 Subject: Add skip_import to PythonPackage and use it in py-nilearn (#32664) * Add skip_import to PythonPackage and use it in py-nilearn * Fix dependencies --- lib/spack/docs/build_systems/pythonpackage.rst | 13 +++++++++++++ lib/spack/spack/build_systems/python.py | 18 +++++++++++++++++- 2 files changed, 30 insertions(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/spack/docs/build_systems/pythonpackage.rst b/lib/spack/docs/build_systems/pythonpackage.rst index 13b59cc96e..53d0f09167 100644 --- a/lib/spack/docs/build_systems/pythonpackage.rst +++ b/lib/spack/docs/build_systems/pythonpackage.rst @@ -582,6 +582,19 @@ libraries. Make sure not to add modules/packages containing the word "test", as these likely won't end up in the installation directory, or may require test dependencies like pytest to be installed. +Instead of defining the ``import_modules`` explicity, only the subset +of module names to be skipped can be defined by using ``skip_modules``. +If a defined module has submodules, they are skipped as well, e.g., +in case the ``plotting`` modules should be excluded from the +automatically detected ``import_modules`` ``['nilearn', 'nilearn.surface', +'nilearn.plotting', 'nilearn.plotting.data']`` set: + +.. code-block:: python + + skip_modules = ['nilearn.plotting'] + +This will set ``import_modules`` to ``['nilearn', 'nilearn.surface']`` + Import tests can be run during the installation using ``spack install --test=root`` or at any time after the installation using ``spack test run``. diff --git a/lib/spack/spack/build_systems/python.py b/lib/spack/spack/build_systems/python.py index 5cd60d774e..085feec5fe 100644 --- a/lib/spack/spack/build_systems/python.py +++ b/lib/spack/spack/build_systems/python.py @@ -138,12 +138,28 @@ class PythonPackage(PackageBase): path.replace(root + os.sep, "", 1).replace(".py", "").replace("/", ".") ) - modules = [mod for mod in modules if re.match("[a-zA-Z0-9._]+$", mod)] + modules = [ + mod + for mod in modules + if re.match("[a-zA-Z0-9._]+$", mod) and not any(map(mod.startswith, self.skip_modules)) + ] tty.debug("Detected the following modules: {0}".format(modules)) return modules + @property + def skip_modules(self): + """Names of modules that should be skipped when running tests. + + These are a subset of import_modules. If a module has submodules, + they are skipped as well (meaning a.b is skipped if a is contained). + + Returns: + list: list of strings of module names + """ + return [] + @property def build_directory(self): """The root directory of the Python package. -- cgit v1.2.3-70-g09d2