PythonPackage: add import module smoke tests (#20023)

This commit is contained in:
Adam J. Stewart 2020-12-16 17:15:03 -06:00 committed by GitHub
parent cd496a20e9
commit 826cd07cf7
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
241 changed files with 335 additions and 1046 deletions

View file

@ -90,7 +90,7 @@ Instead of using the ``PythonPackage`` base class, you should extend
the ``Package`` base class and implement the following custom installation
procedure:
.. code-block::
.. code-block:: python
def install(self, spec, prefix):
pip = which('pip')
@ -255,7 +255,7 @@ Many packages are hosted on PyPI, but are developed on GitHub or another
version control systems. The tarball can be downloaded from either
location, but PyPI is preferred for the following reasons:
#. PyPI contains the bare minimum of files to install the package.
#. PyPI contains the bare minimum number of files needed to install the package.
You may notice that the tarball you download from PyPI does not
have the same checksum as the tarball you download from GitHub.
@ -292,19 +292,6 @@ location, but PyPI is preferred for the following reasons:
PyPI is nice because it makes it physically impossible to
re-release the same version of a package with a different checksum.
There are some reasons to prefer downloading from GitHub:
#. The GitHub tarball may contain unit tests.
As previously mentioned, the PyPI tarball contains the bare minimum
of files to install the package. Unless explicitly specified by the
developers, it will not contain development files like unit tests.
If you desire to run the unit tests during installation, you should
use the GitHub tarball instead.
If you really want to run these unit tests, no one will stop you from
submitting a PR for a new package that downloads from GitHub.
^^^^^^^^^^^^^^^^^^^^^^^^^
Build system dependencies
^^^^^^^^^^^^^^^^^^^^^^^^^
@ -569,7 +556,8 @@ If the package uses ``setuptools``, check for the following clues:
These are packages that are required to run the unit tests for the
package. These dependencies can be specified using the
``type='test'`` dependency type.
``type='test'`` dependency type. However, the PyPI tarballs rarely
contain unit tests, so there is usually no reason to add these.
In the root directory of the package, you may notice a
``requirements.txt`` file. It may look like this file contains a list
@ -625,7 +613,8 @@ add run-time dependencies if they aren't needed, so you need to
determine whether or not setuptools is needed. Grep the installation
directory for any files containing a reference to ``setuptools`` or
``pkg_resources``. Both modules come from ``py-setuptools``.
``pkg_resources`` is particularly common in scripts in ``prefix/bin``.
``pkg_resources`` is particularly common in scripts found in
``prefix/bin``.
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Passing arguments to setup.py
@ -699,49 +688,65 @@ a "package" is a directory containing files like:
foo/baz.py
whereas a "module" is a single Python file. Since ``find_packages``
only returns packages, you'll have to determine the correct module
names yourself. You can now add these packages and modules to the
package like so:
whereas a "module" is a single Python file.
The ``PythonPackage`` base class automatically detects these module
names for you. If, for whatever reason, the module names detected
are wrong, you can provide the names yourself by overriding
``import_modules`` like so:
.. code-block:: python
import_modules = ['six']
When you run ``spack install --test=root py-six``, Spack will attempt
to import the ``six`` module after installation.
Sometimes the list of module names to import depends on how the
package was built. For example, the ``py-pyyaml`` package has a
``+libyaml`` variant that enables the build of a faster optimized
version of the library. If the user chooses ``~libyaml``, only the
``yaml`` library will be importable. If the user chooses ``+libyaml``,
both the ``yaml`` and ``yaml.cyaml`` libraries will be available.
This can be expressed like so:
These tests most often catch missing dependencies and non-RPATHed
.. code-block:: python
@property
def import_modules(self):
modules = ['yaml']
if '+libyaml' in self.spec:
modules.append('yaml.cyaml')
return modules
These tests often catch missing dependencies and non-RPATHed
libraries. Make sure not to add modules/packages containing the word
"test", as these likely won't end up in installation directory.
"test", as these likely won't end up in the installation directory,
or may require test dependencies like pytest to be installed.
These tests can be triggered by running ``spack install --test=root``
or by running ``spack test run`` after the installation has finished.
""""""""""
Unit tests
""""""""""
The package you want to install may come with additional unit tests.
By default, Spack runs:
.. code-block:: console
$ python setup.py test
if it detects that the ``setup.py`` file supports a ``test`` phase.
You can add additional build-time or install-time tests by overriding
``test`` or adding a custom install-time test function. For example,
``py-numpy`` adds:
You can add additional build-time or install-time tests by adding
additional testing functions. For example, ``py-numpy`` adds:
.. code-block:: python
install_time_test_callbacks = ['install_test', 'import_module_test']
@run_after('install')
@on_package_attributes(run_tests=True)
def install_test(self):
with working_dir('..'):
with working_dir('spack-test', create=True):
python('-c', 'import numpy; numpy.test("full", verbose=2)')
These tests can be triggered by running ``spack install --test=root``.
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Setup file in a sub-directory
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@ -781,7 +786,7 @@ PythonPackage vs. packages that use Python
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
There are many packages that make use of Python, but packages that depend
on Python are not necessarily ``PythonPackages``.
on Python are not necessarily ``PythonPackage``'s.
"""""""""""""""""""""""
Choosing a build system
@ -878,8 +883,8 @@ and ``pip`` may be a perfectly valid alternative to using Spack. The
main advantage of Spack over ``pip`` is its ability to compile
non-Python dependencies. It can also build cythonized versions of a
package or link to an optimized BLAS/LAPACK library like MKL,
resulting in calculations that run orders of magnitude faster.
Spack does not offer a significant advantage to other python-management
resulting in calculations that run orders of magnitudes faster.
Spack does not offer a significant advantage over other python-management
systems for installing and using tools like flake8 and sphinx.
But if you need packages with non-Python dependencies like
numpy and scipy, Spack will be very valuable to you.

View file

@ -93,10 +93,17 @@ in the site-packages directory:
$ python
>>> import setuptools
>>> setuptools.find_packages()
['QtPy5']
[
'PyQt5', 'PyQt5.QtCore', 'PyQt5.QtGui', 'PyQt5.QtHelp',
'PyQt5.QtMultimedia', 'PyQt5.QtMultimediaWidgets', 'PyQt5.QtNetwork',
'PyQt5.QtOpenGL', 'PyQt5.QtPrintSupport', 'PyQt5.QtQml',
'PyQt5.QtQuick', 'PyQt5.QtSvg', 'PyQt5.QtTest', 'PyQt5.QtWebChannel',
'PyQt5.QtWebSockets', 'PyQt5.QtWidgets', 'PyQt5.QtXml',
'PyQt5.QtXmlPatterns'
]
Large, complex packages like ``QtPy5`` will return a long list of
Large, complex packages like ``py-pyqt5`` will return a long list of
packages, while other packages may return an empty list. These packages
only install a single ``foo.py`` file. In Python packaging lingo,
a "package" is a directory containing files like:
@ -108,21 +115,25 @@ a "package" is a directory containing files like:
foo/baz.py
whereas a "module" is a single Python file. Since ``find_packages``
only returns packages, you'll have to determine the correct module
names yourself. You can now add these packages and modules to the
package like so:
whereas a "module" is a single Python file.
The ``SIPPackage`` base class automatically detects these module
names for you. If, for whatever reason, the module names detected
are wrong, you can provide the names yourself by overriding
``import_modules`` like so:
.. code-block:: python
import_modules = ['PyQt5']
When you run ``spack install --test=root py-pyqt5``, Spack will attempt
to import the ``PyQt5`` module after installation.
These tests often catch missing dependencies and non-RPATHed
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.
These tests most often catch missing dependencies and non-RPATHed
libraries.
These tests can be triggered by running ``spack install --test=root``
or by running ``spack test run`` after the installation has finished.
^^^^^^^^^^^^^^^^^^^^^^
External documentation

View file

@ -10,8 +10,9 @@
from spack.package import PackageBase, run_after
from llnl.util.filesystem import (working_dir, get_filetype, filter_file,
path_contains_subdirectory, same_path)
path_contains_subdirectory, same_path, find)
from llnl.util.lang import match_predicate
import llnl.util.tty as tty
class PythonPackage(PackageBase):
@ -74,25 +75,12 @@ def configure(self, spec, prefix):
# Default phases
phases = ['build', 'install']
# Name of modules that the Python package provides
# This is used to test whether or not the installation succeeded
# These names generally come from running:
#
# >>> import setuptools
# >>> setuptools.find_packages()
#
# in the source tarball directory
import_modules = []
# To be used in UI queries that require to know which
# build-system class we are using
build_system_class = 'PythonPackage'
#: Callback names for build-time test
build_time_test_callbacks = ['build_test']
#: Callback names for install-time test
install_time_test_callbacks = ['import_module_test']
install_time_test_callbacks = ['test']
extends('python')
@ -100,6 +88,45 @@ def configure(self, spec, prefix):
py_namespace = None
@property
def import_modules(self):
"""Names of modules that the Python package provides.
These are used to test whether or not the installation succeeded.
These names generally come from running:
.. code-block:: python
>> import setuptools
>> setuptools.find_packages()
in the source tarball directory. If the module names are incorrectly
detected, this property can be overridden by the package.
Returns:
list: list of strings of module names
"""
modules = []
# Python libraries may be installed in lib or lib64
# See issues #18520 and #17126
for lib in ['lib', 'lib64']:
root = os.path.join(self.prefix, lib, 'python{0}'.format(
self.spec['python'].version.up_to(2)), 'site-packages')
# Some Python libraries are packages: collections of modules
# distributed in directories containing __init__.py files
for path in find(root, '__init__.py', recursive=True):
modules.append(path.replace(root + os.sep, '', 1).replace(
os.sep + '__init__.py', '').replace('/', '.'))
# Some Python libraries are modules: individual *.py files
# found in the site-packages directory
for path in find(root, '*.py', recursive=False):
modules.append(path.replace(root + os.sep, '', 1).replace(
'.py', '').replace('/', '.'))
tty.debug('Detected the following modules: {0}'.format(modules))
return modules
def setup_file(self):
"""Returns the name of the setup file to use."""
return 'setup.py'
@ -118,27 +145,6 @@ def setup_py(self, *args, **kwargs):
with working_dir(self.build_directory):
self.python('-s', setup, '--no-user-cfg', *args, **kwargs)
def _setup_command_available(self, command):
"""Determines whether or not a setup.py command exists.
Args:
command (str): The command to look for
Returns:
bool: True if the command is found, else False
"""
kwargs = {
'output': os.devnull,
'error': os.devnull,
'fail_on_error': False
}
python = inspect.getmodule(self).python
setup = self.setup_file()
python('-s', setup, '--no-user-cfg', command, '--help', **kwargs)
return python.returncode == 0
# The following phases and their descriptions come from:
# $ python setup.py --help-commands
@ -359,33 +365,16 @@ def check_args(self, spec, prefix):
# Testing
def build_test(self):
"""Run unit tests after in-place build.
These tests are only run if the package actually has a 'test' command.
"""
if self._setup_command_available('test'):
args = self.test_args(self.spec, self.prefix)
self.setup_py('test', *args)
def test_args(self, spec, prefix):
"""Arguments to pass to test."""
return []
run_after('build')(PackageBase._run_default_build_time_test_callbacks)
def import_module_test(self):
"""Attempts to import the module that was just installed.
This test is only run if the package overrides
:py:attr:`import_modules` with a list of module names."""
def test(self):
"""Attempts to import modules of the installed package."""
# Make sure we are importing the installed modules,
# not the ones in the current directory
with working_dir('spack-test', create=True):
# not the ones in the source directory
for module in self.import_modules:
self.python('-c', 'import {0}'.format(module))
self.run_test(inspect.getmodule(self).python.path,
['-c', 'import {0}'.format(module)],
purpose='checking import of {0}'.format(module),
work_dir='spack-test')
run_after('install')(PackageBase._run_default_install_time_test_callbacks)

View file

@ -4,11 +4,12 @@
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
import inspect
import os
from llnl.util.filesystem import working_dir, join_path
from spack.build_systems.python import PythonPackage
from spack.directives import depends_on, extends
from spack.package import PackageBase, run_after
import os
class SIPPackage(PackageBase):
@ -36,13 +37,15 @@ class SIPPackage(PackageBase):
sip_module = 'sip'
#: Callback names for install-time test
install_time_test_callbacks = ['import_module_test']
install_time_test_callbacks = ['test']
extends('python')
depends_on('qt')
depends_on('py-sip')
import_modules = PythonPackage.import_modules
def python(self, *args, **kwargs):
"""The python ``Executable``."""
inspect.getmodule(self).python(*args, **kwargs)
@ -98,17 +101,7 @@ def install_args(self):
# Testing
def import_module_test(self):
"""Attempts to import the module that was just installed.
This test is only run if the package overrides
:py:attr:`import_modules` with a list of module names."""
# Make sure we are importing the installed modules,
# not the ones in the current directory
with working_dir('spack-test', create=True):
for module in self.import_modules:
self.python('-c', 'import {0}'.format(module))
test = PythonPackage.test
run_after('install')(PackageBase._run_default_install_time_test_callbacks)

View file

@ -1761,7 +1761,7 @@ def run_test(self, exe, options=[], expected=[], status=0,
work_dir (str or None): path to the smoke test directory
"""
wdir = '.' if work_dir is None else work_dir
with fsys.working_dir(wdir):
with fsys.working_dir(wdir, create=True):
try:
runner = which(exe)
if runner is None and skip_missing:

View file

@ -18,10 +18,6 @@ class AwsParallelcluster(PythonPackage):
'sean-smith', 'demartinofra', 'enrico-usai', 'lukeseawalker', 'rexcsn',
'ddeidda', 'tilne'
]
import_modules = [
'pcluster', 'awsbatch', 'pcluster.dcv', 'pcluster.configure',
'pcluster.config', 'pcluster.networking'
]
version('2.10.0', sha256='a7a27871b4f54cb913b0c1233e675131e9b2099549af0840d32c36b7e91b104b')
version('2.9.1', sha256='12dc22286cd447a16931f1f8619bdd47d4543fd0de7905d52b6c6f83ff9db8a3')

