[yt-svn] commit/yt: xarthisius: Merged in ngoldbaum/yt (pull request #2140)

commits-noreply at bitbucket.org commits-noreply at bitbucket.org
Wed May 4 11:07:28 PDT 2016


1 new commit in yt:

https://bitbucket.org/yt_analysis/yt/commits/21cedef7066b/
Changeset:   21cedef7066b
Branch:      yt
User:        xarthisius
Date:        2016-05-04 18:07:21+00:00
Summary:     Merged in ngoldbaum/yt (pull request #2140)

Speed up top-level yt import
Affected #:  17 files

diff -r dedf4c47220e9551cf8ce24f10c9259da92f4361 -r 21cedef7066b43a139336890244be2c47f5af0fa yt/frontends/fits/misc.py
--- a/yt/frontends/fits/misc.py
+++ b/yt/frontends/fits/misc.py
@@ -16,7 +16,6 @@
 from yt.fields.derived_field import ValidateSpatial
 from yt.funcs import mylog
 from yt.utilities.on_demand_imports import _astropy
-from yt.visualization._mpl_imports import FigureCanvasAgg
 from yt.units.yt_array import YTQuantity, YTArray
 from yt.utilities.fits_image import FITSImageData
 if PY3:
@@ -258,6 +257,7 @@
         self.pw.save(name=name, mpl_kwargs=mpl_kwargs)
 
     def _repr_html_(self):
+        from yt.visualization._mpl_imports import FigureCanvasAgg
         ret = ''
         for k, v in self.plots.items():
             canvas = FigureCanvasAgg(v)

diff -r dedf4c47220e9551cf8ce24f10c9259da92f4361 -r 21cedef7066b43a139336890244be2c47f5af0fa yt/frontends/http_stream/data_structures.py
--- a/yt/frontends/http_stream/data_structures.py
+++ b/yt/frontends/http_stream/data_structures.py
@@ -15,6 +15,7 @@
 # The full license is in the file COPYING.txt, distributed with this software.
 #-----------------------------------------------------------------------------
 
+import json
 import numpy as np
 import time
 
@@ -24,15 +25,11 @@
     ParticleDataset
 from yt.frontends.sph.fields import \
     SPHFieldInfo
+from yt.funcs import \
+    get_requests
 from yt.geometry.particle_geometry_handler import \
     ParticleIndex
 
-try:
-    import requests
-    import json
-except ImportError:
-    requests = None
-
 class HTTPParticleFile(ParticleFile):
     pass
 
@@ -49,8 +46,9 @@
                  dataset_type = "http_particle_stream",
                  n_ref = 64, over_refine_factor=1, 
                  unit_system="cgs"):
-        if requests is None:
-            raise RuntimeError
+        if get_requests() is None:
+            raise ImportError(
+                "This functionality depends on the requests package")
         self.base_url = base_url
         self.n_ref = n_ref
         self.over_refine_factor = over_refine_factor
@@ -66,6 +64,7 @@
         self.parameters["HydroMethod"] = "sph"
 
         # Here's where we're going to grab the JSON index file
+        requests = get_requests()
         hreq = requests.get(self.base_url + "/yt_index.json")
         if hreq.status_code != 200:
             raise RuntimeError
@@ -108,6 +107,9 @@
     def _is_valid(self, *args, **kwargs):
         if not args[0].startswith("http://"):
             return False
+        requests = get_requests()
+        if requests is None:
+            return False
         hreq = requests.get(args[0] + "/yt_index.json")
         if hreq.status_code == 200:
             return True

diff -r dedf4c47220e9551cf8ce24f10c9259da92f4361 -r 21cedef7066b43a139336890244be2c47f5af0fa yt/frontends/http_stream/io.py
--- a/yt/frontends/http_stream/io.py
+++ b/yt/frontends/http_stream/io.py
@@ -18,24 +18,21 @@
 import numpy as np
 
 from yt.funcs import \
+    get_requests, \
     mylog
 from yt.utilities.io_handler import \
     BaseIOHandler
 from yt.utilities.lib.geometry_utils import \
     compute_morton
 
-try:
-    import requests
-except ImportError:
-    requests = None
-
 class IOHandlerHTTPStream(BaseIOHandler):
     _dataset_type = "http_particle_stream"
     _vector_fields = ("Coordinates", "Velocity", "Velocities")
 
     def __init__(self, ds):
-        if requests is None:
-            raise RuntimeError
+        if get_requests() is None:
+            raise ImportError(
+                "This functionality depends on the requests package")
         self._url = ds.base_url
         # This should eventually manage the IO and cache it
         self.total_bytes = 0
@@ -47,6 +44,7 @@
         s = "%s/%s/%s/%s" % (self._url,
             data_file.file_id, ftype, fname)
         mylog.info("Loading URL %s", s)
+        requests = get_requests()
         resp = requests.get(s)
         if resp.status_code != 200:
             raise RuntimeError

diff -r dedf4c47220e9551cf8ce24f10c9259da92f4361 -r 21cedef7066b43a139336890244be2c47f5af0fa yt/frontends/sdf/data_structures.py
--- a/yt/frontends/sdf/data_structures.py
+++ b/yt/frontends/sdf/data_structures.py
@@ -27,6 +27,8 @@
     ParticleIndex
 from yt.data_objects.static_output import \
     Dataset, ParticleFile
+from yt.funcs import \
+    get_requests
 from .fields import \
     SDFFieldInfo
 from yt.utilities.sdf import \
@@ -34,11 +36,6 @@
     SDFIndex,\
     HTTPSDFRead
 
-try:
-    import requests
-except ImportError:
-    requests = None
-
 @contextlib.contextmanager
 def safeopen(*args, **kwargs):
     if sys.version[0] != '3':
@@ -195,7 +192,9 @@
     def _is_valid(cls, *args, **kwargs):
         sdf_header = kwargs.get('sdf_header', args[0])
         if sdf_header.startswith("http"):
-            if requests is None: return False
+            requests = get_requests()
+            if requests is None: 
+                return False
             hreq = requests.get(sdf_header, stream=True)
             if hreq.status_code != 200: return False
             # Grab a whole 4k page.

diff -r dedf4c47220e9551cf8ce24f10c9259da92f4361 -r 21cedef7066b43a139336890244be2c47f5af0fa yt/funcs.py
--- a/yt/funcs.py
+++ b/yt/funcs.py
@@ -953,3 +953,10 @@
         raise RuntimeError(
             "Please install palettable to use colorbrewer colormaps")
     return bmap.get_mpl_colormap(N=cmap[2])
+
+def get_requests():
+    try:
+        import requests
+    except ImportError:
+        requests = None
+    return requests

diff -r dedf4c47220e9551cf8ce24f10c9259da92f4361 -r 21cedef7066b43a139336890244be2c47f5af0fa yt/testing.py
--- a/yt/testing.py
+++ b/yt/testing.py
@@ -20,6 +20,7 @@
 import numpy as np
 import importlib
 import os
+import unittest
 from yt.funcs import iterable
 from yt.config import ytcfg
 # we import this in a weird way from numpy.testing to avoid triggering
@@ -31,16 +32,22 @@
 from numpy.testing import assert_string_equal  # NOQA
 from numpy.testing import assert_array_almost_equal_nulp  # NOQA
 from numpy.testing import assert_allclose, assert_raises  # NOQA
-try:
-    from nose.tools import assert_true, assert_less_equal  # NOQA
-except ImportError:
-    # This means nose isn't installed, so the tests can't run and it's ok
-    # to not import these functions
-    pass
 from yt.convenience import load
 from yt.units.yt_array import YTArray, YTQuantity
 from yt.utilities.exceptions import YTUnitOperationError
 
+# Expose assert_true and assert_less_equal from unittest.TestCase
+# this is adopted from nose. Doing this here allows us to avoid importing
+# nose at the top level.
+class _Dummy(unittest.TestCase):
+    def nop():
+        pass
+_t = _Dummy('nop')
+
+assert_true = getattr(_t, 'assertTrue')
+assert_less_equal = getattr(_t, 'assertLessEqual')
+
+
 def assert_rel_equal(a1, a2, decimals, err_msg='', verbose=True):
     # We have nan checks in here because occasionally we have fields that get
     # weighted without non-zero weights.  I'm looking at you, particle fields!

diff -r dedf4c47220e9551cf8ce24f10c9259da92f4361 -r 21cedef7066b43a139336890244be2c47f5af0fa yt/utilities/sdf.py
--- a/yt/utilities/sdf.py
+++ b/yt/utilities/sdf.py
@@ -2,13 +2,18 @@
 from yt.extern.six.moves import cStringIO
 import os
 import numpy as np
-try:
-    from thingking.httpmmap import HTTPArray
-    from thingking.arbitrary_page import PageCacheURL
-except ImportError:
-    HTTPArray = PageCacheURL = None
+
 from yt.funcs import mylog
 
+def get_thingking_deps():
+    try:
+        from thingking.httpmmap import HTTPArray
+        from thingking.arbitrary_page import PageCacheURL
+    except ImportError:
+        raise ImportError(
+            "This functionality requires the thingking package to be installed")
+    return HTTPArray, PageCacheURL
+
 _types = {
     'int16_t': 'int16',
     'uint16_t': 'uint16',
@@ -216,8 +221,8 @@
 
     def __init__(self, *args, **kwargs):
         super(HTTPDataStruct, self).__init__(*args, **kwargs)
-        if None in (PageCacheURL, HTTPArray):
-            raise ImportError("'thingking' is required for loading of remote HTTP data.")
+        HTTPArray, PageCacheURL = get_thingking_deps()
+        self.HTTPArray = HTTPArray
         self.pcu = PageCacheURL(self.filename)
 
     def set_offset(self, offset):
@@ -232,7 +237,7 @@
     def build_memmap(self):
         assert(self.size != -1)
         mylog.info('Building memmap with offset: %i and size %i' % (self._offset, self.size))
-        self.handle = HTTPArray(self.filename, dtype=self.dtype,
+        self.handle = self.HTTPArray(self.filename, dtype=self.dtype,
                         shape=self.size, offset=self._offset)
         for k in self.dtype.names:
             self.data[k] = RedirectArray(self.handle, k)
@@ -457,14 +462,14 @@
     _data_struct = HTTPDataStruct
 
     def __init__(self, *args, **kwargs):
-        if None in (PageCacheURL, HTTPArray):
-            raise ImportError("thingking")
+        HTTPArray, _ = get_thingking_deps()
+        self.HTTPArray = HTTPArray
         super(HTTPSDFRead, self).__init__(*args, **kwargs)
 
     def parse_header(self):
         """docstring for parse_header"""
         # Pre-process
-        ascfile = HTTPArray(self.header)
+        ascfile = self.HTTPArray(self.header)
         max_header_size = 1024*1024
         lines = cStringIO(ascfile[:max_header_size].data[:])
         while True:

diff -r dedf4c47220e9551cf8ce24f10c9259da92f4361 -r 21cedef7066b43a139336890244be2c47f5af0fa yt/visualization/_mpl_imports.py
--- a/yt/visualization/_mpl_imports.py
+++ b/yt/visualization/_mpl_imports.py
@@ -1,16 +1,6 @@
 import matplotlib
 matplotlib.rc('contour', negative_linestyle='solid')
 
-import matplotlib.image
-import matplotlib.ticker
-import matplotlib.axes
-import matplotlib.figure
-import matplotlib._image
-import matplotlib.colors
-import matplotlib.colorbar
-import matplotlib.cm
-import matplotlib.collections
-
 from matplotlib.backends.backend_agg import \
     FigureCanvasAgg
 
@@ -19,33 +9,3 @@
 
 from matplotlib.backends.backend_ps import \
     FigureCanvasPS
-
-# Now we provide some convenience functions to get information about plots.
-# With Matplotlib 0.98.x, the 'transforms' branch broke backwards
-# compatibility.  Despite that, the various packagers are plowing ahead with
-# packaging 0.98.x with new distributions of python software.  So I guess
-# we have to support it.
-
-_compatibility_functions = ["mpl_get_bounds","mpl_notify"]
-
-_mpl98_mpl_get_bounds = lambda bbox: bbox.bounds
-_mpl9x_mpl_get_bounds = lambda bbox: bbox.get_bounds()
-_mpl98_mpl_notify = lambda im,cb: cb.update_bruteforce(im)
-_mpl9x_mpl_notify = lambda im,cb: cb.notify(im)
-
-# This next function hurts, because it relies on the fact that we're
-# only differentiating between 0.9[01] and 0.98. And if happens to be
-# 1.0, or any version with only 3 values, this should catch it.
-
-try:
-    _mpl_version = float(matplotlib.__version__[:4])
-except:
-    _mpl_version = float(matplotlib.__version__[:3])
-
-if _mpl_version < 0.98:
-    _prefix = '_mpl9x'
-else:
-    _prefix = '_mpl98'
-
-for fn in _compatibility_functions:
-    exec("%s = %s_%s" % (fn, _prefix, fn))

diff -r dedf4c47220e9551cf8ce24f10c9259da92f4361 -r 21cedef7066b43a139336890244be2c47f5af0fa yt/visualization/base_plot_types.py
--- a/yt/visualization/base_plot_types.py
+++ b/yt/visualization/base_plot_types.py
@@ -15,8 +15,6 @@
 #-----------------------------------------------------------------------------
 from io import BytesIO
 import matplotlib
-from ._mpl_imports import \
-    FigureCanvasAgg, FigureCanvasPdf, FigureCanvasPS
 from yt.funcs import \
     get_image_suffix, \
     mylog, \
@@ -57,6 +55,8 @@
     """
     def __init__(self, fsize, axrect, figure, axes):
         """Initialize PlotMPL class"""
+        import matplotlib.figure
+        from ._mpl_imports import FigureCanvasAgg
         self._plot_valid = True
         if figure is None:
             self.figure = matplotlib.figure.Figure(figsize=fsize, frameon=True)
@@ -73,6 +73,8 @@
 
     def save(self, name, mpl_kwargs=None, canvas=None):
         """Choose backend and save image to disk"""
+        from ._mpl_imports import \
+            FigureCanvasAgg, FigureCanvasPdf, FigureCanvasPS
         if mpl_kwargs is None:
             mpl_kwargs = {}
         if 'papertype' not in mpl_kwargs:
@@ -144,6 +146,7 @@
             self.cb = self.figure.colorbar(self.image, self.cax)
 
     def _repr_png_(self):
+        from ._mpl_imports import FigureCanvasAgg
         canvas = FigureCanvasAgg(self.figure)
         f = BytesIO()
         canvas.print_figure(f)
@@ -315,6 +318,7 @@
     can be instructure, and is encouraged to see how to generate more
     complicated or more specific sets of multiplots for your own purposes.
     """
+    import matplotlib.figure
     hf, wf = 1.0/ny, 1.0/nx
     fudge_x = fudge_y = 1.0
     if colorbar is None:

diff -r dedf4c47220e9551cf8ce24f10c9259da92f4361 -r 21cedef7066b43a139336890244be2c47f5af0fa yt/visualization/eps_writer.py
--- a/yt/visualization/eps_writer.py
+++ b/yt/visualization/eps_writer.py
@@ -17,7 +17,6 @@
 import numpy as np
 from matplotlib import cm
 import matplotlib.pyplot as plt
-from ._mpl_imports import FigureCanvasAgg
 
 from yt.config import \
     ytcfg
@@ -509,7 +508,8 @@
         For best results, set use_colorbar=False when creating the yt
         image.
         """
-        
+        from ._mpl_imports import FigureCanvasAgg
+
         # We need to remove the colorbar (if necessary), remove the
         # axes, and resize the figure to span the entire figure
         force_square = False

diff -r dedf4c47220e9551cf8ce24f10c9259da92f4361 -r 21cedef7066b43a139336890244be2c47f5af0fa yt/visualization/image_writer.py
--- a/yt/visualization/image_writer.py
+++ b/yt/visualization/image_writer.py
@@ -368,7 +368,8 @@
     """
     if cmap_name is None:
         cmap_name = ytcfg.get("yt", "default_colormap")
-    import matplotlib
+    import matplotlib.figure
+    import matplotlib.colors
     from ._mpl_imports import FigureCanvasAgg, FigureCanvasPdf, FigureCanvasPS
 
     # If this is rendered as log, then apply now.

diff -r dedf4c47220e9551cf8ce24f10c9259da92f4361 -r 21cedef7066b43a139336890244be2c47f5af0fa yt/visualization/plot_container.py
--- a/yt/visualization/plot_container.py
+++ b/yt/visualization/plot_container.py
@@ -23,9 +23,7 @@
 
 from collections import defaultdict
 from functools import wraps
-from matplotlib.font_manager import FontProperties
 
-from ._mpl_imports import FigureCanvasAgg
 from .tick_locators import LogLocator, LinearLocator
 
 from yt.config import \
@@ -184,6 +182,8 @@
     _colorbar_valid = False
 
     def __init__(self, data_source, figure_size, fontsize):
+        from matplotlib.font_manager import FontProperties
+
         self.data_source = data_source
         if iterable(figure_size):
             self.figure_size = float(figure_size[0]), float(figure_size[1])
@@ -478,6 +478,8 @@
                           'weight':'bold', 'size':24, 'color':'blue'})
 
         """
+        from matplotlib.font_manager import FontProperties
+
         if font_dict is None:
             font_dict = {}
         if 'color' in font_dict:
@@ -589,6 +591,7 @@
 
     @validate_plot
     def _send_zmq(self):
+        from ._mpl_imports import FigureCanvasAgg
         try:
             # pre-IPython v1.0
             from IPython.zmq.pylab.backend_inline import send_figure as display

diff -r dedf4c47220e9551cf8ce24f10c9259da92f4361 -r 21cedef7066b43a139336890244be2c47f5af0fa yt/visualization/plot_modifications.py
--- a/yt/visualization/plot_modifications.py
+++ b/yt/visualization/plot_modifications.py
@@ -22,11 +22,6 @@
 
 from distutils.version import LooseVersion
 
-from matplotlib.patches import Circle
-from matplotlib.colors import colorConverter
-from matplotlib import cm
-from mpl_toolkits.axes_grid1.anchored_artists import AnchoredSizeBar
-
 from yt.config import \
     ytcfg
 from yt.funcs import \
@@ -561,6 +556,8 @@
         self.edgecolors = edgecolors
 
     def __call__(self, plot):
+        from matplotlib.colors import colorConverter
+
         x0, x1 = plot.xlim
         y0, y1 = plot.ylim
         xx0, xx1 = plot._axes.get_xlim()
@@ -1409,6 +1406,7 @@
         self.factor = factor
 
     def __call__(self, plot):
+        from matplotlib.patches import Circle
         data = plot.data
         x0, x1 = plot.xlim
         y0, y1 = plot.ylim
@@ -2020,6 +2018,8 @@
         self.text_args = text_args
 
     def __call__(self, plot):
+        from mpl_toolkits.axes_grid1.anchored_artists import AnchoredSizeBar
+
         # Callback only works for plots with axis ratios of 1
         xsize = plot.xlim[1] - plot.xlim[0]
         if plot.aspect != 1.0:
@@ -2312,6 +2312,7 @@
         self.const_alpha = const_alpha
 
     def __call__(self, plot):
+        from matplotlib import cm
         x0, x1 = plot.xlim
         y0, y1 = plot.ylim
         xx0, xx1 = plot._axes.get_xlim()

diff -r dedf4c47220e9551cf8ce24f10c9259da92f4361 -r 21cedef7066b43a139336890244be2c47f5af0fa yt/visualization/plot_window.py
--- a/yt/visualization/plot_window.py
+++ b/yt/visualization/plot_window.py
@@ -21,7 +21,6 @@
 import sys
 
 from distutils.version import LooseVersion
-from matplotlib.mathtext import MathTextParser
 from numbers import Number
 
 from .base_plot_types import ImagePlotMPL
@@ -687,6 +686,7 @@
         return xc, yc
 
     def _setup_plots(self):
+        from matplotlib.mathtext import MathTextParser
         if self._plot_valid:
             return
         if not self._data_valid:

diff -r dedf4c47220e9551cf8ce24f10c9259da92f4361 -r 21cedef7066b43a139336890244be2c47f5af0fa yt/visualization/profile_plotter.py
--- a/yt/visualization/profile_plotter.py
+++ b/yt/visualization/profile_plotter.py
@@ -38,15 +38,15 @@
 from yt.utilities.exceptions import \
     YTNotInsideNotebook
 from yt.utilities.logger import ytLogger as mylog
-from . import _mpl_imports as mpl
 from yt.funcs import \
     ensure_list, \
     get_image_suffix, \
     get_ipython_api_version
 
 def get_canvas(name):
+    from . import _mpl_imports as mpl
     suffix = get_image_suffix(name)
-    
+
     if suffix == '':
         suffix = '.png'
     if suffix == ".png":
@@ -65,7 +65,8 @@
         super(FigureContainer, self).__init__()
 
     def __missing__(self, key):
-        figure = mpl.matplotlib.figure.Figure((10, 8))
+        from matplotlib.figure import Figure
+        figure = Figure((10, 8))
         self[key] = figure
         return self[key]
 
@@ -314,6 +315,7 @@
     def _repr_html_(self):
         """Return an html representation of the plot object. Will display as a
         png for each WindowPlotMPL instance in self.plots"""
+        from . import _mpl_imports as mpl
         ret = ''
         unique = set(self.figures.values())
         if len(unique) < len(self.figures):

diff -r dedf4c47220e9551cf8ce24f10c9259da92f4361 -r 21cedef7066b43a139336890244be2c47f5af0fa yt/visualization/volume_rendering/interactive_vr_helpers.py
--- a/yt/visualization/volume_rendering/interactive_vr_helpers.py
+++ b/yt/visualization/volume_rendering/interactive_vr_helpers.py
@@ -17,7 +17,6 @@
 from yt.funcs import mylog
 from yt.data_objects.static_output import Dataset
 from yt.utilities.exceptions import YTSceneFieldNotFound
-from yt.utilities.on_demand_imports import NotAModule
 
 def _render_opengl(data_source, field=None, window_size=None, cam_position=None,
                    cam_focus=None):
@@ -52,6 +51,13 @@
 
     '''
 
+    try:
+        import cyglfw3  # NOQA
+        import OpenGL.GL  # NOQA
+    except ImportError:
+        raise ImportError("This functionality requires the cyglfw3 and PyOpenGL "
+                          "packages to be installed.")
+
     from .interactive_vr import SceneGraph, BlockCollection, TrackballCamera
     from .interactive_loop import RenderingContext
 
@@ -87,9 +93,4 @@
     rc.start_loop(scene, c)
 
 
-try:
-    import cyglfw3 as glfw  # NOQA
-    import OpenGL.GL as GL  # NOQA
-    interactive_render = _render_opengl
-except ImportError:
-    interactive_render = NotAModule("opengl/cyglfw3")
+interactive_render = _render_opengl

diff -r dedf4c47220e9551cf8ce24f10c9259da92f4361 -r 21cedef7066b43a139336890244be2c47f5af0fa yt/visualization/volume_rendering/transfer_function_helper.py
--- a/yt/visualization/volume_rendering/transfer_function_helper.py
+++ b/yt/visualization/volume_rendering/transfer_function_helper.py
@@ -18,8 +18,6 @@
 from yt.data_objects.profiles import create_profile
 from yt.visualization.volume_rendering.transfer_functions import \
     ColorTransferFunction
-from yt.visualization._mpl_imports import FigureCanvasAgg
-from matplotlib.figure import Figure
 from yt.extern.six import BytesIO
 import numpy as np
 
@@ -160,6 +158,8 @@
         If fn is None, will return an image to an IPython notebook.
 
         """
+        from yt.visualization._mpl_imports import FigureCanvasAgg
+        from matplotlib.figure import Figure
         if self.tf is None:
             self.build_transfer_function()
         tf = self.tf

Repository URL: https://bitbucket.org/yt_analysis/yt/

--

This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.spacepope.org/pipermail/yt-svn-spacepope.org/attachments/20160504/8e4dbf1d/attachment.html>


More information about the yt-svn mailing list