[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