View file

@ -21,11 +21,6 @@ class Gdal(AutotoolsPackage):
maintainers = ['adamjstewart']
import_modules = [
'osgeo', 'osgeo.gdal', 'osgeo.ogr', 'osgeo.osr',
'osgeo.gdal_array', 'osgeo.gdalconst'
]
version('3.2.0', sha256='b051f852600ffdf07e337a7f15673da23f9201a9dbb482bd513756a3e5a196a6')
version('3.1.4', sha256='7b82486f71c71cec61f9b237116212ce18ef6b90f068cbbf9f7de4fc50b576a8')
version('3.1.3', sha256='161cf55371a143826f1d76ce566db1f0a666496eeb4371aed78b1642f219d51d')
@ -170,6 +165,8 @@ class Gdal(AutotoolsPackage):
executables = ['^gdal-config$']
import_modules = PythonPackage.import_modules
@classmethod
def determine_version(cls, exe):
return Executable(exe)('--version', output=str, error=str).rstrip()
@ -553,16 +550,12 @@ def install(self, spec, prefix):
make('install')
install('*.jar', prefix)
@run_after('install')
@on_package_attributes(run_tests=True)
def import_module_test(self):
if '+python' in self.spec:
with working_dir('spack-test', create=True):
for module in self.import_modules:
python('-c', 'import {0}'.format(module))
@run_after('install')
def darwin_fix(self):
# The shared library is not installed correctly on Darwin; fix this
if 'platform=darwin' in self.spec:
fix_darwin_install_name(self.prefix.lib)
def test(self):
if '+python' in self.spec:
PythonPackage.test(self)

View file

@ -13,13 +13,6 @@ class Mercurial(PythonPackage):
homepage = "https://www.mercurial-scm.org"
url = "https://www.mercurial-scm.org/release/mercurial-5.3.tar.gz"
import_modules = [
'hgext', 'hgext3rd', 'mercurial', 'hgext.convert', 'hgext.fsmonitor',
'hgext.highlight', 'hgext.largefiles', 'hgext.zeroconf',
'hgext.fsmonitor.pywatchman', 'mercurial.hgweb',
'mercurial.httpclient', 'mercurial.pure'
]
version('5.3', sha256='e57ff61d6b67695149dd451922b40aa455ab02e01711806a131a1e95c544f9b9')
version('5.1.2', sha256='15af0b090b23649e0e53621a88dde97b55a734d7cb08b77d3df284db70d44e2e')
version('5.1.1', sha256='35fc8ba5e0379c1b3affa2757e83fb0509e8ac314cbd9f1fd133cf265d16e49f')

View file

@ -22,6 +22,8 @@ class PyAccimage(PythonPackage):
depends_on('py-numpy', type='test')
depends_on('py-imageio', type='test')
def test(self):
@run_after('build')
@on_package_attributes(run_tests=True)
def build_test(self):
pytest = which('pytest')
pytest('test.py')

View file

@ -25,4 +25,3 @@ class PyAdbEnhanced(PythonPackage):
depends_on('py-future', type=('build', 'run'))
depends_on('py-psutil', type=('build', 'run'))
depends_on('py-asyncio', type=('build', 'run'))
depends_on('py-pytest', type='test')

View file

@ -13,8 +13,6 @@ class PyAenum(PythonPackage):
homepage = "https://bitbucket.org/stoneleaf/aenum"
url = "https://pypi.io/packages/source/a/aenum/aenum-2.1.2.tar.gz"
import_modules = ['aenum']
version('2.1.2', sha256='a3208e4b28db3a7b232ff69b934aef2ea1bf27286d9978e1e597d46f490e4687')
depends_on('py-setuptools', type='build')

