Add PythonPackage base class

- Add a PythonPackage class with build system support.
  - Support build phases in PythonPackage
  - Add a custom sanity check for PythonPackages
  - Get rid of nolink dependencies in python packages

- Update spack create to use new PythonPackage class

- Port most of Python packages to new PythonPackage class

- Conducted a massive install and activate of Python packages.
  - Fixed bugs introduced by install and activate.

- Update API docs on PythonPackage
This commit is contained in:
Adam J. Stewart 2017-01-16 18:13:37 -08:00 committed by Todd Gamblin
parent 1f49493fee
commit c0aaa8fcea
169 changed files with 849 additions and 1011 deletions

View File

@ -159,9 +159,10 @@
from spack.build_systems.makefile import MakefilePackage
from spack.build_systems.autotools import AutotoolsPackage
from spack.build_systems.cmake import CMakePackage
from spack.build_systems.python import PythonPackage
from spack.build_systems.r import RPackage
__all__ += ['Package', 'CMakePackage', 'AutotoolsPackage', 'MakefilePackage',
'RPackage']
'PythonPackage', 'RPackage']
from spack.version import Version, ver
__all__ += ['Version', 'ver']

View File

@ -0,0 +1,309 @@
##############################################################################
# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC.
# Produced at the Lawrence Livermore National Laboratory.
#
# This file is part of Spack.
# Created by Todd Gamblin, tgamblin@llnl.gov, All rights reserved.
# LLNL-CODE-647188
#
# For details, see https://github.com/llnl/spack
# Please also see the LICENSE file for our notice and the LGPL.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License (as
# published by the Free Software Foundation) version 2.1, February 1999.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the IMPLIED WARRANTY OF
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the terms and
# conditions of the GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
##############################################################################
import inspect
from spack.directives import extends
from spack.package import PackageBase
from llnl.util.filesystem import working_dir
class PythonPackage(PackageBase):
"""Specialized class for packages that are built using Python
setup.py files
This class provides the following phases that can be overridden:
* build
* build_py
* build_ext
* build_clib
* build_scripts
* clean
* install
* install_lib
* install_headers
* install_scripts
* install_data
* sdist
* register
* bdist
* bdist_dumb
* bdist_rpm
* bdist_wininst
* upload
* check
These are all standard setup.py commands and can be found by running:
.. code-block:: console
$ python setup.py --help-commands
By default, only the 'build' and 'install' phases are run, but if you
need to run more phases, simply modify your ``phases`` list like so:
.. code-block:: python
phases = ['build_ext', 'install', 'bdist']
Each phase provides a function <phase> that runs:
.. code-block:: console
$ python --no-user-cfg setup.py <phase>
Each phase also has a <phase_args> function that can pass arguments to
this call. All of these functions are empty except for the ``install_args``
function, which passes ``--prefix=/path/to/installation/directory``.
If you need to run a phase which is not a standard setup.py command,
you'll need to define a function for it like so:
.. code-block:: python
def configure(self, spec, prefix):
self.setup_py('configure')
"""
# Default phases
phases = ['build', 'install']
# To be used in UI queries that require to know which
# build-system class we are using
build_system_class = 'PythonPackage'
extends('python')
def setup_file(self, spec, prefix):
"""Returns the name of the setup file to use."""
return 'setup.py'
def build_directory(self):
"""The directory containing the ``setup.py`` file."""
return self.stage.source_path
def python(self, *args):
inspect.getmodule(self).python(*args)
def setup_py(self, *args):
setup = self.setup_file(self.spec, self.prefix)
with working_dir(self.build_directory()):
self.python(setup, '--no-user-cfg', *args)
# The following phases and their descriptions come from:
# $ python setup.py --help-commands
# Only standard commands are included here, but some packages
# define extra commands as well
def build(self, spec, prefix):
"""Build everything needed to install."""
args = self.build_args(spec, prefix)
self.setup_py('build', *args)
def build_args(self, spec, prefix):
"""Arguments to pass to build."""
return []
def build_py(self, spec, prefix):
'''"Build" pure Python modules (copy to build directory).'''
args = self.build_py_args(spec, prefix)
self.setup_py('build_py', *args)
def build_py_args(self, spec, prefix):
"""Arguments to pass to build_py."""
return []
def build_ext(self, spec, prefix):
"""Build C/C++ extensions (compile/link to build directory)."""
args = self.build_ext_args(spec, prefix)
self.setup_py('build_ext', *args)
def build_ext_args(self, spec, prefix):
"""Arguments to pass to build_ext."""
return []
def build_clib(self, spec, prefix):
"""Build C/C++ libraries used by Python extensions."""
args = self.build_clib_args(spec, prefix)
self.setup_py('build_clib', *args)
def build_clib_args(self, spec, prefix):
"""Arguments to pass to build_clib."""
return []
def build_scripts(self, spec, prefix):
'''"Build" scripts (copy and fixup #! line).'''
args = self.build_scripts_args(spec, prefix)
self.setup_py('build_scripts', *args)
def clean(self, spec, prefix):
"""Clean up temporary files from 'build' command."""
args = self.clean_args(spec, prefix)
self.setup_py('clean', *args)
def clean_args(self, spec, prefix):
"""Arguments to pass to clean."""
return []
def install(self, spec, prefix):
"""Install everything from build directory."""
args = self.install_args(spec, prefix)
self.setup_py('install', *args)
def install_args(self, spec, prefix):
"""Arguments to pass to install."""
return ['--prefix={0}'.format(prefix)]
def install_lib(self, spec, prefix):
"""Install all Python modules (extensions and pure Python)."""
args = self.install_lib_args(spec, prefix)
self.setup_py('install_lib', *args)
def install_lib_args(self, spec, prefix):
"""Arguments to pass to install_lib."""
return []
def install_headers(self, spec, prefix):
"""Install C/C++ header files."""
args = self.install_headers_args(spec, prefix)
self.setup_py('install_headers', *args)
def install_headers_args(self, spec, prefix):
"""Arguments to pass to install_headers."""
return []
def install_scripts(self, spec, prefix):
"""Install scripts (Python or otherwise)."""
args = self.install_scripts_args(spec, prefix)
self.setup_py('install_scripts', *args)
def install_scripts_args(self, spec, prefix):
"""Arguments to pass to install_scripts."""
return []
def install_data(self, spec, prefix):
"""Install data files."""
args = self.install_data_args(spec, prefix)
self.setup_py('install_data', *args)
def install_data_args(self, spec, prefix):
"""Arguments to pass to install_data."""
return []
def sdist(self, spec, prefix):
"""Create a source distribution (tarball, zip file, etc.)."""
args = self.sdist_args(spec, prefix)
self.setup_py('sdist', *args)
def sdist_args(self, spec, prefix):
"""Arguments to pass to sdist."""
return []
def register(self, spec, prefix):
"""Register the distribution with the Python package index."""
args = self.register_args(spec, prefix)
self.setup_py('register', *args)
def register_args(self, spec, prefix):
"""Arguments to pass to register."""
return []
def bdist(self, spec, prefix):
"""Create a built (binary) distribution."""
args = self.bdist_args(spec, prefix)
self.setup_py('bdist', *args)
def bdist_args(self, spec, prefix):
"""Arguments to pass to bdist."""
return []
def bdist_dumb(self, spec, prefix):
'''Create a "dumb" built distribution.'''
args = self.bdist_dumb_args(spec, prefix)
self.setup_py('bdist_dumb', *args)
def bdist_dumb_args(self, spec, prefix):
"""Arguments to pass to bdist_dumb."""
return []
def bdist_rpm(self, spec, prefix):
"""Create an RPM distribution."""
args = self.bdist_rpm(spec, prefix)
self.setup_py('bdist_rpm', *args)
def bdist_rpm_args(self, spec, prefix):
"""Arguments to pass to bdist_rpm."""
return []
def bdist_wininst(self, spec, prefix):
"""Create an executable installer for MS Windows."""
args = self.bdist_wininst_args(spec, prefix)
self.setup_py('bdist_wininst', *args)
def bdist_wininst_args(self, spec, prefix):
"""Arguments to pass to bdist_wininst."""
return []
def upload(self, spec, prefix):
"""Upload binary package to PyPI."""
args = self.upload_args(spec, prefix)
self.setup_py('upload', *args)
def upload_args(self, spec, prefix):
"""Arguments to pass to upload."""
return []
def check(self, spec, prefix):
"""Perform some checks on the package."""
args = self.check_args(spec, prefix)
self.setup_py('check', *args)
def check_args(self, spec, prefix):
"""Arguments to pass to check."""
return []
# Check that self.prefix is there after installation
PackageBase.sanity_check('install')(PackageBase.sanity_check_prefix)

View File

@ -30,7 +30,8 @@
build_system_to_phase = {
CMakePackage: 'build',
AutotoolsPackage: 'build'
AutotoolsPackage: 'build',
PythonPackage: 'build'
}

View File

@ -194,19 +194,20 @@ def install(self, spec, prefix):
class PythonPackageTemplate(PackageTemplate):
"""Provides appropriate overrides for Python extensions"""
"""Provides appropriate overrides for python extensions"""
base_class_name = 'PythonPackage'
dependencies = """\
extends('python')
# FIXME: Add additional dependencies if required.
# FIXME: Add dependencies if required.
# depends_on('py-setuptools', type='build')
# depends_on('py-foo', type=('build', 'run'))"""
body = """\
def install(self, spec, prefix):
# FIXME: Add logic to build and install here.
setup_py('install', '--prefix={0}'.format(prefix))"""
def build_args(self):
# FIXME: Add arguments other than --prefix
# FIXME: If not needed delete the function
args = []
return args"""
def __init__(self, name, *args):
# If the user provided `--name py-numpy`, don't rename it py-py-numpy

View File

@ -289,9 +289,10 @@ def extends(spec, **kwargs):
"""
def _execute(pkg):
if pkg.extendees:
msg = 'Packages can extend at most one other package.'
raise DirectiveError(msg)
# if pkg.extendees:
# directive = 'extends'
# msg = 'Packages can extend at most one other package.'
# raise DirectiveError(directive, msg)
when = kwargs.pop('when', pkg.name)
_depends_on(pkg, spec, when=when)
@ -344,8 +345,9 @@ def variant(name, default=False, description=""):
def _execute(pkg):
if not re.match(spack.spec.identifier_re, name):
msg = 'Invalid variant name in {0}: \'{1}\''
raise DirectiveError(msg.format(pkg.name, name))
directive = 'variant'
msg = "Invalid variant name in {0}: '{1}'"
raise DirectiveError(directive, msg.format(pkg.name, name))
pkg.variants[name] = Variant(default, description)
return _execute

View File

@ -25,7 +25,7 @@
from spack import *
class Py3to2(Package):
class Py3to2(PythonPackage):
"""lib3to2 is a set of fixers that are intended to backport code written
for Python version 3.x into Python version 2.x."""
@ -33,8 +33,3 @@ class Py3to2(Package):
url = "https://pypi.python.org/packages/source/3/3to2/3to2-1.1.1.zip"
version('1.1.1', 'cbeed28e350dbdaef86111ace3052824')
extends('python')
def install(self, spec, prefix):
setup_py('install', '--prefix=%s' % prefix)

