[yt-svn] commit/yt: 10 new changesets

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


10 new commits in yt:

https://bitbucket.org/yt_analysis/yt/commits/5efa040e141e/
Changeset:   5efa040e141e
Branch:      yt
User:        ngoldbaum
Date:        2016-04-25 18:00:20+00:00
Summary:     imports: move import of cyglfw3 and OpenGL.GL out of the top-level imports
Affected #:  1 file

diff -r 77db965d0a537a9884d6db3c5ad7595dc3070ba0 -r 5efa040e141e784ac1388d2e3ab84389fcc6046b 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


https://bitbucket.org/yt_analysis/yt/commits/b1775d48b52b/
Changeset:   b1775d48b52b
Branch:      yt
User:        ngoldbaum
Date:        2016-04-25 18:02:11+00:00
Summary:     imports: avoid importing nose at the top level in yt.testing

This requires copying a bit of boilerplate from nose so we can define two
assert functions used in yt that we've gotten from nose until now. These imports
are just API shims on top of unittest.TestCase member functions, so we build
the necessary shims ourselves.
Affected #:  1 file

diff -r 5efa040e141e784ac1388d2e3ab84389fcc6046b -r b1775d48b52bbf04e55fac3305ca34a8c5d5f35d yt/testing.py
--- a/yt/testing.py
+++ b/yt/testing.py
@@ -20,6 +20,8 @@
 import numpy as np
 import importlib
 import os
+import re
+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 +33,23 @@
 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 unittest import TestCase
 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!


https://bitbucket.org/yt_analysis/yt/commits/4a5cd8d0b35e/
Changeset:   4a5cd8d0b35e
Branch:      yt
User:        ngoldbaum
Date:        2016-04-25 18:03:58+00:00
Summary:     imports: avoid importing requests at the top level
Affected #:  4 files

diff -r b1775d48b52bbf04e55fac3305ca34a8c5d5f35d -r 4a5cd8d0b35e0f69636b04fa30b360b3e8558f6f 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 b1775d48b52bbf04e55fac3305ca34a8c5d5f35d -r 4a5cd8d0b35e0f69636b04fa30b360b3e8558f6f 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 b1775d48b52bbf04e55fac3305ca34a8c5d5f35d -r 4a5cd8d0b35e0f69636b04fa30b360b3e8558f6f 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 b1775d48b52bbf04e55fac3305ca34a8c5d5f35d -r 4a5cd8d0b35e0f69636b04fa30b360b3e8558f6f 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


https://bitbucket.org/yt_analysis/yt/commits/cfb40c8cf1e9/
Changeset:   cfb40c8cf1e9
Branch:      yt
User:        ngoldbaum
Date:        2016-04-25 18:04:30+00:00
Summary:     imports: avoid importing thingking at the top level
Affected #:  1 file

diff -r 4a5cd8d0b35e0f69636b04fa30b360b3e8558f6f -r cfb40c8cf1e9e14c53542c69652618290f7395a3 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:


https://bitbucket.org/yt_analysis/yt/commits/ad98aa4cf655/
Changeset:   ad98aa4cf655
Branch:      yt
User:        ngoldbaum
Date:        2016-04-25 18:05:06+00:00
Summary:     plotting: remove shim code for ancient matplotlib versions.

matplotlib 0.98 was released in 2008. We don't need to maintain compatibility
with versions this old
Affected #:  1 file

diff -r cfb40c8cf1e9e14c53542c69652618290f7395a3 -r ad98aa4cf655fed362f593dfd67b7759dafa4ea4 yt/visualization/_mpl_imports.py
--- a/yt/visualization/_mpl_imports.py
+++ b/yt/visualization/_mpl_imports.py
@@ -19,33 +19,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))


https://bitbucket.org/yt_analysis/yt/commits/a412ed373902/
Changeset:   a412ed373902
Branch:      yt
User:        ngoldbaum
Date:        2016-04-25 18:06:35+00:00
Summary:     plotting: remove unused imports in _mpl_imports
Affected #:  1 file

diff -r ad98aa4cf655fed362f593dfd67b7759dafa4ea4 -r a412ed373902a47f9cd03556bc0064a1c83b1d7d 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
 


https://bitbucket.org/yt_analysis/yt/commits/f7881eb5c1eb/
Changeset:   f7881eb5c1eb
Branch:      yt
User:        ngoldbaum
Date:        2016-04-25 18:07:52+00:00
Summary:     imports: avoid importing from matplotlib internals at the top level
Affected #:  8 files