View file

@ -0,0 +1,19 @@
# Copyright 2013-2020 Lawrence Livermore National Security, LLC and other
# Spack Project Developers. See the top-level COPYRIGHT file for details.
#
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
class PyAiohttpCors(PythonPackage):
"""aiohttp_cors library implements Cross Origin Resource Sharing (CORS)
support for aiohttp asyncio-powered asynchronous HTTP server."""
homepage = "https://github.com/aio-libs/aiohttp-cors"
url = "https://pypi.io/packages/source/a/aiohttp_cors/aiohttp-cors-0.7.0.tar.gz"
version('0.7.0', sha256='4d39c6d7100fd9764ed1caf8cebf0eb01bf5e3f24e2e073fda6234bc48b19f5d')
depends_on('python@3.4.1:', type=('build', 'run'))
depends_on('py-setuptools@20.8.1:', type='build')
depends_on('py-aiohttp@1.1:', type=('build', 'run'))
depends_on('py-typing', when='^python@:3.4', type=('build', 'run'))

View file

@ -13,11 +13,8 @@ class PyAlabaster(PythonPackage):
homepage = "https://alabaster.readthedocs.io/"
url = "https://pypi.io/packages/source/a/alabaster/alabaster-0.7.10.tar.gz"
import_modules = ['alabaster']
version('0.7.12', sha256='a661d72d58e6ea8a57f7a86e37d86716863ee5e92788398526d58b26a4e4dc02')
version('0.7.10', sha256='37cdcb9e9954ed60912ebc1ca12a9d12178c26637abdf124e3cde2341c257fe0')
version('0.7.9', sha256='47afd43b08a4ecaa45e3496e139a193ce364571e7e10c6a87ca1a4c57eb7ea08')
depends_on('py-setuptools', type='build')
depends_on('py-pygments', type='test')

View file

@ -18,5 +18,3 @@ class PyApipkg(PythonPackage):
depends_on('py-setuptools@30.3.0:', type='build')
depends_on('py-setuptools-scm', type='build')
depends_on('python@2.7:2.8,3.4:', type=('build', 'run'))
depends_on('py-py', type='test')
depends_on('py-pytest', type='test')

View file

@ -13,16 +13,8 @@ class PyAppdirs(PythonPackage):
homepage = "https://github.com/ActiveState/appdirs"
url = "https://pypi.io/packages/source/a/appdirs/appdirs-1.4.3.tar.gz"
import_modules = ['appdirs']
version('1.4.3', sha256='9e5896d1372858f8dd3344faf4e5014d21849c756c8d5701f78f8a103b372d92')
version('1.4.0', sha256='8fc245efb4387a4e3e0ac8ebcc704582df7d72ff6a42a53f5600bbb18fdaadc5')
patch('setuptools-import.patch', when='@:1.4.0')
# Newer versions of setuptools require appdirs. Although setuptools is an
# optional dependency of appdirs, if it is not found, setup.py will
# fallback on distutils.core instead. Don't add a setuptools dependency
# or we won't be able to bootstrap setuptools.
# depends_on('py-setuptools', type='build')
depends_on('py-setuptools', type='build')

View file

@ -12,8 +12,6 @@ class PyArchspec(PythonPackage):
maintainers = ['alalazo']
import_modules = ['archspec']
version('0.1.1', sha256='34bafad493b41208857232e21776216d716de37ab051a6a4a1cc1653f7e26423')
depends_on('python@2.7:2.8,3.5:', type=('build', 'run'))

View file

@ -16,6 +16,3 @@ class PyArgon2Cffi(PythonPackage):
depends_on('py-cffi@1.0.0:', type=('build', 'run'))
depends_on('py-six', type=('build', 'run'))
depends_on('py-enum34', when='^python@:3.3', type=('build', 'run'))
depends_on('py-coverage@5.0.2:+toml', type='test')
depends_on('py-hypothesis', type='test')
depends_on('py-pytest', type='test')

View file

@ -15,4 +15,3 @@ class PyArgs(PythonPackage):
version('0.1.0', sha256='a785b8d837625e9b61c39108532d95b85274acd679693b71ebb5156848fcf814')
depends_on('py-setuptools', type='build')
depends_on('py-nose', type='test')

View file

@ -25,6 +25,3 @@ class PyArrow(PythonPackage):
depends_on('py-setuptools', type='build')
depends_on('py-backports-functools-lru-cache@1.2.1:', type=('build', 'run'), when='^python@2.7:2.8')
depends_on('py-python-dateutil', type=('build', 'run'))
depends_on('py-chai', type='test')
depends_on('py-mock', type='test')
depends_on('py-pytz@2019.0:', type='test')

View file

@ -16,4 +16,3 @@ class PyAsteval(PythonPackage):
depends_on('python@3.5:', type=('build', 'run'))
depends_on('py-setuptools', type='build')
depends_on('py-pytest', type='test')

View file

@ -18,8 +18,6 @@ class PyAstor(PythonPackage):
depends_on('python@2.7:2.8,3.4:', type=('build', 'run'))
depends_on('py-setuptools', type='build')
depends_on('py-nose', type='test')
depends_on('py-astunparse', type='test')
# Build fails with newer versions of setuptools
# https://github.com/berkerpeksag/astor/issues/162

View file

@ -15,8 +15,6 @@ class PyAstropy(PythonPackage):
homepage = 'https://astropy.org/'
url = 'https://pypi.io/packages/source/a/astropy/astropy-4.0.1.post1.tar.gz'
install_time_test_callbacks = ['install_test', 'import_module_test']
version('4.0.1.post1', sha256='5c304a6c1845ca426e7bc319412b0363fccb4928cb4ba59298acd1918eec44b5')
version('3.2.1', sha256='706c0457789c78285e5464a5a336f5f0b058d646d60f4e5f5ba1f7d5bf424b28')
version('2.0.14', sha256='618807068609a4d8aeb403a07624e9984f566adc0dc0f5d6b477c3658f31aeb6')
@ -87,6 +85,8 @@ def build_args(self, spec, prefix):
return args
@run_after('install')
@on_package_attributes(run_tests=True)
def install_test(self):
with working_dir('spack-test', create=True):
python('-c', 'import astropy; astropy.test()')

View file

@ -12,8 +12,6 @@ class PyAtomicwrites(PythonPackage):
homepage = "https://github.com/untitaker/python-atomicwrites"
url = "https://pypi.io/packages/source/a/atomicwrites/atomicwrites-1.3.0.tar.gz"
import_modules = ['atomicwrites']
version('1.3.0', sha256='75a9445bac02d8d058d5e1fe689654ba5a6556a1dfd8ce6ec55a0ed79866cfa6')
version('1.1.5', sha256='240831ea22da9ab882b551b31d4225591e5e447a68c5e188db5b89ca1d487585')

View file

@ -12,8 +12,6 @@ class PyAttrs(PythonPackage):
homepage = "http://attrs.org/"
url = "https://pypi.io/packages/source/a/attrs/attrs-20.3.0.tar.gz"
import_modules = ['attr']
version('20.3.0', sha256='832aa3cde19744e49938b91fea06d69ecb9e649c93ba974535d08ad92164f700')
version('20.2.0', sha256='26b54ddbbb9ee1d34d5d3668dd37d6cf74990ab23c828c2888dccdceee395594')
version('20.1.0', sha256='0ef97238856430dcf9228e07f316aefc17e8939fc8507e18c6501b761ef1a42a')
@ -25,11 +23,3 @@ class PyAttrs(PythonPackage):
depends_on('python@2.7:2.8,3.4:', type=('build', 'run'))
depends_on('py-setuptools', type='build')
depends_on('py-coverage', type='test')
depends_on('py-hypothesis', type='test')
depends_on('py-pympler', type='test')
depends_on('py-pytest', type='test')
depends_on('py-pytest@4.3.0:', type='test', when='@19.3.0:')
depends_on('py-six', type='test')
depends_on('py-zope-interface', type='test')

View file

@ -18,4 +18,3 @@ class PyAwesomeSlugify(PythonPackage):
depends_on('py-regex', type=('build', 'run'))
depends_on('py-unidecode@0.04.14:0.04.99', type=('build', 'run'))
depends_on('py-nose', type='test')

View file

@ -36,4 +36,3 @@ class PyAzureCliCore(PythonPackage):
depends_on('py-ndg-httpsclient', when='^python@:2.7.8', type=('build', 'run'))
depends_on('py-pyasn1', when='^python@:2.7.8', type=('build', 'run'))
depends_on('py-futures', when='^python@:2', type=('build', 'run'))
depends_on('py-mock', type='test')

View file

@ -15,4 +15,3 @@ class PyAzureCliTelemetry(PythonPackage):
depends_on('py-setuptools', type='build')
depends_on('py-applicationinsights@0.11.1:0.11.999', type=('build', 'run'))
depends_on('py-portalocker@1.2:1.999', type=('build', 'run'))
depends_on('py-mock', type='test')

View file