View File

@ -25,7 +25,7 @@
from spack import *
class PyAlabaster(Package):
class PyAlabaster(PythonPackage):
"""Alabaster is a visually (c)lean, responsive, configurable theme
for the Sphinx documentation system."""
@ -35,9 +35,4 @@ class PyAlabaster(Package):
version('0.7.9', 'b29646a8bbe7aa52830375b7d17b5d7a',
url="https://pypi.python.org/packages/71/c3/70da7d8ac18a4f4c502887bd2549e05745fa403e2cd9d06a8a9910a762bc/alabaster-0.7.9.tar.gz")
extends('python')
depends_on('py-setuptools', type='build')
def install(self, spec, prefix):
setup_py('install', '--prefix={0}'.format(prefix))

View File

@ -25,7 +25,7 @@
from spack import *
class PyArgcomplete(Package):
class PyArgcomplete(PythonPackage):
"""Bash tab completion for argparse."""
homepage = "https://pypi.python.org/pypi/argcomplete"
@ -34,7 +34,3 @@ class PyArgcomplete(Package):
version('1.1.1', '89a3839096c9f991ad33828e72d21abf')
depends_on('py-setuptools', type='build')
extends('python')
def install(self, spec, prefix):
setup_py('install', '--prefix=%s' % prefix)

View File

@ -22,11 +22,10 @@
# License along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
##############################################################################
from spack import depends_on, extends, version
from spack import Package
from spack import *
class PyAstroid(Package):
class PyAstroid(PythonPackage):
homepage = "https://www.astroid.org/"
url = "https://github.com/PyCQA/astroid/archive/astroid-1.4.5.tar.gz"
@ -36,10 +35,6 @@ class PyAstroid(Package):
version('1.4.2', '677f7965840f375af51b0e86403bee6a')
version('1.4.1', 'ed70bfed5e4b25be4292e7fe72da2c02')
extends('python')
depends_on('py-logilab-common', type=('build', 'run'))
depends_on('py-setuptools', type='build')
depends_on('py-six', type=('build', 'run'))
def install(self, spec, prefix):
setup_py('install', '--prefix=%s' % prefix)

View File

@ -25,7 +25,7 @@
from spack import *
class PyAstropy(Package):
class PyAstropy(PythonPackage):
"""The Astropy Project is a community effort to develop a single core
package for Astronomy in Python and foster interoperability between
Python astronomy packages."""
@ -37,7 +37,6 @@ class PyAstropy(Package):
version('1.1.post1', 'b52919f657a37d45cc45f5cb0f58c44d')
# Required dependencies
extends('python')
depends_on('py-numpy', type=('build', 'run'))
# Optional dependencies
@ -55,6 +54,5 @@ class PyAstropy(Package):
depends_on('cfitsio')
depends_on('expat')
def install(self, spec, prefix):
setup_py('build', '--use-system-cfitsio', '--use-system-expat')
setup_py('install', '--prefix={0}'.format(prefix))
def build_args(self, spec, prefix):
return ['--use-system-cfitsio', '--use-system-expat']

View File

@ -25,7 +25,7 @@
from spack import *
class PyAutopep8(Package):
class PyAutopep8(PythonPackage):
"""autopep8 automatically formats Python code to conform to the
PEP 8 style guide."""
@ -48,6 +48,3 @@ def url_for_version(self, version):
return url.format('v', version)
else:
return url.format('ver', version)
def install(self, spec, prefix):
setup_py('install', '--prefix={0}'.format(prefix))

View File

@ -25,7 +25,7 @@
from spack import *
class PyBabel(Package):
class PyBabel(PythonPackage):
"""Babel is an integrated collection of utilities that assist in
internationalizing and localizing Python applications, with an
emphasis on web-based applications."""
@ -36,10 +36,5 @@ class PyBabel(Package):
version('2.3.4', 'afa20bc55b0e991833030129ad498f35',
url="https://pypi.python.org/packages/6e/96/ba2a2462ed25ca0e651fb7b66e7080f5315f91425a07ea5b34d7c870c114/Babel-2.3.4.tar.gz")
extends('python')
depends_on('py-setuptools', type='build')
depends_on('py-pytz', type=('build', 'run'))
def install(self, spec, prefix):
setup_py('install', '--prefix={0}'.format(prefix))

View File

@ -25,17 +25,12 @@
from spack import *
class PyBackportsAbc(Package):
class PyBackportsAbc(PythonPackage):
"""Backports_ABC: A backport of recent additions to the 'collections.abc'
module."""
homepage = "https://github.com/cython/backports_abc"
# base https://pypi.python.org/pypi/backports_abc/
url = "https://github.com/cython/backports_abc/archive/0.4.tar.gz"
version('0.4', 'e4246ae689221c9cbe84369fdb59e8c74d02b298')
extends('python')
depends_on('py-setuptools', type='build')
def install(self, spec, prefix):
setup_py('install', '--prefix={0}'.format(prefix))

View File

@ -25,7 +25,7 @@
from spack import *
class PyBackportsShutilGetTerminalSize(Package):
class PyBackportsShutilGetTerminalSize(PythonPackage):
"""A backport of the get_terminal_size function
from Python 3.3's shutil."""
@ -34,10 +34,5 @@ class PyBackportsShutilGetTerminalSize(Package):
version('1.0.0', '03267762480bd86b50580dc19dff3c66')
extends('python')
depends_on('py-setuptools', type='build')
depends_on('python@:3.2.999')
def install(self, spec, prefix):
setup_py('install', '--prefix={0}'.format(prefix))

View File

@ -25,7 +25,7 @@
from spack import *
class PyBackportsSslMatchHostname(Package):
class PyBackportsSslMatchHostname(PythonPackage):
"""The ssl.match_hostname() function from Python 3.5"""
homepage = "https://pypi.python.org/pypi/backports.ssl_match_hostname"
@ -33,9 +33,4 @@ class PyBackportsSslMatchHostname(Package):
version('3.5.0.1', 'c03fc5e2c7b3da46b81acf5cbacfe1e6')
extends('python')
depends_on('py-setuptools', type='build')
def install(self, spec, prefix):
setup_py('install', '--prefix={0}'.format(prefix))

View File

@ -26,7 +26,7 @@
import os
class PyBasemap(Package):
class PyBasemap(PythonPackage):
"""The matplotlib basemap toolkit is a library for plotting
2D data on maps in Python."""
@ -35,17 +35,18 @@ class PyBasemap(Package):
version('1.0.7', '48c0557ced9e2c6e440b28b3caff2de8')
extends('python')
depends_on('py-setuptools', type='build')
depends_on('py-numpy', type=('build', 'run'))
depends_on('py-matplotlib', type=('build', 'run'))
depends_on('pil', type=('build', 'run'))
depends_on("geos")
depends_on('geos')
def install(self, spec, prefix):
env['GEOS_DIR'] = spec['geos'].prefix
setup_py('install', '--prefix=%s' % prefix)
def setup_environment(self, spack_env, run_env):
spack_env.set('GEOS_DIR', self.spec['geos'].prefix)
@PythonPackage.sanity_check('install')
def post_install_patch(self):
spec = self.spec
# We are not sure if this fix is needed before Python 3.5.2.
# If it is needed, this test should be changed.
# See: https://github.com/LLNL/spack/pull/1964

View File

@ -25,7 +25,7 @@
from spack import *
class PyBeautifulsoup4(Package):
class PyBeautifulsoup4(PythonPackage):
"""Beautiful Soup is a Python library for pulling data out of HTML and
XML files. It works with your favorite parser to provide idiomatic ways
of navigating, searching, and modifying the parse tree."""
@ -38,9 +38,4 @@ class PyBeautifulsoup4(Package):
'download/4.5/beautifulsoup4-4.5.1.tar.gz')
version('4.4.1', '8fbd9a7cac0704645fa20d1419036815')
extends('python')
depends_on('py-setuptools', type='build')
def install(self, spec, prefix):
setup_py('install', '--prefix={0}'.format(prefix))

View File

