diff --git a/INSTALL.rst b/INSTALL.rst index 5bd7bec62c30..f87ed368c136 100644 --- a/INSTALL.rst +++ b/INSTALL.rst @@ -137,19 +137,20 @@ e.g., if the header of some required library is in Dependencies ------------ -Matplotlib requires a large number of dependencies: +Matplotlib requires the following dependencies: * `Python `_ (>= 3.5) - * `NumPy `_ (>= |minimum_numpy_version|) - * `setuptools `__ + * `setuptools `_ + * `NumPy `_ (>= 1.10.0) + * `cycler `_ (>= 0.10.0) * `dateutil `_ (>= 2.1) - * `pyparsing `__ - * `libpng `__ (>= 1.2) - * `pytz `__ - * FreeType (>= 2.3) - * `cycler `__ (>= 0.10.0) - * `six `_ * `kiwisolver `__ (>= 1.0.0) + * `pyparsing `_ (>= 2.1.7; some older + versions may work) + * `pytz `_ + * `six `_ (>= 1.10) + * `FreeType `_ (>= 2.3) + * `libpng `_ (>= 1.2) Optionally, you can also install a number of packages to enable better user interface toolkits. See :ref:`what-is-a-backend` for more details on the diff --git a/doc/conf.py b/doc/conf.py index 9342fa58c646..f02b1fc94565 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -323,10 +323,6 @@ def _check_deps(): # documentation autoclass_content = 'both' -rst_epilog = """ -.. |minimum_numpy_version| replace:: %s -""" % matplotlib.__version__numpy__ - texinfo_documents = [ ("contents", 'matplotlib', 'Matplotlib Documentation', 'John Hunter@*Darren Dale@*Eric Firing@*Michael Droettboom@*' diff --git a/lib/matplotlib/__init__.py b/lib/matplotlib/__init__.py index 16cce6f04584..642064bfc87c 100644 --- a/lib/matplotlib/__init__.py +++ b/lib/matplotlib/__init__.py @@ -94,15 +94,25 @@ matplotlib was initially written by John D. Hunter (1968-2012) and is now developed and maintained by a host of others. - -Occasionally the internal documentation (python docstrings) will refer -to MATLAB®, a registered trademark of The MathWorks, Inc. - """ # NOTE: This file must remain Python 2 compatible for the foreseeable future, # to ensure that we error out properly for existing editable installs. from __future__ import absolute_import, division, print_function +import pkg_resources + +try: + pkg_resources.get_distribution("matplotlib") +except pkg_resources.DistributionNotFound: + # Running from source -- you're on your own. + pass +else: + try: + # Check that dependencies are correctly installed. + pkg_resources.require("matplotlib") + except pkg_resources.ResolutionError as e: + raise ImportError("Matplotlib requires {}".format(e.req)) + import six import sys @@ -120,8 +130,7 @@ import atexit from collections import MutableMapping import contextlib -import distutils.version -import distutils.sysconfig +from distutils.version import LooseVersion import functools import io import inspect @@ -137,16 +146,39 @@ import tempfile import warnings +if sys.version_info < (3, 5): # noqa: E402 + raise ImportError(""" +Matplotlib 3.0+ does not support Python 2.x, 3.0, 3.1, 3.2, 3.3, or 3.4. +Beginning with Matplotlib 3.0, Python 3.5 and above is required. + +See Matplotlib `INSTALL.rst` file for more information: + + https://github.com/matplotlib/matplotlib/blob/master/INSTALL.rst + +""") + +if sys.version_info < (3, 5): # noqa: E402 + raise ImportError(""" +Matplotlib 3.0+ does not support Python 2.x, 3.0, 3.1, 3.2, 3.3, or 3.4. +Beginning with Matplotlib 3.0, Python 3.5 and above is required. + +See Matplotlib `INSTALL.rst` file for more information: + + https://github.com/matplotlib/matplotlib/blob/master/INSTALL.rst + +""") + +from six.moves.urllib.request import urlopen +from six.moves import reload_module as reload + +import numpy + # cbook must import matplotlib only within function # definitions, so it is safe to import from it here. from . import cbook -from matplotlib.cbook import ( +from .cbook import ( _backports, mplDeprecation, dedent, get_label, sanitize_sequence) -from matplotlib.rcsetup import defaultParams, validate_backend, cycler - -import numpy -from six.moves.urllib.request import urlopen -from six.moves import reload_module as reload +from .rcsetup import defaultParams, validate_backend, cycler # Get the version from the _version.py versioneer file. For a git checkout, # this is computed based on the number of commits since the last tag. @@ -191,41 +223,11 @@ def compare_versions(a, b): a = a.decode('ascii') if isinstance(b, bytes): b = b.decode('ascii') - a = distutils.version.LooseVersion(a) - b = distutils.version.LooseVersion(b) - return a >= b + return LooseVersion(a) >= LooseVersion(b) else: return False -try: - import dateutil -except ImportError: - raise ImportError("Matplotlib requires dateutil") - - -if not compare_versions(six.__version__, '1.10'): - raise ImportError( - "Matplotlib requires six>=1.10; you have %s" % six.__version__) - - -try: - import pyparsing -except ImportError: - raise ImportError("Matplotlib requires pyparsing") -else: - if not compare_versions(pyparsing.__version__, '2.0.1'): - raise ImportError( - "Matplotlib requires pyparsing>=2.0.1; you have %s" - % pyparsing.__version__) - - -if not compare_versions(numpy.__version__, __version__numpy__): - raise ImportError( - "Matplotlib requires numpy>=%s; you have %s" % ( - __version__numpy__, numpy.__version__)) - - if not hasattr(sys, 'argv'): # for modpython sys.argv = [str('modpython')] diff --git a/setupext.py b/setupext.py index 646794812fff..ac6c5fe7530c 100644 --- a/setupext.py +++ b/setupext.py @@ -107,18 +107,6 @@ def get_win32_compiler(): win32_compiler = get_win32_compiler() -def extract_versions(): - """ - Extracts version values from the main matplotlib __init__.py and - returns them as a dictionary. - """ - with open('lib/matplotlib/__init__.py') as fd: - for line in fd.readlines(): - if (line.startswith('__version__numpy__')): - exec(line.strip()) - return locals() - - def has_include_file(include_dirs, filename): """ Returns `True` if `filename` can be found in one of the @@ -925,7 +913,8 @@ def include_dirs_hook(): return [numpy.get_include()] def check(self): - min_version = extract_versions()['__version__numpy__'] + # Remember to keep the version in INSTALL.rst in sync. + min_version = "1.7.1" try: import numpy except ImportError: @@ -1391,6 +1380,7 @@ def check(self): return "handled by setuptools" def get_install_requires(self): + # Remember to keep the list in INSTALL.rst in sync. install_requires = [ "cycler>=0.10", "pyparsing>=2.0.1,!=2.0.4,!=2.1.2,!=2.1.6",