@ -99,4 +99,3 @@ class PyAzureCli(PythonPackage):
depends_on('py-xmltodict@0.12:0.999', type=('build', 'run'))
depends_on('py-javaproperties@0.5.1', type=('build', 'run'))
depends_on('py-jsondiff@1.2.0', type=('build', 'run'))
depends_on('py-mock@4.0:4.999', type='test')

View file

@ -14,8 +14,6 @@ class PyBabel(PythonPackage):
homepage = "http://babel.pocoo.org/en/latest/"
url = "https://pypi.io/packages/source/B/Babel/Babel-2.7.0.tar.gz"
import_modules = ['babel', 'babel.localtime', 'babel.messages']
version('2.7.0', sha256='e86135ae101e31e2c8ec20a4e0c5220f4eed12487d5cf3f78be7e98d3a57fc28')
version('2.6.0', sha256='8cba50f48c529ca3fa18cf81fa9403be176d374ac4d60738b839122dfaaa3d23')
version('2.4.0', sha256='8c98f5e5f8f5f088571f2c6bd88d530e331cbbcb95a7311a0db69d3dca7ec563')
@ -24,5 +22,3 @@ class PyBabel(PythonPackage):
depends_on('python@2.7:2.8,3.4:', type=('build', 'run'))
depends_on('py-setuptools', type=('build', 'run'))
depends_on('py-pytz@2015.7:', type=('build', 'run'))
depends_on('py-pytest', type='test')
depends_on('py-freezegun', type='test')

View file

@ -29,5 +29,3 @@ class PyBasisSetExchange(PythonPackage):
depends_on('py-jsonschema', type=('build', 'run'))
depends_on('py-setuptools', type='build')
depends_on('python@3:', type=('build', 'run'))
depends_on('py-pytest@4.0:', type='test')
depends_on('py-pytest-cov', type='test')

View file

@ -18,6 +18,8 @@ class PyBlack(PythonPackage):
version('19.3b0', sha256='68950ffd4d9169716bcb8719a56c07a2f4485354fec061cdd5910aa07369731c')
version('18.9b0', sha256='e030a9a28f542debc08acceb273f228ac422798e5215ba2a791a6ddeaaca22a5')
variant('d', default=False, description='enable blackd HTTP server')
depends_on('python@3.6.0:')
# Needs setuptools at runtime so that `import pkg_resources` succeeds
# See #8843 and #8689 for examples of setuptools added as a runtime dep
@ -28,3 +30,14 @@ class PyBlack(PythonPackage):
depends_on('py-click@6.5:', type=('build', 'run'))
depends_on('py-appdirs', type=('build', 'run'))
depends_on('py-toml@0.9.4:', type=('build', 'run'))
depends_on('py-aiohttp@3.3.2:', when='+d', type=('build', 'run'))
depends_on('py-aiohttp-cors', when='+d', type=('build', 'run'))
@property
def import_modules(self):
modules = ['blib2to3', 'blib2to3.pgen2', 'black']
if '+d' in self.spec:
modules.append('blackd')
return modules

View file

@ -15,4 +15,3 @@ class PyBlis(PythonPackage):
depends_on('py-setuptools', type='build')
depends_on('py-numpy@1.15:', type=('build', 'run'))
depends_on('py-hypothesis', type='test')

View file

@ -19,5 +19,3 @@ class PyBlosc(PythonPackage):
depends_on('python@3.6:', type=('build', 'run'))
depends_on('py-scikit-build', type='build')
# depends_on('c-blosc') # shipped internally
depends_on('py-numpy', type='test')
depends_on('py-psutil', type='test')

View file

@ -12,11 +12,6 @@ class PyBoto3(PythonPackage):
homepage = "https://github.com/boto/boto3"
url = "https://pypi.io/packages/source/b/boto3/boto3-1.10.44.tar.gz"
import_modules = [
'boto3', 'boto3.s3', 'boto3.resources', 'boto3.dynamodb',
'boto3.docs', 'boto3.ec2'
]
version('1.10.44', sha256='adc0c0269bd65967fd528d7cd826304f381d40d94f2bf2b09f58167e5ac05d86')
version('1.10.38', sha256='6cdb063b2ae5ac7b93ded6b6b17e3da1325b32232d5ff56e6800018d4786bba6')
version('1.9.169', sha256='9d8bd0ca309b01265793b7e8d7b88c1df439737d77c8725988f0277bbf58d169')

View file

@ -12,8 +12,6 @@ class PyBotocore(PythonPackage):
homepage = "https://github.com/boto/botocore"
url = "https://pypi.io/packages/source/b/botocore/botocore-1.13.44.tar.gz"
import_modules = ['botocore']
version('1.13.44', sha256='a4409008c32a3305b9c469c5cc92edb5b79d6fcbf6f56fe126886b545f0a4f3f')
version('1.13.38', sha256='15766a367f39dba9de3c6296aaa7da31030f08a0117fd12685e7df682d8acee2')
version('1.12.169', sha256='25b44c3253b5ed1c9093efb57ffca440c5099a2d62fa793e8b6c52e72f54b01e')
@ -28,5 +26,3 @@ class PyBotocore(PythonPackage):
depends_on('py-urllib3@1.20:1.25', type=('build', 'run'))
depends_on('py-urllib3@1.20:1.23', type=('build', 'run'), when='^python@2.6.0:2.6.999')
depends_on('py-urllib3@1.20:1.22', type=('build', 'run'), when='^python@3.3.0:3.3.999')
depends_on('py-mock', type='test')
depends_on('py-nose', type='test')

View file

@ -16,4 +16,3 @@ class PyBottleneck(PythonPackage):
depends_on('py-setuptools', type='build')
depends_on('py-numpy', type=('build', 'run'))
depends_on('py-nose', type='test')

View file

@ -26,7 +26,6 @@ class PyBrian2(PythonPackage):
depends_on('py-jinja2@2.7:', type=('build', 'run'))
depends_on('py-setuptools@21:', type=('build', 'run'))
depends_on('py-sphinx@1.5:', type=('build', 'run'), when='+docs')
depends_on('py-nose@1.0:', type='test')
def build_args(self, spec, prefix):
return ['--with-cython']

View file

@ -14,14 +14,9 @@ class PyCairocffi(PythonPackage):
homepage = "https://github.com/Kozea/cairocffi"
url = "https://pypi.io/packages/source/c/cairocffi/cairocffi-1.0.2.tar.gz"
import_modules = ['cairocffi']
version('1.0.2', sha256='01ac51ae12c4324ca5809ce270f9dd1b67f5166fe63bd3e497e9ea3ca91946ff')
depends_on('python@3.5:', type=('build', 'run'))
depends_on('py-setuptools@39.2.0:', type='build')
depends_on('py-cffi@1.1.0:', type=('build', 'run'))
depends_on('py-pytest-runner', type='test')
depends_on('py-pytest-cov', type='test')
depends_on('py-pytest-flake8', type='test')
depends_on('py-pytest-isort', type='test')

View file

@ -13,10 +13,6 @@ class PyCartopy(PythonPackage):
url = "https://github.com/SciTools/cartopy/archive/v0.18.0.tar.gz"
maintainers = ['adamjstewart']
import_modules = [
'cartopy', 'cartopy.sphinxext', 'cartopy.io', 'cartopy.geodesic',
'cartopy.examples', 'cartopy.mpl', 'cartopy.feature',
]
version('0.18.0', sha256='493ced4698361ffabec1a213d2b711dc836117242c304f3b93f5406182fd8bc2')
version('0.17.0', sha256='137642e63952404ec0841fa0333ad14c58fbbf19cca2a5ac6a38498c4b4998fb')
@ -48,11 +44,6 @@ class PyCartopy(PythonPackage):
depends_on('pil@1.7.8:', type=('build', 'run'), when='+plotting')
depends_on('py-scipy@0.10:', type=('build', 'run'), when='+plotting')
# Testing dependencies
depends_on('py-filelock', type='test')
depends_on('py-mock@1.0.1:', type='test')
depends_on('py-pytest@3.0.0:', type='test')
patch('proj6.patch', when='@0.17.0')
phases = ['build_ext', 'install']
@ -74,8 +65,6 @@ def build_ext_args(self, spec, prefix):
return args
# Tests need to be re-added since `phases` was overridden
run_after('build_ext')(
PythonPackage._run_default_build_time_test_callbacks)
run_after('install')(
PythonPackage._run_default_install_time_test_callbacks)
run_after('install')(PythonPackage.sanity_check_prefix)

View file

@ -14,8 +14,6 @@ class PyCertifi(PythonPackage):
homepage = "http://certifi.io/"
url = "https://pypi.io/packages/source/c/certifi/certifi-2020.6.20.tar.gz"
import_modules = ['certifi']
version('2020.6.20', sha256='5930595817496dd21bb8dc35dad090f1c2cd0adfaf21204bf6732ca5d8ee34d3')
version('2019.9.11', sha256='e4f3620cfea4f83eedc95b24abd9cd56f3c4b146dd0177e83a21b4eb49e21e50')
version('2019.6.16', sha256='945e3ba63a0b9f577b1395204e13c3a231f9bc0223888be653286534e5873695')