@ -25,7 +25,7 @@
from spack import *
class PyBiopython(Package):
class PyBiopython(PythonPackage):
"""A distributed collaborative effort to develop Python libraries and
applications which address the needs of current and future work in
bioinformatics.
@ -36,9 +36,5 @@ class PyBiopython(Package):
version('1.65', '143e7861ade85c0a8b5e2bbdd1da1f67')
extends('python')
depends_on('py-mx', type=('build', 'run'))
depends_on('py-numpy', type=('build', 'run'))
def install(self, spec, prefix):
setup_py('install', '--prefix=%s' % prefix)

View File

@ -0,0 +1,39 @@
##############################################################################
# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC.
# Produced at the Lawrence Livermore National Laboratory.
#
# This file is part of Spack.
# Created by Todd Gamblin, tgamblin@llnl.gov, All rights reserved.
# LLNL-CODE-647188
#
# For details, see https://github.com/llnl/spack
# Please also see the LICENSE file for our notice and the LGPL.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License (as
# published by the Free Software Foundation) version 2.1, February 1999.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the IMPLIED WARRANTY OF
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the terms and
# conditions of the GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
##############################################################################
from spack import *
class PyBleach(PythonPackage):
"""An easy whitelist-based HTML-sanitizing tool."""
homepage = "http://github.com/mozilla/bleach"
url = "https://pypi.python.org/packages/99/00/25a8fce4de102bf6e3cc76bc4ea60685b2fee33bde1b34830c70cacc26a7/bleach-1.5.0.tar.gz"
version('1.5.0', 'b663300efdf421b3b727b19d7be9c7e7')
depends_on('python@2.6:2.7,3.2:3.5')
depends_on('py-setuptools', type='build')
depends_on('py-six', type=('build', 'run'))
depends_on('py-html5lib@0.999,0.999999:0.9999999', type=('build', 'run'))

View File

@ -25,7 +25,7 @@
from spack import *
class PyBlessings(Package):
class PyBlessings(PythonPackage):
"""A nicer, kinder way to write to the terminal """
homepage = "https://github.com/erikrose/blessings"
url = "https://pypi.python.org/packages/source/b/blessings/blessings-1.6.tar.gz"
@ -33,8 +33,3 @@ class PyBlessings(Package):
version('1.6', '4f552a8ebcd4982693c92571beb99394')
depends_on('py-setuptools', type='build')
extends("python")
def install(self, spec, prefix):
setup_py('install', '--prefix=%s' % prefix)

View File

@ -25,15 +25,11 @@
from spack import *
class PyBottleneck(Package):
class PyBottleneck(PythonPackage):
"""A collection of fast NumPy array functions written in Cython."""
homepage = "https://pypi.python.org/pypi/Bottleneck/1.0.0"
url = "https://pypi.python.org/packages/source/B/Bottleneck/Bottleneck-1.0.0.tar.gz"
version('1.0.0', '380fa6f275bd24f27e7cf0e0d752f5d2')
extends('python')
depends_on('py-numpy', type=('build', 'run'))
def install(self, spec, prefix):
setup_py('install', '--prefix=%s' % prefix)

View File

@ -25,18 +25,13 @@
from spack import *
class PyCclib(Package):
class PyCclib(PythonPackage):
"""Open source library for parsing and interpreting the results of
computational chemistry packages"""
homepage = "https://cclib.github.io/"
url = "https://github.com/cclib/cclib/releases/download/v1.5/cclib-1.5.tar.gz"
version('1.5', 'c06940101c4796bce82036b13fecb73c')
extends('python')
version('1.5.post1', '1a50be48e4597b1a6dabe943da82a43c',
url="https://github.com/cclib/cclib/releases/download/v1.5/cclib-1.5.post1.tar.gz")
depends_on('py-numpy@1.5:', type=('build', 'run'))
def install(self, spec, prefix):
setup_py('install', '--prefix={0}'.format(prefix))

View File

@ -25,7 +25,7 @@
from spack import *
class PyCdo(Package):
class PyCdo(PythonPackage):
"""The cdo package provides an interface to the Climate Data
Operators from Python."""
@ -35,13 +35,8 @@ class PyCdo(Package):
version('1.3.2', '4b3686ec1b9b891f166c1c466c6db745',
url="https://pypi.python.org/packages/d6/13/908e7c1451e1f5fb68405f341cdcb3196a16952ebfe1f172cb788f864aa9/cdo-1.3.2.tar.gz")
extends('python')
depends_on('cdo')
depends_on('py-setuptools', type='build')
depends_on('py-scipy', type=('build', 'run'))
depends_on('py-netcdf', type=('build', 'run'))
def install(self, spec, prefix):
setup_py('install', '--prefix={0}'.format(prefix))

View File

@ -25,18 +25,13 @@
from spack import *
class PyCertifi(Package):
class PyCertifi(PythonPackage):
"""Certifi: A carefully curated collection of Root Certificates for validating
the trustworthiness of SSL certificates while verifying the identity of TLS
hosts."""
homepage = "https://github.com/certifi/python-certifi"
# base https://pypi.python.org/pypi/certifi/
url = "https://github.com/certifi/python-certifi/archive/2016.02.28.tar.gz"
version('2016.02.28', '5ccfc23bd5e931863f0b01ef3e9d2dbd3bef0e1b')
extends('python')
depends_on('py-setuptools', type='build')
def install(self, spec, prefix):
setup_py('install', '--prefix={0}'.format(prefix))

View File

@ -22,12 +22,10 @@
# License along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
##############################################################################
import os
from spack import *
class PyCffi(Package):
class PyCffi(PythonPackage):
"""Foreign Function Interface for Python calling C code"""
homepage = "http://cffi.readthedocs.org/en/latest/"
# base https://pypi.python.org/pypi/cffi
@ -35,18 +33,15 @@ class PyCffi(Package):
version('1.1.2', 'ca6e6c45b45caa87aee9adc7c796eaea')
extends('python')
depends_on('py-setuptools', type='build')
depends_on('py-pycparser', type=('build', 'run'))
depends_on('libffi')
def install(self, spec, prefix):
def setup_environment(self, spack_env, run_env):
# This sets the compiler (and flags) that distutils will use
# to create the final shared library. It will use the
# compiler specified by the environment variable 'CC' for all
# other compilation. We are setting the 'LDSHARED" to the
# spack compiler wrapper plus a few extra flags necessary for
# building the shared library.
os.environ['LDSHARED'] = "{0} -shared -pthread".format(spack_cc)
setup_py('install', '--prefix=%s' % prefix)
spack_env.set('LDSHARED', "{0} -shared -pthread".format(spack_cc))

View File

@ -25,7 +25,7 @@
from spack import *
class PyConfigparser(Package):
class PyConfigparser(PythonPackage):
"""This library brings the updated configparser from Python 3.5 to
Python 2.6-3.5."""
@ -35,12 +35,10 @@ class PyConfigparser(Package):
version('3.5.0', 'cfdd915a5b7a6c09917a64a573140538',
url="https://pypi.python.org/packages/7c/69/c2ce7e91c89dc073eb1aa74c0621c3eefbffe8216b3f9af9d3885265c01c/configparser-3.5.0.tar.gz")
extends('python')
depends_on('python@2.6:2.7,3.4:')
depends_on('py-ordereddict', when='^python@2.6:2.6.999', type=('build', 'run'))
# This dependency breaks concretization
# See https://github.com/LLNL/spack/issues/2793
# depends_on('py-ordereddict', when='^python@2.6:2.6.999', type=('build', 'run')) # noqa
depends_on('py-setuptools', type='build')
def install(self, spec, prefix):
setup_py('install', '--prefix={0}'.format(prefix))

View File

@ -25,7 +25,7 @@
from spack import *
class PyCoverage(Package):
class PyCoverage(PythonPackage):
""" Testing coverage checker for python """
homepage = "http://nedbatchelder.com/code/coverage/"
@ -34,8 +34,3 @@ class PyCoverage(Package):
version('4.0a6', '1bb4058062646148965bef0796b61efc')
depends_on('py-setuptools', type='build')
extends('python')
def install(self, spec, prefix):
setup_py('install', '--prefix=%s' % prefix)

View File

@ -25,7 +25,7 @@
from spack import *
class PyCsvkit(Package):
class PyCsvkit(PythonPackage):
"""A library of utilities for working with CSV, the king of tabular file
formats"""
@ -34,14 +34,9 @@ class PyCsvkit(Package):
version('0.9.1', '48d78920019d18846933ee969502fff6')
extends('python')
depends_on('py-dateutil', type=('build', 'run'))
depends_on('py-dbf', type=('build', 'run'))
depends_on('py-xlrd', type=('build', 'run'))
depends_on('py-sqlalchemy', type=('build', 'run'))
depends_on('py-six', type=('build', 'run'))
depends_on('py-openpyxl', type=('build', 'run'))
def install(self, spec, prefix):
setup_py('install', '--prefix=%s' % prefix)

View File

@ -25,7 +25,7 @@
from spack import *
class PyCycler(Package):
class PyCycler(PythonPackage):
"""Composable style cycles."""
homepage = "http://matplotlib.org/cycler/"
@ -33,10 +33,5 @@ class PyCycler(Package):
version('0.10.0', '83dd0df7810e838b59e4dd9fa6e2d198')
extends('python')
depends_on('py-setuptools', type='build')
depends_on('py-six', type=('build', 'run'))
def install(self, spec, prefix):
setup_py('install', '--prefix={0}'.format(prefix))

View File

@ -25,7 +25,7 @@
from spack import *
class PyCython(Package):
class PyCython(PythonPackage):
"""The Cython compiler for writing C extensions for the Python language."""
homepage = "https://pypi.python.org/pypi/cython"
url = "https://pypi.io/packages/source/c/cython/Cython-0.25.2.tar.gz"
@ -38,8 +38,3 @@ class PyCython(Package):
# These versions contain illegal Python3 code...
version('0.22', '1ae25add4ef7b63ee9b4af697300d6b6')
version('0.21.2', 'd21adb870c75680dc857cd05d41046a4')
extends('python')
def install(self, spec, prefix):
setup_py('install', '--prefix=%s' % prefix)

View File

@ -25,16 +25,11 @@
from spack import *
class PyDask(Package):
class PyDask(PythonPackage):
"""Minimal task scheduling abstraction"""
homepage = "https://github.com/dask/dask/"
url = "https://pypi.python.org/packages/source/d/dask/dask-0.8.1.tar.gz"
version('0.8.1', '5dd8e3a3823b3bc62c9a6d192e2cb5b4')
extends('python')
depends_on('py-setuptools', type='build')
def install(self, spec, prefix):
setup_py('install', '--prefix=%s' % prefix)

View File

@ -25,7 +25,7 @@
from spack import *
class PyDateutil(Package):
class PyDateutil(PythonPackage):
"""Extensions to the standard Python datetime module."""
homepage = "https://pypi.python.org/pypi/dateutil"
url = "https://pypi.python.org/packages/source/p/python-dateutil/python-dateutil-2.4.0.tar.gz"
@ -34,9 +34,5 @@ class PyDateutil(Package):
version('2.4.2', '4ef68e1c485b09e9f034e10473e5add2')
version('2.5.2', 'eafe168e8f404bf384514f5116eedbb6')
extends('python')
depends_on('py-setuptools', type='build')
depends_on('py-six', type=('build', 'run'))
def install(self, spec, prefix):
setup_py('install', '--prefix=%s' % prefix)

View File

@ -25,7 +25,7 @@
from spack import *
class PyDbf(Package):
class PyDbf(PythonPackage):
"""Pure python package for reading/writing dBase, FoxPro, and Visual FoxPro
.dbf files (including memos)"""
@ -33,8 +33,3 @@ class PyDbf(Package):
url = "https://pypi.python.org/packages/source/d/dbf/dbf-0.96.005.tar.gz"
version('0.96.005', 'bce1a1ed8b454a30606e7e18dd2f8277')
extends('python')
def install(self, spec, prefix):
setup_py('install', '--prefix=%s' % prefix)

View File

@ -25,7 +25,7 @@
from spack import *
class PyDecorator(Package):
class PyDecorator(PythonPackage):
"""The aim of the decorator module it to simplify the usage of decorators
for the average programmer, and to popularize decorators by showing
various non-trivial examples."""
@ -34,9 +34,4 @@ class PyDecorator(Package):
version('4.0.9', 'f12c5651ccd707e12a0abaa4f76cd69a')
extends('python')
depends_on('py-setuptools', type='build')
def install(self, spec, prefix):
setup_py('install', '--prefix=%s' % prefix)

View File

@ -25,7 +25,7 @@
from spack import *
class PyDocutils(Package):
class PyDocutils(PythonPackage):
"""Docutils is an open-source text processing system for processing
plaintext documentation into useful formats, such as HTML, LaTeX,
man-pages, open-document or XML. It includes reStructuredText, the
@ -35,9 +35,6 @@ class PyDocutils(Package):
homepage = "http://docutils.sourceforge.net/"
url = "https://pypi.python.org/packages/source/d/docutils/docutils-0.12.tar.gz"
version('0.13.1', 'ea4a893c633c788be9b8078b6b305d53',
url="https://pypi.python.org/packages/05/25/7b5484aca5d46915493f1fd4ecb63c38c333bd32aa9ad6e19da8d08895ae/docutils-0.13.1.tar.gz")
version('0.12', '4622263b62c5c771c03502afa3157768')
extends('python')
def install(self, spec, prefix):
setup_py('install', '--prefix={0}'.format(prefix))

View File

