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
This commit is contained in:
Manuela Kuhn 2022-09-18 01:02:30 +02:00 committed by GitHub
parent 2c7c749986
commit d4c13b0f8f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 58 additions and 36 deletions

View file

@ -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, "test", as these likely won't end up in the installation directory,
or may require test dependencies like pytest to be installed. 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 Import tests can be run during the installation using ``spack install
--test=root`` or at any time after the installation using --test=root`` or at any time after the installation using
``spack test run``. ``spack test run``.

View file

@ -138,12 +138,28 @@ def import_modules(self):
path.replace(root + os.sep, "", 1).replace(".py", "").replace("/", ".") 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)) tty.debug("Detected the following modules: {0}".format(modules))
return 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 @property
def build_directory(self): def build_directory(self):
"""The root directory of the Python package. """The root directory of the Python package.

View file

@ -11,7 +11,10 @@ class PyNilearn(PythonPackage):
homepage = "https://nilearn.github.io/" homepage = "https://nilearn.github.io/"
pypi = "nilearn/nilearn-0.7.1.tar.gz" pypi = "nilearn/nilearn-0.7.1.tar.gz"
git = "https://github.com/nilearn/nilearn"
version("0.9.2", sha256="8da8d3835d92cd7b8a6cc92455a489d7e7f5994cf64fc71bce653e362773b9e4")
version("0.9.0", sha256="f9c8e30adef51489910aec7724b5699de178427d3ae63873dad9b23dd321fe76")
version("0.8.1", sha256="a0489940855130f35bbc4cac0750479a6f82025215ea7b1d778faca064219298") version("0.8.1", sha256="a0489940855130f35bbc4cac0750479a6f82025215ea7b1d778faca064219298")
version("0.8.0", sha256="f2d3dc81005f829f3a183efa6c90d698ea6818c06264d2e3f03e805c4340febb") version("0.8.0", sha256="f2d3dc81005f829f3a183efa6c90d698ea6818c06264d2e3f03e805c4340febb")
version("0.7.1", sha256="8b1409a5e1f0f6d1a1f02555c2f11115a2364f45f1e57bcb5fb3c9ea11f346fa") version("0.7.1", sha256="8b1409a5e1f0f6d1a1f02555c2f11115a2364f45f1e57bcb5fb3c9ea11f346fa")
@ -25,13 +28,22 @@ class PyNilearn(PythonPackage):
variant("plotting", default=False, description="Enable plotting functionalities") variant("plotting", default=False, description="Enable plotting functionalities")
depends_on("py-joblib@0.15:", when="@0.9.1:", type=("build", "run"))
depends_on("py-joblib@0.12:", when="@0.7:", type=("build", "run"))
depends_on("py-joblib@0.11:", when="@0.6:", type=("build", "run"))
depends_on("py-lxml", when="@0.9.1:", type=("build", "run"))
depends_on("py-nibabel@3:", when="@0.9.1:", type=("build", "run"))
depends_on("py-nibabel@2.5:", when="@0.8:", type=("build", "run"))
depends_on("py-nibabel@2.0.2:", type=("build", "run"))
depends_on("py-numpy@1.18:", when="@0.9.1:", type=("build", "run"))
depends_on("py-numpy@1.16:", when="@0.8:", type=("build", "run")) depends_on("py-numpy@1.16:", when="@0.8:", type=("build", "run"))
depends_on("py-numpy@1.11:", when="@0.5:", type=("build", "run")) depends_on("py-numpy@1.11:", when="@0.5:", type=("build", "run"))
depends_on("py-numpy@1.6.1:", type=("build", "run")) depends_on("py-numpy@1.6.1:", type=("build", "run"))
depends_on("py-scipy@1.2:", when="@0.8:", type=("build", "run")) depends_on("py-pandas@1:", when="@0.9.1:", type=("build", "run"))
depends_on("py-scipy@0.19:", when="@0.6:", type=("build", "run")) depends_on("py-pandas@0.24.0:", when="@0.8:", type=("build", "run"))
depends_on("py-scipy@0.17:", when="@0.5:", type=("build", "run")) depends_on("py-pandas@0.18.0:", when="@0.7:", type=("build", "run"))
depends_on("py-scipy@0.14:", type=("build", "run")) depends_on("py-requests@2:", when="@0.7:", type=("build", "run"))
depends_on("py-scikit-learn@0.22:", when="@0.9.1:", type=("build", "run"))
depends_on("py-scikit-learn@0.21:", when="@0.8:", type=("build", "run")) depends_on("py-scikit-learn@0.21:", when="@0.8:", type=("build", "run"))
depends_on("py-scikit-learn@0.19:", when="@0.7:", type=("build", "run")) depends_on("py-scikit-learn@0.19:", when="@0.7:", type=("build", "run"))
# sklearn.linear_model.base was deprecated in py-scikit.learn@0.24 # sklearn.linear_model.base was deprecated in py-scikit.learn@0.24
@ -39,43 +51,24 @@ class PyNilearn(PythonPackage):
# older py-nilearn versions use import sklearn.external.joblib which was # older py-nilearn versions use import sklearn.external.joblib which was
# deprecated in py-scikit-learn@0.23: # deprecated in py-scikit-learn@0.23:
depends_on("py-scikit-learn@0.15:0.22", when="@:0.5", type=("build", "run")) depends_on("py-scikit-learn@0.15:0.22", when="@:0.5", type=("build", "run"))
depends_on("py-joblib@0.12:", when="@0.7:", type=("build", "run")) depends_on("py-scipy@1.5:", when="@0.9.1:", type=("build", "run"))
depends_on("py-joblib@0.11:", when="@0.6:", type=("build", "run")) depends_on("py-scipy@1.2:", when="@0.8:", type=("build", "run"))
depends_on("py-nibabel@2.5:", when="@0.8:", type=("build", "run")) depends_on("py-scipy@0.19:", when="@0.6:", type=("build", "run"))
depends_on("py-nibabel@2.0.2:", type=("build", "run")) depends_on("py-scipy@0.17:", when="@0.5:", type=("build", "run"))
depends_on("py-pandas@0.24.0:", when="@0.8:", type=("build", "run")) depends_on("py-scipy@0.14:", type=("build", "run"))
depends_on("py-pandas@0.18.0:", when="@0.7:", type=("build", "run"))
depends_on("py-requests@2:", when="@0.7:", type=("build", "run"))
depends_on("py-matplotlib@2.0:", when="@0.6: +plotting", type=("build", "run")) depends_on("py-matplotlib@3:", when="@0.9.1: +plotting", type=("build", "run"))
depends_on("py-matplotlib@2:", when="@0.6: +plotting", type=("build", "run"))
# older py-nilearn versions use matplotlib.cm.revcmap which was deprecated # older py-nilearn versions use matplotlib.cm.revcmap which was deprecated
# in py-matplotlib@3.4: # in py-matplotlib@3.4:
depends_on("py-matplotlib@1.1.1:3.3", when="@:0.6 +plotting", type=("build", "run")) depends_on("py-matplotlib@1.5.1:3.3", when="@:0.5 +plotting", type=("build", "run"))
depends_on("py-matplotlib@1.1.1:3.3", when="0.4.2 +plotting", type=("build", "run"))
@property @property
def import_modules(self): def skip_modules(self):
modules = [ modules = []
"nilearn",
"nilearn.connectome",
"nilearn.datasets",
"nilearn.decoding",
"nilearn.decomposition",
"nilearn.image",
"nilearn.input_data",
"nilearn.masking",
"nilearn.mass_univariate",
"nilearn.regions",
"nilearn.signal",
"nilearn.surface",
]
if self.spec.satisfies("@0.6:"): if self.spec.satisfies("~plotting"):
modules.append("nilearn.externals")
if self.spec.satisfies("@0.7:"):
modules.append("nilearn.glm")
if "+plotting" in self.spec:
modules.append("nilearn.plotting") modules.append("nilearn.plotting")
if self.spec.satisfies("@0.7:"): if self.spec.satisfies("@0.7:"):
modules.append("nilearn.reporting") modules.append("nilearn.reporting")