View file

@ -13,8 +13,6 @@ class PyCffi(PythonPackage):
homepage = "https://cffi.readthedocs.io/en/latest/"
url = "https://pypi.io/packages/source/c/cffi/cffi-1.13.0.tar.gz"
import_modules = ['cffi']
version('1.14.3', sha256='f92f789e4f9241cd262ad7a555ca2c648a98178a953af117ef7fad46aa1d5591')
version('1.13.0', sha256='8fe230f612c18af1df6f348d02d682fe2c28ca0a6c3856c99599cdacae7cf226')
version('1.12.2', sha256='e113878a446c6228669144ae8a56e268c91b7f1fafae927adc4879d9849e0ea7')
@ -27,8 +25,6 @@ class PyCffi(PythonPackage):
depends_on('py-pycparser', type=('build', 'run'))
depends_on('py-pycparser@2.19:', when='^python@:2.6', type=('build', 'run'))
depends_on('libffi')
depends_on('py-py', type='test')
depends_on('py-pytest', type='test')
def setup_build_environment(self, env):
# This sets the compiler (and flags) that distutils will use

View file

@ -18,5 +18,3 @@ class PyChardet(PythonPackage):
depends_on('py-setuptools', type=('build', 'run'))
depends_on('py-pytest-runner', type='build')
depends_on('py-pytest', type='test')
depends_on('py-hypothesis', type='test')

View file

@ -12,13 +12,7 @@ class PyCloudpickle(PythonPackage):
homepage = "https://github.com/cloudpipe/cloudpickle"
url = "https://pypi.io/packages/source/c/cloudpickle/cloudpickle-0.5.2.tar.gz"
import_modules = ['cloudpickle']
version('1.2.1', sha256='603244e0f552b72a267d47a7d9b347b27a3430f58a0536037a290e7e0e212ecf')
version('0.5.2', sha256='b0e63dd89ed5285171a570186751bc9b84493675e99e12789e9a5dc5490ef554')
depends_on('py-setuptools', type='build')
def build_test(self):
# PyPI tarball does not come with unit tests
pass

View file

@ -15,4 +15,3 @@ class PyCmocean(PythonPackage):
depends_on('py-setuptools', type='build')
depends_on('py-matplotlib', type=('build', 'run'))
depends_on('py-numpy', type=('build', 'run'))
depends_on('py-pytest', type='test')

View file

@ -12,13 +12,9 @@ class PyCodecov(PythonPackage):
homepage = "https://github.com/codecov/codecov-python"
url = "https://pypi.io/packages/source/c/codecov/codecov-2.0.15.tar.gz"
import_modules = ['codecov']
version('2.0.15', sha256='8ed8b7c6791010d359baed66f84f061bba5bd41174bf324c31311e8737602788')
depends_on('py-setuptools', type=('build', 'run'))
depends_on('py-requests@2.7.9:', type=('build', 'run'))
depends_on('py-coverage', type=('build', 'run'))
depends_on('py-argparse', when='^python@:2.6', type=('build', 'run'))
depends_on('py-unittest2', type='test')
depends_on('py-linecache2', type='test')

View file

@ -10,8 +10,6 @@ class PyCounter(PythonPackage):
"""Counter package defines the "counter.Counter" class similar to
bags or multisets in other languages."""
import_modules = ['counter']
homepage = "https://github.com/KelSolaar/Counter"
url = "https://pypi.io/packages/source/C/Counter/Counter-1.0.0.tar.gz"

View file

@ -13,8 +13,6 @@ class PyCvxopt(PythonPackage):
homepage = "http://cvxopt.org/"
url = "https://pypi.io/packages/source/c/cvxopt/cvxopt-1.1.9.tar.gz"
import_modules = ['cvxopt']
version('1.2.5', sha256='94ec8c36bd6628a11de9014346692daeeef99b3b7bae28cef30c7490bbcb2d72')
version('1.1.9', sha256='8f157e7397158812cabd340b68546f1baa55a486ed0aad8bc26877593dc2983d')

View file

@ -16,13 +16,10 @@ class PyCvxpy(PythonPackage):
version('1.0.25', sha256='8535529ddb807067b0d59661dce1d9a6ddb2a218398a38ea7772328ad8a6ea13')
depends_on('py-setuptools', type='build')
depends_on('py-nose', type='test')
depends_on('py-numpy@1.15:', type=('build', 'run'))
depends_on('py-scipy@1.1.0:', type=('build', 'run'))
depends_on('py-ecos@2:', type=('build', 'run'))
depends_on('py-scs@1.1.3:', type=('build', 'run'))
depends_on('py-osqp@0.4.1', type=('build', 'run'))
depends_on('py-multiprocess', type=('build', 'run'))
depends_on('py-six', type=('build', 'run'))

View file

@ -12,14 +12,6 @@ class PyCython(PythonPackage):
homepage = "https://pypi.python.org/pypi/cython"
url = "https://pypi.io/packages/source/c/cython/Cython-0.29.21.tar.gz"
import_modules = [
'cython', 'Cython', 'Cython.Build', 'Cython.Compiler',
'Cython.Runtime', 'Cython.Distutils', 'Cython.Debugger',
'Cython.Debugger.Tests', 'Cython.Plex', 'Cython.Tests',
'Cython.Build.Tests', 'Cython.Compiler.Tests', 'Cython.Utility',
'Cython.Tempita', 'pyximport',
]
version('0.29.21', sha256='e57acb89bd55943c8d8bf813763d20b9099cc7165c0f16b707631a7654be9cad')
version('0.29.16', sha256='232755284f942cbb3b43a06cd85974ef3c970a021aef19b5243c03ee2b08fa05')
version('0.29.15', sha256='60d859e1efa5cc80436d58aecd3718ff2e74b987db0518376046adedba97ac30')
@ -47,6 +39,8 @@ def command(self):
"""Returns the Cython command"""
return Executable(self.prefix.bin.cython)
@run_after('build')
@on_package_attributes(run_tests=True)
def build_test(self):
# Warning: full suite of unit tests takes a very long time
python('runtests.py', '-j', str(make_jobs))

View file

@ -38,9 +38,6 @@ class PyDask(PythonPackage):
depends_on('python@3.6:', type=('build', 'run'), when='@2.7.0:')
depends_on('py-setuptools', type='build')
depends_on('py-pytest@3.1.0:', type='test')
depends_on('py-requests', type='test')
depends_on('py-pytest-runner', type='test')
# Requirements for dask.array
depends_on('py-numpy@1.10.4:', type=('build', 'run'), when='+array')

View file

@ -26,8 +26,3 @@ class PyDateparser(PythonPackage):
depends_on('py-ruamel-yaml', type=('build', 'run'), when='+calendars')
depends_on('py-convertdate', type=('build', 'run'), when='+calendars')
depends_on('py-jdatetime', type=('build', 'run'), when='+calendars')
depends_on('py-mock', type='test')
depends_on('py-nose', type='test')
depends_on('py-parameterized', type='test')
depends_on('py-six', type='test')
depends_on('py-coverage', type='test')

View file