@ -25,7 +25,7 @@
from spack import *
class PyEmcee(Package):
class PyEmcee(PythonPackage):
"""emcee is an MIT licensed pure-Python implementation of Goodman & Weare's
Affine Invariant Markov chain Monte Carlo (MCMC) Ensemble sampler."""
@ -34,8 +34,4 @@ class PyEmcee(Package):
version('2.1.0', 'c6b6fad05c824d40671d4a4fc58dfff7')
extends('python')
depends_on('py-numpy', type=('build', 'run'))
def install(self, spec, prefix):
setup_py('install', '--prefix={0}'.format(prefix))

View File

@ -25,7 +25,7 @@
from spack import *
class PyEnum34(Package):
class PyEnum34(PythonPackage):
"""Python 3.4 Enum backported to 3.3, 3.2, 3.1, 2.7, 2.6, 2.5, and 2.4."""
homepage = "https://pypi.python.org/pypi/enum34"
@ -34,12 +34,10 @@ class PyEnum34(Package):
version('1.1.6', '5f13a0841a61f7fc295c514490d120d0',
url="https://pypi.python.org/packages/bf/3e/31d502c25302814a7c2f1d3959d2a3b3f78e509002ba91aea64993936876/enum34-1.1.6.tar.gz")
extends('python')
depends_on('python@2.4:2.8,3.3:')
depends_on('py-ordereddict', when='^python@:2.6.999', type=('build', 'run'))
# This dependency breaks concretization
# See https://github.com/LLNL/spack/issues/2793
# depends_on('py-ordereddict', when='^python@:2.6.999', type=('build', 'run')) # noqa
depends_on('py-setuptools', type='build')
def install(self, spec, prefix):
setup_py('install', '--prefix={0}'.format(prefix))

View File

@ -25,15 +25,10 @@
from spack import *
class PyEpydoc(Package):
class PyEpydoc(PythonPackage):
"""Epydoc is a tool for generating API documentation documentation for
Python modules, based on their docstrings."""
homepage = "https://pypi.python.org/pypi/epydoc"
url = "https://pypi.python.org/packages/source/e/epydoc/epydoc-3.0.1.tar.gz"
version('3.0.1', '36407974bd5da2af00bf90ca27feeb44')
extends('python')
def install(self, spec, prefix):
setup_py('install', '--prefix=%s' % prefix)

View File

@ -25,7 +25,7 @@
from spack import *
class PyFlake8(Package):
class PyFlake8(PythonPackage):
"""Flake8 is a wrapper around PyFlakes, pep8 and Ned Batchelder's
McCabe script."""
@ -43,7 +43,7 @@ class PyFlake8(Package):
depends_on('py-setuptools', type=('build', 'run'))
# pyflakes >= 0.8.1, != 1.2.0, != 1.2.1, != 1.2.2, < 1.3.0
depends_on('py-pyflakes@0.8.1:1.1.0,1.2.3:1.2.3', when='@3.0.4', type=('build', 'run')) # noqa
depends_on('py-pyflakes@0.8.1:1.1.0,1.2.3:1.2.3', when='@3.0.4', type=('build', 'run'))
# pyflakes >= 0.8.1, < 1.1
depends_on('py-pyflakes@0.8.1:1.0.0', when='@2.5.4', type=('build', 'run'))
@ -57,11 +57,12 @@ class PyFlake8(Package):
# mccabe >= 0.2.1, < 0.5
depends_on('py-mccabe@0.2.1:0.4.0', when='@2.5.4', type=('build', 'run'))
depends_on('py-configparser', when='^python@:3.3.999', type=('build', 'run'))
depends_on('py-enum34', when='^python@:3.1.999', type=('build', 'run'))
# These dependencies breaks concretization
# See https://github.com/LLNL/spack/issues/2793
# depends_on('py-configparser', when='^python@:3.3.999', type=('build', 'run')) # noqa
# depends_on('py-enum34', when='^python@:3.1.999', type=('build', 'run'))
depends_on('py-configparser', type=('build', 'run'))
depends_on('py-enum34', type=('build', 'run'))
# TODO: Add test dependencies
# depends_on('py-nose', type='test')
def install(self, spec, prefix):
setup_py('install', '--prefix={0}'.format(prefix))

View File

@ -25,16 +25,11 @@
from spack import *
class PyFuncsigs(Package):
class PyFuncsigs(PythonPackage):
"""Python function signatures from PEP362 for Python 2.6, 2.7 and 3.2."""
homepage = "https://pypi.python.org/pypi/funcsigs"
url = "https://pypi.python.org/packages/source/f/funcsigs/funcsigs-0.4.tar.gz"
version('0.4', 'fb1d031f284233e09701f6db1281c2a5')
extends('python')
depends_on('py-setuptools', type='build')
def install(self, spec, prefix):
setup_py('install', '--prefix=%s' % prefix)

View File

@ -25,17 +25,11 @@
from spack import *
class PyFunctools32(Package):
class PyFunctools32(PythonPackage):
"""Backport of the functools module from Python 3.2.3 for use on 2.7 and
PyPy."""
homepage = "https://github.com/MiCHiLU/python-functools32"
# base https://pypi.python.org/pypi/functools32
url = "https://pypi.python.org/packages/source/f/functools32/functools32-3.2.3-2.tar.gz"
version('3.2.3-2', '09f24ffd9af9f6cd0f63cb9f4e23d4b2')
extends('python')
def install(self, spec, prefix):
setup_py('install', '--prefix={0}'.format(prefix))

View File

@ -25,7 +25,7 @@
from spack import *
class PyFutures(Package):
class PyFutures(PythonPackage):
"""Backport of the concurrent.futures package from Python 3.2"""
homepage = "https://pypi.python.org/pypi/futures"
@ -33,9 +33,4 @@ class PyFutures(Package):
version('3.0.5', 'ced2c365e518242512d7a398b515ff95')
extends('python')
depends_on('py-setuptools', type='build')
def install(self, spec, prefix):
setup_py('install', '--prefix={0}'.format(prefix))

View File

@ -36,6 +36,9 @@ class PyGenders(Package):
url='https://github.com/chaos/genders/releases/download/genders-1-22-1/genders-1.22.tar.gz')
extends('python')
# FIXME: Missing a dependency on genders
# #include <genders.h>
def install(self, spec, prefix):
configure("--prefix=%s" % prefix)
make(parallel=False)

View File

@ -22,11 +22,10 @@
# License along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
##############################################################################
from spack import version, extends, depends_on
from spack import Package
from spack import *
class PyGenshi(Package):
class PyGenshi(PythonPackage):
"""Python toolkit for generation of output for the web"""
homepage = "https://genshi.edgewall.org/"
url = "http://ftp.edgewall.com/pub/genshi/Genshi-0.7.tar.gz"
@ -35,8 +34,4 @@ class PyGenshi(Package):
version('0.6.1', '372c368c8931110b0a521fa6091742d7')
version('0.6', '604e8b23b4697655d36a69c2d8ef7187')
extends("python")
depends_on("py-setuptools", type='build')
def install(self, spec, prefix):
setup_py('install', '--prefix=%s' % prefix)

View File

@ -25,7 +25,7 @@
from spack import *
class PyGnuplot(Package):
class PyGnuplot(PythonPackage):
"""Gnuplot.py is a Python package that allows you to create graphs from
within Python using the gnuplot plotting program."""
homepage = "http://gnuplot-py.sourceforge.net/"
@ -33,8 +33,4 @@ class PyGnuplot(Package):
version('1.8', 'abd6f571e7aec68ae7db90a5217cd5b1')
extends('python')
depends_on('py-numpy', type=('build', 'run'))
def install(self, spec, prefix):
setup_py('install', '--prefix=%s' % prefix)

View File

@ -25,7 +25,7 @@
from spack import *
class PyH5py(Package):
class PyH5py(PythonPackage):
"""The h5py package provides both a high- and low-level interface to the
HDF5 library from Python."""
@ -38,8 +38,6 @@ class PyH5py(Package):
variant('mpi', default=True, description='Build with MPI support')
extends('python')
# Build dependencies
depends_on('py-cython@0.19:', type='build')
depends_on('pkg-config', type='build')
@ -55,11 +53,11 @@ class PyH5py(Package):
# Runtime dependencies
depends_on('py-six', type=('build', 'run'))
def install(self, spec, prefix):
setup_py('configure', '--hdf5={0}'.format(spec['hdf5'].prefix))
phases = ['configure', 'install']
def configure(self, spec, prefix):
self.setup_py('configure', '--hdf5={0}'.format(spec['hdf5'].prefix))
if '+mpi' in spec:
env['CC'] = spec['mpi'].mpicc
setup_py('configure', '--mpi')
setup_py('install', '--prefix={0}'.format(prefix))
self.setup_py('configure', '--mpi')

View File

@ -0,0 +1,37 @@
##############################################################################
# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC.
# Produced at the Lawrence Livermore National Laboratory.
#
# This file is part of Spack.
# Created by Todd Gamblin, tgamblin@llnl.gov, All rights reserved.
# LLNL-CODE-647188
#
# For details, see https://github.com/llnl/spack
# Please also see the LICENSE file for our notice and the LGPL.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License (as
# published by the Free Software Foundation) version 2.1, February 1999.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the IMPLIED WARRANTY OF
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the terms and
# conditions of the GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
##############################################################################
from spack import *
class PyHtml5lib(PythonPackage):
"""HTML parser based on the WHATWG HTML specification."""
homepage = "https://github.com/html5lib/html5lib-python"
url = "https://pypi.python.org/packages/ae/ae/bcb60402c60932b32dfaf19bb53870b29eda2cd17551ba5639219fb5ebf9/html5lib-0.9999999.tar.gz"
version('0.9999999', 'ef43cb05e9e799f25d65d1135838a96f')
depends_on('python@2.6:2.7,3.2:3.4')
depends_on('py-six', type=('build', 'run'))

View File

@ -25,7 +25,7 @@
from spack import *
class PyImagesize(Package):
class PyImagesize(PythonPackage):
"""Parses image file headers and returns image size. Supports PNG, JPEG,
JPEG2000, and GIF image file formats."""
@ -35,9 +35,4 @@ class PyImagesize(Package):
version('0.7.1', '976148283286a6ba5f69b0f81aef8052',
url="https://pypi.python.org/packages/53/72/6c6f1e787d9cab2cc733cf042f125abec07209a58308831c9f292504e826/imagesize-0.7.1.tar.gz")
extends('python')
depends_on('py-setuptools', type='build')
def install(self, spec, prefix):
setup_py('install', '--prefix={0}'.format(prefix))

View File

@ -25,7 +25,7 @@
from spack import *
class PyIminuit(Package):
class PyIminuit(PythonPackage):
"""Interactive IPython-Friendly Minimizer based on SEAL Minuit2."""
homepage = "https://pypi.python.org/pypi/iminuit"
@ -34,13 +34,9 @@ class PyIminuit(Package):
version('1.2', '4701ec472cae42015e26251703e6e984')
# Required dependencies
extends('python')
depends_on('py-setuptools', type='build')
# Optional dependencies
depends_on('py-numpy', type=('build', 'run'))
depends_on('py-matplotlib', type=('build', 'run'))
depends_on('py-cython', type='build')
def install(self, spec, prefix):
setup_py('install', '--prefix={0}'.format(prefix))