diff -r a412ed373902a47f9cd03556bc0064a1c83b1d7d -r f7881eb5c1eb4a10c6596d338100cd4ee3ccc36e 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 a412ed373902a47f9cd03556bc0064a1c83b1d7d -r f7881eb5c1eb4a10c6596d338100cd4ee3ccc36e 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,7 @@
     """
     def __init__(self, fsize, axrect, figure, axes):
         """Initialize PlotMPL class"""
+        from ._mpl_imports import FigureCanvasAgg
         self._plot_valid = True
         if figure is None:
             self.figure = matplotlib.figure.Figure(figsize=fsize, frameon=True)
@@ -73,6 +72,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 +145,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)

diff -r a412ed373902a47f9cd03556bc0064a1c83b1d7d -r f7881eb5c1eb4a10c6596d338100cd4ee3ccc36e 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 a412ed373902a47f9cd03556bc0064a1c83b1d7d -r f7881eb5c1eb4a10c6596d338100cd4ee3ccc36e 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 a412ed373902a47f9cd03556bc0064a1c83b1d7d -r f7881eb5c1eb4a10c6596d338100cd4ee3ccc36e 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:

diff -r a412ed373902a47f9cd03556bc0064a1c83b1d7d -r f7881eb5c1eb4a10c6596d338100cd4ee3ccc36e 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

diff -r a412ed373902a47f9cd03556bc0064a1c83b1d7d -r f7881eb5c1eb4a10c6596d338100cd4ee3ccc36e 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,7 @@
         super(FigureContainer, self).__init__()
 
     def __missing__(self, key):
-        figure = mpl.matplotlib.figure.Figure((10, 8))
+        figure = matplotlib.figure.Figure((10, 8))
         self[key] = figure
         return self[key]
 
@@ -309,6 +309,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 a412ed373902a47f9cd03556bc0064a1c83b1d7d -r f7881eb5c1eb4a10c6596d338100cd4ee3ccc36e 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


https://bitbucket.org/yt_analysis/yt/commits/3e758589616e/
Changeset:   3e758589616e
Branch:      yt
User:        ngoldbaum
Date:        2016-04-25 18:43:48+00:00
Summary:     Fix errors detected by flake8
Affected #:  3 files

diff -r f7881eb5c1eb4a10c6596d338100cd4ee3ccc36e -r 3e758589616ef58345a4ada26710b8c7a9f83478 yt/testing.py
--- a/yt/testing.py
+++ b/yt/testing.py
@@ -20,7 +20,6 @@
 import numpy as np
 import importlib
 import os
-import re
 import unittest
 from yt.funcs import iterable
 from yt.config import ytcfg
@@ -33,7 +32,6 @@
 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
-from unittest import TestCase
 from yt.convenience import load
 from yt.units.yt_array import YTArray, YTQuantity
 from yt.utilities.exceptions import YTUnitOperationError

diff -r f7881eb5c1eb4a10c6596d338100cd4ee3ccc36e -r 3e758589616ef58345a4ada26710b8c7a9f83478 yt/visualization/plot_modifications.py
--- a/yt/visualization/plot_modifications.py
+++ b/yt/visualization/plot_modifications.py
@@ -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 f7881eb5c1eb4a10c6596d338100cd4ee3ccc36e -r 3e758589616ef58345a4ada26710b8c7a9f83478 yt/visualization/plot_window.py
--- a/yt/visualization/plot_window.py
+++ b/yt/visualization/plot_window.py
@@ -686,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:


https://bitbucket.org/yt_analysis/yt/commits/b7e1465db7f8/
Changeset:   b7e1465db7f8
Branch:      yt
User:        ngoldbaum
Date:        2016-04-26 16:53:23+00:00
Summary:     Ensure matplotlib.figure namespace is imported in a few places
Affected #:  3 files

diff -r 3e758589616ef58345a4ada26710b8c7a9f83478 -r b7e1465db7f84736f15f947b0c716794cee53dc2 yt/visualization/base_plot_types.py
--- a/yt/visualization/base_plot_types.py
+++ b/yt/visualization/base_plot_types.py
@@ -55,6 +55,7 @@
     """
     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:
@@ -317,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 3e758589616ef58345a4ada26710b8c7a9f83478 -r b7e1465db7f84736f15f947b0c716794cee53dc2 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 3e758589616ef58345a4ada26710b8c7a9f83478 -r b7e1465db7f84736f15f947b0c716794cee53dc2 yt/visualization/profile_plotter.py
--- a/yt/visualization/profile_plotter.py
+++ b/yt/visualization/profile_plotter.py
@@ -65,7 +65,8 @@
         super(FigureContainer, self).__init__()
 
     def __missing__(self, key):
-        figure = matplotlib.figure.Figure((10, 8))
+        from matplotlib.figure import Figure
+        figure = Figure((10, 8))
         self[key] = figure
         return self[key]
 


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/38e2fc05/attachment.html>


More information about the yt-svn mailing list