@ -30,8 +30,6 @@ class PyDeeptools(PythonPackage):
depends_on('py-plotly@2.0.0:', type=('build', 'run'))
depends_on('py-deeptoolsintervals@0.1.8:', type=('build', 'run'))
depends_on('py-nose', type='test')
def patch(self):
# Add nosetest hook for "python setup.py test" argument.
filter_file(r'^setup\(',

View file

@ -13,4 +13,3 @@ class PyDiskcache(PythonPackage):
version('4.1.0', sha256='bcee5a59f9c264e2809e58d01be6569a3bbb1e36a1e0fb83f7ef9b2075f95ce0')
depends_on('py-setuptools', type='build')
depends_on('py-tox', type='test')

View file

@ -12,8 +12,6 @@ class PyDocopt(PythonPackage):
homepage = "http://docopt.org/"
url = "https://pypi.io/packages/source/d/docopt/docopt-0.6.2.tar.gz"
import_modules = ['docopt']
version('0.6.2', sha256='49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491')
depends_on('py-setuptools', type='build')

View file

@ -17,17 +17,6 @@ class PyDocutils(PythonPackage):
homepage = "http://docutils.sourceforge.net/"
url = "https://pypi.io/packages/source/d/docutils/docutils-0.15.2.tar.gz"
import_modules = [
'docutils', 'docutils.languages', 'docutils.parsers',
'docutils.readers', 'docutils.transforms', 'docutils.utils',
'docutils.writers', 'docutils.parsers.rst',
'docutils.parsers.rst.directives', 'docutils.parsers.rst.languages',
'docutils.utils.math', 'docutils.writers.html4css1',
'docutils.writers.html5_polyglot', 'docutils.writers.latex2e',
'docutils.writers.odf_odt', 'docutils.writers.pep_html',
'docutils.writers.s5_html', 'docutils.writers.xetex'
]
version('0.15.2', sha256='a2aeea129088da402665e92e0b25b04b073c04b2dce4ab65caaa38b7ce2e1a99')
version('0.14', sha256='51e64ef2ebfb29cae1faa133b3710143496eca21c530f3f71424d77687764274')
version('0.13.1', sha256='718c0f5fb677be0f34b781e04241c4067cbd9327b66bdd8e763201130f5175be')

View file

@ -14,8 +14,6 @@ class PyDxchange(PythonPackage):
homepage = "https://github.com/data-exchange/dxchange"
url = "https://github.com/data-exchange/dxchange/archive/v0.1.2.tar.gz"
import_modules = ['dxchange']
version('0.1.2', sha256='d005b036b6323d0dffd5944c3da0b8a90496d96277654e72b53717058dd5fd87')
depends_on('py-setuptools', type='build')

View file

@ -13,8 +13,6 @@ class PyDxfile(PythonPackage):
homepage = "https://github.com/data-exchange/dxfile"
url = "https://github.com/data-exchange/dxfile/archive/v0.4.tar.gz"
import_modules = ['dxfile']
version('0.4', sha256='b7729eebdc7c99a66a8b339fc10019aa8565e02bd12708540fb3f47935f004c7')
depends_on('py-setuptools', type='build')

View file

@ -22,6 +22,3 @@ class PyEasybuildFramework(PythonPackage):
depends_on('python@2.6:2.8,3.5:', when='@4:', type=('build', 'run'))
depends_on('py-setuptools', when='@:3', type=('build', 'run'))
depends_on('py-vsc-base@2.5.4:', when='@2.9:3', type='run')
# Only required for tests (python -O -m test.framework.suite)
depends_on('py-vsc-install', when='@:3', type='test')

View file

@ -18,4 +18,3 @@ class PyEcdsa(PythonPackage):
depends_on('python@2.6:2.8,3.3:', type=('build', 'run'))
depends_on('py-setuptools', type='build')
depends_on('py-six@1.9.0:', type=('build', 'run'))
depends_on('openssl', type='test')

View file

@ -16,6 +16,5 @@ class PyEcos(PythonPackage):
version('2.0.7.post1', sha256='83e90f42b3f32e2a93f255c3cfad2da78dbd859119e93844c45d2fca20bdc758')
depends_on('py-setuptools', type='build')
depends_on('py-nose', type='test')
depends_on('py-numpy@1.6:', type=('build', 'run'))
depends_on('py-scipy@0.9:', type=('build', 'run'))

View file

@ -12,8 +12,6 @@ class PyEdffile(PythonPackage):
homepage = "https://github.com/vasole/pymca/blob/master/PyMca5/PyMcaIO/EdfFile.py"
git = "https://github.com/conda-forge/edffile-feedstock.git"
import_modules = ['EdfFile']
version('5.0.0', commit='be5ab4199db9f8209c59e31874934b8536b52301')
depends_on('py-setuptools', type='build')

View file

@ -27,4 +27,3 @@ class PyElephant(PythonPackage):
depends_on('py-pandas@0.14.1:', type=('build', 'run'), when='+pandas')
depends_on('py-numpydoc@0.5:', type=('build', 'run'), when='+docs')
depends_on('py-sphinx@1.2.2:', type=('build', 'run'), when='+docs')
depends_on('py-nose@1.3.3:', type='test')

View file

@ -12,8 +12,6 @@ class PyEntrypoints(PythonPackage):
homepage = "https://pypi.python.org/pypi/entrypoints"
url = "https://pypi.io/packages/source/e/entrypoints/entrypoints-0.2.3.tar.gz"
import_modules = ['entrypoints']
version('0.3', sha256='c70dd71abe5a8c85e55e12c19bd91ccfeec11a6e99044204511f9ed547d48451')
version('0.2.3', sha256='d2d587dde06f99545fb13a383d2cd336a8ff1f359c5839ce3a64c917d10c029f')

View file

@ -30,7 +30,6 @@ class PyFenicsDolfinx(PythonPackage):
depends_on("py-cffi", type=("run"))
depends_on("py-numpy", type=("run"))
import_modules = ['dolfinx']
phases = ['build_ext', 'build', 'install']
build_directory = 'python'

View file

@ -15,5 +15,3 @@ class PyFilemagic(PythonPackage):
version('1.6', sha256='e684359ef40820fe406f0ebc5bf8a78f89717bdb7fed688af68082d991d6dbf3')
depends_on('py-setuptools', type='build')
depends_on('py-mock', type='test', when='^python@3:')
depends_on('py-unittest2', type='test')

View file

@ -13,7 +13,6 @@ class PyFiona(PythonPackage):
url = "https://pypi.io/packages/source/F/Fiona/Fiona-1.8.6.tar.gz"
maintainers = ['adamjstewart']
import_modules = ['fiona', 'fiona.fio']
version('1.8.6', sha256='fa31dfe8855b9cd0b128b47a4df558f1b8eda90d2181bff1dd9854e5556efb3e')
version('1.7.12', sha256='8b54eb8422d7c502bb7776b184018186bede1a489cf438a7a47f992ade6a0e51')
@ -33,7 +32,3 @@ class PyFiona(PythonPackage):
depends_on('py-argparse', type=('build', 'run'), when='^python@:2.6')
depends_on('py-ordereddict', type=('build', 'run'), when='^python@:2.6')
depends_on('py-enum34', type=('build', 'run'), when='^python@:3.3')
def build_test(self):
# PyPI tarball does not come with unit tests
pass

View file

@ -17,7 +17,6 @@ class PyFiscalyear(PythonPackage):
git = "https://github.com/adamjstewart/fiscalyear.git"
maintainers = ['adamjstewart']
import_modules = ['fiscalyear']
version('master', branch='master')
version('0.2.0', sha256='f513616aeb03046406c56d7c69cd9e26f6a12963c71c1410cc3d4532a5bfee71')
@ -25,7 +24,3 @@ class PyFiscalyear(PythonPackage):
depends_on('python@2.5:', type=('build', 'run'))
depends_on('py-setuptools', type='build')
depends_on('py-pytest', type='test')
depends_on('py-pytest-runner', type='test')
depends_on('py-pytest-mock', type='test')

View file

@ -18,4 +18,3 @@ class PyFisher(PythonPackage):
depends_on('py-setuptools', type='build')
depends_on('py-numpy', type=('build', 'run'))
depends_on('py-pytest', type='test')

View file

@ -13,13 +13,9 @@ class PyFreezegun(PythonPackage):
homepage = "https://github.com/spulec/freezegun"
url = "https://pypi.io/packages/source/f/freezegun/freezegun-0.3.12.tar.gz"
import_modules = ['freezegun']
version('0.3.12', sha256='2a4d9c8cd3c04a201e20c313caf8b6338f1cfa4cda43f46a94cc4a9fd13ea5e7')
depends_on('py-setuptools', type='build')
depends_on('py-six', type=('build', 'run'))
depends_on('py-python-dateutil@1.0:1.999', type=('build', 'run'), when='^python@:2')
depends_on('py-python-dateutil@2:', type=('build', 'run'), when='^python@3:')
depends_on('py-mock', type='test')
depends_on('py-nose', type='test')

View file

@ -12,8 +12,6 @@ class PyFsspec(PythonPackage):
homepage = "https://github.com/intake/filesystem_spec"
url = "https://pypi.io/packages/source/f/fsspec/fsspec-0.4.4.tar.gz"
import_modules = ['fsspec', 'fsspec.implementations']
version('0.7.3', sha256='1b540552c93b47e83c568e87507d6e02993e6d1b30bc7285f2336c81c5014103')
version('0.4.4', sha256='97697a46e8bf8be34461c2520d6fc4bfca0ed749b22bb2b7c21939fd450a7d63')

View file

@ -12,10 +12,7 @@ class PyFuncsigs(PythonPackage):
homepage = "https://pypi.python.org/pypi/funcsigs"
url = "https://pypi.io/packages/source/f/funcsigs/funcsigs-1.0.2.tar.gz"
import_modules = ['funcsigs']
version('1.0.2', sha256='a7bb0f2cf3a3fd1ab2732cb49eba4252c2af4240442415b4abce3b87022a8f50')
version('0.4', sha256='d83ce6df0b0ea6618700fe1db353526391a8a3ada1b7aba52fed7a61da772033')
depends_on('py-setuptools@17.1:', type='build')
depends_on('py-unittest2', type='test')

View file

@ -21,3 +21,29 @@ class PyFuture(PythonPackage):
depends_on('py-setuptools', type='build')
depends_on('py-importlib', type=('build', 'run'), when='^python@:2.6')
depends_on('py-argparse', type=('build', 'run'), when='^python@:2.6')
@property
def import_modules(self):
modules = [
'copyreg', '_thread', 'past', 'past.types', 'past.translation',
'past.utils', 'past.builtins', 'reprlib', 'html', 'builtins',
'http', '_dummy_thread', 'queue', 'xmlrpc', 'libfuturize',
'libfuturize.fixes', 'future', 'future.moves', 'future.moves.test',
'future.moves.urllib', 'future.moves.html', 'future.moves.http',
'future.moves.dbm', 'future.moves.xmlrpc', 'future.types',
'future.tests', 'future.utils', 'future.builtins',
'future.backports', 'future.backports.test',
'future.backports.urllib', 'future.backports.html',
'future.backports.http', 'future.backports.xmlrpc',
'future.backports.email', 'future.backports.email.mime',
'future.standard_library', 'libpasteurize', 'libpasteurize.fixes',
'socketserver', '_markupbase'
]
if 'platform=windows' in self.spec:
modules.append('winreg')
if '+tkinter' in self.spec['python']:
modules.extend(['tkinter', 'future.moves.tkinter'])
return modules

View file

@ -22,6 +22,5 @@ class PyGeeAssetManager(PythonPackage):
depends_on('py-retrying@1.3.3:', type=('build', 'run'))
depends_on('py-beautifulsoup4@4.5.1:', type=('build', 'run'))
depends_on('py-requests-toolbelt@0.7.0:', type=('build', 'run'))
depends_on('py-pytest@3.0.0:', type=('build', 'test'))
depends_on('py-future@0.16.0:', type=('build', 'run'))
depends_on('py-google-cloud-storage@1.1.1:', type=('build', 'run'))

View file

@ -22,7 +22,6 @@ class PyGeeadd(PythonPackage):
depends_on('py-clipboard@0.0.4:', type=('build', 'run'))
depends_on('py-beautifulsoup4@4.5.1:', type=('build', 'run'))
depends_on('py-requests-toolbelt@0.7.0:', type=('build', 'run'))
depends_on('py-pytest@3.0.0:', type=('build', 'test'))
depends_on('py-future@0.16.0:', type=('build', 'run'))
depends_on('py-google-cloud-storage@1.1.1:', type=('build', 'run'))
depends_on('py-oauth2client@4.1.3:', type=('build', 'run'))

View file

@ -20,9 +20,3 @@ class PyGeoalchemy2(PythonPackage):
depends_on('py-setuptools', type='build')
depends_on('py-sqlalchemy@0.8:', type=('build', 'run'))
depends_on('py-shapely@1.3.0:', type=('build', 'run'), when='+dev')
depends_on('py-pycodestyle@2.2.0', type='test')
depends_on('py-flake8@3.2.0', type='test')
depends_on('py-pytest@3.7.4', type='test', when='@0.6.3')
depends_on('py-pytest@3.1.3', type='test', when='@0.4.2')
depends_on('py-pytest-cov@2.5.1', type='test')

View file

@ -17,9 +17,6 @@ class PyGeopandas(PythonPackage):
url = "https://pypi.io/packages/source/g/geopandas/geopandas-0.5.0.tar.gz"
maintainers = ['adamjstewart']
import_modules = [
'geopandas', 'geopandas.io', 'geopandas.tools', 'geopandas.datasets'
]
version('0.5.0', sha256='d075d2ab61a502ab92ec6b72aaf9610a1340ec24ed07264fcbdbe944b9e68954')
version('0.4.0', sha256='9f5d24d23f33e6d3267a633025e4d9e050b3a1e86d41a96d3ccc5ad95afec3db')

View file

@ -12,6 +12,10 @@ class PyGoogleApiCore(PythonPackage):
homepage = "https://github.com/GoogleCloudPlatform/google-cloud-python"
url = "https://pypi.io/packages/source/g/google-api-core/google-api-core-1.14.2.tar.gz"
# google.api_core.operations_v1 and google.api_core.gapic_v1 require
# grpc optional dependency
import_modules = ['google.api_core', 'google.api_core.future']
version('1.14.2', sha256='2c23fbc81c76b941ffb71301bb975ed66a610e9b03f918feacd1ed59cf43a6ec')
depends_on('python@2.7:2.8,3.4:', type=('build', 'run'))

View file

@ -19,5 +19,3 @@ class PyGpustat(PythonPackage):
depends_on('py-nvidia-ml-py3@7.352.0:', when='^python@3:', type=('build', 'run'))
depends_on('py-psutil', type=('build', 'run'))
depends_on('py-blessings@1.6:', type=('build', 'run'))
depends_on('py-mock@2:', type='test')
depends_on('py-pytest@:4', type='test')

View file

@ -30,10 +30,5 @@ class PyGraphviz(PythonPackage):
depends_on('py-pep8-naming', type=('build', 'run'), when='+dev')
depends_on('py-wheel', type=('build', 'run'), when='+dev')
depends_on('py-twine', type=('build', 'run'), when='+dev')
depends_on('py-mock@2:', type='test')
depends_on('py-pytest@3.4:', type='test')
depends_on('py-pytest@3.4:3.9,3.11:', when='@0.11.1', type='test')
depends_on('py-pytest-mock@1.8:', type='test')
depends_on('py-pytest-cov', type='test')
depends_on('py-sphinx@1.7:', type=('build', 'run'), when='+docs')
depends_on('py-sphinx-rtd-theme', type=('build', 'run'), when='+docs')

View file

@ -22,4 +22,3 @@ class PyGrequests(PythonPackage):
depends_on('py-setuptools', type='build')
depends_on('py-gevent', type=('build', 'run'))
depends_on('py-requests', type=('build', 'run'))
depends_on('py-nose', type='test')

View file

@ -14,8 +14,6 @@ class PyH5py(PythonPackage):
url = "https://pypi.io/packages/source/h/h5py/h5py-2.10.0.tar.gz"
git = "https://github.com/h5py/h5py.git"
import_modules = ['h5py', 'h5py._hl']
version('master', branch='master')
version('2.10.0', sha256='84412798925dc870ffd7107f045d7659e60f5d46d1c70c700375248bf6bf512d')
version('2.9.0', sha256='9d41ca62daf36d6b6515ab8765e4c8c4388ee18e2a665701fef2b41563821002')

View file

@ -22,4 +22,3 @@ class PyH5sh(PythonPackage):
depends_on('py-prompt-toolkit@2:', type=('build', 'run'))
depends_on('py-pygments', type=('build', 'run'))
depends_on('py-six', type=('build', 'run'))
depends_on('py-pytest', type='test')

View file

@ -12,8 +12,6 @@ class PyHacking(PythonPackage):
homepage = "https://docs.openstack.org/hacking/latest/"
url = "https://pypi.io/packages/source/h/hacking/hacking-1.1.0.tar.gz"
import_modules = ['hacking']
version('1.1.0', sha256='23a306f3a1070a4469a603886ba709780f02ae7e0f1fc7061e5c6fb203828fee')
depends_on('py-setuptools', type='build')

View file

@ -89,12 +89,6 @@ class PyHorovod(PythonPackage, CudaPackage):
# There does not appear to be a way to use an external Gloo installation
depends_on('cmake', type='build', when='tensor_ops=gloo')
# Test dependencies
depends_on('py-mock', type='test')
depends_on('py-pytest', type='test')
depends_on('py-pytest-forked', type='test')
depends_on('py-parameterized', type='test', when='@0.20:')
conflicts('cuda_arch=none', when='+cuda',
msg='Must specify CUDA compute capabilities of your GPU, see '
'https://developer.nvidia.com/cuda-gpus')
@ -105,6 +99,51 @@ class PyHorovod(PythonPackage, CudaPackage):
# https://github.com/horovod/horovod/pull/1835
patch('fma.patch', when='@0.19.0:0.19.1')
@property
def import_modules(self):
modules = [
'horovod', 'horovod.runner', 'horovod.runner.util',
'horovod.runner.elastic', 'horovod.runner.driver',
'horovod.runner.common', 'horovod.runner.common.util',
'horovod.runner.common.service', 'horovod.runner.http',
'horovod.runner.task', 'horovod.common'
]
if 'frameworks=tensorflow' in self.spec:
modules.append('horovod.tensorflow')
if 'frameworks=pytorch' in self.spec:
modules.extend([
'horovod.torch', 'horovod.torch.mpi_lib',
'horovod.torch.elastic', 'horovod.torch.mpi_lib_impl'
])
if 'frameworks=mxnet' in self.spec:
modules.append('horovod.mxnet')
if 'frameworks=keras' in self.spec:
modules.extend(['horovod.keras', 'horovod._keras'])
if 'frameworks=spark' in self.spec:
modules.extend([
'horovod.spark', 'horovod.spark.driver',
'horovod.spark.common', 'horovod.spark.task'
])
if 'frameworks=ray' in self.spec:
modules.append('horovod.ray')
if 'frameworks=tensorflow,keras' in self.spec:
modules.append('horovod.tensorflow.keras')
if 'frameworks=spark,pytorch' in self.spec:
modules.append('horovod.spark.torch')
if 'frameworks=spark,keras' in self.spec:
modules.append('horovod.spark.keras')
return modules
def setup_build_environment(self, env):
# https://github.com/horovod/horovod/blob/master/docs/install.rst#environment-variables
@ -167,8 +206,6 @@ def setup_build_environment(self, env):
env.set('HOROVOD_CPU_OPERATIONS',
self.spec.variants['tensor_ops'].value.upper())
@run_after('install')
@on_package_attributes(run_tests=True)
def install_test(self):
horovodrun = Executable(self.prefix.bin.horovodrun)
horovodrun('--check-build')
def test(self):
super(PyHorovod, self).test()
run_test(self.prefix.bin.horovodrun, '--check-build')

View file

@ -18,5 +18,3 @@ class PyHtmlgen(PythonPackage):
depends_on('python@2.7:2.8,3.4:', type=('build', 'run'))
depends_on('py-setuptools', type='build')
depends_on('py-asserts@0.8.0:0.8.999', type='test')
depends_on('py-typing', type='test')

View file

@ -19,4 +19,3 @@ class PyHumanize(PythonPackage):
version('0.5.1', sha256='a43f57115831ac7c70de098e6ac46ac13be00d69abbf60bdcac251344785bb19')
depends_on('py-setuptools', type='build')
depends_on('py-mock', type='test')

View file

@ -12,14 +12,6 @@ class PyHypothesis(PythonPackage):
homepage = "https://github.com/HypothesisWorks/hypothesis-python"
url = "https://pypi.io/packages/source/h/hypothesis/hypothesis-4.41.2.tar.gz"
import_modules = [
'hypothesis', 'hypothesis.searchstrategy', 'hypothesis.extra',
'hypothesis.utils', 'hypothesis.vendor', 'hypothesis.internal',
'hypothesis.internal.conjecture'
]
# TODO: Add missing dependency required to import hypothesis.extra.django
version('5.3.0', sha256='c9fdb53fe3bf1f8e7dcca1a7dd6e430862502f088aca2903d141511212e79429')
version('4.57.1', sha256='3c4369a4b0a1348561048bcda5f1db951a1b8e2a514ea8e8c70d36e656bf6fa0')
version('4.41.2', sha256='6847df3ffb4aa52798621dd007e6b61dbcf2d76c30ba37dc2699720e2c734b7a')

View file

@ -13,8 +13,6 @@ class PyImagesize(PythonPackage):
homepage = "https://github.com/shibukawa/imagesize_py"
url = "https://pypi.io/packages/source/i/imagesize/imagesize-0.7.1.tar.gz"
import_modules = ['imagesize']
version('1.1.0', sha256='f3832918bc3c66617f92e35f5d70729187676313caa60c187eb0f28b8fe5e3b5')
version('0.7.1', sha256='0ab2c62b87987e3252f89d30b7cedbec12a01af9274af9ffa48108f2c13c6062')

View file

@ -18,9 +18,3 @@ class PyIminuit(PythonPackage):
# Required dependencies
depends_on('py-setuptools', type='build')
depends_on('py-numpy', type=('build', 'run'), when='@1.3:')
# Optional dependencies
depends_on('py-matplotlib', type='test', when='@1.3:')
depends_on('py-cython', type='test', when='@1.3:')
depends_on('py-pytest', type='test', when='@1.3:')
depends_on('py-scipy', type='test', when='@1.3:')

View file

@ -25,5 +25,3 @@ class PyImportlibMetadata(PythonPackage):
depends_on('py-pathlib2', when='^python@:2', type=('build', 'run'))
depends_on('py-contextlib2', when='^python@:2', type=('build', 'run'))
depends_on('py-configparser@3.5:', when='^python@:2', type=('build', 'run'))
depends_on('py-importlib-resources', when='^python@:3.6', type='test')
depends_on('py-packaging', type='test')

View file

@ -15,5 +15,4 @@ class PyIntervaltree(PythonPackage):
version('3.0.2', sha256='e8ab75b66077f2e5fb85ac56cb6df834689edb048d38601d53d8867cce3b77d1')
depends_on('py-sortedcontainers@2:2.999', type=('build', 'run'))
depends_on('py-pytest', type='test')
depends_on('py-setuptools', type='build')

View file

@ -36,10 +36,6 @@ class PyIpykernel(PythonPackage):
depends_on('py-tornado@4.0:', when='@:4.999', type=('build', 'run'))
depends_on('py-tornado@4.2:', when='@5.0.0:', type=('build', 'run'))
depends_on('py-appnope', when='platform=darwin', type=('build', 'run'))
depends_on('py-pytest@:5.3.3,5.3.5:', type='test')
depends_on('py-pytest-cov', type='test')
# depends_on('py-flaky', type='test')
depends_on('py-nose', type='test')
phases = ['build', 'install', 'install_data']

View file

@ -41,9 +41,3 @@ class PyIpython(PythonPackage):
depends_on('py-backports-shutil-get-terminal-size', type=('build', 'run'), when="^python@:3.2")
depends_on('py-pathlib2', type=('build', 'run'), when="^python@:3.3")
depends_on('py-simplegeneric@0.8:', type=('build', 'run'), when='@:7.0.0')
depends_on('py-nose@0.10.1:', type='test')
depends_on('py-requests', type='test')
depends_on('py-testpath', type='test')
depends_on('py-nbformat', type='test')
depends_on('py-ipykernel', type='test')
depends_on('py-numpy@1.14:', type='test')

View file

@ -30,5 +30,3 @@ class PyIpywidgets(PythonPackage):
when='@7.4.2')
depends_on('py-widgetsnbextension@3.5.0:3.5.999', type=('build', 'run'),
when='@7.5.1')
depends_on('py-mock', type='test', when='^python@2.7:2.8')
depends_on('py-nose', type='test')