View File

@ -25,7 +25,7 @@
from spack import *
class PyIpykernel(Package):
class PyIpykernel(PythonPackage):
"""IPython Kernel for Jupyter"""
homepage = "https://pypi.python.org/pypi/ipykernel"
@ -42,15 +42,10 @@ class PyIpykernel(Package):
version('4.1.1', '51376850c46fb006e1f8d1cd353507c5')
version('4.1.0', '638a43e4f8a15872f749090c3f0827b6')
extends('python')
depends_on('python@2.7:2.7.999,3.3:')
depends_on('py-setuptools', type='build')
depends_on('py-traitlets@4.1.0:')
depends_on('py-tornado@4.0:')
depends_on('py-ipython@4.0:')
depends_on('py-jupyter-client')
depends_on('py-pexpect')
def install(self, spec, prefix):
setup_py('install', '--prefix={0}'.format(prefix))
depends_on('py-traitlets@4.1.0:', type=('build', 'run'))
depends_on('py-tornado@4.0:', type=('build', 'run'))
depends_on('py-ipython@4.0:', type=('build', 'run'))
depends_on('py-jupyter-client', type=('build', 'run'))
depends_on('py-pexpect', type=('build', 'run'))

View File

@ -25,7 +25,7 @@
from spack import *
class PyIpythonGenutils(Package):
class PyIpythonGenutils(PythonPackage):
"""Vestigial utilities from IPython"""
homepage = "https://pypi.python.org/pypi/ipython_genutils"
@ -33,10 +33,5 @@ class PyIpythonGenutils(Package):
version('0.1.0', '9a8afbe0978adbcbfcb3b35b2d015a56')
extends('python')
depends_on('py-setuptools', type='build')
depends_on('python@2.7:2.7.999,3.3:')
def install(self, spec, prefix):
setup_py('install', '--prefix={0}'.format(prefix))

View File

@ -25,7 +25,7 @@
from spack import *
class PyIpython(Package):
class PyIpython(PythonPackage):
"""IPython provides a rich toolkit to help you make the most out of using
Python interactively."""
homepage = "https://pypi.python.org/pypi/ipython"
@ -35,13 +35,15 @@ class PyIpython(Package):
version('3.1.0', 'a749d90c16068687b0ec45a27e72ef8f')
version('2.3.1', '2b7085525dac11190bfb45bb8ec8dcbf')
extends('python')
depends_on('py-pygments', type=('build', 'run'))
depends_on('py-setuptools', type=('build', 'run'))
depends_on('py-backports-shutil-get-terminal-size', when="^python@:3.2.999")
depends_on('py-pathlib2', when="^python@:3.3.999")
depends_on('py-pickleshare')
depends_on('py-simplegeneric')
def install(self, spec, prefix):
setup_py('install', '--prefix=%s' % prefix)
# These dependencies breaks concretization
# See https://github.com/LLNL/spack/issues/2793
# depends_on('py-backports-shutil-get-terminal-size', when="^python@:3.2.999") # noqa
# depends_on('py-pathlib2', when="^python@:3.3.999")
depends_on('py-backports-shutil-get-terminal-size', type=('build', 'run'))
depends_on('py-pathlib2', type=('build', 'run'))
depends_on('py-pickleshare', type=('build', 'run'))
depends_on('py-simplegeneric', type=('build', 'run'))

View File

@ -25,7 +25,7 @@
from spack import *
class PyIpywidgets(Package):
class PyIpywidgets(PythonPackage):
"""IPython widgets for the Jupyter Notebook"""
homepage = "https://github.com/ipython/ipywidgets"
@ -33,13 +33,8 @@ class PyIpywidgets(Package):
version('5.2.2', '112f3daa4aa0f42f8dda831cea3649c8')
extends('python')
depends_on('py-setuptools', type='build')
depends_on('python@2.7:2.7.999,3.3:')
depends_on('py-ipython@4.0.0:')
depends_on('py-ipykernel@4.2.2:')
depends_on('py-traitlets@4.2.1:')
def install(self, spec, prefix):
setup_py('install', '--prefix={0}'.format(prefix))
depends_on('py-ipython@4.0.0:', type=('build', 'run'))
depends_on('py-ipykernel@4.2.2:', type=('build', 'run'))
depends_on('py-traitlets@4.2.1:', type=('build', 'run'))

View File

@ -25,15 +25,10 @@
from spack import *
class PyJdcal(Package):
class PyJdcal(PythonPackage):
"""Julian dates from proleptic Gregorian and Julian calendars"""
homepage = 'http://github.com/phn/jdcal'
url = "https://pypi.python.org/packages/source/j/jdcal/jdcal-1.2.tar.gz"
version('1.2', 'ab8d5ba300fd1eb01514f363d19b1eb9')
extends('python')
def install(self, spec, prefix):
setup_py('install', '--prefix=%s' % prefix)

View File

@ -25,7 +25,7 @@
from spack import *
class PyJinja2(Package):
class PyJinja2(PythonPackage):
"""Jinja2 is a template engine written in pure Python. It provides
a Django inspired non-XML syntax but supports inline expressions
and an optional sandboxed environment."""
@ -39,11 +39,6 @@ class PyJinja2(Package):
version('2.7.1', '282aed153e69f970d6e76f78ed9d027a')
version('2.7', 'c2fb12cbbb523c57d3d15bfe4dc0e8fe')
extends('python')
depends_on('py-setuptools', type='build')
depends_on('py-markupsafe', type=('build', 'run'))
depends_on('py-babel@0.8:', type=('build', 'run')) # optional, required for i18n
def install(self, spec, prefix):
setup_py('install', '--prefix={0}'.format(prefix))

View File

@ -25,19 +25,18 @@
from spack import *
class PyJsonschema(Package):
class PyJsonschema(PythonPackage):
"""Jsonschema: An(other) implementation of JSON Schema for Python."""
homepage = "http://github.com/Julian/jsonschema"
# base https://pypi.python.org/pypi/jsonschema
url = "https://pypi.python.org/packages/source/j/jsonschema/jsonschema-2.5.1.tar.gz"
version('2.5.1', '374e848fdb69a3ce8b7e778b47c30640')
extends('python')
depends_on('py-setuptools', type='build')
depends_on('py-vcversioner')
depends_on('py-functools32', when="^python@2.7")
depends_on('py-vcversioner', type=('build', 'run'))
def install(self, spec, prefix):
setup_py('install', '--prefix={0}'.format(prefix))
# This dependency breaks concretization
# See https://github.com/LLNL/spack/issues/2793
# depends_on('py-functools32', when="^python@2.7", type=('build', 'run'))
depends_on('py-functools32', type=('build', 'run'))

View File

@ -25,7 +25,7 @@
from spack import *
class PyJupyterClient(Package):
class PyJupyterClient(PythonPackage):
"""Jupyter protocol client APIs"""
homepage = "https://github.com/jupyter/jupyter_client"
@ -40,13 +40,8 @@ class PyJupyterClient(Package):
version('4.1.0', 'cf42048b889c8434fbb5813a9eec1d34')
version('4.0.0', '00fa63c67cb3adf359d09dc4d803aff5')
extends('python')
depends_on('py-setuptools', type='build')
depends_on('python@2.7:2.7.999,3.3:')
depends_on('py-traitlets')
depends_on('py-jupyter-core')
depends_on('py-zmq@13:')
def install(self, spec, prefix):
setup_py('install', '--prefix={0}'.format(prefix))
depends_on('py-traitlets', type=('build', 'run'))
depends_on('py-jupyter-core', type=('build', 'run'))
depends_on('py-zmq@13:', type=('build', 'run'))

View File

@ -25,7 +25,7 @@
from spack import *
class PyJupyterConsole(Package):
class PyJupyterConsole(PythonPackage):
"""Jupyter Terminal Console"""
homepage = "https://github.com/jupyter/jupyter_console"
@ -37,15 +37,10 @@ class PyJupyterConsole(Package):
version('4.0.3', '0e928ea261e7f8154698cf69ed4f2459')
version('4.0.2', 'f2e174938c91136549b908bd39fa5d59')
extends('python')
depends_on('py-setuptools', type='build')
depends_on('python@2.7:2.7.999,3.3:')
depends_on('py-jupyter-client')
depends_on('py-ipython')
depends_on('py-ipykernel')
depends_on('py-pygments')
depends_on('py-prompt-toolkit@1.0.0:1.999.999')
def install(self, spec, prefix):
setup_py('install', '--prefix={0}'.format(prefix))
depends_on('py-jupyter-client', type=('build', 'run'))
depends_on('py-ipython', type=('build', 'run'))
depends_on('py-ipykernel', type=('build', 'run'))
depends_on('py-pygments', type=('build', 'run'))
depends_on('py-prompt-toolkit@1.0.0:1.999.999', type=('build', 'run'))

View File

@ -25,7 +25,7 @@
from spack import *
class PyJupyterCore(Package):
class PyJupyterCore(PythonPackage):
"""Core Jupyter functionality"""
homepage = "http://jupyter-core.readthedocs.io/"
@ -40,13 +40,8 @@ class PyJupyterCore(Package):
version('4.0.3', 'f2608f6e92f992ec8e37646b52c922a6')
version('4.0.2', 'ae0d0197c4febf43c050a97ac6277263')
version('4.0.1', 'f849136b2badaaba2a8a3b397bf04639')
version('4.0' , 'b6b37cb4f40bd0fcd20433cb2cc7a4c1')
extends('python')
version('4.0', 'b6b37cb4f40bd0fcd20433cb2cc7a4c1')
depends_on('py-setuptools', type='build')
depends_on('python@2.7:2.7.999,3.3:')
depends_on('py-traitlets')
def install(self, spec, prefix):
setup_py('install', '--prefix={0}'.format(prefix))
depends_on('py-traitlets', type=('build', 'run'))

View File

@ -25,7 +25,7 @@
from spack import *
class PyJupyterNotebook(Package):
class PyJupyterNotebook(PythonPackage):
"""Jupyter Interactive Notebook"""
homepage = "https://github.com/jupyter/notebook"
@ -44,23 +44,18 @@ class PyJupyterNotebook(Package):
variant('terminal', default=False, description="Enable terminal functionality")
extends('python')
depends_on('py-setuptools', type='build')
depends_on('python@2.7:2.7.999,3.3:')
depends_on('npm', type='build')
depends_on('py-jinja2')
depends_on('py-tornado@4:')
depends_on('py-ipython-genutils')
depends_on('py-traitlets')
depends_on('py-jupyter-core')
depends_on('py-jupyter-client')
depends_on('py-jupyter-console')
depends_on('py-nbformat')
depends_on('py-nbconvert')
depends_on('py-ipykernel')
depends_on('py-terminado@0.3.3:', when="+terminal")
depends_on('py-ipywidgets', when="+terminal")
def install(self, spec, prefix):
setup_py('install', '--prefix={0}'.format(prefix))
depends_on('py-jinja2', type=('build', 'run'))
depends_on('py-tornado@4:', type=('build', 'run'))
depends_on('py-ipython-genutils', type=('build', 'run'))
depends_on('py-traitlets', type=('build', 'run'))
depends_on('py-jupyter-core', type=('build', 'run'))
depends_on('py-jupyter-client', type=('build', 'run'))
depends_on('py-jupyter-console', type=('build', 'run'))
depends_on('py-nbformat', type=('build', 'run'))
depends_on('py-nbconvert', type=('build', 'run'))
depends_on('py-ipykernel', type=('build', 'run'))
depends_on('py-terminado@0.3.3:', when="+terminal", type=('build', 'run'))
depends_on('py-ipywidgets', when="+terminal", type=('build', 'run'))