View file

@ -16,8 +16,6 @@ class PyIsort(PythonPackage):
version('4.2.15', sha256='79f46172d3a4e2e53e7016e663cc7a8b538bec525c36675fcfd2767df30b3983')
depends_on('py-setuptools', type=('build', 'run'))
depends_on('py-pytest', type='test')
depends_on('py-mock', type='test')
depends_on('python@2.6:2.8,3.3:', type=('build', 'run'))
depends_on('python@2.7:2.8,3.4:', type=('build', 'run'), when='@4.3.0:')
depends_on('py-futures', type=('build', 'run'), when='@4.3.0: ^python@:3.1')

View file

@ -14,8 +14,6 @@ class PyJinja2(PythonPackage):
homepage = "https://palletsprojects.com/p/jinja/"
url = "https://pypi.io/packages/source/J/Jinja2/Jinja2-2.10.3.tar.gz"
import_modules = ['jinja2']
version('2.10.3', sha256='9fe95f19286cfefaa917656583d020be14e7859c6b0252588391e47db34527de')
version('2.10.1', sha256='065c4f02ebe7f7cf559e49ee5a95fb800a9e4528727aec6f24402a5374c65013')
version('2.10', sha256='f84be1bb0040caca4cea721fcbbbbd61f9be9464ca236387158b0feea01914a4')