View File

@ -25,7 +25,7 @@
from spack import *
class PyLockfile(Package):
class PyLockfile(PythonPackage):
"""The lockfile package exports a LockFile class which provides a
simple API for locking files. Unlike the Windows msvcrt.locking
function, the fcntl.lockf and flock functions, and the
@ -41,8 +41,4 @@ class PyLockfile(Package):
version('0.10.2', '1aa6175a6d57f082cd12e7ac6102ab15')
extends("python")
depends_on("py-setuptools", type='build')
def install(self, spec, prefix):
setup_py('install', '--prefix=%s' % prefix)

View File

@ -22,11 +22,10 @@
# License along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
##############################################################################
from spack import depends_on, extends, version
from spack import Package
from spack import *
class PyLogilabCommon(Package):
class PyLogilabCommon(PythonPackage):
"""Common modules used by Logilab projects"""
homepage = "https://www.logilab.org/project/logilab-common"
url = "https://pypi.python.org/packages/a7/31/1650d23e44794d46935d82b86e73454cc83b814cbe1365260ccce8a2f4c6/logilab-common-1.2.0.tar.gz"
@ -36,6 +35,3 @@ class PyLogilabCommon(Package):
extends('python', ignore=r'bin/pytest')
depends_on("py-setuptools", type='build')
depends_on("py-six", type=('build', 'run'))
def install(self, spec, prefix):
setup_py('install', '--prefix=%s' % prefix)

View File

@ -26,7 +26,7 @@
from spack import *
class PyMacs2(Package):
class PyMacs2(PythonPackage):
"""MACS2 Model-based Analysis of ChIP-Seq"""
homepage = "https://github.com/taoliu/MACS"
@ -34,13 +34,9 @@ class PyMacs2(Package):
version('2.1.1.20160309', '2008ba838f83f34f8e0fddefe2a3a0159f4a740707c68058f815b31ddad53d26')
extends('python')
depends_on('python@2.7:2.8')
# Most Python packages only require py-setuptools as a build dependency.
# However, py-macs2 requires py-setuptools during runtime as well.
depends_on('py-setuptools', type=('build', 'run'))
depends_on('py-numpy@1.6:', type=('build', 'run'))
def install(self, spec, prefix):
setup_py('install', '--prefix={0}'.format(prefix))

View File

@ -25,7 +25,7 @@
from spack import *
class PyMako(Package):
class PyMako(PythonPackage):
"""A super-fast templating language that borrows the best
ideas from the existing templating languages."""
@ -35,12 +35,7 @@ class PyMako(Package):
version('1.0.4', 'c5fc31a323dd4990683d2f2da02d4e20')
version('1.0.1', '9f0aafd177b039ef67b90ea350497a54')
extends('python')
depends_on('py-setuptools', type='build')
# depends_on('py-mock', type='test') # TODO: Add test deptype
# depends_on('py-pytest', type='test') # TODO: Add test deptype
depends_on('py-markupsafe@0.9.2:', type=('build', 'run'))
def install(self, spec, prefix):
setup_py('install', '--prefix={0}'.format(prefix))

View File

@ -26,7 +26,7 @@
from spack import *
class PyMarkdown(Package):
class PyMarkdown(PythonPackage):
"""This is a Python implementation of John Gruber's Markdown. It is
almost completely compliant with the reference implementation, though
there are a few very minor differences. See John's Syntax
@ -48,14 +48,9 @@ class PyMarkdown(Package):
version('2.5.1', 'be6f6ba65a8fb843d2aaf1fcdd68c755')
version('2.5', '8393ceab9c6e33357fb8a7be063a4849')
extends('python')
depends_on('py-setuptools', type='build')
depends_on('python@2.7:2.8,3.2:3.4')
def url_for_version(self, version):
base_url = "https://github.com/waylan/Python-Markdown/archive"
return "{0}/{1}-final.tar.gz".format(base_url, version)
def install(self, spec, prefix):
setup_py('install', '--prefix={0}'.format(prefix))

View File

@ -25,7 +25,7 @@
from spack import *
class PyMarkupsafe(Package):
class PyMarkupsafe(PythonPackage):
"""MarkupSafe is a library for Python that implements a unicode
string that is aware of HTML escaping rules and can be used to
implement automatic string escaping. It is used by Jinja 2, the
@ -40,9 +40,4 @@ class PyMarkupsafe(Package):
version('0.20', '7da066d9cb191a70aa85d0a3d43565d1')
version('0.19', 'ccb3f746c807c5500850987006854a6d')
extends('python')
depends_on('py-setuptools', type='build')
def install(self, spec, prefix):
setup_py('install', '--prefix={0}'.format(prefix))

View File

@ -26,7 +26,7 @@
import os
class PyMatplotlib(Package):
class PyMatplotlib(PythonPackage):
"""matplotlib is a python 2D plotting library which produces publication
quality figures in a variety of hardcopy formats and interactive
environments across platforms."""
@ -80,7 +80,7 @@ class PyMatplotlib(Package):
# --------- Optional dependencies
depends_on('pkg-config', type='build') # why not...
depends_on('py-pillow', when='+image', type=('build', 'run'))
depends_on('pil', when='+image', type=('build', 'run'))
depends_on('py-ipython', when='+ipython')
depends_on('ghostscript', when='+latex', type='run')
depends_on('texlive', when='+latex', type='run')
@ -95,9 +95,10 @@ class PyMatplotlib(Package):
# depends_on('ttconv')
depends_on('py-six@1.9.0:', type=('build', 'run'))
def install(self, spec, prefix):
setup_py('build')
setup_py('install', '--prefix={0}'.format(prefix))
@PythonPackage.sanity_check('install')
def set_backend(self):
spec = self.spec
prefix = self.prefix
if '+qt' in spec or '+tk' in spec:
# Set backend in matplotlib configuration file

View File

@ -25,7 +25,7 @@
from spack import *
class PyMccabe(Package):
class PyMccabe(PythonPackage):
"""Ned's script to check McCabe complexity."""
homepage = "https://github.com/PyCQA/mccabe"
@ -41,13 +41,9 @@ class PyMccabe(Package):
version('0.2', '36d4808c37e187dbb1fe2373a0ac6645')
version('0.1', '3c9e8e72612a9c01d865630cc569150a')
extends('python')
depends_on('python@2.7:2.8,3.3:')
depends_on('py-setuptools', type='build')
# TODO: Add test dependencies
# depends_on('py-pytest', type='test')
def install(self, spec, prefix):
setup_py('install', '--prefix={0}'.format(prefix))

View File