View file

@ -12,9 +12,6 @@ class PyJmespath(PythonPackage):
homepage = "https://github.com/jmespath/jmespath.py"
url = "https://pypi.io/packages/source/j/jmespath/jmespath-0.9.4.tar.gz"
import_modules = ['jmespath']
version('0.9.4', sha256='bde2aef6f44302dfb30320115b17d030798de8c4110e28d5cf6cf91a7a31074c')
depends_on('py-setuptools', type='build')
depends_on('py-nose', type='test')

View file

@ -22,5 +22,3 @@ class PyJupyterlabServer(PythonPackage):
depends_on('py-jsonschema@3.0.1:', type=('build', 'run'))
depends_on('py-notebook@4.2.0:', type=('build', 'run'))
depends_on('py-jinja2@2.10:', type=('build', 'run'))
depends_on('py-pytest', type='test')

View file

@ -20,8 +20,3 @@ class PyJupyterlab(PythonPackage):
depends_on('py-tornado@:5,6.0.3:', type=('build', 'run'))
depends_on('py-jupyterlab-server@1.1.5:1.999', type=('build', 'run'))
depends_on('py-jinja2@2.10:', type=('build', 'run'))
depends_on('py-pytest', type='test')
depends_on('py-pytest-check-links', type='test')
depends_on('py-requests', type='test')
depends_on('py-wheel', type='test')
depends_on('py-virtualenv', type='test')

View file

@ -13,8 +13,6 @@ class PyKmodes(PythonPackage):
homepage = "https://github.com/nicodv/kmodes"
url = "https://pypi.io/packages/source/k/kmodes/kmodes-0.10.1.tar.gz"
import_modules = ['kmodes', 'kmodes.util']
version('0.10.1', sha256='3222c2f672a6356be353955c02d1e38472d9f6074744b4ffb0c058e8c2235ea1')
depends_on('python@3.4:', type=('build', 'run'))

Some files were not shown because too many files have changed in this diff Show more