@ -25,7 +25,7 @@
from spack import *
class PyMeep(Package):
class PyMeep(PythonPackage):
"""Python-meep is a wrapper around libmeep. It allows the scripting of
Meep-simulations with Python"""
@ -36,7 +36,6 @@ class PyMeep(Package):
variant('mpi', default=True, description='Enable MPI support')
extends('python')
depends_on('py-numpy', type=('build', 'run'))
depends_on('py-scipy', type=('build', 'run'))
depends_on('py-matplotlib', type=('build', 'run'))
@ -50,9 +49,12 @@ class PyMeep(Package):
# or else it can't handle newer C++ compilers and flags.
depends_on('swig@1.3.39:3.0.2')
def install(self, spec, prefix):
setup = 'setup-mpi.py' if '+mpi' in spec else 'setup.py'
phases = ['clean', 'build_ext', 'install', 'bdist']
def setup_file(self, spec, prefix):
return 'setup-mpi.py' if '+mpi' in spec else 'setup.py'
def common_args(self, spec, prefix):
include_dirs = [
spec['meep'].prefix.include,
spec['py-numpy'].include
@ -69,7 +71,19 @@ def install(self, spec, prefix):
include_flags = '-I{0}'.format(','.join(include_dirs))
library_flags = '-L{0}'.format(','.join(library_dirs))
python(setup, 'clean', '--all')
python(setup, 'build_ext', include_flags, library_flags)
python(setup, 'install', '--prefix={0}'.format(prefix))
python(setup, 'bdist', include_flags, library_flags)
# FIXME: For some reason, this stopped working.
# The -I and -L are no longer being properly forwarded to setup.py:
# meep_common.i:87: Error: Unable to find 'meep/mympi.hpp'
# meep_common.i:88: Error: Unable to find 'meep/vec.hpp'
# meep_common.i:89: Error: Unable to find 'meep.hpp'
return [include_flags, library_flags]
def clean_args(self, spec, prefix):
return ['--all']
def build_ext_args(self, spec, prefix):
return self.common_args(spec, prefix)
def bdist_args(self, spec, prefix):
return self.common_args(spec, prefix)

View File

@ -22,11 +22,10 @@
# License along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
##############################################################################
from spack import depends_on, extends, version
from spack import Package
from spack import *
class PyMistune(Package):
class PyMistune(PythonPackage):
"""
Python markdown parser
"""
@ -39,8 +38,4 @@ class PyMistune(Package):
version('0.5.1', '1c6cfce28a4aa90cf125217cd6c6fe6c')
version('0.5', '997736554f1f95eea78c66ae339b5722')
extends('python')
depends_on('py-setuptools', type='build')
def install(self, spec, prefix):
setup_py('install', '--prefix=%s' % prefix)

View File

@ -25,7 +25,7 @@
from spack import *
class PyMock(Package):
class PyMock(PythonPackage):
"""mock is a library for testing in Python. It allows you to replace parts
of your system under test with mock objects and make assertions about how
they have been used."""
@ -35,9 +35,5 @@ class PyMock(Package):
version('1.3.0', '73ee8a4afb3ff4da1b4afa287f39fdeb')
extends('python')
depends_on('py-pbr', type=('build', 'run'))
depends_on('py-setuptools@17.1:', type='build')
def install(self, spec, prefix):
setup_py('install', '--prefix=%s' % prefix)

View File

@ -25,7 +25,7 @@
from spack import *
class PyMonotonic(Package):
class PyMonotonic(PythonPackage):
"""An implementation of time.monotonic() for Python 2 & < 3.3"""
homepage = "https://pypi.python.org/pypi/monotonic"
@ -33,9 +33,4 @@ class PyMonotonic(Package):
version('1.2', 'd14c93aabc3d6af25ef086b032b123cf')
extends('python')
depends_on('py-setuptools', type='build')
def install(self, spec, prefix):
setup_py('install', '--prefix={0}'.format(prefix))

View File

@ -25,7 +25,7 @@
from spack import *
class PyMpi4py(Package):
class PyMpi4py(PythonPackage):
"""This package provides Python bindings for the Message Passing
Interface (MPI) standard. It is implemented on top of the
MPI-1/MPI-2 specification and exposes an API which grounds on the
@ -38,9 +38,5 @@ class PyMpi4py(Package):
version('2.0.0', '4f7d8126d7367c239fd67615680990e3')
version('1.3.1', 'dbe9d22bdc8ed965c23a7ceb6f32fc3c')
extends('python')
depends_on('py-setuptools', type='build')
depends_on('mpi')
def install(self, spec, prefix):
setup_py('install', '--prefix=%s' % prefix)

View File

@ -25,14 +25,9 @@
from spack import *
class PyMpmath(Package):
class PyMpmath(PythonPackage):
"""A Python library for arbitrary-precision floating-point arithmetic."""
homepage = "http://mpmath.org"
url = "https://pypi.python.org/packages/source/m/mpmath/mpmath-all-0.19.tar.gz"
version('0.19', 'd1b7e19dd6830d0d7b5e1bc93d46c02c')
extends('python')
def install(self, spec, prefix):
setup_py('install', '--prefix=%s' % prefix)

View File

@ -25,7 +25,7 @@
from spack import *
class PyMx(Package):
class PyMx(PythonPackage):
"""The eGenix.com mx Base Distribution for Python is a collection of
professional quality software tools which enhance Python's
usability in many important areas such as fast text searching,
@ -36,8 +36,3 @@ class PyMx(Package):
url = "https://downloads.egenix.com/python/egenix-mx-base-3.2.8.tar.gz"
version('3.2.8', '9d9d3a25f9dc051a15e97f452413423b')
extends('python')
def install(self, spec, prefix):
setup_py('install', '--prefix=%s' % prefix)

View File

@ -25,15 +25,14 @@
from spack import *
class PyMysqldb1(Package):
class PyMysqldb1(PythonPackage):
"""Legacy mysql bindings for python"""
homepage = "https://github.com/farcepest/MySQLdb1"
url = "https://github.com/farcepest/MySQLdb1/archive/MySQLdb-1.2.5.tar.gz"
version('1.2.5', '332c8f4955b6bc0c79ea15170bf7321b')
version('1.2.5', '332c8f4955b6bc0c79ea15170bf7321b',
url="https://github.com/farcepest/MySQLdb1/archive/MySQLdb-1.2.5.tar.gz")
# FIXME: Missing dependency on mysql
extends('python')
depends_on('py-setuptools', type='build')
def install(self, spec, prefix):
setup_py('install', '--prefix=%s' % prefix)

View File

@ -25,30 +25,31 @@
from spack import *
class PyNbconvert(Package):
class PyNbconvert(PythonPackage):
"""Jupyter Notebook Conversion"""
homepage = "https://github.com/jupyter/nbconvert"
url = "https://github.com/jupyter/nbconvert/archive/4.2.0.tar.gz"
version('4.2.0' , '8bd88771cc00f575d5edcd0b5197f964')
version('4.1.0' , '06655576713ba1ff7cece2b92760c187')
version('4.0.0' , '9661620b1e10a7b46f314588d2d0932f')
extends('python')
version('4.2.0', '8bd88771cc00f575d5edcd0b5197f964')
version('4.1.0', '06655576713ba1ff7cece2b92760c187')
version('4.0.0', '9661620b1e10a7b46f314588d2d0932f')
depends_on('py-setuptools', type='build')
depends_on('py-pycurl', type='build')
depends_on('python@2.7:2.7.999,3.3:')
depends_on('py-mistune')
depends_on('py-jinja2')
depends_on('py-pygments')
depends_on('py-traitlets')
depends_on('py-jupyter-core')
depends_on('py-nbformat')
depends_on('py-entrypoints')
depends_on('py-tornado')
depends_on('py-jupyter-client')
depends_on('py-mistune', type=('build', 'run'))
depends_on('py-jinja2', type=('build', 'run'))
depends_on('py-pygments', type=('build', 'run'))
depends_on('py-traitlets', type=('build', 'run'))
depends_on('py-jupyter-core', type=('build', 'run'))
depends_on('py-nbformat', type=('build', 'run'))
depends_on('py-entrypoints', type=('build', 'run'))
depends_on('py-tornado', type=('build', 'run'))
depends_on('py-jupyter-client', type=('build', 'run'))
def install(self, spec, prefix):
setup_py('install', '--prefix={0}'.format(prefix))
# FIXME:
# Failed, try again after installing PycURL with `pip install pycurl` to avoid outdated SSL. # noqa
# Failed to download css from https://cdn.jupyter.org/notebook/4.1.0/style/style.min.css: [Errno socket error] [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:661) # noqa
# Downloading CSS: https://cdn.jupyter.org/notebook/4.1.0/style/style.min.css # noqa
# error: Need Notebook CSS to proceed: nbconvert/resources/style.min.css

View File

@ -25,7 +25,7 @@
from spack import *
class PyNbformat(Package):
class PyNbformat(PythonPackage):
"""The Jupyter Notebook format"""
homepage = "https://github.com/jupyter/nbformat"
@ -35,13 +35,8 @@ class PyNbformat(Package):
version('4.0.1', 'ab7172e517c9d561c0c01eef5631b4c8')
version('4.0.0', '7cf61359fa4e9cf3ef5e969e2fcb909e')
extends('python')
depends_on('py-setuptools', type='build')
depends_on('py-ipython-genutils')
depends_on('py-traitlets')
depends_on('py-jsonschema')
depends_on('py-jupyter-core')
def install(self, spec, prefix):
setup_py('install', '--prefix={0}'.format(prefix))
depends_on('py-ipython-genutils', type=('build', 'run'))
depends_on('py-traitlets', type=('build', 'run'))
depends_on('py-jsonschema', type=('build', 'run'))
depends_on('py-jupyter-core', type=('build', 'run'))

View File

@ -25,7 +25,7 @@
from spack import *
class PyNestle(Package):
class PyNestle(PythonPackage):
"""Nested sampling algorithms for evaluating Bayesian evidence."""
homepage = "http://kbarbary.github.io/nestle/"
@ -34,11 +34,7 @@ class PyNestle(Package):
version('0.1.1', '4875c0f9a0a8e263c1d7f5fa6ce604c5')
# Required dependencies
extends('python')
depends_on('py-numpy', type=('build', 'run'))
# Optional dependencies
depends_on('py-scipy', type=('build', 'run'))
def install(self, spec, prefix):
setup_py('install', '--prefix={0}'.format(prefix))

View File

@ -25,18 +25,14 @@
from spack import *
class PyNetcdf(Package):
class PyNetcdf(PythonPackage):
"""Python interface to the netCDF Library."""
homepage = "http://unidata.github.io/netcdf4-python"
url = "https://github.com/Unidata/netcdf4-python/tarball/v1.2.3.1rel"
version('1.2.3.1', '4fc4320d4f2a77b894ebf8da1c9895af')
extends('python')
depends_on('py-numpy', type=('build', 'run'))
depends_on('py-cython', type=('build', 'run'))
depends_on('py-setuptools', type=('build', 'run'))
depends_on('netcdf')
def install(self, spec, prefix):
setup_py('install', '--prefix=%s' % prefix)

View File

@ -25,7 +25,7 @@
from spack import *
class PyNetworkx(Package):
class PyNetworkx(PythonPackage):
"""NetworkX is a Python package for the creation, manipulation, and study
of the structure, dynamics, and functions of complex networks."""
homepage = "http://networkx.github.io/"
@ -33,10 +33,5 @@ class PyNetworkx(Package):
version('1.11', '6ef584a879e9163013e9a762e1cf7cd1')
extends('python')
depends_on('py-decorator', type=('build', 'run'))
depends_on('py-setuptools', type='build')
def install(self, spec, prefix):
setup_py('install', '--prefix=%s' % prefix)

View File

@ -25,7 +25,7 @@
from spack import *
class PyNose(Package):
class PyNose(PythonPackage):
"""nose extends the test loading and running features of unittest,
making it easier to write, find and run tests."""
@ -36,8 +36,4 @@ class PyNose(Package):
version('1.3.6', '0ca546d81ca8309080fc80cb389e7a16')
version('1.3.7', '4d3ad0ff07b61373d2cefc89c5d0b20b')
extends('python')
depends_on('py-setuptools', type='build')
def install(self, spec, prefix):
setup_py('install', '--prefix=%s' % prefix)

View File

@ -25,16 +25,16 @@
from spack import *
class PyNumexpr(Package):
class PyNumexpr(PythonPackage):
"""Fast numerical expression evaluator for NumPy"""
homepage = "https://pypi.python.org/pypi/numexpr"
url = "https://pypi.python.org/packages/source/n/numexpr/numexpr-2.4.6.tar.gz"
version('2.4.6', '17ac6fafc9ea1ce3eb970b9abccb4fbd')
version('2.6.1', '6365245705b446426df9543ad218dd8e',
url="https://pypi.python.org/packages/c6/f0/11628fa4d332d8fe9ab0ba8e9bfe0e065fb6b5324859171ee72d84e079c0/numexpr-2.6.1.tar.gz")
version('2.5', '84f66cced45ba3e30dcf77a937763aaa')
version('2.4.6', '17ac6fafc9ea1ce3eb970b9abccb4fbd')
extends('python')
depends_on('py-numpy', type=('build', 'run'))
def install(self, spec, prefix):
setup_py('install', '--prefix=%s' % prefix)
depends_on('python@2.6:')
depends_on('py-numpy@1.6:', type=('build', 'run'))
depends_on('py-setuptools', type='build')

View File

@ -26,7 +26,7 @@
import platform
class PyNumpy(Package):
class PyNumpy(PythonPackage):
"""NumPy is the fundamental package for scientific computing with Python.
It contains among other things: a powerful N-dimensional array object,
sophisticated (broadcasting) functions, tools for integrating C/C++ and
@ -46,7 +46,6 @@ class PyNumpy(Package):
variant('blas', default=True)
variant('lapack', default=True)
extends('python')
depends_on('python@2.6:2.8,3.2:')
depends_on('py-nose', type='build')
depends_on('py-setuptools', type='build')
@ -65,7 +64,8 @@ def setup_dependent_package(self, module, dep_spec):
self.spec.version, python_version, arch),
'numpy/core/include')
def install(self, spec, prefix):
def patch(self):
spec = self.spec
# for build notes see http://www.scipy.org/scipylib/building/linux.html
lapackblas = LibraryList('')
if '+lapack' in spec:
@ -82,5 +82,3 @@ def install(self, spec, prefix):
if not ((platform.system() == "Darwin") and
(platform.mac_ver()[0] == '10.12')):
f.write('rpath=%s\n' % ':'.join(lapackblas.directories))
setup_py('install', '--prefix={0}'.format(prefix))

View File

@ -25,7 +25,7 @@
from spack import *
class PyOpenpyxl(Package):
class PyOpenpyxl(PythonPackage):
"""A Python library to read/write Excel 2007 xlsx/xlsm files"""
homepage = 'http://openpyxl.readthedocs.org/'
@ -33,10 +33,5 @@ class PyOpenpyxl(Package):
version('2.4.0-a1', 'e5ca6d23ceccb15115d45cdf26e736fc')
extends('python')
depends_on('py-jdcal', type=('build', 'run'))
depends_on('py-setuptools', type='build')
def install(self, spec, prefix):
setup_py('install', '--prefix=%s' % prefix)

View File

@ -25,7 +25,7 @@
from spack import *
class PyOrdereddict(Package):
class PyOrdereddict(PythonPackage):
"""A drop-in substitute for Py2.7's new collections.
OrderedDict that works in Python 2.4-2.6."""
@ -33,9 +33,3 @@ class PyOrdereddict(Package):
url = "https://pypi.python.org/packages/source/o/ordereddict/ordereddict-1.1.tar.gz"
version('1.1', 'a0ed854ee442051b249bfad0f638bbec')
extends('python')
depends_on('python@2.4:2.6.999')
def install(self, spec, prefix):
setup_py('install', '--prefix={0}'.format(prefix))

View File

@ -25,7 +25,7 @@
from spack import *
class PyPandas(Package):
class PyPandas(PythonPackage):
"""pandas is a Python package providing fast, flexible, and expressive
data structures designed to make working with relational or
labeled data both easy and intuitive. It aims to be the
@ -42,13 +42,9 @@ class PyPandas(Package):
version('0.16.1', 'fac4f25748f9610a3e00e765474bdea8')
version('0.18.0', 'f143762cd7a59815e348adf4308d2cf6')
extends('python')
depends_on('py-dateutil', type=('build', 'run'))
depends_on('py-numpy', type=('build', 'run'))
depends_on('py-setuptools', type='build')
depends_on('py-pytz', type=('build', 'run'))
depends_on('py-numexpr', type=('build', 'run'))
depends_on('py-bottleneck', type=('build', 'run'))
def install(self, spec, prefix):
setup_py('install', '--prefix=%s' % prefix)

View File

@ -25,7 +25,7 @@
from spack import *
class PyPathlib2(Package):
class PyPathlib2(PythonPackage):
"""Backport of pathlib from python 3.4"""
homepage = "https://pypi.python.org/pypi/pathlib2"
@ -33,10 +33,5 @@ class PyPathlib2(Package):
version('2.1.0', '38e4f58b4d69dfcb9edb49a54a8b28d2')
extends('python')
depends_on('py-setuptools', type='build')
depends_on('python@:3.3.999')
def install(self, spec, prefix):
setup_py('install', '--prefix={0}'.format(prefix))

View File

@ -25,7 +25,7 @@
from spack import *
class PyPathspec(Package):
class PyPathspec(PythonPackage):
"""pathspec extends the test loading and running features of unittest,
making it easier to write, find and run tests."""
@ -34,8 +34,4 @@ class PyPathspec(Package):
version('0.3.4', '2a4af9bf2dee98845d583ec61a00d05d',
url='https://pypi.python.org/packages/14/9d/c9d790d373d6f6938d793e9c549b87ad8670b6fa7fc6176485e6ef11c1a4/pathspec-0.3.4.tar.gz')
extends('python')
depends_on('py-setuptools', type='build')
def install(self, spec, prefix):
setup_py('install', '--prefix=%s' % prefix)

View File

@ -25,7 +25,7 @@
from spack import *
class PyPbr(Package):
class PyPbr(PythonPackage):
"""PBR is a library that injects some useful and sensible default
behaviors into your setuptools run."""
homepage = "https://pypi.python.org/pypi/pbr"
@ -33,9 +33,4 @@ class PyPbr(Package):
version('1.8.1', 'c8f9285e1a4ca6f9654c529b158baa3a')
extends('python')
depends_on('py-setuptools', type='build')
def install(self, spec, prefix):
setup_py('install', '--prefix=%s' % prefix)

View File

@ -25,7 +25,7 @@
from spack import *
class PyPeriodictable(Package):
class PyPeriodictable(PythonPackage):
"""nose extends the test loading and running features of unittest,
making it easier to write, find and run tests."""
@ -36,7 +36,3 @@ class PyPeriodictable(Package):
depends_on('py-numpy', type=('build', 'run'))
depends_on('py-pyparsing', type=('build', 'run'))
extends('python')
def install(self, spec, prefix):
setup_py('install', '--prefix=%s' % prefix)

View File

@ -25,16 +25,12 @@
from spack import *
class PyPexpect(Package):
class PyPexpect(PythonPackage):
"""Pexpect allows easy control of interactive console applications."""
homepage = "https://pypi.python.org/pypi/pexpect"
url = "https://pypi.io/packages/source/p/pexpect/pexpect-4.2.1.tar.gz"
version('4.2.1', '3694410001a99dff83f0b500a1ca1c95')
version('3.3', '0de72541d3f1374b795472fed841dce8')
extends('python')
depends_on('py-ptyprocess')
def install(self, spec, prefix):
setup_py('install', '--prefix=%s' % prefix)
depends_on('py-ptyprocess', type=('build', 'run'))

View File

@ -25,7 +25,7 @@
from spack import *
class PyPhonopy(Package):
class PyPhonopy(PythonPackage):
"""Phonopy is an open source package for phonon
calculations at harmonic and quasi-harmonic levels."""
homepage = "http://atztogo.github.io/phonopy/index.html"
@ -33,11 +33,7 @@ class PyPhonopy(Package):
version('1.10.0', '973ed1bcea46e21b9bf747aab9061ff6')
extends('python')
depends_on('py-numpy', type=('build', 'run'))
depends_on('py-scipy', type=('build', 'run'))
depends_on('py-matplotlib', type=('build', 'run'))
depends_on('py-pyyaml', type=('build', 'run'))
def install(self, spec, prefix):
setup_py('install', '--home=%s' % prefix)

View File

@ -25,7 +25,7 @@
from spack import *
class PyPickleshare(Package):
class PyPickleshare(PythonPackage):
"""Tiny 'shelve'-like database with concurrency support"""
homepage = "https://pypi.python.org/pypi/pickleshare"
@ -33,9 +33,4 @@ class PyPickleshare(Package):
version('0.7.4', '6a9e5dd8dfc023031f6b7b3f824cab12')
extends('python')
depends_on('py-setuptools', type='build')
def install(self, spec, prefix):
setup_py('install', '--prefix={0}'.format(prefix))

View File

@ -25,7 +25,7 @@
from spack import *
class PyPil(Package):
class PyPil(PythonPackage):
"""The Python Imaging Library (PIL) adds image processing capabilities
to your Python interpreter. This library supports many file formats,
and provides powerful image processing and graphics capabilities."""
@ -39,8 +39,4 @@ class PyPil(Package):
# py-pil currently only works with Python2.
# If you are using Python 3, try using py-pillow instead.
extends('python')
depends_on('python@1.5.2:2.8')
def install(self, spec, prefix):
setup_py('install', '--prefix=%s' % prefix)

View File

@ -23,9 +23,10 @@
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
##############################################################################
from spack import *
import sys
class PyPillow(Package):
class PyPillow(PythonPackage):
"""Pillow is a fork of the Python Imaging Library (PIL). It adds image
processing capabilities to your Python interpreter. This library supports
many file formats, and provides powerful image processing and graphics
@ -64,8 +65,7 @@ class PyPillow(Package):
# description='Provide improved color quantization')
# Required dependencies
extends('python')
depends_on('binutils', type='build')
depends_on('binutils', type='build', when=sys.platform != 'darwin')
depends_on('py-setuptools', type='build')
# Recommended dependencies
@ -83,6 +83,8 @@ class PyPillow(Package):
# depends_on('webpmux', when='+webpmux')
# depends_on('imagequant', when='+imagequant')
phases = ['build_ext', 'install']
def patch(self):
"""Patch setup.py to provide lib and include directories
for dependencies."""
@ -121,13 +123,10 @@ def patch(self):
spec['openjpeg'].prefix.lib,
spec['openjpeg'].prefix.include))
def install(self, spec, prefix):
def build_ext_args(self, spec, prefix):
def variant_to_flag(variant):
able = 'enable' if '+{0}'.format(variant) in spec else 'disable'
return '--{0}-{1}'.format(able, variant)
variants = ['jpeg', 'zlib', 'tiff', 'freetype', 'lcms', 'jpeg2000']
build_args = list(map(variant_to_flag, variants))
setup_py('build_ext', *build_args)
setup_py('install', '--prefix={0}'.format(prefix))
return list(map(variant_to_flag, variants))

View File

@ -25,7 +25,7 @@
from spack import *
class PyPip(Package):
class PyPip(PythonPackage):
"""The PyPA recommended tool for installing Python packages."""
homepage = "https://pypi.python.org/pypi/pip"
@ -33,9 +33,4 @@ class PyPip(Package):
version('9.0.1', '35f01da33009719497f01a4ba69d63c9')
extends('python')
depends_on('py-setuptools', type='build')
def install(self, spec, prefix):
setup_py('install', '--prefix={0}'.format(prefix))

View File

@ -25,14 +25,9 @@
from spack import *
class PyPly(Package):
class PyPly(PythonPackage):
"""PLY is nothing more than a straightforward lex/yacc implementation."""
homepage = "http://www.dabeaz.com/ply"
url = "http://www.dabeaz.com/ply/ply-3.8.tar.gz"
version('3.8', '94726411496c52c87c2b9429b12d5c50')
extends('python')
def install(self, spec, prefix):
setup_py('install', '--prefix=%s' % prefix)

View File

@ -25,15 +25,10 @@
from spack import *
class PyPmw(Package):
class PyPmw(PythonPackage):
"""Pmw is a toolkit for building high-level compound widgets, or
megawidgets, constructed using other widgets as component parts."""
homepage = "https://pypi.python.org/pypi/Pmw"
url = "https://pypi.python.org/packages/source/P/Pmw/Pmw-2.0.0.tar.gz"
version('2.0.0', 'c7c3f26c4f5abaa99807edefee578fc0')
extends('python')
def install(self, spec, prefix):
setup_py('install', '--prefix=%s' % prefix)

View File

@ -25,7 +25,7 @@
from spack import *
class PyPrettytable(Package):
class PyPrettytable(PythonPackage):
"""PrettyTable is a simple Python library designed to make
it quick and easy to represent tabular data in visually
appealing ASCII tables.
@ -36,8 +36,4 @@ class PyPrettytable(Package):
version('0.7.2', 'a6b80afeef286ce66733d54a0296b13b')
extends("python")
depends_on("py-setuptools", type='build')
def install(self, spec, prefix):
setup_py('install', '--prefix=%s' % prefix)

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