diff --git a/chaco/__init__.py b/chaco/__init__.py index 289c10037..044dcf939 100644 --- a/chaco/__init__.py +++ b/chaco/__init__.py @@ -7,4 +7,5 @@ __requires__ = [ 'enable', + 'six' ] diff --git a/chaco/abstract_colormap.py b/chaco/abstract_colormap.py index 2167eb582..fb54f1316 100644 --- a/chaco/abstract_colormap.py +++ b/chaco/abstract_colormap.py @@ -2,7 +2,7 @@ """ from traits.api import Enum, Event, HasTraits, Instance -from data_range_1d import DataRange1D +from .data_range_1d import DataRange1D class AbstractColormap(HasTraits): """ diff --git a/chaco/abstract_data_range.py b/chaco/abstract_data_range.py index 9feca20d6..d880f4ee9 100644 --- a/chaco/abstract_data_range.py +++ b/chaco/abstract_data_range.py @@ -6,7 +6,7 @@ from traits.api import Event, Float, HasTraits, Instance, List, Trait # Local relative imports -from abstract_data_source import AbstractDataSource +from .abstract_data_source import AbstractDataSource class AbstractDataRange(HasTraits): diff --git a/chaco/abstract_data_source.py b/chaco/abstract_data_source.py index 706c68ca1..39db59333 100644 --- a/chaco/abstract_data_source.py +++ b/chaco/abstract_data_source.py @@ -5,7 +5,7 @@ from traits.api import Bool, Dict, Event, HasTraits # Local relative imports -from base import DimensionTrait +from .base import DimensionTrait class AbstractDataSource(HasTraits): """ This abstract interface must be implemented by any class supplying data @@ -124,7 +124,7 @@ def __getstate__(self): # everything but 'metadata' for key in ['value_dimension', 'index_dimension', 'persist_data']: - if state.has_key(key): + if key in state: del state[key] return state diff --git a/chaco/abstract_mapper.py b/chaco/abstract_mapper.py index 1161cdf24..bd4204d9d 100644 --- a/chaco/abstract_mapper.py +++ b/chaco/abstract_mapper.py @@ -55,7 +55,7 @@ def map_data_array(self, screen_vals): def __getstate__(self): state = super(AbstractMapper,self).__getstate__() for key in ['_cache_valid']: - if state.has_key(key): + if key in state: del state[key] return state diff --git a/chaco/abstract_overlay.py b/chaco/abstract_overlay.py index 5be969c37..64046ae60 100644 --- a/chaco/abstract_overlay.py +++ b/chaco/abstract_overlay.py @@ -7,7 +7,7 @@ from enable.api import Component from traits.api import Instance -from plot_component import PlotComponent +from .plot_component import PlotComponent class AbstractOverlay(PlotComponent): diff --git a/chaco/abstract_plot_renderer.py b/chaco/abstract_plot_renderer.py index 6aef11858..c15a3cdd4 100644 --- a/chaco/abstract_plot_renderer.py +++ b/chaco/abstract_plot_renderer.py @@ -4,7 +4,7 @@ from traits.api import Enum # Local relative imports -from plot_component import PlotComponent +from .plot_component import PlotComponent class AbstractPlotRenderer(PlotComponent): """ This is the minimal interface that all plot renderers must support. diff --git a/chaco/api.py b/chaco/api.py index a9aaf352e..5d8ea3401 100644 --- a/chaco/api.py +++ b/chaco/api.py @@ -3,113 +3,113 @@ # This just imports the key datamodel classes into the top-level package # namespace for convenience. -from base import NumericalSequenceTrait, PointTrait, ImageTrait, DimensionTrait, \ +from .base import NumericalSequenceTrait, PointTrait, ImageTrait, DimensionTrait, \ SortOrderTrait, bin_search, reverse_map_1d, right_shift, \ left_shift, sort_points, find_runs, arg_find_runs, \ point_line_distance # Data model -from abstract_data_source import AbstractDataSource -from array_data_source import ArrayDataSource -from grid_data_source import GridDataSource -from image_data import ImageData -from multi_array_data_source import MultiArrayDataSource -from point_data_source import PointDataSource -from abstract_data_range import AbstractDataRange -from base_data_range import BaseDataRange -from data_range_1d import DataRange1D -from data_range_2d import DataRange2D +from .abstract_data_source import AbstractDataSource +from .array_data_source import ArrayDataSource +from .grid_data_source import GridDataSource +from .image_data import ImageData +from .multi_array_data_source import MultiArrayDataSource +from .point_data_source import PointDataSource +from .abstract_data_range import AbstractDataRange +from .base_data_range import BaseDataRange +from .data_range_1d import DataRange1D +from .data_range_2d import DataRange2D # Mappers -from abstract_mapper import AbstractMapper -from base_1d_mapper import Base1DMapper -from grid_mapper import GridMapper -from log_mapper import LogMapper -from linear_mapper import LinearMapper -from color_mapper import ColorMapper, ColorMapTemplate -from discrete_color_mapper import DiscreteColorMapper -from transform_color_mapper import TransformColorMapper +from .abstract_mapper import AbstractMapper +from .base_1d_mapper import Base1DMapper +from .grid_mapper import GridMapper +from .log_mapper import LogMapper +from .linear_mapper import LinearMapper +from .color_mapper import ColorMapper, ColorMapTemplate +from .discrete_color_mapper import DiscreteColorMapper +from .transform_color_mapper import TransformColorMapper # Colormaps and color palettes -from default_colormaps import * -from default_colors import * +from .default_colormaps import * +from .default_colors import * # Visual components -from abstract_plot_renderer import AbstractPlotRenderer -from abstract_overlay import AbstractOverlay -from base_plot_container import BasePlotContainer -from base_plot_frame import BasePlotFrame -from cross_plot_frame import CrossPlotFrame -from data_view import DataView -from simple_plot_frame import SimplePlotFrame -from plot_component import PlotComponent -from plot_graphics_context import PlotGraphicsContext, PlotGraphicsContextMixin -from selectable_overlay_container import SelectableOverlayPlotContainer -from plot_containers import OverlayPlotContainer, HPlotContainer, VPlotContainer, \ +from .abstract_plot_renderer import AbstractPlotRenderer +from .abstract_overlay import AbstractOverlay +from .base_plot_container import BasePlotContainer +from .base_plot_frame import BasePlotFrame +from .cross_plot_frame import CrossPlotFrame +from .data_view import DataView +from .simple_plot_frame import SimplePlotFrame +from .plot_component import PlotComponent +from .plot_graphics_context import PlotGraphicsContext, PlotGraphicsContextMixin +from .selectable_overlay_container import SelectableOverlayPlotContainer +from .plot_containers import OverlayPlotContainer, HPlotContainer, VPlotContainer, \ GridPlotContainer GridContainer = GridPlotContainer -from label import Label -from plot_label import PlotLabel -from legend import Legend -from tooltip import ToolTip -from data_label import DataLabel -from lasso_overlay import LassoOverlay -from color_bar import ColorBar -from text_box_overlay import TextBoxOverlay -from scatter_inspector_overlay import ScatterInspectorOverlay +from .label import Label +from .plot_label import PlotLabel +from .legend import Legend +from .tooltip import ToolTip +from .data_label import DataLabel +from .lasso_overlay import LassoOverlay +from .color_bar import ColorBar +from .text_box_overlay import TextBoxOverlay +from .scatter_inspector_overlay import ScatterInspectorOverlay # Renderers -from barplot import BarPlot -from base_1d_plot import Base1DPlot -from base_2d_plot import Base2DPlot -from base_xy_plot import BaseXYPlot -from scatterplot import ScatterPlot, render_markers -from image_plot import ImagePlot -from cmap_image_plot import CMapImagePlot -from contour_line_plot import ContourLinePlot -from contour_poly_plot import ContourPolyPlot -from lineplot import LinePlot -from colormapped_scatterplot import ColormappedScatterPlot -from colormapped_selection_overlay import ColormappedSelectionOverlay -from polygon_plot import PolygonPlot -from errorbar_plot import ErrorBarPlot -from filled_line_plot import FilledLinePlot -from quiverplot import QuiverPlot -from candle_plot import CandlePlot -from multi_line_plot import MultiLinePlot -from jitterplot import JitterPlot -from variable_size_scatterplot import VariableSizeScatterPlot -from horizon_plot import BandedMapper, HorizonPlot -from scatterplot_1d import ScatterPlot1D -from line_scatterplot_1d import LineScatterPlot1D -from text_plot_1d import TextPlot1D +from .barplot import BarPlot +from .base_1d_plot import Base1DPlot +from .base_2d_plot import Base2DPlot +from .base_xy_plot import BaseXYPlot +from .scatterplot import ScatterPlot, render_markers +from .image_plot import ImagePlot +from .cmap_image_plot import CMapImagePlot +from .contour_line_plot import ContourLinePlot +from .contour_poly_plot import ContourPolyPlot +from .lineplot import LinePlot +from .colormapped_scatterplot import ColormappedScatterPlot +from .colormapped_selection_overlay import ColormappedSelectionOverlay +from .polygon_plot import PolygonPlot +from .errorbar_plot import ErrorBarPlot +from .filled_line_plot import FilledLinePlot +from .quiverplot import QuiverPlot +from .candle_plot import CandlePlot +from .multi_line_plot import MultiLinePlot +from .jitterplot import JitterPlot +from .variable_size_scatterplot import VariableSizeScatterPlot +from .horizon_plot import BandedMapper, HorizonPlot +from .scatterplot_1d import ScatterPlot1D +from .line_scatterplot_1d import LineScatterPlot1D +from .text_plot_1d import TextPlot1D # Plot factories -from plot_factory import create_bar_plot, create_line_plot, create_scatter_plot, \ +from .plot_factory import create_bar_plot, create_line_plot, create_scatter_plot, \ create_polar_plot, add_default_axes, add_default_grids -from abstract_plot_data import AbstractPlotData -from array_plot_data import ArrayPlotData -from data_frame_plot_data import DataFramePlotData -from plot import Plot -from toolbar_plot import ToolbarPlot +from .abstract_plot_data import AbstractPlotData +from .array_plot_data import ArrayPlotData +from .data_frame_plot_data import DataFramePlotData +from .plot import Plot +from .toolbar_plot import ToolbarPlot # Axis -from axis import PlotAxis, MinorPlotAxis -from label_axis import LabelAxis -from ticks import AbstractTickGenerator, DefaultTickGenerator, auto_ticks, auto_interval, \ +from .axis import PlotAxis, MinorPlotAxis +from .label_axis import LabelAxis +from .ticks import AbstractTickGenerator, DefaultTickGenerator, auto_ticks, auto_interval, \ tick_intervals, log_auto_ticks, auto_bounds, calc_bound # Grid -from grid import PlotGrid +from .grid import PlotGrid # Style stuff #from stylable import Stylable #from stylesheets import Style, StyleSheet # Tools -from abstract_controller import AbstractController +from .abstract_controller import AbstractController # Importing various symbols into the Chaco namespace for backwards # compatibility. New code should directly import from Enable. diff --git a/chaco/array_data_source.py b/chaco/array_data_source.py index f61a99821..14340c6f7 100644 --- a/chaco/array_data_source.py +++ b/chaco/array_data_source.py @@ -8,8 +8,8 @@ from traits.api import Any, Constant, Int, Tuple # Chaco imports -from base import NumericalSequenceTrait, reverse_map_1d, SortOrderTrait -from abstract_data_source import AbstractDataSource +from .base import NumericalSequenceTrait, reverse_map_1d, SortOrderTrait +from .abstract_data_source import AbstractDataSource def bounded_nanargmin(arr): diff --git a/chaco/array_plot_data.py b/chaco/array_plot_data.py index a134f604a..c487adec8 100644 --- a/chaco/array_plot_data.py +++ b/chaco/array_plot_data.py @@ -1,6 +1,7 @@ """ Defines ArrayPlotData. """ - +import six +import six.moves as sm from numpy import array, ndarray # Enthought library imports @@ -62,7 +63,7 @@ def __init__(self, *data, **kw): """ super(AbstractPlotData, self).__init__() self._update_data(kw) - data = dict(zip(self._generate_names(len(data)), data)) + data = dict(sm.zip(self._generate_names(len(data)), data)) self._update_data(data) @@ -73,7 +74,7 @@ def __init__(self, *data, **kw): def list_data(self): """ Returns a list of the names of the arrays managed by this instance. """ - return self.arrays.keys() + return list(self.arrays.keys()) def get_data(self, name): @@ -189,7 +190,7 @@ def _update_data(self, data): """ # note that this call modifies data, but that's OK since the callers # all create the dictionary that they pass in - for name, value in data.items(): + for name, value in list(data.items()): if not isinstance(value, (ndarray, AbstractDataSource)): data[name] = array(value) else: diff --git a/chaco/axis.py b/chaco/axis.py index f9699a1c2..aaffaf732 100644 --- a/chaco/axis.py +++ b/chaco/axis.py @@ -14,11 +14,11 @@ Bool, Event, List, Array, Instance, Enum, Callable, ArrayOrNone # Local relative imports -from ticks import AbstractTickGenerator, DefaultTickGenerator, MinorTickGenerator -from abstract_mapper import AbstractMapper -from abstract_overlay import AbstractOverlay -from label import Label -from log_mapper import LogMapper +from .ticks import AbstractTickGenerator, DefaultTickGenerator, MinorTickGenerator +from .abstract_mapper import AbstractMapper +from .abstract_overlay import AbstractOverlay +from .label import Label +from .log_mapper import LogMapper def DEFAULT_TICK_FORMATTER(val): @@ -196,7 +196,7 @@ def traits_view(self): called automatically be the Traits framework when .edit_traits() is invoked. """ - from axis_view import AxisView + from .axis_view import AxisView return AxisView @@ -463,7 +463,7 @@ def _compute_tick_positions(self, gc, overlay_component=None): return if datalow > datahigh: - raise RuntimeError, "DataRange low is greater than high; unable to compute axis ticks." + raise RuntimeError("DataRange low is greater than high; unable to compute axis ticks.") if not self.tick_generator: return @@ -793,7 +793,7 @@ def __getstate__(self): state = super(PlotAxis,self).__getstate__() for key in dont_pickle: - if state.has_key(key): + if key in state: del state[key] return state @@ -811,7 +811,7 @@ class MinorPlotAxis(PlotAxis): The MinorPlotAxis is a PlotAxis which draws ticks with a smaller interval, smaller tick sizes, and no tick labels. """ - + def __init__(self, *args, **kwargs): super(MinorPlotAxis, self).__init__(*args, **kwargs) diff --git a/chaco/axis_view.py b/chaco/axis_view.py index 6c287dadc..07e0d91f4 100644 --- a/chaco/axis_view.py +++ b/chaco/axis_view.py @@ -1,5 +1,7 @@ """ Defines the Traits UI view for a PlotAxis """ +import six + from traits.api import TraitError from traitsui.api import View, HGroup, Group, VGroup, Item, TextEditor @@ -12,9 +14,9 @@ def float_or_auto(val): try: return float(val) except: - if isinstance(val, basestring) and val == "auto": + if isinstance(val, six.string_types) and val == "auto": return val - raise TraitError, "Tick interval must be a number or 'auto'." + raise TraitError("Tick interval must be a number or 'auto'.") # Traits UI for a PlotAxis. AxisView = View(VGroup( diff --git a/chaco/barplot.py b/chaco/barplot.py index 40bf7a053..570d918eb 100644 --- a/chaco/barplot.py +++ b/chaco/barplot.py @@ -12,10 +12,10 @@ from kiva.constants import FILL_STROKE # Local relative imports -from chaco.abstract_plot_renderer import AbstractPlotRenderer -from abstract_mapper import AbstractMapper -from array_data_source import ArrayDataSource -from base import reverse_map_1d +from .abstract_plot_renderer import AbstractPlotRenderer +from .abstract_mapper import AbstractMapper +from .array_data_source import ArrayDataSource +from .base import reverse_map_1d logger = logging.getLogger(__name__) diff --git a/chaco/base.py b/chaco/base.py index 3a4603360..3c9a96931 100644 --- a/chaco/base.py +++ b/chaco/base.py @@ -55,7 +55,7 @@ def n_gon(center, r, nsides, rot_degrees=0): rotation about the center may be specified with *rot_degrees*. """ if nsides < 3: - raise ValueError, 'Must have at least 3 sides in a polygon' + raise ValueError('Must have at least 3 sides in a polygon') rotation = radians(rot_degrees) theta = (pi * 2) / nsides return [poly_point(center, r, i*theta+rotation) for i in range(nsides)] @@ -122,10 +122,10 @@ def reverse_map_1d(data, pt, sort_order, floor_only=False): elif sort_order == "descending": ndx = bin_search(data, pt, -1) else: - raise NotImplementedError, "reverse_map_1d() requires a sorted array" + raise NotImplementedError("reverse_map_1d() requires a sorted array") if ndx == -1: - raise IndexError, "value outside array data range" + raise IndexError("value outside array data range") # Now round the index to the closest matching index. Do this @@ -175,7 +175,7 @@ def sort_points(points, index=0): on their x-coordinate. """ if points.ndim != 2: - raise RuntimeError, "sort_points(): Array of wrong shape." + raise RuntimeError("sort_points(): Array of wrong shape.") return points[argsort(points[:, index]), :] diff --git a/chaco/base_1d_mapper.py b/chaco/base_1d_mapper.py index be5ee4417..b269a52ae 100644 --- a/chaco/base_1d_mapper.py +++ b/chaco/base_1d_mapper.py @@ -4,8 +4,8 @@ from traits.api import Bool, Instance, Float, Property # Local relative imports -from abstract_mapper import AbstractMapper -from data_range_1d import DataRange1D +from .abstract_mapper import AbstractMapper +from .data_range_1d import DataRange1D class Base1DMapper(AbstractMapper): diff --git a/chaco/base_2d_plot.py b/chaco/base_2d_plot.py index f53bbc678..c15fc117e 100644 --- a/chaco/base_2d_plot.py +++ b/chaco/base_2d_plot.py @@ -7,12 +7,12 @@ from traits.api import Enum, Event, Instance, Property, Range, Trait # Local relative imports -from abstract_plot_renderer import AbstractPlotRenderer -from base import reverse_map_1d -from plot_label import PlotLabel -from grid_data_source import GridDataSource -from grid_mapper import GridMapper -from image_data import ImageData +from .abstract_plot_renderer import AbstractPlotRenderer +from .base import reverse_map_1d +from .plot_label import PlotLabel +from .grid_data_source import GridDataSource +from .grid_mapper import GridMapper +from .image_data import ImageData class Base2DPlot(AbstractPlotRenderer): @@ -155,7 +155,7 @@ def map_index(self, screen_pt, threshold=2.0, try: x_ndx = reverse_map_1d(x_data, x_pt, self.index.sort_order[0], floor_only=True) - except IndexError, e: + except IndexError as e: if outside_returns_none: return None, None @@ -168,7 +168,7 @@ def map_index(self, screen_pt, threshold=2.0, try: y_ndx = reverse_map_1d(y_data, y_pt, self.index.sort_order[1], floor_only=True) - except IndexError, e: + except IndexError as e: if outside_returns_none: return None, None diff --git a/chaco/base_candle_plot.py b/chaco/base_candle_plot.py index 1325a35a6..5aa7454ba 100644 --- a/chaco/base_candle_plot.py +++ b/chaco/base_candle_plot.py @@ -9,7 +9,7 @@ from traits.api import Bool, Float, Int, List, Property, Trait # Chaco imports -from base_xy_plot import BaseXYPlot +from .base_xy_plot import BaseXYPlot # TODO: allow to set the width of the bar diff --git a/chaco/base_contour_plot.py b/chaco/base_contour_plot.py index c1827c11a..4530708f7 100644 --- a/chaco/base_contour_plot.py +++ b/chaco/base_contour_plot.py @@ -1,3 +1,4 @@ +import six from numpy import array, isscalar, issubsctype, linspace, number @@ -7,8 +8,8 @@ Range, Str, Trait, Tuple # Local relative imports -from base_2d_plot import Base2DPlot -from color_mapper import ColorMapper +from .base_2d_plot import Base2DPlot +from .color_mapper import ColorMapper class BaseContourPlot(Base2DPlot): @@ -100,7 +101,7 @@ def _update_colors(self, numcolors=None): self._colors = [self._color_map_trait_] * numcolors # If we are given a single color, apply it to all levels - elif isinstance(colors, basestring): + elif isinstance(colors, six.string_types): self._color_map_trait = colors self._colors = [self._color_map_trait_] * numcolors diff --git a/chaco/base_data_range.py b/chaco/base_data_range.py index 83ac7c2d5..242d4ba97 100644 --- a/chaco/base_data_range.py +++ b/chaco/base_data_range.py @@ -3,7 +3,7 @@ """ # Local relative imports -from abstract_data_range import AbstractDataRange +from .abstract_data_range import AbstractDataRange class BaseDataRange(AbstractDataRange): diff --git a/chaco/base_plot_container.py b/chaco/base_plot_container.py index b878be03c..c2fd15e2f 100644 --- a/chaco/base_plot_container.py +++ b/chaco/base_plot_container.py @@ -7,7 +7,7 @@ from traits.api import Bool, Instance, Property, Str, Tuple # Local, relative imports -from plot_component import DEFAULT_DRAWING_ORDER, PlotComponent +from .plot_component import DEFAULT_DRAWING_ORDER, PlotComponent class BasePlotContainer(Container): diff --git a/chaco/base_plot_frame.py b/chaco/base_plot_frame.py index 14f513d17..97b884ddf 100644 --- a/chaco/base_plot_frame.py +++ b/chaco/base_plot_frame.py @@ -10,12 +10,14 @@ from __future__ import with_statement +import six +import six.moves as sm # Enthought library imports from enable.api import Container from traits.api import Enum # Local, relative imports -from plot_component import PlotComponent, DEFAULT_DRAWING_ORDER +from .plot_component import PlotComponent, DEFAULT_DRAWING_ORDER class BasePlotFrame(Container, PlotComponent): @@ -62,7 +64,7 @@ def set_slot(self, slotname, container): """ Sets the named slot to use the given container. *container* can be None. """ - if self._frame_slots.has_key(slotname): + if slotname in self._frame_slots: old_container = self._frame_slots[slotname] Container.remove(self, old_container) if container is not None: @@ -150,8 +152,8 @@ def __getattr__(self, name): if name in self.slot_names: return self._frame_slots[name] else: - raise AttributeError, "'%s' object has no attribute '%s'" % \ - (self.__class__.__name__, name) + raise AttributeError("'%s' object has no attribute '%s'" % \ + (self.__class__.__name__, name)) def __setattr__(self, name, value): if name in self.slot_names: diff --git a/chaco/base_xy_plot.py b/chaco/base_xy_plot.py index 0fd95784e..183931a4d 100644 --- a/chaco/base_xy_plot.py +++ b/chaco/base_xy_plot.py @@ -13,14 +13,14 @@ # Local relative imports -from abstract_mapper import AbstractMapper -from abstract_plot_renderer import AbstractPlotRenderer -from abstract_data_source import AbstractDataSource -from array_data_source import ArrayDataSource -from axis import PlotAxis -from base import point_line_distance, reverse_map_1d -from grid import PlotGrid -from plot_label import PlotLabel +from .abstract_mapper import AbstractMapper +from .abstract_plot_renderer import AbstractPlotRenderer +from .abstract_data_source import AbstractDataSource +from .array_data_source import ArrayDataSource +from .axis import PlotAxis +from .base import point_line_distance, reverse_map_1d +from .grid import PlotGrid +from .plot_label import PlotLabel class BaseXYPlot(AbstractPlotRenderer): @@ -720,7 +720,7 @@ def __getstate__(self): state = super(BaseXYPlot,self).__getstate__() for key in ['_cache_valid', '_cached_data_pts', '_screen_cache_valid', '_cached_screen_pts']: - if state.has_key(key): + if key in state: del state[key] return state diff --git a/chaco/candle_plot.py b/chaco/candle_plot.py index cdeaf75e0..ce2f1cf3b 100644 --- a/chaco/candle_plot.py +++ b/chaco/candle_plot.py @@ -8,8 +8,8 @@ from traits.api import Instance, Property # Chaco imports -from abstract_data_source import AbstractDataSource -from base_candle_plot import BaseCandlePlot +from .abstract_data_source import AbstractDataSource +from .base_candle_plot import BaseCandlePlot def broaden(mask): """ Takes a 1D boolean mask array and returns a copy with all the non-zero diff --git a/chaco/chaco_plot_editor.py b/chaco/chaco_plot_editor.py index 6c7c6c775..49fd2ae35 100644 --- a/chaco/chaco_plot_editor.py +++ b/chaco/chaco_plot_editor.py @@ -2,7 +2,8 @@ Traits UI editor for WX, based on the Chaco1 PlotEditor in traits.ui.wx.plot_editor. """ - +import six +import six.moves as sm # Enthought library imports from traits.etsconfig.api import ETSConfig from enable.api import black_color_trait, LineStyle, ColorTrait,\ @@ -19,14 +20,14 @@ Editor = toolkit_object('editor:Editor') # Local relative imports -from axis import PlotAxis -from plot_containers import OverlayPlotContainer -from plot_factory import create_line_plot, create_scatter_plot, \ +from .axis import PlotAxis +from .plot_containers import OverlayPlotContainer +from .plot_factory import create_line_plot, create_scatter_plot, \ add_default_grids, add_default_axes -from plot_label import PlotLabel +from .plot_label import PlotLabel # Somewhat unorthodox... -from chaco.tools.api import PanTool, ZoomTool +from .tools.api import PanTool, ZoomTool #------------------------------------------------------------------------------- # Trait definitions: @@ -329,13 +330,13 @@ def update_editor(self): plot_creator_map = { "line": self._create_line_plot, "scatter": self._create_scatter_plot } - if plot_type in plot_creator_map.keys(): + if plot_type in plot_creator_map: plot = plot_creator_map[plot_type](plotitem, (x_values, y_values), index_bounds = index_bounds, value_bounds = value_bounds, orientation = plotitem.orientation) else: - raise RuntimeError, "Unknown plot type '%s' in ChacoPlotEditor." % plot_type + raise RuntimeError("Unknown plot type '%s' in ChacoPlotEditor." % plot_type) self._set_basic_properties(plot, plotitem) diff --git a/chaco/cmap_image_plot.py b/chaco/cmap_image_plot.py index 88ae8b811..8a8ec9386 100644 --- a/chaco/cmap_image_plot.py +++ b/chaco/cmap_image_plot.py @@ -12,9 +12,9 @@ from traits.api import Any, Bool, Float, Instance, Property, Tuple # Local relative imports -from image_plot import ImagePlot -from abstract_colormap import AbstractColormap -from speedups import apply_selection_fade +from .image_plot import ImagePlot +from .abstract_colormap import AbstractColormap +from .speedups import apply_selection_fade class CMapImagePlot(ImagePlot): diff --git a/chaco/color_bar.py b/chaco/color_bar.py index 8aaff3094..a1f0a4742 100644 --- a/chaco/color_bar.py +++ b/chaco/color_bar.py @@ -12,12 +12,12 @@ from kiva.image import GraphicsContext # Local imports -from base_xy_plot import BaseXYPlot -from abstract_plot_renderer import AbstractPlotRenderer -from abstract_mapper import AbstractMapper -from array_data_source import ArrayDataSource -from grid import PlotGrid -from axis import PlotAxis +from .base_xy_plot import BaseXYPlot +from .abstract_plot_renderer import AbstractPlotRenderer +from .abstract_mapper import AbstractMapper +from .array_data_source import ArrayDataSource +from .grid import PlotGrid +from .axis import PlotAxis class ColorBar(AbstractPlotRenderer): diff --git a/chaco/color_mapper.py b/chaco/color_mapper.py index 56a155535..0220e3af4 100644 --- a/chaco/color_mapper.py +++ b/chaco/color_mapper.py @@ -1,5 +1,7 @@ """ Defines the ColorMapper and ColorMapTemplate classes. """ +import six +import six.moves as sm # Major library imports from numpy import arange, array, asarray, clip, divide, float32, int8, isinf, \ @@ -11,10 +13,10 @@ Int, Property, Str, Trait # Relative imports -from abstract_colormap import AbstractColormap -from data_range_1d import DataRange1D +from .abstract_colormap import AbstractColormap +from .data_range_1d import DataRange1D -from speedups import map_colors, map_colors_uint8 +from .speedups import map_colors, map_colors_uint8 class ColorMapTemplate(HasTraits): @@ -133,16 +135,16 @@ def from_palette_array(cls, palette, **traits): # From the offsets and the color data, generate a segment map. segment_map = {} red_values = palette[:,0] - segment_map['red'] = zip(offsets, red_values, red_values) + segment_map['red'] = list(sm.zip(offsets, red_values, red_values)) green_values = palette[:,1] - segment_map['green'] = zip(offsets, green_values, green_values) + segment_map['green'] = list(zip(offsets, green_values, green_values)) blue_values = palette[:,2] - segment_map['blue'] = zip(offsets, blue_values, blue_values) + segment_map['blue'] = list(zip(offsets, blue_values, blue_values)) if n_components == 3: alpha_values = ones(n_colors) else: alpha_values = palette[:,3] - segment_map['alpha'] = zip(offsets, alpha_values, alpha_values) + segment_map['alpha'] = list(zip(offsets, alpha_values, alpha_values)) return cls(segment_map, **traits) @@ -303,7 +305,7 @@ def _get_color_bands(self): if self.color_depth is 'rgba': luts.append(self._alpha_lut) - result = zip(*luts) + result = list(sm.zip(*luts)) return result diff --git a/chaco/colormapped_scatterplot.py b/chaco/colormapped_scatterplot.py index c92469e30..11871daa6 100644 --- a/chaco/colormapped_scatterplot.py +++ b/chaco/colormapped_scatterplot.py @@ -3,6 +3,8 @@ from __future__ import with_statement +import six +import six.moves as sm # Major library imports from numpy import argsort, array, concatenate, nonzero, invert, take, \ isnan, transpose, newaxis, zeros, ndarray @@ -13,10 +15,10 @@ from traitsui.api import Item, RangeEditor # Local, relative imports -from array_data_source import ArrayDataSource -from base import left_shift, right_shift -from abstract_colormap import AbstractColormap -from scatterplot import ScatterPlot, ScatterPlotView +from .array_data_source import ArrayDataSource +from .base import left_shift, right_shift +from .abstract_colormap import AbstractColormap +from .scatterplot import ScatterPlot, ScatterPlotView class ColormappedScatterPlotView(ScatterPlotView): @@ -329,7 +331,7 @@ def _render_banded(self, gc, points): self.outline_color_, self.line_width) gc.draw_path_at_points(xy, path, mode) else: - raise RuntimeError, "Batch drawing requested on non-batch-capable GC." + raise RuntimeError("Batch drawing requested on non-batch-capable GC.") return def _render_bruteforce(self, gc, points): diff --git a/chaco/colormapped_selection_overlay.py b/chaco/colormapped_selection_overlay.py index a12ff7e61..0424439e0 100644 --- a/chaco/colormapped_selection_overlay.py +++ b/chaco/colormapped_selection_overlay.py @@ -1,13 +1,15 @@ """ Defines the ColormappedSelectionOverlay class. """ +import six.moves as sm + from numpy import logical_and # Enthought library imports from traits.api import Any, Bool, Float, Instance, Property, Enum # Local imports -from abstract_overlay import AbstractOverlay -from colormapped_scatterplot import ColormappedScatterPlot +from .abstract_overlay import AbstractOverlay +from .colormapped_scatterplot import ColormappedScatterPlot class ColormappedSelectionOverlay(AbstractOverlay): """ @@ -74,7 +76,7 @@ def overlay(self, component, gc, view_bounds=None, mode="normal"): mask = (data_pts >= low) & (data_pts <= high) elif self.selection_type == 'mask': - mask = reduce(logical_and, datasource.metadata["selection_masks"]) + mask = sm.reduce(logical_and, datasource.metadata["selection_masks"]) if sum(mask)<2: return diff --git a/chaco/contour_line_plot.py b/chaco/contour_line_plot.py index 727bd071d..5f53dd6dd 100644 --- a/chaco/contour_line_plot.py +++ b/chaco/contour_line_plot.py @@ -12,8 +12,8 @@ from traits.api import Bool, Dict, Float, List, Str, Trait # Local relative imports -from base_contour_plot import BaseContourPlot -from contour.contour import Cntr +from .base_contour_plot import BaseContourPlot +from .contour.contour import Cntr class ContourLinePlot(BaseContourPlot): diff --git a/chaco/contour_poly_plot.py b/chaco/contour_poly_plot.py index 040dea171..324d30596 100644 --- a/chaco/contour_poly_plot.py +++ b/chaco/contour_poly_plot.py @@ -10,8 +10,8 @@ from traits.api import Bool, Dict # Local relative imports -from base_contour_plot import BaseContourPlot -from contour.contour import Cntr +from .base_contour_plot import BaseContourPlot +from .contour.contour import Cntr class ContourPolyPlot(BaseContourPlot): diff --git a/chaco/cross_plot_frame.py b/chaco/cross_plot_frame.py index 5242d039d..b66ea8f37 100644 --- a/chaco/cross_plot_frame.py +++ b/chaco/cross_plot_frame.py @@ -9,12 +9,15 @@ from __future__ import with_statement +import six +import six.moves as sm + # Enthought library imports from traits.api import Bool, Float # Local, relative imports -from base_plot_frame import BasePlotFrame -from plot_containers import HPlotContainer, OverlayPlotContainer, VPlotContainer +from .base_plot_frame import BasePlotFrame +from .plot_containers import HPlotContainer, OverlayPlotContainer, VPlotContainer class CrossPlotFrame(BasePlotFrame): @@ -52,10 +55,8 @@ class CrossPlotFrame(BasePlotFrame): def __init__(self, **kwtraits): - if kwtraits.has_key("bounds"): - bounds = kwtraits.pop("bounds") - else: - bounds = list(self.default_bounds) + bounds = kwtraits.pop("bounds", list(self.default_bounds)) + BasePlotFrame.__init__(self, **kwtraits) # Create our plot containers @@ -167,7 +168,7 @@ def _do_layout(self): def __getstate__(self): state = super(CrossPlotFrame,self).__getstate__() for key in ['_layout_needed']: - if state.has_key(key): + if key in state: del state[key] return state diff --git a/chaco/data_label.py b/chaco/data_label.py index 5270fdf1c..599ef53b6 100644 --- a/chaco/data_label.py +++ b/chaco/data_label.py @@ -11,8 +11,8 @@ from enable.api import ColorTrait, MarkerTrait # Local, relative imports -from scatterplot import render_markers -from tooltip import ToolTip +from .scatterplot import render_markers +from .tooltip import ToolTip # Specifies the position of a label relative to its target. This can diff --git a/chaco/data_range_1d.py b/chaco/data_range_1d.py index 3a9556dc6..42c9e122e 100644 --- a/chaco/data_range_1d.py +++ b/chaco/data_range_1d.py @@ -5,6 +5,10 @@ # Major library imports from math import ceil, floor, log + +import six +import six.moves as sm + from numpy import compress, inf, isinf, isnan, ndarray # Enthought library imports @@ -12,9 +16,9 @@ Callable # Local relative imports -from base import arg_find_runs -from base_data_range import BaseDataRange -from ticks import heckbert_interval +from .base import arg_find_runs +from .base_data_range import BaseDataRange +from .ticks import heckbert_interval class DataRange1D(BaseDataRange): @@ -338,7 +342,7 @@ def _refresh_bounds(self): self._high_value = self._high_setting return else: - mins, maxes = zip(*bounds_list) + mins, maxes = sm.zip(*bounds_list) low_start, high_start = \ calc_bounds(self._low_setting, self._high_setting, diff --git a/chaco/data_range_2d.py b/chaco/data_range_2d.py index e03f62208..1f8676512 100644 --- a/chaco/data_range_2d.py +++ b/chaco/data_range_2d.py @@ -9,8 +9,8 @@ Tuple, on_trait_change # Local relative imports -from base_data_range import BaseDataRange -from data_range_1d import DataRange1D +from .base_data_range import BaseDataRange +from .data_range_1d import DataRange1D class DataRange2D(BaseDataRange): diff --git a/chaco/data_view.py b/chaco/data_view.py index 9a69bc8f9..a4c114800 100644 --- a/chaco/data_view.py +++ b/chaco/data_view.py @@ -6,15 +6,15 @@ from traits.api import Bool, Enum, Instance, Property from enable.colors import color_table -from abstract_overlay import AbstractOverlay -from axis import PlotAxis -from base_1d_mapper import Base1DMapper -from base_2d_plot import Base2DPlot -from data_range_2d import DataRange2D -from grid import PlotGrid -from linear_mapper import LinearMapper -from log_mapper import LogMapper -from plot_containers import OverlayPlotContainer +from .abstract_overlay import AbstractOverlay +from .axis import PlotAxis +from .base_1d_mapper import Base1DMapper +from .base_2d_plot import Base2DPlot +from .data_range_2d import DataRange2D +from .grid import PlotGrid +from .linear_mapper import LinearMapper +from .log_mapper import LogMapper +from .plot_containers import OverlayPlotContainer #----------------------------------------------------------------------------- diff --git a/chaco/datamapper.py b/chaco/datamapper.py index e09947d3c..89bc42918 100644 --- a/chaco/datamapper.py +++ b/chaco/datamapper.py @@ -45,7 +45,7 @@ def sort_points(points, index=0): to their x-coordinate (index=0) or y-coordinate (index=1). """ if len(points.shape) != 2 or (2 not in points.shape): - raise RuntimeError, "sort_points(): Array of wrong shape." + raise RuntimeError("sort_points(): Array of wrong shape.") return take( points, argsort(points[:,index]) ) def array_zip(*arys): diff --git a/chaco/errorbar_plot.py b/chaco/errorbar_plot.py index d035df036..261729fae 100644 --- a/chaco/errorbar_plot.py +++ b/chaco/errorbar_plot.py @@ -1,6 +1,9 @@ from __future__ import with_statement +import six +import six.moves + # Major library imports from numpy import column_stack, compress, invert, isnan, transpose import logging @@ -9,8 +12,8 @@ from traits.api import Any, Enum, Float, Instance # Chaco imports -from lineplot import LinePlot -from abstract_data_source import AbstractDataSource +from .lineplot import LinePlot +from .abstract_data_source import AbstractDataSource # Set up a logger for this module logger = logging.getLogger(__name__) @@ -71,7 +74,7 @@ def _gather_points(self): value_high, value_high_mask = self.value_high.get_data_mask() value_mask = value_low_mask & value_high_mask - l1, l2, l3 = map(len, (index, value_low, value_high)) + l1, l2, l3 = sm.map(len, (index, value_low, value_high)) if 0 in (l1, l2, l3) or not (l1 == l2 == l3): logger.warn("Chaco: using empty dataset; index_len=%d, value_low_len=%d, value_high_len=%d." % (l1,l2,l3)) self._cached_data_pts = [] diff --git a/chaco/example_support.py b/chaco/example_support.py index f0dd66f76..7abe49e1d 100644 --- a/chaco/example_support.py +++ b/chaco/example_support.py @@ -1,3 +1,5 @@ +from __future__ import print_function + doc = \ """ This file contains a support class that wraps up the boilerplate toolkit calls @@ -7,7 +9,6 @@ Try running simple_line.py, colormapped_scatter.py, or check out any of the programs in in tutorials/. """ - from numpy import array from traits.etsconfig.api import ETSConfig @@ -29,7 +30,7 @@ # Import a default palette for backwards compatibility -from default_colors import cbrewer as COLOR_PALETTE +from .default_colors import cbrewer as COLOR_PALETTE # FIXME - it should be enough to do the following import, but because of the @@ -157,6 +158,6 @@ def demo_main(demo_class, size=(640,480), title="Chaco Example"): if __name__ == "__main__": - print "\n" + doc + "\n" + print("\n" + doc + "\n") # EOF diff --git a/chaco/filled_line_plot.py b/chaco/filled_line_plot.py index 133d14b7a..40a33b5b5 100644 --- a/chaco/filled_line_plot.py +++ b/chaco/filled_line_plot.py @@ -5,8 +5,8 @@ from traits.api import Property, Enum # Local imports -from lineplot import LinePlot -from polygon_plot import PolygonPlot +from .lineplot import LinePlot +from .polygon_plot import PolygonPlot def Alias(name): diff --git a/chaco/function_data_source.py b/chaco/function_data_source.py index 802922724..3672a09a1 100644 --- a/chaco/function_data_source.py +++ b/chaco/function_data_source.py @@ -8,9 +8,9 @@ from traits.api import Callable, Instance, on_trait_change # Local, relative imports -from abstract_data_source import AbstractDataSource -from array_data_source import ArrayDataSource -from data_range_1d import DataRange1D +from .abstract_data_source import AbstractDataSource +from .array_data_source import ArrayDataSource +from .data_range_1d import DataRange1D class FunctionDataSource(ArrayDataSource): diff --git a/chaco/grid.py b/chaco/grid.py index 1157e0cba..40bf8018c 100644 --- a/chaco/grid.py +++ b/chaco/grid.py @@ -4,6 +4,8 @@ from __future__ import with_statement +import six + from numpy import around, array, asarray, column_stack, float64, inf, zeros, zeros_like # Enthought library imports @@ -13,10 +15,10 @@ from traitsui.api import HGroup, Item, VGroup, View, TextEditor # Local, relative imports -from abstract_overlay import AbstractOverlay -from abstract_mapper import AbstractMapper -from log_mapper import LogMapper -from ticks import AbstractTickGenerator, DefaultTickGenerator +from .abstract_overlay import AbstractOverlay +from .abstract_mapper import AbstractMapper +from .log_mapper import LogMapper +from .ticks import AbstractTickGenerator, DefaultTickGenerator def float_or_auto(val): @@ -28,9 +30,9 @@ def float_or_auto(val): try: return float(val) except: - if isinstance(val, basestring) and val == "auto": + if isinstance(val, six.string_types) and val == "auto": return val - raise TraitError, "Tick interval must be a number or 'auto'." + raise TraitError("Tick interval must be a number or 'auto'.") # View for setting grid properties. GridView = View(VGroup( @@ -413,7 +415,7 @@ def _orientation_changed(self): def __getstate__(self): state = super(PlotGrid,self).__getstate__() for key in ['_cache_valid', '_tick_list', '_tick_positions', '_tick_extents']: - if state.has_key(key): + if key in state: del state[key] return state diff --git a/chaco/grid_data_source.py b/chaco/grid_data_source.py index 04487a24a..3ca4bf355 100644 --- a/chaco/grid_data_source.py +++ b/chaco/grid_data_source.py @@ -8,9 +8,9 @@ from traits.api import Constant, Instance, Tuple # Chaco imports -from abstract_data_source import AbstractDataSource -from array_data_source import ArrayDataSource -from base import SortOrderTrait +from .abstract_data_source import AbstractDataSource +from .array_data_source import ArrayDataSource +from .base import SortOrderTrait class GridDataSource(AbstractDataSource): diff --git a/chaco/grid_mapper.py b/chaco/grid_mapper.py index e8b282cf3..be04c17fc 100644 --- a/chaco/grid_mapper.py +++ b/chaco/grid_mapper.py @@ -13,11 +13,11 @@ from traits.api import Bool, DelegatesTo, Instance, Float, Property # Local relative imports -from abstract_mapper import AbstractMapper -from base_1d_mapper import Base1DMapper -from data_range_2d import DataRange2D -from linear_mapper import LinearMapper -from log_mapper import LogMapper +from .abstract_mapper import AbstractMapper +from .base_1d_mapper import Base1DMapper +from .data_range_2d import DataRange2D +from .linear_mapper import LinearMapper +from .log_mapper import LogMapper class GridMapper(AbstractMapper): diff --git a/chaco/image_data.py b/chaco/image_data.py index dfd0f7d87..c8351f91a 100644 --- a/chaco/image_data.py +++ b/chaco/image_data.py @@ -7,8 +7,8 @@ from traits.api import Bool, Int, Property, ReadOnly, Tuple # Local relative imports -from base import DimensionTrait, ImageTrait -from abstract_data_source import AbstractDataSource +from .base import DimensionTrait, ImageTrait +from .abstract_data_source import AbstractDataSource class ImageData(AbstractDataSource): """ diff --git a/chaco/image_plot.py b/chaco/image_plot.py index 3f88be8d1..3637a5725 100644 --- a/chaco/image_plot.py +++ b/chaco/image_plot.py @@ -15,6 +15,9 @@ from math import ceil, floor, pi from contextlib import contextmanager +import six +import six.moves as sm + import numpy as np # Enthought library imports. @@ -23,8 +26,8 @@ from kiva.agg import GraphicsContextArray # Local relative imports -from base_2d_plot import Base2DPlot -from image_utils import trim_screen_rect +from .base_2d_plot import Base2DPlot +from .image_utils import trim_screen_rect try: # InterpolationQuality required for Quartz backend only (requires OSX). @@ -326,7 +329,7 @@ def _calc_zoom_coords(self, image_rect): col_max = array_width - col_max col_min, col_max = col_max, col_min - index_bounds = map(int, [col_min, col_max, row_min, row_max]) + index_bounds = list(sm.map(int, [col_min, col_max, row_min, row_max])) screen_rect = [x_min, y_min, x_max - x_min, y_max - y_min] return index_bounds, screen_rect diff --git a/chaco/jitterplot.py b/chaco/jitterplot.py index 11ec0ade9..bff7d22a2 100644 --- a/chaco/jitterplot.py +++ b/chaco/jitterplot.py @@ -1,8 +1,11 @@ from __future__ import absolute_import -from itertools import izip from math import sqrt + +import six +import six.moves as sm + import numpy as np from traits.api import Any, Int @@ -122,9 +125,9 @@ def get_screen_points(self): self._gather_points() pts = self.map_screen(self._cached_data) if self.orientation == "h": - self._cached_screen_map = dict((x,y) for x,y in izip(pts[:,0], pts[:,1])) + self._cached_screen_map = dict((x,y) for x,y in sm.zip(pts[:,0], pts[:,1])) else: - self._cached_screen_map = dict((y,x) for x,y in izip(pts[:,0], pts[:,1])) + self._cached_screen_map = dict((y,x) for x,y in sm.zip(pts[:,0], pts[:,1])) self._cached_screen_pts = pts self._screen_cache_valid = True self._cached_data_pts_sorted = None diff --git a/chaco/label_axis.py b/chaco/label_axis.py index b9b02921e..edf7eee31 100644 --- a/chaco/label_axis.py +++ b/chaco/label_axis.py @@ -8,8 +8,8 @@ from traits.api import ArrayOrNone, Str, List, Float # Local, relative imports -from axis import PlotAxis -from label import Label +from .axis import PlotAxis +from .label import Label class LabelAxis(PlotAxis): @@ -80,7 +80,7 @@ def _compute_tick_positions(self, gc, component=None): self._tick_label_list = take(self.labels, take(pos_index, tick_indices)) if datalow > datahigh: - raise RuntimeError, "DataRange low is greater than high; unable to compute axis ticks." + raise RuntimeError("DataRange low is greater than high; unable to compute axis ticks.") mapped_label_positions = [((self.mapper.map_screen(pos)-screenlow) / \ (screenhigh-screenlow)) for pos in tick_positions] diff --git a/chaco/lasso_overlay.py b/chaco/lasso_overlay.py index c473b0cc7..974ed5c47 100644 --- a/chaco/lasso_overlay.py +++ b/chaco/lasso_overlay.py @@ -10,7 +10,7 @@ from traits.api import Float, Instance, Bool # Local imports -from abstract_overlay import AbstractOverlay +from .abstract_overlay import AbstractOverlay class LassoOverlay(AbstractOverlay): """ Draws a lasso selection region on top of a plot. diff --git a/chaco/layers/api.py b/chaco/layers/api.py index 10507a1cb..decda6ade 100644 --- a/chaco/layers/api.py +++ b/chaco/layers/api.py @@ -1 +1 @@ -from status_layer import StatusLayer, ErrorLayer, WarningLayer +from .status_layer import StatusLayer, ErrorLayer, WarningLayer diff --git a/chaco/layers/svg_range_selection_overlay.py b/chaco/layers/svg_range_selection_overlay.py index 6119d7b55..b484ba629 100644 --- a/chaco/layers/svg_range_selection_overlay.py +++ b/chaco/layers/svg_range_selection_overlay.py @@ -7,7 +7,7 @@ from chaco.api import GridMapper from traits.api import Property, Enum, Str, cached_property -from status_layer import StatusLayer +from .status_layer import StatusLayer class SvgRangeSelectionOverlay(StatusLayer): """ This is a primitive range selection overlay which uses diff --git a/chaco/legend.py b/chaco/legend.py index f6a7d53eb..21d41aff2 100644 --- a/chaco/legend.py +++ b/chaco/legend.py @@ -4,6 +4,9 @@ from __future__ import with_statement +import six +import six.moves as sm + from numpy import array, zeros_like from enable.api import black_color_trait, white_color_trait @@ -13,11 +16,11 @@ HasTraits, Instance, Int, List, Str # Local relative imports -from abstract_overlay import AbstractOverlay -from label import Label -from lineplot import LinePlot -from plot_component import PlotComponent -from scatterplot import ScatterPlot +from .abstract_overlay import AbstractOverlay +from .label import Label +from .lineplot import LinePlot +from .plot_component import PlotComponent +from .scatterplot import ScatterPlot class AbstractCompositeIconRenderer(HasTraits): @@ -36,7 +39,7 @@ class CompositeIconRenderer(AbstractCompositeIconRenderer): """ def render_icon(self, plots, *render_args): """ Renders an icon for a list of plots. """ - types = set(map(type, plots)) + types = set(sm.map(type, plots)) if types == set([ScatterPlot]): self._render_scatterplots(plots, *render_args) elif types == set([LinePlot]): @@ -355,7 +358,7 @@ def get_preferred_size(self): if len(self.plots) == 0: return [0, 0] - plot_names, visible_plots = map(list, zip(*sorted(self.plots.items()))) + plot_names, visible_plots = list(sm.map(list, sm.zip(*sorted(self.plots.items())))) label_names = self.labels if len(label_names) == 0: if len(self.plots) > 0: diff --git a/chaco/linear_mapper.py b/chaco/linear_mapper.py index 6f48c4b6b..c2808c939 100644 --- a/chaco/linear_mapper.py +++ b/chaco/linear_mapper.py @@ -10,7 +10,7 @@ from traits.api import Bool, Float # Local relative imports -from base_1d_mapper import Base1DMapper +from .base_1d_mapper import Base1DMapper class LinearMapper(Base1DMapper): diff --git a/chaco/lineplot.py b/chaco/lineplot.py index 6f831e318..382633006 100644 --- a/chaco/lineplot.py +++ b/chaco/lineplot.py @@ -16,8 +16,8 @@ from traitsui.api import Item, View # Local relative imports -from base import arg_find_runs, arg_true_runs, reverse_map_1d, intersect_range -from base_xy_plot import BaseXYPlot +from .base import arg_find_runs, arg_true_runs, reverse_map_1d, intersect_range +from .base_xy_plot import BaseXYPlot @@ -181,7 +181,7 @@ def interpolate(self, index_value): """ if self.index is None or self.value is None: - raise IndexError, "cannot index when data source index or value is None" + raise IndexError("cannot index when data source index or value is None") index_data = self.index.get_data() value_data = self.value.get_data() @@ -415,7 +415,7 @@ def _line_width_changed(self): def __getstate__(self): state = super(LinePlot,self).__getstate__() for key in ['traits_view']: - if state.has_key(key): + if key in state: del state[key] return state diff --git a/chaco/log_mapper.py b/chaco/log_mapper.py index 0ca76d6e6..e426a2555 100644 --- a/chaco/log_mapper.py +++ b/chaco/log_mapper.py @@ -9,7 +9,7 @@ from traits.api import Bool, Float #Local relative imports -from base_1d_mapper import Base1DMapper +from .base_1d_mapper import Base1DMapper LOG_MINIMUM = 0.0 diff --git a/chaco/multi_array_data_source.py b/chaco/multi_array_data_source.py index 1f7bb952d..c7b94bfe2 100644 --- a/chaco/multi_array_data_source.py +++ b/chaco/multi_array_data_source.py @@ -9,8 +9,8 @@ from traits.api import Any, Int, Tuple # Chaco imports -from base import NumericalSequenceTrait, SortOrderTrait -from abstract_data_source import AbstractDataSource +from .base import NumericalSequenceTrait, SortOrderTrait +from .abstract_data_source import AbstractDataSource class MultiArrayDataSource(AbstractDataSource): @@ -218,7 +218,7 @@ def _set_data(self, value): if len(value.shape) != 2: msg = 'Input is %d dimensional, but it must be 1 or 2' \ 'dimensional.' % len(value.shape) - raise ValueError, msg + raise ValueError(msg) self._data = value diff --git a/chaco/multi_line_plot.py b/chaco/multi_line_plot.py index 813d4ad81..b40b4c050 100644 --- a/chaco/multi_line_plot.py +++ b/chaco/multi_line_plot.py @@ -17,9 +17,9 @@ Bool, Callable, Property, cached_property, Instance, Array from traitsui.api import Item, View, ScrubberEditor, HGroup -from array_data_source import ArrayDataSource -from base import arg_find_runs, bin_search -from base_xy_plot import BaseXYPlot +from .array_data_source import ArrayDataSource +from .base import arg_find_runs, bin_search +from .base_xy_plot import BaseXYPlot class MultiLinePlot(BaseXYPlot): @@ -469,7 +469,7 @@ def _amplitude_changed(self): def __getstate__(self): state = super(MultiLinePlot,self).__getstate__() for key in ['traits_view']: - if state.has_key(key): + if key in state: del state[key] return state diff --git a/chaco/overlays/aligned_container_overlay.py b/chaco/overlays/aligned_container_overlay.py index 600594abe..80b5010bc 100644 --- a/chaco/overlays/aligned_container_overlay.py +++ b/chaco/overlays/aligned_container_overlay.py @@ -3,7 +3,7 @@ from traits.api import Enum, Any -from container_overlay import ContainerOverlay +from .container_overlay import ContainerOverlay class AlignedContainerOverlay(ContainerOverlay): """ Container overlay that aligns itself to the plot diff --git a/chaco/overlays/api.py b/chaco/overlays/api.py index 8f7fb565f..6fa2b0baf 100644 --- a/chaco/overlays/api.py +++ b/chaco/overlays/api.py @@ -1,6 +1,6 @@ -from databox import DataBox -from container_overlay import ContainerOverlay -from aligned_container_overlay import AlignedContainerOverlay -from text_grid_overlay import TextGridOverlay -from simple_inspector_overlay import SimpleInspectorOverlay, basic_formatter, \ +from .databox import DataBox +from .container_overlay import ContainerOverlay +from .aligned_container_overlay import AlignedContainerOverlay +from .text_grid_overlay import TextGridOverlay +from .simple_inspector_overlay import SimpleInspectorOverlay, basic_formatter, \ datetime_formatter, date_formatter, time_formatter diff --git a/chaco/overlays/simple_inspector_overlay.py b/chaco/overlays/simple_inspector_overlay.py index aa0c5611b..5ee6844bc 100644 --- a/chaco/overlays/simple_inspector_overlay.py +++ b/chaco/overlays/simple_inspector_overlay.py @@ -12,7 +12,7 @@ from traits.api import Any, List, Callable, Enum, Bool -from text_grid_overlay import TextGridOverlay +from .text_grid_overlay import TextGridOverlay def basic_formatter(key, decimals): """Create a basic ': ' formatting function diff --git a/chaco/overlays/text_grid_overlay.py b/chaco/overlays/text_grid_overlay.py index cec7050ef..a28052742 100644 --- a/chaco/overlays/text_grid_overlay.py +++ b/chaco/overlays/text_grid_overlay.py @@ -4,7 +4,7 @@ from traits.api import Instance from enable.text_grid import TextGrid -from aligned_container_overlay import AlignedContainerOverlay +from .aligned_container_overlay import AlignedContainerOverlay class TextGridOverlay(AlignedContainerOverlay): """ Overlay for plots containing a TextGrid diff --git a/chaco/plot.py b/chaco/plot.py index ff77eb0d4..5b17199f1 100644 --- a/chaco/plot.py +++ b/chaco/plot.py @@ -3,6 +3,9 @@ # Major library imports import itertools import warnings + +import six +import six.moves as sm from numpy import arange, array, ndarray, linspace from types import FunctionType @@ -10,38 +13,38 @@ from traits.api import Delegate, Dict, Instance, Int, List, Property, Str # Local, relative imports -from abstract_colormap import AbstractColormap -from abstract_data_source import AbstractDataSource -from abstract_plot_data import AbstractPlotData -from array_data_source import ArrayDataSource -from array_plot_data import ArrayPlotData -from base_xy_plot import BaseXYPlot -from barplot import BarPlot -from candle_plot import CandlePlot -from colormapped_scatterplot import ColormappedScatterPlot -from contour_line_plot import ContourLinePlot -from contour_poly_plot import ContourPolyPlot -from cmap_image_plot import CMapImagePlot -from data_range_1d import DataRange1D -from data_view import DataView -from default_colormaps import Spectral -from grid_data_source import GridDataSource -from grid_mapper import GridMapper -from image_data import ImageData -from image_plot import ImagePlot -from legend import Legend -from lineplot import LinePlot -from line_scatterplot_1d import LineScatterPlot1D -from linear_mapper import LinearMapper -from log_mapper import LogMapper -from plot_label import PlotLabel -from polygon_plot import PolygonPlot -from scatterplot import ScatterPlot -from scatterplot_1d import ScatterPlot1D -from text_plot_1d import TextPlot1D -from filled_line_plot import FilledLinePlot -from quiverplot import QuiverPlot -from jitterplot import JitterPlot +from .abstract_colormap import AbstractColormap +from .abstract_data_source import AbstractDataSource +from .abstract_plot_data import AbstractPlotData +from .array_data_source import ArrayDataSource +from .array_plot_data import ArrayPlotData +from .base_xy_plot import BaseXYPlot +from .barplot import BarPlot +from .candle_plot import CandlePlot +from .colormapped_scatterplot import ColormappedScatterPlot +from .contour_line_plot import ContourLinePlot +from .contour_poly_plot import ContourPolyPlot +from .cmap_image_plot import CMapImagePlot +from .data_range_1d import DataRange1D +from .data_view import DataView +from .default_colormaps import Spectral +from .grid_data_source import GridDataSource +from .grid_mapper import GridMapper +from .image_data import ImageData +from .image_plot import ImagePlot +from .legend import Legend +from .lineplot import LinePlot +from .line_scatterplot_1d import LineScatterPlot1D +from .linear_mapper import LinearMapper +from .log_mapper import LogMapper +from .plot_label import PlotLabel +from .polygon_plot import PolygonPlot +from .scatterplot import ScatterPlot +from .scatterplot_1d import ScatterPlot1D +from .text_plot_1d import TextPlot1D +from .filled_line_plot import FilledLinePlot +from .quiverplot import QuiverPlot +from .jitterplot import JitterPlot @@ -301,7 +304,7 @@ def plot(self, data, type="line", name=None, index_scale="linear", if len(data) == 0: return - if isinstance(data, basestring): + if isinstance(data, six.string_types): data = (data,) self.index_scale = index_scale @@ -435,10 +438,10 @@ def custom_value_func(data_low, data_high, margin, tight_bounds): value = self._get_or_create_datasource(data[1]) self.value_range.add(value) color = self._get_or_create_datasource(data[2]) - if not styles.has_key("color_mapper"): + if "color_mapper" not in styles: raise ValueError("Scalar 2D data requires a color_mapper.") - colormap = styles.pop("color_mapper", None) + colormap = styles.pop("color_mapper") if self.color_mapper is not None and self.color_mapper.range is not None: color_range = self.color_mapper.range @@ -699,12 +702,12 @@ def _create_2d_plot(self, cls, name, origin, xbounds, ybounds, value_ds, array_data = value_ds.get_data() # process bounds to get linspaces - if isinstance(xbounds, basestring): + if isinstance(xbounds, six.string_types): xbounds = self._get_or_create_datasource(xbounds).get_data() xs = self._process_2d_bounds(xbounds, array_data, 1, cell_plot) - if isinstance(ybounds, basestring): + if isinstance(ybounds, six.string_types): ybounds = self._get_or_create_datasource(ybounds).get_data() ys = self._process_2d_bounds(ybounds, array_data, 0, cell_plot) @@ -804,24 +807,24 @@ def candle_plot(self, data, name=None, value_scale="linear", origin=None, # Create the datasources if len(data) == 3: - index, bar_min, bar_max = map(self._get_or_create_datasource, data) + index, bar_min, bar_max = sm.map(self._get_or_create_datasource, data) self.value_range.add(bar_min, bar_max) center = None min = None max = None elif len(data) == 4: - index, bar_min, center, bar_max = map(self._get_or_create_datasource, data) + index, bar_min, center, bar_max = sm.map(self._get_or_create_datasource, data) self.value_range.add(bar_min, center, bar_max) min = None max = None elif len(data) == 5: index, min, bar_min, bar_max, max = \ - map(self._get_or_create_datasource, data) + sm.map(self._get_or_create_datasource, data) self.value_range.add(min, bar_min, bar_max, max) center = None elif len(data) == 6: index, min, bar_min, center, bar_max, max = \ - map(self._get_or_create_datasource, data) + sm.map(self._get_or_create_datasource, data) self.value_range.add(min, bar_min, center, bar_max, max) self.index_range.add(index) @@ -900,7 +903,7 @@ def quiverplot(self, data, name=None, origin=None, if origin is None: origin = self.default_origin - index, value, vectors = map(self._get_or_create_datasource, data) + index, value, vectors = list(sm.map(self._get_or_create_datasource, data)) self.index_range.add(index) self.value_range.add(value) @@ -959,7 +962,7 @@ def plot_1d(self, data, type='scatter_1d', name=None, orientation=None, if len(data) == 0: return - if isinstance(data, basestring): + if isinstance(data, six.string_types): data = (data,) # TODO: support lists of plot types @@ -1062,7 +1065,7 @@ def delplot(self, *names): # Cull the candidate list of sources to remove by checking the other plots sources_in_use = set() - for p in itertools.chain(*self.plots.values()): + for p in itertools.chain(*list(self.plots.values())): sources_in_use.add(p.index) sources_in_use.add(p.value) @@ -1273,7 +1276,7 @@ def _handle_range_changed(self, name, old, new): if new is not None: new.add(datasource) range_name = name + "_range" - for renderer in itertools.chain(*self.plots.values()): + for renderer in itertools.chain(six.itervalues(self.plots)): if hasattr(renderer, range_name): setattr(renderer, range_name, new) diff --git a/chaco/plot_canvas.py b/chaco/plot_canvas.py index 28ef8de84..e2e697945 100644 --- a/chaco/plot_canvas.py +++ b/chaco/plot_canvas.py @@ -4,7 +4,7 @@ from traits.api import Instance, Tuple # Local, relative chaco imports -from plot_containers import DEFAULT_DRAWING_ORDER +from .plot_containers import DEFAULT_DRAWING_ORDER class PlotCanvas(Canvas): """ The PlotCanvas is basically like Canvas, but we inherit some behaviors diff --git a/chaco/plot_canvas_toolbar.py b/chaco/plot_canvas_toolbar.py index ad9709ae0..1a9082e0c 100644 --- a/chaco/plot_canvas_toolbar.py +++ b/chaco/plot_canvas_toolbar.py @@ -3,8 +3,8 @@ from enable.drawing.api import ToolbarButton # Local, relative imports -from plot_containers import VPlotContainer -from plot_component import PlotComponent +from .plot_containers import VPlotContainer +from .plot_component import PlotComponent class PlotCanvasToolbar(VPlotContainer): diff --git a/chaco/plot_containers.py b/chaco/plot_containers.py index 8a292cd53..a5cbac3c3 100644 --- a/chaco/plot_containers.py +++ b/chaco/plot_containers.py @@ -10,7 +10,7 @@ simple_container_do_layout # Local relative imports -from base_plot_container import BasePlotContainer +from .base_plot_container import BasePlotContainer __all__ = ["OverlayPlotContainer", "HPlotContainer", "VPlotContainer", \ @@ -220,7 +220,7 @@ def _do_stack_layout(self, components, align): def __getstate__(self): state = super(StackedPlotContainer,self).__getstate__() for key in ['stack_dimension', 'other_dimension', 'stack_index']: - if state.has_key(key): + if key in state: del state[key] return state @@ -269,7 +269,7 @@ def _do_layout(self): def __getstate__(self): state = super(HPlotContainer,self).__getstate__() for key in ['_cached_preferred_size']: - if state.has_key(key): + if key in state: del state[key] return state diff --git a/chaco/plot_factory.py b/chaco/plot_factory.py index e87c5285d..69fed7d57 100644 --- a/chaco/plot_factory.py +++ b/chaco/plot_factory.py @@ -6,17 +6,17 @@ from numpy import array, ndarray, transpose, cos, sin # Local relative imports -from abstract_data_source import AbstractDataSource -from array_data_source import ArrayDataSource -from axis import PlotAxis -from barplot import BarPlot -from data_range_1d import DataRange1D -from grid import PlotGrid -from linear_mapper import LinearMapper -from scatterplot import ScatterPlot -from polar_mapper import PolarMapper -from lineplot import LinePlot -from polar_line_renderer import PolarLineRenderer +from .abstract_data_source import AbstractDataSource +from .array_data_source import ArrayDataSource +from .axis import PlotAxis +from .barplot import BarPlot +from .data_range_1d import DataRange1D +from .grid import PlotGrid +from .linear_mapper import LinearMapper +from .scatterplot import ScatterPlot +from .polar_mapper import PolarMapper +from .lineplot import LinePlot +from .polar_line_renderer import PolarLineRenderer def _create_data_sources(data, index_sort="none"): """ @@ -28,16 +28,16 @@ def _create_data_sources(data, index_sort="none"): if type(index) in (list, tuple, ndarray): index = ArrayDataSource(array(index), sort_order=index_sort) elif not isinstance(index, AbstractDataSource): - raise RuntimeError, "Need an array or list of values or a DataSource, got %s instead." % type(index) + raise RuntimeError("Need an array or list of values or a DataSource, got %s instead." % type(index)) if type(value) in (list, tuple, ndarray): value = ArrayDataSource(array(value)) elif not isinstance(value, AbstractDataSource): - raise RuntimeError, "Need an array or list of values or a DataSource, got %s instead." % type(index) + raise RuntimeError("Need an array or list of values or a DataSource, got %s instead." % type(index)) return index, value else: - raise RuntimeError, "Unable to create datasources." + raise RuntimeError("Unable to create datasources.") def create_scatter_plot(data=[], index_bounds=None, value_bounds=None, diff --git a/chaco/plot_label.py b/chaco/plot_label.py index 36646b2e0..b608c199a 100644 --- a/chaco/plot_label.py +++ b/chaco/plot_label.py @@ -6,8 +6,8 @@ from enable.font_metrics_provider import font_metrics_provider from traits.api import DelegatesTo, Enum, Instance, Str, Trait -from abstract_overlay import AbstractOverlay -from label import Label +from .abstract_overlay import AbstractOverlay +from .label import Label LabelDelegate = DelegatesTo("_label") diff --git a/chaco/plotscrollbar.py b/chaco/plotscrollbar.py index c4c367323..aba698e45 100644 --- a/chaco/plotscrollbar.py +++ b/chaco/plotscrollbar.py @@ -1,3 +1,6 @@ +from __future__ import print_function + +import six.moves as sm from traits.api import Any, Enum, Int, Property, Trait @@ -81,7 +84,7 @@ def _handle_dataspace_update(self): range = self.mapper.range bounds_list = [source.get_bounds() for source in range.sources \ if source.get_size() > 0] - mins, maxes = zip(*bounds_list) + mins, maxes = sm.zip(*bounds_list) dmin = min(mins) dmax = max(maxes) @@ -100,7 +103,7 @@ def _handle_dataspace_update(self): else: ticksize = 1 foo = (totalmin, totalmax, view, ticksize) - print "scrollrange:", foo + print("scrollrange:", foo) self.set(range = foo, scroll_position = max(min(self.scroll_position, totalmax-view), totalmin), trait_change_notify=False) diff --git a/chaco/plugin/workbench_session.py b/chaco/plugin/workbench_session.py index e5ea5b5ca..aa5546c41 100644 --- a/chaco/plugin/workbench_session.py +++ b/chaco/plugin/workbench_session.py @@ -5,7 +5,7 @@ from traits.api import Any, Dict, List, Str from chaco.shell.session import PlotSession -from plot_editor import PlotEditor +from .plot_editor import PlotEditor class WorkbenchSession(PlotSession): diff --git a/chaco/point_data_source.py b/chaco/point_data_source.py index bd40cb15a..170ae66d6 100644 --- a/chaco/point_data_source.py +++ b/chaco/point_data_source.py @@ -9,8 +9,8 @@ from traits.api import Enum, Property, ReadOnly, Tuple # Local, relative imports -from base import PointTrait, reverse_map_1d, SortOrderTrait -from array_data_source import ArrayDataSource +from .base import PointTrait, reverse_map_1d, SortOrderTrait +from .array_data_source import ArrayDataSource class PointDataSource(ArrayDataSource): @@ -73,7 +73,7 @@ class PointDataSource(ArrayDataSource): def __init__(self, data = transpose(array([[],[]])), **kw): shape = data.shape if (len(shape) != 2) or (shape[1] != 2): - raise RuntimeError, "PointDataSource constructor requires Nx2 array, but got array of shape " + str(shape) + " instead." + raise RuntimeError("PointDataSource constructor requires Nx2 array, but got array of shape " + str(shape) + " instead.") super(PointDataSource, self).__init__(data, **kw) return @@ -114,7 +114,7 @@ def reverse_map(self, pt, index=0, outside_returns_none=True): raise NotImplementedError if index != 0 and index != 1: - raise ValueError, "Index must be 0 or 1." + raise ValueError("Index must be 0 or 1.") # This basically reduces to a scalar data search along self.data[index]. lowerleft, upperright= self._cached_bounds diff --git a/chaco/polar_line_renderer.py b/chaco/polar_line_renderer.py index a27cab916..d9b49aa47 100644 --- a/chaco/polar_line_renderer.py +++ b/chaco/polar_line_renderer.py @@ -11,7 +11,7 @@ from traits.api import Float # Local, relative imports -from abstract_plot_renderer import AbstractPlotRenderer +from .abstract_plot_renderer import AbstractPlotRenderer class PolarLineRenderer(AbstractPlotRenderer): diff --git a/chaco/polar_mapper.py b/chaco/polar_mapper.py index 00cec3f6c..c3425fa16 100644 --- a/chaco/polar_mapper.py +++ b/chaco/polar_mapper.py @@ -10,7 +10,7 @@ from traits.api import Bool, Float # Local relative imports -from abstract_mapper import AbstractMapper +from .abstract_mapper import AbstractMapper ############################################################### # same as linear mapper at the moment... to be modified later # diff --git a/chaco/polygon_plot.py b/chaco/polygon_plot.py index d8db99a3d..4234bf667 100644 --- a/chaco/polygon_plot.py +++ b/chaco/polygon_plot.py @@ -14,7 +14,7 @@ on_trait_change # Local imports. -from base_xy_plot import BaseXYPlot +from .base_xy_plot import BaseXYPlot class PolygonPlot(BaseXYPlot): """ Plots a polygon in dataspace. diff --git a/chaco/quiverplot.py b/chaco/quiverplot.py index c5ae7572e..757c22a32 100644 --- a/chaco/quiverplot.py +++ b/chaco/quiverplot.py @@ -8,8 +8,8 @@ from traits.api import Array, Enum, Float, Instance, Int # Chaco relative imports -from abstract_data_source import AbstractDataSource -from scatterplot import ScatterPlot +from .abstract_data_source import AbstractDataSource +from .scatterplot import ScatterPlot class QuiverPlot(ScatterPlot): diff --git a/chaco/scales/api.py b/chaco/scales/api.py index c0f4fb611..b05d1e5b3 100644 --- a/chaco/scales/api.py +++ b/chaco/scales/api.py @@ -1,3 +1,3 @@ -from formatters import * -from scales import * -from time_scale import * +from .formatters import * +from .scales import * +from .time_scale import * diff --git a/chaco/scales/formatters.py b/chaco/scales/formatters.py index 8f85879ac..af1d8849d 100644 --- a/chaco/scales/formatters.py +++ b/chaco/scales/formatters.py @@ -3,8 +3,12 @@ """ from math import ceil, floor, fmod, log10 + +import six +import six.moves as sm + from numpy import abs, all, array, asarray, amax, amin -from safetime import strftime, time, safe_fromtimestamp, localtime +from .safetime import strftime, time, safe_fromtimestamp, localtime import warnings @@ -128,9 +132,9 @@ def format(self, ticks, numlabels=None, char_width=None, fill_ratio=0.3): else: # For decimal mode, if not (ticks % 1).any(): - labels = map(str, ticks.astype(int)) + labels = list(sm.map(str, ticks.astype(int))) else: - labels = map(str, ticks) + labels = list(sm.map(str, ticks)) return labels @@ -209,7 +213,7 @@ def estimate_width(self, start, end, numlabels=None, char_width=None, return 0, 0 # use the start and end points as ticks and average their label sizes - labelsizes = map(len, self.format([start, end])) + labelsizes = sm.map(len, self.format([start, end])) avg_size = sum(labelsizes) / 2.0 if ticker: @@ -236,7 +240,7 @@ class IntegerFormatter(BasicFormatter): def format(self, ticks, numlabels=None, char_width=None, fill_ratio=0.3): """ Formats integer tick labels. """ - return map(str, map(int, ticks)) + return list(sm.map(str, sm.map(int, ticks))) class OffsetFormatter(BasicFormatter): @@ -350,15 +354,20 @@ def estimate_width(self, start, end, numlabels=None, char_width=None, elif char_width: avg_size = len("%g%g" % (start, end)) / 2.0 initial_estimate = round(fill_ratio * char_width / avg_size) + else: + raise ValueError( + "num_labels and char_width should not both be None." + ) est_ticks = int(ticker.num_ticks(start, end, initial_estimate)) elif numlabels: est_ticks = numlabels + # FIXME BUG HERE elif char_width: est_ticks = round(fill_ratio * char_width / avg_size) - start, mid, end = map(len, self.format([start, (start+end)/2.0, end])) + start, mid, end = sm.map(len, self.format([start, (start+end)/2.0, end])) if est_ticks > 2: size = start + end + (est_ticks-2) * mid else: @@ -567,7 +576,7 @@ def format(self, ticks, numlabels=None, char_width=None, fill_ratio = 0.3, try: tm = localtime(t) s = strftimeEx(format, t, tm) - except ValueError, e: + except ValueError as e: warnings.warn("Unable to convert tick for timestamp " + str(t)) labels.append("ERR") continue diff --git a/chaco/scales/safetime.py b/chaco/scales/safetime.py index 2224dbb29..288069d18 100644 --- a/chaco/scales/safetime.py +++ b/chaco/scales/safetime.py @@ -26,7 +26,7 @@ def safe_fromtimestamp(timestamp, *args, **kwds): """ try: return EPOCH + timedelta(seconds=timestamp) - except (ValueError, OverflowError), e: + except (ValueError, OverflowError) as e: warnings.warn("Timestamp out of range. Returning safe default value.") if timestamp <= 0: return datetime(MINYEAR, 1, 1, 0, 0, 0) diff --git a/chaco/scales/scales.py b/chaco/scales/scales.py index a3501a779..524afb1f0 100644 --- a/chaco/scales/scales.py +++ b/chaco/scales/scales.py @@ -5,10 +5,13 @@ from bisect import bisect from math import ceil, floor, log10 + +import six.moves as sm + from numpy import abs, argmin, array, isnan, linspace # Local imports -from formatters import BasicFormatter +from .formatters import BasicFormatter __all__ = ["AbstractScale", "DefaultScale", "FixedScale", "Pow10Scale", @@ -83,7 +86,7 @@ def labels(self, start, end, numlabels=None, char_width=None): """ ticks = self.ticks(start, end, numlabels) labels = self.formatter.format(ticks, numlabels, char_width) - return zip(ticks, labels) + return list(sm.zip(ticks, labels)) def label_width(self, start, end, numlabels=None, char_width=None): """ Returns an estimate of the total number of characters used by the @@ -467,7 +470,7 @@ def labels(self, start, end, numlabels=None, char_width=None): # Check for insufficient arguments. if numlabels is None and char_width is None: - raise ValueError, "Either numlabels or char_width (or both) must be given." + raise ValueError("Either numlabels or char_width (or both) must be given.") if numlabels == 0 or char_width == 0 or isnan(start) or isnan(end): return [] @@ -506,7 +509,7 @@ def labels(self, start, end, numlabels=None, char_width=None): else: scales = self.scales - counts, widths = zip(*[s.label_width(start, end, char_width=char_width) \ + counts, widths = sm.zip(*[s.label_width(start, end, char_width=char_width) \ for s in scales]) widths = array(widths) closest = argmin(abs(widths - char_width*self.fill_ratio)) diff --git a/chaco/scales/scales_test_case.py b/chaco/scales/scales_test_case.py index eb57dbddd..33610785b 100644 --- a/chaco/scales/scales_test_case.py +++ b/chaco/scales/scales_test_case.py @@ -1,10 +1,11 @@ +from __future__ import print_function from traits.testing.unittest_tools import unittest from numpy import array -from formatters import BasicFormatter, OffsetFormatter -from scales import Pow10Scale, FixedScale, LogScale, DefaultScale, ScaleSystem, frange +from .formatters import BasicFormatter, OffsetFormatter +from .scales import Pow10Scale, FixedScale, LogScale, DefaultScale, ScaleSystem, frange class TicksTestCase(unittest.TestCase): @@ -148,7 +149,7 @@ def test2_nice_sci(self): for mdigits, desired in lst[1:]: s = fmt._nice_sci(val, mdigits) if s != desired: - print "Mismatch for", val, "; desired:", desired, "actual:", s + print("Mismatch for", val, "; desired:", desired, "actual:", s) def test_estimate_default_scale(self): @@ -176,11 +177,11 @@ def test_width_based_default_scale(self): test_intervals = ((1, 100, 80), (1, 100, 40), (1, 100, 20),) - print + print() for start, end, width in test_intervals: labels = scale.labels(start, end, char_width=width) - print "(%d,%d)" % (start,end), " avail:", width, - print " used:", sum([len(x[1]) for x in labels]) + print("(%d,%d)" % (start,end), " avail:", width, end=" ") + print(" used:", sum([len(x[1]) for x in labels])) return def test_scale_system(self): @@ -199,12 +200,12 @@ def test_scale_system(self): (1, 10, 100), (1, 10, 50), (1, 10, 20),) - print + print() for start, end, width in test_intervals: labels = scale.labels(start, end, char_width=width) - print "(%d,%d)" % (start,end), " avail:", width, - print " used:", sum([len(x[1]) for x in labels]), - print list(zip(*labels))[1] + print("(%d,%d)" % (start,end), " avail:", width, end=" ") + print(" used:", sum([len(x[1]) for x in labels]), end=" ") + print(list(zip(*labels))[1]) return class OffsetFormatterTestCase(TicksTestCase): @@ -225,11 +226,11 @@ def test_format(self): scale = FixedScale(resolution = resol) numlabels = 12 ticks = scale.ticks(start, end, numlabels) - print "range:", start, end + print("range:", start, end) labels = fmt.format(ticks, numlabels, None) - print "Labels:", labels, "\n" - print "estimated width:", fmt.estimate_width(start, end, numlabels) - print "actual width:", sum(map(len, labels)) + print("Labels:", labels) + print("estimated width:", fmt.estimate_width(start, end, numlabels)) + print("actual width:", sum(map(len, labels))) diff --git a/chaco/scales/tests/test_formatters.py b/chaco/scales/tests/test_formatters.py index 39129d023..756593e74 100644 --- a/chaco/scales/tests/test_formatters.py +++ b/chaco/scales/tests/test_formatters.py @@ -1,3 +1,4 @@ +from __future__ import print_function from chaco.scales.formatters import strftimeEx, TimeFormatter @@ -42,7 +43,7 @@ def test_strftimeEx_04(): # The format "%(ms_)" uses floor(). result = strftimeEx(fmt, t) expected = "678.910ms" - print 'result = "%s" expected = "%s"' % (result, expected) + print('result = "%s" expected = "%s"' % (result, expected)) assert result == expected def test_strftimeEx_05(): @@ -51,7 +52,7 @@ def test_strftimeEx_05(): fmt = "%S %(ms_) %(us)" result = strftimeEx(fmt, t) expected = "08 000 000" - print 'result = "%s" expected = "%s"' % (result, expected) + print('result = "%s" expected = "%s"' % (result, expected)) assert result == expected def test_strftimeEx_06(): @@ -60,7 +61,7 @@ def test_strftimeEx_06(): fmt = "%S %(ms)" result = strftimeEx(fmt, t) expected = "08 000" - print 'result = "%s" expected = "%s"' % (result, expected) + print('result = "%s" expected = "%s"' % (result, expected)) assert result == expected def test_strftimeEx_07(): @@ -69,7 +70,7 @@ def test_strftimeEx_07(): fmt = "%S %(ms_)" result = strftimeEx(fmt, t) expected = "07 999" - print 'result = "%s" expected = "%s"' % (result, expected) + print('result = "%s" expected = "%s"' % (result, expected)) assert result == expected #---------------------------------------------------------------- @@ -81,5 +82,5 @@ def test_time_formatter_01(): ticks = [10.005, 10.0053, 10.0056] labels = tf.format(ticks, char_width=130) expected = ["5.000ms", "5.300ms", "5.600ms"] - print "labels =", labels, " expected =", expected + print("labels =", labels, " expected =", expected) assert labels == expected diff --git a/chaco/scales/tests/test_time_scale.py b/chaco/scales/tests/test_time_scale.py index f3ec415ed..e89e746b4 100644 --- a/chaco/scales/tests/test_time_scale.py +++ b/chaco/scales/tests/test_time_scale.py @@ -4,6 +4,8 @@ import os import contextlib +import six.moves as sm + import numpy as np from chaco.scales.time_scale import ( @@ -402,7 +404,7 @@ def test_trange_seconds_01(): def test_trange_seconds_02(): r = trange(0, 10, seconds=1) - assert r == range(11) + assert r == list(sm.xrange(11)) def test_trange_seconds_03(): r = trange(0, 1.5, seconds=1) diff --git a/chaco/scales/time_scale.py b/chaco/scales/time_scale.py index c13dc722e..a4724d7e9 100644 --- a/chaco/scales/time_scale.py +++ b/chaco/scales/time_scale.py @@ -4,15 +4,18 @@ from math import floor -from scales import AbstractScale, ScaleSystem, frange, heckbert_interval -from formatters import TimeFormatter -from safetime import (safe_fromtimestamp, datetime, timedelta, EPOCH, +import six +import six.moves as sm + +from .scales import AbstractScale, ScaleSystem, frange, heckbert_interval +from .formatters import TimeFormatter +from .safetime import (safe_fromtimestamp, datetime, timedelta, EPOCH, MINYEAR, MAXYEAR) # Labels for date and time units. datetime_scale = ["microsecond", "second", "minute", "hour", "day", "month", "year"] -datetime_zeros = zip(datetime_scale, [0, 0, 0, 0, 1, 1, 1]) +datetime_zeros = list(sm.zip(datetime_scale, [0, 0, 0, 0, 1, 1, 1])) __all__ = ["TimeScale", "CalendarScaleSystem", "HMSScales", "MDYScales", @@ -66,7 +69,10 @@ def tfrac(t, **time_unit): ======= A tuple: (aligned time as UNIX time, remainder in seconds) """ - unit, period = time_unit.items()[0] + time_units = list(six.iteritems(time_unit)) + if len(time_unit) > 1: + raise ValueError("tfrac() only takes one keyword argument, got %d" % len(time_units)) + unit, period = time_units[0] if unit == "milliseconds": unit = "microsecond" period *= 1000 @@ -160,11 +166,13 @@ def trange(start, end, **time_unit): A list of times that nicely span the interval, or an empty list if *start* and *end* fall within the same interval. """ - if len(time_unit) > 1: - raise ValueError("trange() only takes one keyword argument, got %d" % len(time_unit)) + time_units = list(six.iteritems(time_unit)) + + if len(time_units) != 1: + raise ValueError("trange() only takes one keyword argument, got %d" % len(time_units)) # Months and years are non-uniform, so we special-case them. - unit, value = time_unit.items()[0] + unit, value = time_units[0] if unit == 'months': return trange_months(start, end, value) elif unit == 'years': @@ -226,7 +234,7 @@ def __init__(self, **kw_interval): """ Defines the time period that this scale uses. """ self.formatter = kw_interval.pop("formatter", TimeFormatter()) - unit, val = kw_interval.items()[0] + unit, val = list(kw_interval.items())[0] self.unit = unit if "_of_" in unit: # Calendar time interval - divide by the number of ticks per larger @@ -298,11 +306,11 @@ def cal_ticks(self, start, end): # get range of years of interest # add 2 because of python ranges + guard against timezone shifts # eg. if 20000101 -> 19991231 because of local timezone, end is 1999+2 - years = range(start_dt.year, min(end_dt.year+2, MAXYEAR+1)) + years = sm.xrange(start_dt.year, min(end_dt.year+2, MAXYEAR+1)) if self.unit == "day_of_month": # get naive datetimes for start of each day of each month # in range of years. Excess will be discarded later. - months = range(1, 13) + months = sm.xrange(1, 13) dates = [datetime(year, month, i) for year in years for month in months for i in self.vals] @@ -328,8 +336,9 @@ def labels(self, start, end, numlabels=None, char_width=None): Overrides AbstractScale. """ ticks = self.ticks(start, end, numlabels) - labels = self.formatter.format(ticks, numlabels, char_width, ticker=self) - return zip(ticks, labels) + labels = self.formatter.format(ticks, numlabels, char_width, + ticker=self) + return list(sm.zip(ticks, labels)) def label_width(self, start, end, numlabels=None, char_width=None): """ Returns an estimate of total number of characters used by the @@ -351,11 +360,11 @@ def label_width(self, start, end, numlabels=None, char_width=None): [TimeScale(hours=dt) for dt in (1, 2, 3, 4, 6, 12, 24)] # Default time scale for months, days, and years. -MDYScales = [TimeScale(day_of_month=range(1,31,3)), +MDYScales = [TimeScale(day_of_month=list(sm.xrange(1,31,3))), TimeScale(day_of_month=(1,8,15,22)), TimeScale(day_of_month=(1,15)), - TimeScale(month_of_year=range(1,13)), - TimeScale(month_of_year=range(1,13,3)), + TimeScale(month_of_year=list(sm.xrange(1,13))), + TimeScale(month_of_year=list(sm.range(1,13,3))), TimeScale(month_of_year=(1,7)), TimeScale(month_of_year=(1,)),] + \ [TimeScale(years=dt) for dt in (1,2,5,10)] diff --git a/chaco/scales/time_scale_test_case.py b/chaco/scales/time_scale_test_case.py index 23f3cdcde..d39c705d1 100644 --- a/chaco/scales/time_scale_test_case.py +++ b/chaco/scales/time_scale_test_case.py @@ -1,12 +1,13 @@ +from __future__ import print_function from itertools import starmap from datetime import datetime as DT -from scales import ScaleSystem -from time_scale import dt_to_sec, trange, TimeScale, HMSScales -from formatters import TimeFormatter +from .scales import ScaleSystem +from .time_scale import dt_to_sec, trange, TimeScale, HMSScales +from .formatters import TimeFormatter -from scales_test_case import TicksTestCase +from .scales_test_case import TicksTestCase def DTS(*args, **kw): @@ -49,13 +50,13 @@ def test_microseconds(self): # so an increment of, say, 3 microseconds is only about a factor of 10 # more than machine precision. base = DTS(2005, 3, 15, 10, 45, 10) - print "base: ", base + print("base: ", base) start = base + 0.0000027 end = base + 0.0000177 ticks = trange(start, end, microseconds=5) desired = [base+i for i in (5e-6, 10e-6, 15e-6)] - print "ticks: ", ticks - print "desired: ", desired + print("ticks: ", ticks) + print("desired: ", desired) self.check_ticks(ticks, desired) def test_milliseconds(self): @@ -73,8 +74,8 @@ def test_daily(self): secs_per_day = 24*3600 ticks = trange(base, base + secs_per_day*5, days=1) desired = [base+i*secs_per_day for i in range(6)] - print "ticks: ", ticks - print "desired: ", desired + print("ticks: ", ticks) + print("desired: ", desired) self.check_ticks(ticks, desired) def test_daily_leap(self): @@ -95,7 +96,7 @@ def test_multiday_increment(self): start = DTS(2005, 1, 1) ticks = trange(start, start + 9*24*3600, days=3) desired = [start+i*3*24*3600 for i in range(4)] - print "ticks: ", ticks, " desired: ", desired + print("ticks: ", ticks, " desired: ", desired) self.check_ticks(ticks, desired) @@ -151,8 +152,8 @@ def test_microsecond(self): end = base + 9.2e-6 ticks = ts.ticks(start, end) desired = [base+i for i in (3e-6, 4e-6, 5e-6, 6e-6, 7e-6, 8e-6, 9e-6)] - print "ticks: ", ticks - print "desired: ", desired + print("ticks: ", ticks) + print("desired: ", desired) self.check_ticks(ticks, desired) @@ -181,11 +182,11 @@ def test_widths(self): scale = TimeScale(minutes = 5) test_intervals = ([(2005,3,15,10,30), (2005,3,15,10,50), 50], ) - print + print() for start, end, width in test_intervals: est_width = scale.label_width(DTS(*start), DTS(*end), char_width=width) - print start, end, - print " avail:", width, "est:", est_width[1], "numlabels:", est_width[0] + print(start, end, end=" ") + print(" avail:", width, "est:", est_width[1], "numlabels:", est_width[0]) return def test_labels(self): @@ -194,12 +195,12 @@ def test_labels(self): test_intervals = ([(2005,3,15,10,30), (2005,3,15,10,50), 150], ) - print + print() for start, end, width in test_intervals: labels = scale.labels(DTS(*start), DTS(*end), char_width=width) - print start, end, " avail:", width, - print " used:", sum([len(x[1]) for x in labels]), - print labels + print(start, end, " avail:", width, end=" ") + print(" used:", sum([len(x[1]) for x in labels]), end=" ") + print(labels) return diff --git a/chaco/scales_tick_generator.py b/chaco/scales_tick_generator.py index e9041a434..706528967 100644 --- a/chaco/scales_tick_generator.py +++ b/chaco/scales_tick_generator.py @@ -1,13 +1,17 @@ """ Defines the ScalesTickGenerator class. """ + +import six.moves as sm + from numpy import array from traits.api import Any from enable.font_metrics_provider import font_metrics_provider -from ticks import AbstractTickGenerator + +from .ticks import AbstractTickGenerator # Use the new scales/ticks library -from scales.api import ScaleSystem +from .scales.api import ScaleSystem class ScalesTickGenerator(AbstractTickGenerator): @@ -37,10 +41,12 @@ def get_ticks_and_labels(self, data_low, data_high, bounds_low, bounds_high, test_str = "0123456789-+" charsize = metrics.get_full_text_extent(test_str)[0] / len(test_str) numchars = (bounds_high - bounds_low) / charsize - tmp = zip(*self.scale.labels(data_low, data_high, numlabels=8, char_width=numchars)) + tmp = list(sm.zip(*self.scale.labels(data_low, data_high, numlabels=8, + char_width=numchars))) # Check to make sure we actually have labels/ticks to show before # unpacking the return tuple into (tick_array, labels). if len(tmp) == 0: return array([]), [] else: - return array(tmp[0]), tmp[1] + tick_array, labels = tmp + return array(tick_array), labels diff --git a/chaco/scatter_inspector_overlay.py b/chaco/scatter_inspector_overlay.py index 1c6b16a4d..60297fbda 100644 --- a/chaco/scatter_inspector_overlay.py +++ b/chaco/scatter_inspector_overlay.py @@ -9,8 +9,8 @@ from traits.api import Float, Int, Str, Trait # Local, relative imports -from abstract_overlay import AbstractOverlay -from scatterplot import render_markers +from .abstract_overlay import AbstractOverlay +from .scatterplot import render_markers class ScatterInspectorOverlay(AbstractOverlay): """ diff --git a/chaco/scatterplot.py b/chaco/scatterplot.py index 5394804b1..f9c72de47 100644 --- a/chaco/scatterplot.py +++ b/chaco/scatterplot.py @@ -5,6 +5,9 @@ # Standard library imports import itertools +import six +import six.moves as sm + # Major library imports from numpy import around, array, asarray, column_stack, \ isfinite, isnan, nanargmin, ndarray, sqrt, sum, transpose, where @@ -18,9 +21,9 @@ from traitsui.api import View, VGroup, Item # Local relative imports -from base_xy_plot import BaseXYPlot -from speedups import scatterplot_gather_points -from base import reverse_map_1d +from .base_xy_plot import BaseXYPlot +from .speedups import scatterplot_gather_points +from .base import reverse_map_1d #------------------------------------------------------------------------------ # Traits UI View for customizing a scatter plot. @@ -78,7 +81,7 @@ def render_markers(gc, points, marker, marker_size, return # marker can be string, class, or instance - if isinstance(marker, basestring): + if isinstance(marker, six.string_types): marker = MarkerNameDict[marker]() elif issubclass(marker, AbstractMarker): marker = marker() @@ -133,7 +136,7 @@ def render_markers(gc, points, marker, marker_size, if not marker.antialias: gc.set_antialias(False) if not isinstance(marker, CustomMarker): - for pt,size in itertools.izip(points, marker_size): + for pt,size in sm.zip(points, marker_size): sx, sy = pt with gc: gc.translate_ctm(sx, sy) @@ -142,7 +145,7 @@ def render_markers(gc, points, marker, marker_size, gc.draw_path(marker.draw_mode) else: path = custom_symbol - for pt,size in itertools.izip(points, marker_size): + for pt,size in sm.zip(points, marker_size): sx, sy = pt with gc: gc.translate_ctm(sx, sy) @@ -302,7 +305,7 @@ def map_index(self, screen_pt, threshold=0.0, outside_returns_none=True, \ try: ndx = reverse_map_1d(index_data, data_pt, self.index.sort_order) - except IndexError, e: + except IndexError as e: # if reverse_map raises this exception, it means that data_pt is # outside the range of values in index_data. if outside_returns_none: diff --git a/chaco/selectable_legend.py b/chaco/selectable_legend.py index 3879c455f..fb8b08769 100644 --- a/chaco/selectable_legend.py +++ b/chaco/selectable_legend.py @@ -2,7 +2,7 @@ from chaco.tools.api import SelectTool from traits.api import List -from legend import Legend +from .legend import Legend class SelectableLegend(Legend, SelectTool): diff --git a/chaco/selectable_overlay_container.py b/chaco/selectable_overlay_container.py index 43239516e..6eb979b44 100644 --- a/chaco/selectable_overlay_container.py +++ b/chaco/selectable_overlay_container.py @@ -10,7 +10,7 @@ from enable.api import ColorTrait # Local imports -from plot_containers import OverlayPlotContainer +from .plot_containers import OverlayPlotContainer class SelectableOverlayPlotContainer(OverlayPlotContainer): """ diff --git a/chaco/serializable.py b/chaco/serializable.py index 29e01a490..fdf8fd8a3 100644 --- a/chaco/serializable.py +++ b/chaco/serializable.py @@ -1,6 +1,9 @@ """ Defines the Serializable mix-in class. """ +from __future__ import print_function + + class Serializable(object): """ Mix-in class to help serialization. Serializes just the attributes in @@ -56,7 +59,7 @@ def _post_load(self): you want post_load() to happen in the same order as MRO, which super() does automatically. """ - print 'Serializable._post_load' + print('Serializable._post_load') pass def _do_setstate(self, state): @@ -96,9 +99,9 @@ def _do_setstate(self, state): # for attrib in all_pickles: # state[attrib] = getattr(self, attrib) # -# print '<<<<<<<<<<<<<', self +# print('<<<<<<<<<<<<<', self) # for key,value in state.items(): -# print key, type(value) +# print(key, type(value)) # print '>>>>>>>>>>>>>' # # return state diff --git a/chaco/shell/__init__.py b/chaco/shell/__init__.py index 00d37e4e1..819e3279c 100644 --- a/chaco/shell/__init__.py +++ b/chaco/shell/__init__.py @@ -1,2 +1,2 @@ -from commands import * +from .commands import * diff --git a/chaco/shell/commands.py b/chaco/shell/commands.py index f982aa433..c0bd42054 100644 --- a/chaco/shell/commands.py +++ b/chaco/shell/commands.py @@ -1,6 +1,11 @@ """ Defines commands for the Chaco shell. """ +from __future__ import print_function + +import six +import six.moves as sm + try: from wx import GetApp except ImportError: @@ -15,8 +20,8 @@ CalendarScaleSystem) from chaco.default_colormaps import * -import plot_maker -from session import PlotSession +from . import plot_maker +from .session import PlotSession session = PlotSession() @@ -101,7 +106,7 @@ def chaco_commands(): save saves the current plot to a file (png, bmp, jpg, pdf) """ - print chaco_commands.__doc__ + print(chaco_commands.__doc__) # The following are not implemented yet """ @@ -225,7 +230,7 @@ def colormap(map): The color map to use; if it is a string, it is the name of a default colormap; if it is a callable, it must return an AbstractColorMap. """ - if isinstance(map, basestring): + if isinstance(map, six.string_types): session.colormap = color_map_name_dict[map] else: session.colormap = map @@ -261,7 +266,7 @@ def _do_plot_boilerplate(kwargs, image=False): returns a Plot object for the plotting function to use. """ - if kwargs.has_key("hold"): + if "hold" in kwargs: hold(kwargs["hold"]) del kwargs["hold"] @@ -286,7 +291,7 @@ def _do_plot_boilerplate(kwargs, image=False): cont.overlays.append(ZoomTool(cont, tool_mode="box", always_on=True, drag_button="right")) if not session.hold: - cont.delplot(*cont.plots.keys()) + cont.delplot(*list(cont.plots.keys())) return cont @@ -691,7 +696,7 @@ def _set_scale(axis, system): ticks = p.y_ticks if system == 'time': system = CalendarScaleSystem() - if isinstance(system, basestring): + if isinstance(system, six.string_types): setattr(p, log_linear_trait, system) else: if system is None: @@ -765,13 +770,13 @@ def save(filename="chacoplot.png", dpi=72, pagesize="letter", dest_box=None, uni """ p = curplot() if not p: - print "Doing nothing because there is no active plot." + print("Doing nothing because there is no active plot.") return import os.path ext = os.path.splitext(filename)[-1] if ext == ".pdf": - print "Warning: the PDF backend is still a little buggy." + print("Warning: the PDF backend is still a little buggy.") from chaco.pdf_graphics_context import PdfPlotGraphicsContext # Set some default PDF options if none are provided if dest_box is None: @@ -789,7 +794,7 @@ def save(filename="chacoplot.png", dpi=72, pagesize="letter", dest_box=None, uni gc.save() del gc - print "Saved to", filename + print("Saved to", filename) elif ext in [".bmp", ".png", ".jpg"]: from chaco.api import PlotGraphicsContext @@ -803,10 +808,10 @@ def save(filename="chacoplot.png", dpi=72, pagesize="letter", dest_box=None, uni gc.save(filename) del gc - print "Saved to", filename + print("Saved to", filename) else: - print "Format not yet supported:", ext - print "Currently supported formats are: bmp, png, jpg." + print("Format not yet supported:", ext) + print("Currently supported formats are: bmp, png, jpg.") return diff --git a/chaco/shell/plot_maker.py b/chaco/shell/plot_maker.py index 62dec079c..ba8e63cff 100644 --- a/chaco/shell/plot_maker.py +++ b/chaco/shell/plot_maker.py @@ -7,6 +7,8 @@ import io import re +import six + # Major library imports from numpy import all, array, arange, asarray, reshape, shape, transpose @@ -19,7 +21,7 @@ # Local relative imports -from chaco_shell_error import ChacoShellError +from .chaco_shell_error import ChacoShellError # Normally I don't define an __all__, but this lets us distinguish @@ -73,7 +75,7 @@ def do_plotv(session, *args, **kw): elif plot_type == "line": plots = [create_line_plot(sources) for sources in sources_list] else: - raise ChacoShellError, "Unknown plot type '%s'." % plot_type + raise ChacoShellError("Unknown plot type '%s'." % plot_type) for plot in plots: plot.orientation = kw.get("orientation", "h") @@ -94,7 +96,7 @@ def make_data_sources(session, index_sort="none", *args): data.append(arg) if len(data) == 0: - raise ChacoShellError, "Insufficient data for plot." + raise ChacoShellError("Insufficient data for plot.") # 1D array(s) if len(data[0].shape) == 1: @@ -126,8 +128,9 @@ def make_data_sources(session, index_sort="none", *args): # Not a two-dimensional array, error. else: - raise ChacoShellError, "Unable to create plot data sources from array of" \ - "shape " + str(data[1].shape) + "." + raise ChacoShellError( + "Unable to create plot data sources from array of shape " + + str(data[1].shape) + ".") #----------------------------------------------------------------------------- @@ -212,7 +215,7 @@ def _process_group(group, plot_data=None): # with a format string, or an x and y were provided. If PlotData # was provided, use that to disambiguate; otherwise, assume that the # second string is a format string. - if isinstance(group[1], basestring): + if isinstance(group[1], six.string_types): if plot_data and group[1] in plot_data.list_data(): x = group[0] y = group[1] @@ -252,7 +255,7 @@ def do_plot(plotdata, active_plot, *data_and_formats, **kwtraits): groups = [] valid_names = plotdata.list_data() for arg in data_and_formats: - if not isinstance(arg, basestring): + if not isinstance(arg, six.string_types): # an array was passed in cur_group.append(plotdata.set_data("", arg, generate_name=True)) elif arg in valid_names: @@ -308,7 +311,7 @@ def do_imread(*data, **kwargs): """ Returns image file as array. """ # Check to see if the data given is either a file path or a file object - if isinstance(data[0], basestring) or isinstance(data[0], io.IOBase): + if isinstance(data[0], six.string_types) or isinstance(data[0], io.IOBase): return ImageData.fromfile(data[0]) else: raise ValueError("do_imread takes a string filename") @@ -401,7 +404,7 @@ def _get_or_create_plot_data(data, plotdata): """ valid_names = plotdata.list_data() - if not isinstance(data, basestring): + if not isinstance(data, six.string_types): name = plotdata.set_data("", data, generate_name=True) else: if data not in valid_names: diff --git a/chaco/shell/session.py b/chaco/shell/session.py index f7d7e0f0c..b5d9176a0 100644 --- a/chaco/shell/session.py +++ b/chaco/shell/session.py @@ -1,6 +1,10 @@ """ Defines the PlotSession class. """ +from __future__ import print_function + +import six + # Enthoght library imports from chaco.array_plot_data import ArrayPlotData from chaco.default_colormaps import * @@ -9,8 +13,8 @@ # Local, relative imports -from plot_window import PlotWindow -from preferences import Preferences +from .plot_window import PlotWindow +from .preferences import Preferences class PlotSession(HasTraits): @@ -78,7 +82,7 @@ def new_window(self, name=None, title=None, is_image=False): def get_window(self, ident): """ Retrieves a window either by index or by name """ - if isinstance(ident, basestring): + if isinstance(ident, six.string_types): return self.window_map.get(ident, None) elif type(ident) == int and ident < len(self.windows): return self.windows[ident] @@ -94,7 +98,7 @@ def del_window(self, ident): The name of the window in **window_map**, or the index of the window in **windows**. """ - if isinstance(ident, basestring): + if isinstance(ident, six.string_types): if ident in self.window_map: win = self.window_map[ident] del self.window_map[ident] @@ -102,7 +106,7 @@ def del_window(self, ident): return elif type(ident) == int: if ident >= len(self.windows): - print "No such window %d." % ident + print("No such window %d." % ident) win = self.windows.pop(ident) if len(self.windows) == 0: @@ -113,7 +117,7 @@ def del_window(self, ident): if win in self.window_map.values(): # we have to go through the whole dict and remove all keys # that correspond to the deleted window - for k, v in self.window_map.items(): + for k, v in list(self.window_map.items()): if v == win: del self.window_map[k] else: @@ -131,7 +135,7 @@ def _set_active_window(self, win): elif win is None: self.active_window_index = None else: - raise RuntimeError, "That window is not part of this session." + raise RuntimeError("That window is not part of this session.") def _colormap_changed(self): plots = [] @@ -145,7 +149,7 @@ def _colormap_changed(self): p.invalidate_draw() p.request_redraw() elif hasattr(p, "colors"): - if isinstance(p.colors, basestring) or \ + if isinstance(p.colors, six.string_types) or \ isinstance(p.colors, AbstractColormap): p.colors = color_map_dict[self.colormap] diff --git a/chaco/shell/tests/make_data_sources_test_case.py b/chaco/shell/tests/make_data_sources_test_case.py index 905d34510..15ba77f00 100644 --- a/chaco/shell/tests/make_data_sources_test_case.py +++ b/chaco/shell/tests/make_data_sources_test_case.py @@ -1,10 +1,13 @@ import unittest +import six + import numpy as np from numpy.testing.utils import assert_almost_equal from chaco.shell.plot_maker import make_data_sources + class MakeDataSourcesTestCase(unittest.TestCase): def test_1D_single(self): @@ -23,8 +26,8 @@ def test_1d_multiple(self): t = np.tan(index) sources = make_data_sources(session, "ascending", index, s, c, t) assert_almost_equal(sources[0][0].get_data(), index) - self.assert_(sources[0][0] == sources[1][0]) - self.assert_(sources[0][0] == sources[2][0]) + self.assertTrue(sources[0][0] == sources[1][0]) + self.assertTrue(sources[0][0] == sources[2][0]) assert_almost_equal(sources[0][1].get_data(), s) assert_almost_equal(sources[1][1].get_data(), c) assert_almost_equal(sources[2][1].get_data(), t) diff --git a/chaco/simple_plot_frame.py b/chaco/simple_plot_frame.py index 713460f46..5f19c6644 100644 --- a/chaco/simple_plot_frame.py +++ b/chaco/simple_plot_frame.py @@ -14,8 +14,8 @@ from traits.api import Bool # Local, relative imports -from base_plot_frame import BasePlotFrame -from plot_containers import OverlayPlotContainer +from .base_plot_frame import BasePlotFrame +from .plot_containers import OverlayPlotContainer class SimplePlotFrame(BasePlotFrame): """ @@ -50,10 +50,8 @@ class SimplePlotFrame(BasePlotFrame): def __init__(self, **kwtraits): # Delay setting the bounds until after base class initialization - if kwtraits.has_key("bounds"): - bounds = kwtraits.pop("bounds") - else: - bounds = list(self.default_bounds) + bounds = kwtraits.pop("bounds", list(self.default_bounds)) + BasePlotFrame.__init__(self, **kwtraits) self.set_slot("center", OverlayPlotContainer(resizable="hv")) self.bounds = bounds @@ -141,7 +139,7 @@ def _do_layout(self): def __getstate__(self): state = super(SimplePlotFrame,self).__getstate__() for key in ['_layout_needed']: - if state.has_key(key): + if key in state: del state[key] return state diff --git a/chaco/speedups.py b/chaco/speedups.py index 93a75b4eb..ac1f65ece 100644 --- a/chaco/speedups.py +++ b/chaco/speedups.py @@ -1,11 +1,11 @@ # This contains python implementations of all the speedups -from _speedups_fallback import * +from ._speedups_fallback import * # cython implementation of speedups. Import these if we can. try: - from _cython_speedups import * + from ._cython_speedups import * except ImportError: pass diff --git a/chaco/subdivision_cells.py b/chaco/subdivision_cells.py index e1272df23..3a15c8fe2 100644 --- a/chaco/subdivision_cells.py +++ b/chaco/subdivision_cells.py @@ -1,11 +1,15 @@ """ Defines cell-related classes and functions. """ +import itertools + +import six.moves as sm + from numpy import take, array, concatenate, nonzero from traits.api import HasStrictTraits, Instance, Delegate, Array, List, \ Tuple, Property, Trait, Any, Disallow -from datamapper import AbstractDataMapper, right_shift, left_shift, sort_points +from .datamapper import AbstractDataMapper, right_shift, left_shift, sort_points def find_runs(int_array, order='ascending'): @@ -48,7 +52,7 @@ def arg_find_runs(int_array, order='ascending'): rshifted = right_shift(int_array, int_array[0]-increment) start_indices = concatenate([[0], nonzero(int_array - (rshifted+increment))[0]]) end_indices = left_shift(start_indices, len(int_array)) - return zip(start_indices, end_indices) + return list(sm.zip(start_indices, end_indices)) class AbstractCell(HasStrictTraits): @@ -216,8 +220,8 @@ def _set_indices(self, indices): return def _get_indices(self): - list_of_indices = [range(i,j) for (i,j) in self._ranges] - return sum(list_of_indices, []) + list_of_indices = [sm.xrange(i, j) for (i, j) in self._ranges] + return list(itertools.chain(*list_of_indices)) #--------------------------------------------------------------------- diff --git a/chaco/subdivision_mapper.py b/chaco/subdivision_mapper.py index aa8e9c34f..b7030a4bd 100644 --- a/chaco/subdivision_mapper.py +++ b/chaco/subdivision_mapper.py @@ -1,6 +1,10 @@ """ Defines the SubdivisionDataMapper and SubdivisionLineDataMapper classes. """ # Major library imports + +import six +import six.moves as sm + import math from numpy import array, arange, concatenate, searchsorted, nonzero, transpose, \ argsort, zeros, sort, vstack @@ -10,10 +14,10 @@ from traits.api import List, Array, Tuple, Int, Float # Local, relative imports -from datamapper import AbstractDataMapper, right_shift, left_shift, \ +from .datamapper import AbstractDataMapper, right_shift, left_shift, \ sort_points, ArraySortTrait, \ array_zip -from subdivision_cells import AbstractCell, Cell, RangedCell, find_runs, \ +from .subdivision_cells import AbstractCell, Cell, RangedCell, find_runs, \ arg_find_runs @@ -160,12 +164,12 @@ def _basic_insertion(self, celltype): start_indices = concatenate([[0], diff_indices]) end_indices = concatenate([diff_indices, [len(self._data)]]) - for start,end in zip(start_indices, end_indices): + for start,end in sm.zip(start_indices, end_indices): gridx, gridy = cell_indices[start] # can use 'end' here just as well if celltype == RangedCell: self._cellgrid[gridx,gridy].add_ranges([(start,end)]) else: - self._cellgrid[gridx,gridy].add_indices(range(start,end)) + self._cellgrid[gridx,gridy].add_indices(list(sm.xrange(start,end))) return def _get_indices_for_points(self, pointlist): @@ -196,7 +200,7 @@ def _cells_to_rects(self, cells): row_end_indices = left_shift(row_start_indices, len(cells)) rects = [] - for rownum, start, end in zip(rownums, row_start_indices, row_end_indices): + for rownum, start, end in sm.zip(rownums, row_start_indices, row_end_indices): # y_sorted is sorted by the J (row) coordinate, so after we # extract the column indices, we need to sort them before # passing them to find_runs(). @@ -239,7 +243,7 @@ def _cells_to_rects(self, cells): #~ elif cell.sort_order == 'descending': #~ cell.points = find_runs(sort_points(cellpts)[::-1], 'descending') #~ else: - #~ raise RuntimeError, "Invalid sort_order: " + cell.sort_order + #~ raise RuntimeError("Invalid sort_order: " + cell.sort_order) #~ return class SubdivisionLineDataMapper(SubdivisionDataMapper): diff --git a/chaco/tests/arraydatasource_test_case.py b/chaco/tests/arraydatasource_test_case.py index 2b6cbf2cb..6b67ba765 100644 --- a/chaco/tests/arraydatasource_test_case.py +++ b/chaco/tests/arraydatasource_test_case.py @@ -5,6 +5,10 @@ import pickle import unittest + +import six +import six.moves as sm + from numpy import arange, array, allclose, empty, isnan, nan, ones from numpy.testing import assert_array_equal import numpy as np @@ -173,7 +177,8 @@ def test_bounds_negative_positive_inf(self): self.assertEqual(bounds, (-np.inf, np.inf)) def test_bounds_non_numeric(self): - myarray = np.array([u'abc', u'foo', u'bar', u'def'], dtype=unicode) + myarray = np.array([u'abc', u'foo', + u'bar', u'def'], dtype=six.text_type) data_source = ArrayDataSource(myarray) bounds = data_source.get_bounds() self.assertEqual(bounds, (u'abc', u'def')) @@ -259,13 +264,13 @@ class PointDataTestCase(unittest.TestCase): # Since PointData is mostly the same as ScalarData, the key things to # test are functionality that use _compute_bounds() and reverse_map(). def create_array(self): - return array(zip(range(10), range(0, 100, 10))) + return array(list(zip(list(sm.range(10)), list(sm.range(0, 100, 10))))) def test_basic_set_get(self): myarray = self.create_array() pd = PointDataSource(myarray) self.assertTrue(allclose(myarray, pd._data)) - self.assert_(pd.value_dimension == "point") + self.assertTrue(pd.value_dimension == "point") return def test_bounds(self): diff --git a/chaco/tests/base_utils_test_case.py b/chaco/tests/base_utils_test_case.py index 0f16e38e7..24fb41c53 100644 --- a/chaco/tests/base_utils_test_case.py +++ b/chaco/tests/base_utils_test_case.py @@ -2,6 +2,8 @@ Unit tests for utility functions in chaco.base """ +from __future__ import print_function + import unittest from math import sqrt from numpy import arange, array, linspace, nan, ones @@ -535,7 +537,7 @@ def test_all_inside_mask(self): x = linspace(1, 2, 101) mask = (x <= 1.4) | (x >= 1.6) result = intersect_range(x, 0.0, 3.0, mask) - print mask ^ result + print(mask ^ result) assert_array_equal(result, mask) if __name__ == '__main__': diff --git a/chaco/tests/border_test_case.py b/chaco/tests/border_test_case.py index d41f830fe..083365d73 100644 --- a/chaco/tests/border_test_case.py +++ b/chaco/tests/border_test_case.py @@ -16,7 +16,7 @@ class DrawBorderTestCase(unittest.TestCase): def assertRavelEqual(self, x, y): - self.assert_(alltrue(ravel(x) == ravel(y)), "\n%s\n !=\n%s" % (x, y)) + self.assertTrue(alltrue(ravel(x) == ravel(y)), "\n%s\n !=\n%s" % (x, y)) def test_draw_border_simple(self): """ Borders should have the correct height and width. diff --git a/chaco/tests/colormapper_test_case.py b/chaco/tests/colormapper_test_case.py index b91360844..430169f7a 100644 --- a/chaco/tests/colormapper_test_case.py +++ b/chaco/tests/colormapper_test_case.py @@ -27,7 +27,7 @@ def test_simple_map(self): expected = array([0.0, 0.5, 1.0]) close = allclose(ravel(b[:,:1]), expected, atol=0.02) - self.assert_(close, + self.assertTrue(close, "Simple map failed. Expected %s. Got %s" % (expected, b[:,:1])) return @@ -54,7 +54,7 @@ def test_change_min_max(self): expected = array([0.0, 0.5, 1.0]) close = allclose(ravel(b[:,:1]), expected, atol=0.02) - self.assert_(close, + self.assertTrue(close, "Changing min value broke map. Expected %s. Got %s" % (expected, b[:,:1])) # Update the max_value. @@ -67,7 +67,7 @@ def test_change_min_max(self): expected = array([0.0, 0.5, 1.0]) close = allclose(ravel(b[:,:1]), expected, atol=0.02) - self.assert_(close, + self.assertTrue(close, "Changing min value broke map. Expected %s. Got %s" % (expected, b[:,:1])) diff --git a/chaco/tests/data_view_test_case.py b/chaco/tests/data_view_test_case.py index 1465a48d7..a71c5f722 100644 --- a/chaco/tests/data_view_test_case.py +++ b/chaco/tests/data_view_test_case.py @@ -8,21 +8,21 @@ class DataViewTestCase(unittest.TestCase): def test_empty(self): dv = DataView() - self.assert_(dv.orientation=="h") - self.assert_(dv.index_scale=="linear") - self.assert_(dv.bgcolor=="white") - self.assert_(dv.overlay_border==True) + self.assertTrue(dv.orientation=="h") + self.assertTrue(dv.index_scale=="linear") + self.assertTrue(dv.bgcolor=="white") + self.assertTrue(dv.overlay_border==True) - self.assert_(dv.range2d.x_range==dv.index_range) - self.assert_(dv.range2d.y_range==dv.value_range) + self.assertTrue(dv.range2d.x_range==dv.index_range) + self.assertTrue(dv.range2d.y_range==dv.value_range) def test_orientation(self): dv = DataView() x_mapper_start = dv.x_mapper y_mapper_start = dv.y_mapper dv.orientation = "v" - self.assert_(dv.x_mapper is y_mapper_start) - self.assert_(dv.y_mapper is x_mapper_start) + self.assertTrue(dv.x_mapper is y_mapper_start) + self.assertTrue(dv.y_mapper is x_mapper_start) def test_range2d_changed(self): dv = DataView() @@ -31,12 +31,12 @@ def test_range2d_changed(self): old_range = dv.range2d r = DataRange2D() - self.assert_(dv.range2d.sources==[ds]) + self.assertTrue(dv.range2d.sources==[ds]) dv.range2d = r - self.assert_(dv.range2d.sources==[ds]) - self.assert_(old_range.sources==[]) - self.assert_(dv.range2d.x_range is dv.index_mapper.range) - self.assert_(dv.range2d.y_range is dv.value_mapper.range) + self.assertTrue(dv.range2d.sources==[ds]) + self.assertTrue(old_range.sources==[]) + self.assertTrue(dv.range2d.x_range is dv.index_mapper.range) + self.assertTrue(dv.range2d.y_range is dv.value_mapper.range) if __name__ == '__main__': import nose diff --git a/chaco/tests/datarange_1d_test_case.py b/chaco/tests/datarange_1d_test_case.py index 978f3a85c..5c3235375 100644 --- a/chaco/tests/datarange_1d_test_case.py +++ b/chaco/tests/datarange_1d_test_case.py @@ -1,3 +1,4 @@ +from __future__ import print_function import unittest @@ -52,7 +53,7 @@ def test_set_bounds1(self): self.assertEqual(foo.range.low, -1.0) self.assertEqual(foo.range.high, 2.0) # Verify that the `updated` event fired. - self.assert_(foo.range_updated) + self.assertTrue(foo.range_updated) def test_set_bounds2(self): """Change only the high value with set_bounds().""" @@ -67,7 +68,7 @@ def test_set_bounds2(self): self.assertEqual(foo.range.low, 0.0) self.assertEqual(foo.range.high, 2.0) # Verify that the `updated` event fired. - self.assert_(foo.range_updated) + self.assertTrue(foo.range_updated) def test_set_bounds3(self): """Change only the low value with set_bounds().""" @@ -82,7 +83,7 @@ def test_set_bounds3(self): self.assertEqual(foo.range.low, 0.5) self.assertEqual(foo.range.high, 1.0) # Verify that the `updated` event fired. - self.assert_(foo.range_updated) + self.assertTrue(foo.range_updated) def test_set_bounds4(self): """Set set_bounds() with high='track'.""" @@ -95,12 +96,12 @@ def test_set_bounds4(self): # Now reset foo's range_updated flag and set the bounds with set_bounds(). foo.range_updated = False foo.range.set_bounds(100.0, 'track') - print foo.range.low, foo.range.high + print(foo.range.low, foo.range.high) # Verify the values. self.assertEqual(foo.range.low, 100.0) self.assertEqual(foo.range.high, 101.0) # Verify that the `updated` event fired. - self.assert_(foo.range_updated) + self.assertTrue(foo.range_updated) def test_set_bounds5(self): """Set set_bounds() with low='track'.""" @@ -117,7 +118,7 @@ def test_set_bounds5(self): self.assertEqual(foo.range.low, 99.0) self.assertEqual(foo.range.high, 100.0) # Verify that the `updated` event fired. - self.assert_(foo.range_updated) + self.assertTrue(foo.range_updated) def test_set_tracking_amount(self): """Test setting the tracking amount using the set_tracking_amount() method.""" @@ -134,7 +135,7 @@ def test_set_tracking_amount(self): self.assertEqual(foo.range.low, -1.0) self.assertEqual(foo.range.high, 1.0) # Verify that the `updated` event fired. - self.assert_(foo.range_updated) + self.assertTrue(foo.range_updated) def test_scale_tracking_amount(self): """Test setting the tracking amount using the scale_tracking_amount() method.""" @@ -151,7 +152,7 @@ def test_scale_tracking_amount(self): self.assertEqual(foo.range.low, 0.5) self.assertEqual(foo.range.high, 1.0) # Verify that the `updated` event fired. - self.assert_(foo.range_updated) + self.assertTrue(foo.range_updated) def test_single_source(self): r = DataRange1D() diff --git a/chaco/tests/datarange_2d_test_case.py b/chaco/tests/datarange_2d_test_case.py index 8bd7c51c8..5ed935c55 100644 --- a/chaco/tests/datarange_2d_test_case.py +++ b/chaco/tests/datarange_2d_test_case.py @@ -13,8 +13,8 @@ def test_empty_range(self): r = DataRange2D() assert_ary_(r.low,array([-inf,-inf])) assert_ary_(r.high,array([inf,inf])) - self.assert_(r.low_setting == ('auto','auto')) - self.assert_(r.high_setting == ('auto', 'auto')) + self.assertTrue(r.low_setting == ('auto','auto')) + self.assertTrue(r.high_setting == ('auto', 'auto')) r.low = array([5.0,5.0]) r.high = array([10.0,10.0]) assert_ary_(r.low_setting, array([5.0,5.0])) @@ -46,7 +46,7 @@ def test_single_source(self): assert_ary_(r.high, array([6.0,60.0])) r.low = ('auto', 'auto') - self.assert_(r.low_setting == ('auto', 'auto')) + self.assertTrue(r.low_setting == ('auto', 'auto')) assert_ary_(r.low, array([0.0,0.0])) return diff --git a/chaco/tests/default_colormaps_test_case.py b/chaco/tests/default_colormaps_test_case.py index 89a00d190..c9dad05b9 100644 --- a/chaco/tests/default_colormaps_test_case.py +++ b/chaco/tests/default_colormaps_test_case.py @@ -10,6 +10,8 @@ # #------------------------------------------------------------------------------ +from __future__ import print_function + import unittest import numpy as np @@ -54,7 +56,7 @@ def test_discrete_colormaps_smoke(self): x = np.array([2, 4, 0]) datarange = DataRange1D(low_setting=0, high_setting=4) for cmap_func in default_colormaps.discrete_color_map_functions: - print cmap_func + print(cmap_func) cmapper = cmap_func(datarange) rgba = cmapper.map_screen(x) self.assertEqual(rgba.shape, (3, 4)) diff --git a/chaco/tests/function_data_source_test_case.py b/chaco/tests/function_data_source_test_case.py index dcf2f9fb8..2a95cd8cd 100644 --- a/chaco/tests/function_data_source_test_case.py +++ b/chaco/tests/function_data_source_test_case.py @@ -4,6 +4,8 @@ import unittest +import six.moves as sm + from numpy import array, linspace, ones from numpy.testing import assert_array_equal @@ -69,7 +71,7 @@ def test_range_data_range_changed(self): self.data_source.get_data()) def test_set_mask(self): - mymask = array([i % 2 for i in xrange(101)], dtype=bool) + mymask = array([i % 2 for i in sm.xrange(101)], dtype=bool) with self.assertRaises(NotImplementedError): self.data_source.set_mask(mymask) diff --git a/chaco/tests/instantiation_order_test_case.py b/chaco/tests/instantiation_order_test_case.py index c5569cd32..5b4f4e02d 100644 --- a/chaco/tests/instantiation_order_test_case.py +++ b/chaco/tests/instantiation_order_test_case.py @@ -16,17 +16,17 @@ def test_piecewise_construction(self): ds.set_data(ary) r = DataRange1D() r.add(ds) - self.assert_(r.low_setting == "auto") - self.assert_(r.high_setting == "auto") - self.assert_(r.low == 1) - self.assert_(r.high == 7) + self.assertTrue(r.low_setting == "auto") + self.assertTrue(r.high_setting == "auto") + self.assertTrue(r.low == 1) + self.assertTrue(r.high == 7) mapper = LinearMapper() mapper.range = r mapper.low_pos = 1.0 mapper.high_pos = 7.0 screen_pts = mapper.map_screen(array([1,3,7])) - self.assert_(tuple(screen_pts) == (1.0, 3.0, 7.0)) + self.assertTrue(tuple(screen_pts) == (1.0, 3.0, 7.0)) return def test_reverse_construction(self): @@ -41,10 +41,10 @@ def test_reverse_construction(self): r.add(ds) ds.set_data(ary) - self.assert_(r.low == 1) - self.assert_(r.high == 7) + self.assertTrue(r.low == 1) + self.assertTrue(r.high == 7) screen_pts = mapper.map_screen(array([1,3,7])) - self.assert_(tuple(screen_pts) == (1.0, 3.0, 7.0)) + self.assertTrue(tuple(screen_pts) == (1.0, 3.0, 7.0)) return diff --git a/chaco/tests/plotcontainer_test_case.py b/chaco/tests/plotcontainer_test_case.py index 04331ad3f..936552aa3 100644 --- a/chaco/tests/plotcontainer_test_case.py +++ b/chaco/tests/plotcontainer_test_case.py @@ -1,6 +1,8 @@ import sys import unittest +import six.moves as sm + from chaco.api import HPlotContainer, OverlayPlotContainer, \ PlotComponent, VPlotContainer, GridContainer from traits.api import Any, Tuple @@ -10,9 +12,9 @@ class ContainerTestCase(unittest.TestCase): def assert_tuple(self, t1, t2): - self.assertEquals(len(t1), len(t2)) - for i in xrange(len(t1)): - self.assertEquals(t1[i], t2[i]) + self.assertEqual(len(t1), len(t2)) + for i in sm.xrange(len(t1)): + self.assertEqual(t1[i], t2[i]) class StaticPlotComponent(PlotComponent): @@ -20,7 +22,7 @@ class StaticPlotComponent(PlotComponent): def __init__(self, bounds, *args, **kw): kw["bounds"] = bounds - if not kw.has_key("resizable"): + if "resizable" not in kw: kw["resizable"] = "" PlotComponent.__init__(self, *args, **kw) return @@ -52,21 +54,21 @@ class OverlayPlotContainerTestCase(ContainerTestCase): def test_basics(self): container = OverlayPlotContainer(resizable='', bounds=[100.0,200.0]) self.assert_tuple(container.get_preferred_size(), (100.0,200.0)) - self.assertEquals(container._layout_needed, True) + self.assertEqual(container._layout_needed, True) container.do_layout() - self.assertEquals(container._layout_needed, False) + self.assertEqual(container._layout_needed, False) return def test_fixed_size_component(self): container = OverlayPlotContainer(resizable='', bounds=[200.0,300.0]) # non-resizable component component = PlotComponent(resizable='', position=[50.0,60.0], bounds=[100.0,110.0]) - self.assertEquals(container._layout_needed, True) + self.assertEqual(container._layout_needed, True) container.do_layout() container.add(component) - self.assertEquals(container._layout_needed, True) + self.assertEqual(container._layout_needed, True) container.do_layout() - self.assertEquals(container._layout_needed, False) + self.assertEqual(container._layout_needed, False) # check the results of the layout self.assert_tuple(container.get_preferred_size(), (200.0,300.0)) @@ -156,10 +158,10 @@ def test_valign(self): comp1 = StaticPlotComponent([200,100]) container.add(comp1) container.do_layout() - self.failUnlessEqual(comp1.position, [0,50]) + self.assertEqual(comp1.position, [0,50]) container.valign="top" container.do_layout(force=True) - self.failUnlessEqual(comp1.position, [0,100]) + self.assertEqual(comp1.position, [0,100]) return @@ -202,10 +204,10 @@ def test_halign(self): comp1 = StaticPlotComponent([100,200]) container.add(comp1) container.do_layout() - self.failUnlessEqual(comp1.position, [50,0]) + self.assertEqual(comp1.position, [50,0]) container.halign="right" container.do_layout(force=True) - self.failUnlessEqual(comp1.position, [100,0]) + self.assertEqual(comp1.position, [100,0]) return def test_fit_components(self): @@ -231,8 +233,8 @@ def test_fit_components(self): class SizePrefsTestCase(unittest.TestCase): def assert_tuple(self, t1, t2): - self.assertEquals(t1[0], t2[0]) - self.assertEquals(t1[1], t2[1]) + self.assertEqual(t1[0], t2[0]) + self.assertEqual(t1[1], t2[1]) def test_sequential_non_resizable(self): prefs = SizePrefs(4, "h") @@ -252,9 +254,9 @@ def test_overlapping_non_resizable(self): prefs.update_from_component(StaticPlotComponent([200,10]), 0) prefs.update_from_component(StaticPlotComponent([300,10]), 0) pref_size = prefs.get_preferred_size() - self.assertEquals(pref_size[0], 300) + self.assertEqual(pref_size[0], 300) sizes = prefs.compute_size_array(400) - self.assertEquals(sizes[0], 400) + self.assertEqual(sizes[0], 400) def test_sequential_resizable(self): prefs = SizePrefs(3, "v") @@ -296,9 +298,9 @@ def test_overlapping_fully_resizable(self): for i in range(3): prefs.update_from_component(ResizablePlotComponent(), 0) pref_size = prefs.get_preferred_size() - self.assertEquals(pref_size[0], 0) + self.assertEqual(pref_size[0], 0) sizes = prefs.compute_size_array(60) - self.assertEquals(sizes[0], 60) + self.assertEqual(sizes[0], 60) def test_sequential_mixed_resizable(self): # Tests a sequence of resizable and fully resizable components. diff --git a/chaco/tests/scatterplot_renderers_test_case.py b/chaco/tests/scatterplot_renderers_test_case.py index c6e57cfdf..803675ed3 100644 --- a/chaco/tests/scatterplot_renderers_test_case.py +++ b/chaco/tests/scatterplot_renderers_test_case.py @@ -1,5 +1,7 @@ import unittest +import six.moves as sm + from numpy import alltrue from enable.compiled_path import CompiledPath @@ -12,7 +14,7 @@ def test_scatter_fast(self): """ Coverage test to check basic case works """ size = (50, 50) scatterplot = create_scatter_plot( - data=[range(10), range(10)], + data=[list(sm.xrange(10)), list(sm.xrange(10))], border_visible=False, ) scatterplot.outer_bounds = list(size) @@ -25,7 +27,7 @@ def test_scatter_circle(self): """ Coverage test to check circles work """ size = (50, 50) scatterplot = create_scatter_plot( - data=[range(10), range(10)], + data=[list(sm.xrange(10)), list(sm.xrange(10))], marker="circle", border_visible=False, ) @@ -47,7 +49,7 @@ def test_scatter_custom(self): size = (50, 50) scatterplot = create_scatter_plot( - data=[range(10), range(10)], + data=[list(sm.xrange(10)), list(sm.xrange(10))], marker='custom', border_visible=False, ) @@ -62,10 +64,10 @@ def test_scatter_slow(self): """ Coverage test to check multiple marker size works """ size = (50, 50) scatterplot = create_scatter_plot( - data=[range(10), range(10)], + data=[list(sm.xrange(10)), list(sm.xrange(10))], marker="circle", border_visible=False, - marker_size=range(1, 11), + marker_size=list(sm.xrange(1, 11)), ) scatterplot.outer_bounds = list(size) gc = PlotGraphicsContext(size) diff --git a/chaco/tests/serializable_test_case.py b/chaco/tests/serializable_test_case.py index b4b6c82e7..efa15c9f4 100644 --- a/chaco/tests/serializable_test_case.py +++ b/chaco/tests/serializable_test_case.py @@ -1,10 +1,11 @@ +from __future__ import print_function -from cPickle import loads, dumps +import six.moves as sm import unittest # pickling child classes doesn't work well in the unittest framework unless # the classes to be pickled are in a different file -from serializable_base import Circle, Poly +from .serializable_base import Circle, Poly class SimpleSerializationTestCase(unittest.TestCase): @@ -18,25 +19,25 @@ def compare_traits(self, a, b, trait_names=None): o1 = getattr(a,name) o2 = getattr(b,name) if isinstance(o1, list) or isinstance(o1, tuple): - print "Warning: Cowardly refusing to do deep compares" + print("Warning: Cowardly refusing to do deep compares") else: - self.assert_(o1 == o2) + self.assertTrue(o1 == o2) return def test_basic_save(self): c = Circle(radius=5.0, name="c1", x=1.0, y=2.0) - c2 = loads(dumps(c)) + c2 = sm.cPickle.loads(sm.cPickle.dumps(c)) for attrib in ("tools", "filled", "color", "x", "radius"): - self.assert_(getattr(c, attrib) == getattr(c2, attrib)) - self.failUnlessEqual(c2.y, 2.0) + self.assertTrue(getattr(c, attrib) == getattr(c2, attrib)) + self.assertEqual(c2.y, 2.0) return def test_basic_save2(self): p = Poly(numside=3, name="poly", x=3.0, y=4.0) - p2 = loads(dumps(p)) + p2 = sm.cPickle.loads(sm.cPickle.dumps(p)) for attrib in ("tools", "filled", "color", "x", "numsides", "length"): - self.assert_(getattr(p, attrib) == getattr(p2, attrib)) - self.failUnlessEqual(p2.y, 4.0) + self.assertTrue(getattr(p, attrib) == getattr(p2, attrib)) + self.assertEqual(p2.y, 4.0) return diff --git a/chaco/tests/speedups_test_case.py b/chaco/tests/speedups_test_case.py index 8403fd489..62ae9751a 100644 --- a/chaco/tests/speedups_test_case.py +++ b/chaco/tests/speedups_test_case.py @@ -27,7 +27,7 @@ def test_basic(self): points, selection = self.func(index, 4.5, 14.5, value, -1.0, 2.4) desired = array([[5, 6, 7, 8, 9, 10, 11, 12, 13, 14], [0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 0.65, 0.8]]).T - self.assert_(selection == None) + self.assertTrue(selection == None) assert_close(desired, points) def test_masked(self): diff --git a/chaco/tests/test_data_label.py b/chaco/tests/test_data_label.py index 558db5100..5309d7976 100644 --- a/chaco/tests/test_data_label.py +++ b/chaco/tests/test_data_label.py @@ -1,4 +1,7 @@ import unittest + +import six.moves as sm + from chaco.api import create_scatter_plot, PlotGraphicsContext, DataLabel @@ -10,7 +13,8 @@ def test_data_label_arrow_not_visible(self): # arrow_visible=False in the DataLabel constructor) would raise an # exception because of an undefined reference. size = (50, 50) - plot = create_scatter_plot(data=[range(10), range(10)]) + plot = create_scatter_plot(data=[list(sm.xrange(10)), + list(sm.xrange(10))]) label = DataLabel(component=plot, data_point=(4, 4), marker_color="red", diff --git a/chaco/tests/test_image_plot.py b/chaco/tests/test_image_plot.py index dba9d3105..1df5de21e 100644 --- a/chaco/tests/test_image_plot.py +++ b/chaco/tests/test_image_plot.py @@ -1,7 +1,14 @@ +from __future__ import print_function + import os + import tempfile from contextlib import contextmanager +import six + +import unittest + import numpy as np from traits.etsconfig.api import ETSConfig @@ -89,7 +96,7 @@ def verify_result_image(input_image, expected_image, **plot_kwargs): assert expected_image.dtype == np.uint8 image_result = rendered_image_result(input_image, **plot_kwargs) rms = calculate_rms(image_result, expected_image) - print "RMS =", rms + print("RMS =", rms) assert rms < MAX_RMS_ERROR @@ -108,34 +115,40 @@ def plot_comparison(input_image, expected_image, **plot_kwargs): plt.show() +@unittest.skipIf(six.PY3, "Bug in the image plotter in python 3. See GH enthought/enable #95.") def test_horizontal_top_left(): # Horizontal orientation with top left origin renders original image. verify_result_image(RGB, IMAGE, origin='top left') +@unittest.skipIf(six.PY3, "Bug in the image plotter in python 3. See GH enthought/enable #95.") def test_horizontal_bottom_left(): # Horizontal orientation with bottom left origin renders a vertically # flipped image. verify_result_image(RGB, IMAGE[::-1], origin='bottom left') +@unittest.skipIf(six.PY3, "Bug in the image plotter in python 3. See GH enthought/enable #95.") def test_horizontal_top_right(): # Horizontal orientation with top right origin renders a horizontally # flipped image. verify_result_image(RGB, IMAGE[:, ::-1], origin='top right') +@unittest.skipIf(six.PY3, "Bug in the image plotter in python 3. See GH enthought/enable #95.") def test_horizontal_bottom_right(): # Horizontal orientation with top right origin renders an image flipped # horizontally and vertically. verify_result_image(RGB, IMAGE[::-1, ::-1], origin='bottom right') +@unittest.skipIf(six.PY3, "Bug in the image plotter in python 3. See GH enthought/enable #95.") def test_vertical_top_left(): # Vertical orientation with top left origin renders transposed image. verify_result_image(RGB, IMAGE.T, origin='top left', orientation='v') +@unittest.skipIf(six.PY3, "Bug in the image plotter in python 3. See GH enthought/enable #95.") def test_vertical_bottom_left(): # Vertical orientation with bottom left origin renders transposed image # that is vertically flipped. @@ -143,6 +156,7 @@ def test_vertical_bottom_left(): origin='bottom left', orientation='v') +@unittest.skipIf(six.PY3, "Bug in the image plotter in python 3. See GH enthought/enable #95.") def test_vertical_top_right(): # Vertical orientation with top right origin renders transposed image # that is horizontally flipped. @@ -150,6 +164,7 @@ def test_vertical_top_right(): origin='top right', orientation='v') +@unittest.skipIf(six.PY3, "Bug in the image plotter in python 3. See GH enthought/enable #95.") def test_vertical_bottom_right(): # Vertical orientation with bottom right origin renders transposed image # that is flipped vertically and horizontally. diff --git a/chaco/text_box_overlay.py b/chaco/text_box_overlay.py index 734b85c6c..3e9dcd09d 100644 --- a/chaco/text_box_overlay.py +++ b/chaco/text_box_overlay.py @@ -8,8 +8,8 @@ from traits.api import Any, Enum, Int, Str, Float, Trait, Bool # Local, relative imports -from abstract_overlay import AbstractOverlay -from label import Label +from .abstract_overlay import AbstractOverlay +from .label import Label class TextBoxOverlay(AbstractOverlay): diff --git a/chaco/text_plot_1d.py b/chaco/text_plot_1d.py index 045f9c493..ad493da80 100644 --- a/chaco/text_plot_1d.py +++ b/chaco/text_plot_1d.py @@ -6,7 +6,8 @@ from __future__ import absolute_import -from itertools import izip + +import six.moves as sm from numpy import array, empty @@ -105,7 +106,7 @@ def _draw_plot(self, gc, view_bounds=None, mode="normal"): def _render(self, gc, pts, labels): with gc: gc.clip_to_rect(self.x, self.y, self.width, self.height) - for pt, label in izip(pts, labels): + for pt, label in sm.zip(pts, labels): with gc: gc.translate_ctm(*pt) label.draw(gc) diff --git a/chaco/ticks.py b/chaco/ticks.py index 219b8472a..aa68d84f1 100644 --- a/chaco/ticks.py +++ b/chaco/ticks.py @@ -13,6 +13,8 @@ """ # Major library imports +import six + from numpy import arange, argsort, array, ceil, concatenate, equal, finfo, \ float64, floor, linspace, log10, minimum, ndarray, newaxis, \ putmask, shape @@ -159,12 +161,12 @@ def auto_ticks ( data_low, data_high, bound_low, bound_high, tick_interval, is_auto_low = (bound_low == 'auto') is_auto_high = (bound_high == 'auto') - if isinstance(bound_low, basestring): + if isinstance(bound_low, six.string_types): lower = data_low else: lower = float( bound_low ) - if isinstance(bound_high, basestring): + if isinstance(bound_high, six.string_types): upper = data_high else: upper = float( bound_high ) diff --git a/chaco/tools/api.py b/chaco/tools/api.py index d1171da25..e02b816cb 100644 --- a/chaco/tools/api.py +++ b/chaco/tools/api.py @@ -1,32 +1,32 @@ -from better_zoom import BetterZoom -from better_selecting_zoom import BetterSelectingZoom -from broadcaster import BroadcasterTool -from dataprinter import DataPrinter -from data_label_tool import DataLabelTool +from .better_zoom import BetterZoom +from .better_selecting_zoom import BetterSelectingZoom +from .broadcaster import BroadcasterTool +from .dataprinter import DataPrinter +from .data_label_tool import DataLabelTool from enable.tools.drag_tool import DragTool -from draw_points_tool import DrawPointsTool -from drag_zoom import DragZoom -from highlight_tool import HighlightTool -from image_inspector_tool import ImageInspectorTool, ImageInspectorOverlay -from lasso_selection import LassoSelection -from legend_tool import LegendTool -from legend_highlighter import LegendHighlighter -from line_inspector import LineInspector -from line_segment_tool import LineSegmentTool -from move_tool import MoveTool -from pan_tool import PanTool -from point_marker import PointMarker -from range_selection import RangeSelection -from range_selection_2d import RangeSelection2D -from range_selection_overlay import RangeSelectionOverlay -from regression_lasso import RegressionLasso, RegressionOverlay -from save_tool import SaveTool -from scatter_inspector import ScatterInspector -from select_tool import SelectTool -from simple_inspector import SimpleInspectorTool -from tool_states import ZoomState, PanState, GroupedToolState, SelectedZoomState -from tracking_pan_tool import TrackingPanTool -from tracking_zoom import TrackingZoom -from traits_tool import TraitsTool -from zoom_tool import ZoomTool +from .draw_points_tool import DrawPointsTool +from .drag_zoom import DragZoom +from .highlight_tool import HighlightTool +from .image_inspector_tool import ImageInspectorTool, ImageInspectorOverlay +from .lasso_selection import LassoSelection +from .legend_tool import LegendTool +from .legend_highlighter import LegendHighlighter +from .line_inspector import LineInspector +from .line_segment_tool import LineSegmentTool +from .move_tool import MoveTool +from .pan_tool import PanTool +from .point_marker import PointMarker +from .range_selection import RangeSelection +from .range_selection_2d import RangeSelection2D +from .range_selection_overlay import RangeSelectionOverlay +from .regression_lasso import RegressionLasso, RegressionOverlay +from .save_tool import SaveTool +from .scatter_inspector import ScatterInspector +from .select_tool import SelectTool +from .simple_inspector import SimpleInspectorTool +from .tool_states import ZoomState, PanState, GroupedToolState, SelectedZoomState +from .tracking_pan_tool import TrackingPanTool +from .tracking_zoom import TrackingZoom +from .traits_tool import TraitsTool +from .zoom_tool import ZoomTool # EOF diff --git a/chaco/tools/better_selecting_zoom.py b/chaco/tools/better_selecting_zoom.py index 25d40dafa..8aa449a1f 100644 --- a/chaco/tools/better_selecting_zoom.py +++ b/chaco/tools/better_selecting_zoom.py @@ -7,8 +7,8 @@ from traits.api import Bool, Enum, Trait, Int, Float, Tuple, Instance, Property from traits.util.deprecated import deprecated -from better_zoom import BetterZoom -from tool_states import SelectedZoomState +from .better_zoom import BetterZoom +from .tool_states import SelectedZoomState class BetterSelectingZoom(AbstractOverlay, BetterZoom): """ Zooming tool which allows the user to draw a box which defines the diff --git a/chaco/tools/better_zoom.py b/chaco/tools/better_zoom.py index 2f61d35ad..faa0dfed1 100644 --- a/chaco/tools/better_zoom.py +++ b/chaco/tools/better_zoom.py @@ -13,8 +13,8 @@ from enable.api import BaseTool, KeySpec from traits.api import Enum, Float, Instance, Bool, List, Tuple -from tool_history_mixin import ToolHistoryMixin -from tool_states import ZoomState, PanState, GroupedToolState, ToolState +from .tool_history_mixin import ToolHistoryMixin +from .tool_states import ZoomState, PanState, GroupedToolState, ToolState class BetterZoom(BaseTool, ToolHistoryMixin): diff --git a/chaco/tools/broadcaster.py b/chaco/tools/broadcaster.py index 9330fda79..28d90fbb0 100644 --- a/chaco/tools/broadcaster.py +++ b/chaco/tools/broadcaster.py @@ -23,12 +23,11 @@ def dispatch(self, event, suffix): handled = False # keeps track of whether any tool handled this event if event.window.mouse_owner == self: - tools = self.mouse_owners.keys() + tools = list(self.mouse_owners.keys()) mouse_owned = True else: tools = self.tools mouse_owned = False - for tool in tools: if mouse_owned: event.window.set_mouse_owner(tool, self.mouse_owners[tool]) @@ -42,7 +41,6 @@ def dispatch(self, event, suffix): # The tool owned the mouse before handling the previous event, # and now doesn't, so remove it from the list of mouse_owners del self.mouse_owners[tool] - elif not mouse_owned and event.window.mouse_owner == tool: # The tool is a new mouse owner self.mouse_owners[tool] = event.window.mouse_owner_transform diff --git a/chaco/tools/cursor_tool.py b/chaco/tools/cursor_tool.py index c955a9ce7..a0f30e38d 100644 --- a/chaco/tools/cursor_tool.py +++ b/chaco/tools/cursor_tool.py @@ -27,7 +27,7 @@ from chaco.scatter_markers import CircleMarker from chaco.base_xy_plot import BaseXYPlot from chaco.base_2d_plot import Base2DPlot -from line_inspector import LineInspector +from .line_inspector import LineInspector def CursorTool(component, *args, **kwds): diff --git a/chaco/tools/dataprinter.py b/chaco/tools/dataprinter.py index 1b9f21855..023019feb 100644 --- a/chaco/tools/dataprinter.py +++ b/chaco/tools/dataprinter.py @@ -1,5 +1,8 @@ """ Defines the DataPrinter tool class. """ + +from __future__ import print_function + # Enthought library imports from traits.api import Str from enable.api import BaseTool @@ -33,10 +36,10 @@ def normal_mouse_move(self, event): ndx = plot.map_index((event.x, event.y), index_only = True) x = plot.index.get_data()[ndx] y = plot.value.get_data()[ndx] - print self.format % (x,y) + print(self.format % (x,y)) else: - print "dataprinter: don't know how to handle plots of type", - print plot.__class__.__name__ + print("dataprinter: don't know how to handle plots of type", end=" ") + print(plot.__class__.__name__) return diff --git a/chaco/tools/drag_zoom.py b/chaco/tools/drag_zoom.py index bad8d56dd..1a7e09eac 100644 --- a/chaco/tools/drag_zoom.py +++ b/chaco/tools/drag_zoom.py @@ -6,7 +6,7 @@ from traits.api import Bool, Enum, Float, Tuple # Chaco imports -from better_zoom import BetterZoom +from .better_zoom import BetterZoom class DragZoom(DragTool, BetterZoom): diff --git a/chaco/tools/legend_highlighter.py b/chaco/tools/legend_highlighter.py index 608c22fcb..0d2bf5469 100644 --- a/chaco/tools/legend_highlighter.py +++ b/chaco/tools/legend_highlighter.py @@ -1,5 +1,8 @@ import operator +import six +import six.moves as sm + # ETS imports from chaco.tools.api import LegendTool from traits.api import List, Float @@ -79,7 +82,7 @@ def normal_left_down(self, event): def _reset_selects(self, plots): """ Set all renderers to their default values. """ - for plot in reduce(operator.add, plots.values()): + for plot in sm.reduce(operator.add, plots.values()): if not hasattr(plot, '_orig_alpha'): plot._orig_alpha = plot.alpha plot._orig_line_width = plot.line_width @@ -89,7 +92,7 @@ def _reset_selects(self, plots): def _set_states(self, plots): """ Decorates a plot to indicate it is selected """ - for plot in reduce(operator.add, plots.values()): + for plot in sm.reduce(operator.add, plots.values()): if not hasattr(plot, '_orig_alpha'): # FIXME: These attributes should be put into the class def. plot._orig_alpha = plot.alpha diff --git a/chaco/tools/line_inspector.py b/chaco/tools/line_inspector.py index e760169b5..12eef8449 100644 --- a/chaco/tools/line_inspector.py +++ b/chaco/tools/line_inspector.py @@ -146,6 +146,8 @@ def normal_mouse_move(self, event): metadata = x_coord, old_y_data elif self.axis == "index_y": metadata = old_x_data, y_coord + else: + raise ValueError(self.axis) else: if plot.orientation == "h": x_ndx, y_ndx = plot.map_index((event.x, event.y), @@ -157,7 +159,6 @@ def normal_mouse_move(self, event): metadata = x_ndx, old_y_data elif self.axis == "index_y": metadata = old_x_data, y_ndx - plot.index.metadata[self.metadata_name] = metadata plot.request_redraw() diff --git a/chaco/tools/range_selection_2d.py b/chaco/tools/range_selection_2d.py index 75099777c..6a0634b0e 100644 --- a/chaco/tools/range_selection_2d.py +++ b/chaco/tools/range_selection_2d.py @@ -4,7 +4,7 @@ import numpy # Chaco imports -from range_selection import RangeSelection +from .range_selection import RangeSelection class RangeSelection2D(RangeSelection): diff --git a/chaco/tools/rect_zoom.py b/chaco/tools/rect_zoom.py index 0fa3b10ff..295b33367 100644 --- a/chaco/tools/rect_zoom.py +++ b/chaco/tools/rect_zoom.py @@ -1,6 +1,6 @@ """ Defines the RectZoomTool class. """ -from zoom_tool import ZoomTool +from .zoom_tool import ZoomTool class RectZoomTool(ZoomTool): """ diff --git a/chaco/tools/scatter_inspector.py b/chaco/tools/scatter_inspector.py index 74acc9a81..6f796c75c 100644 --- a/chaco/tools/scatter_inspector.py +++ b/chaco/tools/scatter_inspector.py @@ -5,7 +5,7 @@ from traits.api import Bool, Str # Local, relative imports -from select_tool import SelectTool +from .select_tool import SelectTool class ScatterInspector(SelectTool): diff --git a/chaco/tools/simple_zoom.py b/chaco/tools/simple_zoom.py index 83bf85db9..5909d059d 100644 --- a/chaco/tools/simple_zoom.py +++ b/chaco/tools/simple_zoom.py @@ -14,8 +14,8 @@ # Chaco imports from chaco.abstract_overlay import AbstractOverlay -from base_zoom_tool import BaseZoomTool -from tool_history_mixin import ToolHistoryMixin +from .base_zoom_tool import BaseZoomTool +from .tool_history_mixin import ToolHistoryMixin class SimpleZoom(AbstractOverlay, ToolHistoryMixin, BaseZoomTool): """ Selects a range along the index or value axis. @@ -674,7 +674,7 @@ def __getstate__(self): '_screen_end'] state = super(SimpleZoom,self).__getstate__() for key in dont_pickle: - if state.has_key(key): + if key in state: del state[key] return state diff --git a/chaco/tools/toolbars/toolbar_buttons.py b/chaco/tools/toolbars/toolbar_buttons.py index 96f80f9b7..d15c75042 100644 --- a/chaco/tools/toolbars/toolbar_buttons.py +++ b/chaco/tools/toolbars/toolbar_buttons.py @@ -1,3 +1,5 @@ +import six + import numpy from traits.etsconfig.api import ETSConfig @@ -136,7 +138,7 @@ def perform(self, event): gc.render_component(plot_component) try: gc.save(filename) - except KeyError, e: + except KeyError as e: errmsg = ("The filename must have an extension that matches " "a graphics format, such as '.png' or '.tiff'.") if str(e.message) != '': diff --git a/chaco/tools/tracking_zoom.py b/chaco/tools/tracking_zoom.py index 9ad7a5397..2d1352217 100644 --- a/chaco/tools/tracking_zoom.py +++ b/chaco/tools/tracking_zoom.py @@ -2,7 +2,7 @@ """ # Chaco imports -from zoom_tool import ZoomTool +from .zoom_tool import ZoomTool class TrackingZoom(ZoomTool): """ Allows the user to zoom in or out on a plot that is using tracking. diff --git a/chaco/tools/zoom_tool.py b/chaco/tools/zoom_tool.py index 2753d7461..023ba7786 100644 --- a/chaco/tools/zoom_tool.py +++ b/chaco/tools/zoom_tool.py @@ -1 +1 @@ -from better_selecting_zoom import BetterSelectingZoom as ZoomTool +from .better_selecting_zoom import BetterSelectingZoom as ZoomTool diff --git a/chaco/tooltip.py b/chaco/tooltip.py index c23ae947a..b93e3c569 100644 --- a/chaco/tooltip.py +++ b/chaco/tooltip.py @@ -13,9 +13,9 @@ # Local imports -from abstract_overlay import AbstractOverlay -from plot_component import PlotComponent -from label import Label +from .abstract_overlay import AbstractOverlay +from .plot_component import PlotComponent +from .label import Label class ToolTip(AbstractOverlay): diff --git a/chaco/transform_color_mapper.py b/chaco/transform_color_mapper.py index 378cb0541..52acadff7 100644 --- a/chaco/transform_color_mapper.py +++ b/chaco/transform_color_mapper.py @@ -3,7 +3,7 @@ from chaco.api import ColorMapper from traits.api import Trait, Callable, Tuple, Float, on_trait_change -from speedups import map_colors, map_colors_uint8 +from .speedups import map_colors, map_colors_uint8 class TransformColorMapper(ColorMapper): """This class adds arbitrary data transformations to a ColorMapper. diff --git a/chaco/variable_size_scatterplot.py b/chaco/variable_size_scatterplot.py index eca76eb5f..64f4f3368 100644 --- a/chaco/variable_size_scatterplot.py +++ b/chaco/variable_size_scatterplot.py @@ -2,7 +2,7 @@ This definition remains for backwards compatibility. """ -from chaco.scatterplot import ScatterPlot +from .scatterplot import ScatterPlot # TODO: This should be officially deprecated. diff --git a/docs/scipy_tutorial/chaco_talk.html b/docs/scipy_tutorial/chaco_talk.html index 81f6233c4..24458e08c 100644 --- a/docs/scipy_tutorial/chaco_talk.html +++ b/docs/scipy_tutorial/chaco_talk.html @@ -293,7 +293,7 @@

Writing our first interactor

def dispatch(self, event, suffix): # event' is a MouseEvent or KeyEvent object from the enable2 # package, and suffix is a text string - print suffix, "event received at (%d,%d)" % (event.x, event.y) + print(suffix, "event received at (%d,%d)" % (event.x, event.y)) from tutorial2 import myplot, PlotFrame, main @@ -318,7 +318,7 @@

Looking at data

# We are assuming that self.component is an X-Y plot x = self.component.x_mapper.map_data(event.x) y = self.component.y_mapper.map_data(event.y) - print suffix, "event received at (%d,%d)" % (x, y) + print(suffix, "event received at (%d,%d)" % (x, y)) from tutorial2 import myplot, PlotFrame, main diff --git a/docs/source/conf.py b/docs/source/conf.py index d5783929b..528d0c648 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -52,7 +52,8 @@ def get_build_docset(): # The default replacements for |version| and |release|, also used in various # other places throughout the built documents. d = {} -execfile(os.path.join('..', '..', 'chaco', '_version.py'), d) +chaco_version_file = os.path.join('..', '..', 'chaco', '_version.py') +exec(compile(open(chaco_version_file).read(), chaco_version_file, 'exec'), d) release = d['version'] version = '.'.join(release.split('.',2)[:2]) diff --git a/docs/source/sphinxext/comment_eater.py b/docs/source/sphinxext/comment_eater.py index cb408cd97..715748cad 100644 --- a/docs/source/sphinxext/comment_eater.py +++ b/docs/source/sphinxext/comment_eater.py @@ -1,10 +1,11 @@ -from cStringIO import StringIO +import six.moves as sm + import compiler import inspect import textwrap import tokenize -from compiler_unparse import unparse +from .compiler_unparse import unparse class Comment(object): @@ -76,7 +77,7 @@ def __init__(self): def process_file(self, file): """ Process a file object. """ - for token in tokenize.generate_tokens(file.next): + for token in tokenize.generate_tokens(sm.next(file)): self.process_token(*token) self.make_index() @@ -154,7 +155,7 @@ def get_class_traits(klass): # FIXME: gracefully handle errors here or in the caller? source = inspect.getsource(klass) cb = CommentBlocker() - cb.process_file(StringIO(source)) + cb.process_file(sm.StringIO(source)) mod_ast = compiler.parse(source) class_ast = mod_ast.node.nodes[0] for node in class_ast.code.nodes: diff --git a/docs/source/sphinxext/compiler_unparse.py b/docs/source/sphinxext/compiler_unparse.py index d62d65c2e..1bb1e13fb 100644 --- a/docs/source/sphinxext/compiler_unparse.py +++ b/docs/source/sphinxext/compiler_unparse.py @@ -12,11 +12,14 @@ """ import sys -import cStringIO + +import six +import six.moves as sm + from compiler.ast import Const, Name, Tuple, Div, Mul, Sub, Add def unparse(ast, single_line_functions=False): - s = cStringIO.StringIO() + s = sm.cStringIO.StringIO() UnparseCompilerAst(ast, s, single_line_functions) return s.getvalue().lstrip() diff --git a/docs/source/sphinxext/docscrape.py b/docs/source/sphinxext/docscrape.py index a4b8cfff7..cf60cdf79 100644 --- a/docs/source/sphinxext/docscrape.py +++ b/docs/source/sphinxext/docscrape.py @@ -1,12 +1,16 @@ """Extract reference documentation from the NumPy source tree. """ +from __future__ import print_function import inspect import textwrap import re + +import six +import six.moves as sm + import pydoc -from StringIO import StringIO from warnings import warn class Reader(object): @@ -122,7 +126,7 @@ def __getitem__(self,key): return self._parsed_data[key] def __setitem__(self,key,val): - if not self._parsed_data.has_key(key): + if key not in self._parsed_data: warn("Unknown section %s" % key) else: self._parsed_data[key] = val @@ -362,7 +366,7 @@ def _str_index(self): idx = self['index'] out = [] out += ['.. index:: %s' % idx.get('default','')] - for section, references in idx.iteritems(): + for section, references in six.iteritems(idx): if section == 'default': continue out += [' :%s: %s' % (section, ', '.join(references))] @@ -399,13 +403,13 @@ def __init__(self, func, role='func'): self._role = role # e.g. "func" or "meth" try: NumpyDocString.__init__(self,inspect.getdoc(func) or '') - except ValueError, e: - print '*'*78 - print "ERROR: '%s' while parsing `%s`" % (e, self._f) - print '*'*78 - #print "Docstring follows:" - #print doclines - #print '='*78 + except ValueError as e: + print('*'*78) + print("ERROR: '%s' while parsing `%s`" % (e, self._f)) + print('*'*78) + #print("Docstring follows:") + #print(doclines) + #print('='*78) if not self['Signature']: func, func_name = self.get_func() @@ -415,7 +419,7 @@ def __init__(self, func, role='func'): argspec = inspect.formatargspec(*argspec) argspec = argspec.replace('*','\*') signature = '%s%s' % (func_name, argspec) - except TypeError, e: + except TypeError as e: signature = '%s()' % func_name self['Signature'] = signature @@ -437,8 +441,8 @@ def __str__(self): 'meth': 'method'} if self._role: - if not roles.has_key(self._role): - print "Warning: invalid role %s" % self._role + if self._role not in roles: + print("Warning: invalid role %s" % self._role) out += '.. %s:: %s\n \n\n' % (roles.get(self._role,''), func_name) diff --git a/docs/source/sphinxext/docscrape_sphinx.py b/docs/source/sphinxext/docscrape_sphinx.py index a644866fa..8821ae700 100644 --- a/docs/source/sphinxext/docscrape_sphinx.py +++ b/docs/source/sphinxext/docscrape_sphinx.py @@ -1,5 +1,9 @@ import re, textwrap -from docscrape import NumpyDocString, FunctionDoc, ClassDoc + +import six + +from .docscrape import NumpyDocString, FunctionDoc, ClassDoc + class SphinxDocString(NumpyDocString): # string conversion routines @@ -66,7 +70,7 @@ def _str_index(self): return out out += ['.. index:: %s' % idx.get('default','')] - for section, references in idx.iteritems(): + for section, references in six.iteritems(idx): if section == 'default': continue elif section == 'refguide': diff --git a/docs/source/sphinxext/numpydoc.py b/docs/source/sphinxext/numpydoc.py index 4a58efa54..7bc0148f8 100644 --- a/docs/source/sphinxext/numpydoc.py +++ b/docs/source/sphinxext/numpydoc.py @@ -1,7 +1,14 @@ +from __future__ import print_function + import os, re, pydoc -from docscrape_sphinx import SphinxDocString, SphinxClassDoc, SphinxFunctionDoc + +import six +import six.moves as sm + +from .docscrape_sphinx import SphinxDocString, SphinxClassDoc, SphinxFunctionDoc import inspect + def mangle_docstrings(app, what, name, obj, options, lines, reference_offset=[0]): if what == 'module': @@ -26,7 +33,7 @@ def mangle_docstrings(app, what, name, obj, options, lines, try: references.append(int(l[len('.. ['):l.index(']')])) except ValueError: - print "WARNING: invalid reference in %s docstring" % name + print("WARNING: invalid reference in %s docstring" % name) # Start renaming from the biggest number, otherwise we may # overwrite references. @@ -81,7 +88,7 @@ def initialize(app): fn = app.config.numpydoc_phantom_import_file if (fn and os.path.isfile(fn)): - print "[numpydoc] Phantom importing modules from", fn, "..." + print("[numpydoc] Phantom importing modules from", fn, "...") import_phantom_module(fn) def setup(app): @@ -258,7 +265,7 @@ def _import_by_name(name): name_parts = name.split('.') last_j = 0 modname = None - for j in reversed(range(1, len(name_parts)+1)): + for j in reversed(sm.xrange(1, len(name_parts)+1)): last_j = j modname = '.'.join(name_parts[:j]) try: @@ -275,7 +282,7 @@ def _import_by_name(name): return obj else: return sys.modules[modname] - except (ValueError, ImportError, AttributeError, KeyError), e: + except (ValueError, ImportError, AttributeError, KeyError) as e: raise ImportError(e) #------------------------------------------------------------------------------ @@ -315,7 +322,7 @@ def monkeypatch_sphinx_ext_autodoc(): if sphinx.ext.autodoc.format_signature is our_format_signature: return - print "[numpydoc] Monkeypatching sphinx.ext.autodoc ..." + print("[numpydoc] Monkeypatching sphinx.ext.autodoc ...") _original_format_signature = sphinx.ext.autodoc.format_signature sphinx.ext.autodoc.format_signature = our_format_signature @@ -431,6 +438,7 @@ def base_cmp(a, b): doc = "%s%s\n\n%s" % (funcname, argspec, doc) obj = lambda: 0 obj.__argspec_is_invalid_ = True + obj.func_name = funcname obj.__name__ = name obj.__doc__ = doc diff --git a/docs/source/sphinxext/traitsdoc.py b/docs/source/sphinxext/traitsdoc.py index 01c6dacf4..2fe9e7949 100644 --- a/docs/source/sphinxext/traitsdoc.py +++ b/docs/source/sphinxext/traitsdoc.py @@ -1,11 +1,14 @@ +from __future__ import print_function + import inspect import os import pydoc -import docscrape -from docscrape_sphinx import SphinxClassDoc, SphinxFunctionDoc -import numpydoc -import comment_eater +from . import docscrape +from .docscrape_sphinx import SphinxClassDoc, SphinxFunctionDoc +from . import numpydoc +from . import comment_eater + class SphinxTraitsDoc(SphinxClassDoc): def __init__(self, cls, modulename='', func_doc=SphinxFunctionDoc): @@ -126,7 +129,7 @@ def initialize(app): fn = app.config.numpydoc_phantom_import_file if (fn and os.path.isfile(fn)): - print "[numpydoc] Phantom importing modules from", fn, "..." + print("[numpydoc] Phantom importing modules from", fn, "...") numpydoc.import_phantom_module(fn) def setup(app): diff --git a/docs/source/user_manual/chaco_tutorial.rst b/docs/source/user_manual/chaco_tutorial.rst index 5896947d9..865b919ce 100644 --- a/docs/source/user_manual/chaco_tutorial.rst +++ b/docs/source/user_manual/chaco_tutorial.rst @@ -1173,7 +1173,7 @@ This can be done in just a few lines: :: class CustomTool(BaseTool): def normal_mouse_move(self, event): - print "Screen point:", event.x, event.y + print("Screen point:", event.x, event.y) :class:`BaseTool` is an abstract class that forms the interface for tools. It defines a set of methods that are called for the @@ -1210,7 +1210,7 @@ event, and we will exit that state when we detect a "left up" event: :: event_state = Enum("normal", "mousedown") def normal_mouse_move(self, event): - print "Screen:", event.x, event.y + print("Screen:", event.x, event.y) def normal_left_down(self, event): self.event_state = "mousedown" @@ -1232,7 +1232,7 @@ data space: .. code-block:: python def mousedown_mouse_move(self, event): - print "Data:", self.component.map_data((event.x, event.y)) + print("Data:", self.component.map_data((event.x, event.y))) The ``self.component`` attribute contains a reference to the underlying plot. This is why tools need to be given a reference to a plot when diff --git a/examples/demo/advanced/asynchronous_updates.py b/examples/demo/advanced/asynchronous_updates.py index bbe9dd23e..319f55200 100644 --- a/examples/demo/advanced/asynchronous_updates.py +++ b/examples/demo/advanced/asynchronous_updates.py @@ -11,6 +11,8 @@ # Major library imports from numpy import ogrid, pi, sin +import six.moves as sm + # Enthought library imports from enable.api import Component, ComponentEditor from traits.api import (Array, Bool, DelegatesTo, HasTraits, Instance, Range, @@ -155,7 +157,7 @@ def blur_image(image, blur_level): """ Blur the image using a potentially time-consuming algorithm """ blurred_image = image.copy() - for _ in xrange(blur_level**2): + for _ in sm.xrange(blur_level**2): blurred_image[1:-1, 1:-1] += ( blurred_image[:-2, 1:-1] + # top blurred_image[2:, 1:-1] + # bottom diff --git a/examples/demo/advanced/data_cube.py b/examples/demo/advanced/data_cube.py index 4326d497b..9420a783d 100644 --- a/examples/demo/advanced/data_cube.py +++ b/examples/demo/advanced/data_cube.py @@ -3,6 +3,8 @@ Click or click-drag in any data window to set the slice to view. """ +from __future__ import print_function +import warnings # Outstanding TODOs: # - need to add line inspectors to side and bottom plots, and synchronize @@ -16,6 +18,8 @@ # Standard library imports import os, sys, shutil +import six.moves as sm + # Major library imports from numpy import arange, linspace, nanmin, nanmax, newaxis, pi, sin, cos @@ -315,7 +319,7 @@ def download_data(): print('Please enter the location of the "voldata" subdirectory containing') print('the data files for this demo, or enter a path to download to (7.8MB).') print('Press to download to the current directory.') - dl_path = input('Path: ').strip().rstrip("/").rstrip("\\") + dl_path = sm.input('Path: ').strip().rstrip("/").rstrip("\\") if not dl_path.endswith("voldata"): voldata_path = os.path.join(dl_path, 'voldata') @@ -360,7 +364,7 @@ def download_data(): try: open(tar_path, 'wb').write(opener.read()) except: - print('Cannot write to the destination directory specified. ' \ + print('Cannot write to the destination directory specified. ' 'Opening backup data.') run_cleanup = False raise @@ -379,7 +383,7 @@ def download_data(): def cleanup_data(): global dl_path - answer = input('Remove downloaded files? [Y/N]: ') + answer = sm.input('Remove downloaded files? [Y/N]: ') if answer.lower() == 'y': try: shutil.rmtree(os.path.join(dl_path, 'voldata')) diff --git a/examples/demo/basic/image_from_file.py b/examples/demo/basic/image_from_file.py index 8ced9c23e..9eed76270 100644 --- a/examples/demo/basic/image_from_file.py +++ b/examples/demo/basic/image_from_file.py @@ -140,20 +140,17 @@ def _save(self): plot_gc.save(self._save_file) def _load(self): - try: - # Load the image with the user supplied filename - image = ImageData.fromfile(self._load_file) - - # Update the plot data. NB we must extract _data from the image - # for the time being, until ImageData is made more friendly - self.pd.set_data("imagedata", image._data) - - # Set the title and redraw - self.plot.title = os.path.basename(self._load_file) - self.plot.request_redraw() - except: - # If loading fails, simply do nothing - pass + # Load the image with the user supplied filename + image = ImageData.fromfile(self._load_file) + + # Update the plot data. NB we must extract _data from the image + # for the time being, until ImageData is made more friendly + self.pd.set_data("imagedata", image._data) + + # Set the title and redraw + self.plot.title = os.path.basename(self._load_file) + self.plot.request_redraw() + #------------------------------------------------------------------------------- diff --git a/examples/demo/financial_plot.py b/examples/demo/financial_plot.py index 030438bc2..617f08a09 100644 --- a/examples/demo/financial_plot.py +++ b/examples/demo/financial_plot.py @@ -82,7 +82,8 @@ def _create_plot_component(): container.overlays.append(PlotLabel("Financial Plot", component=container, #font="Times New Roman 24")) - font="Arial 24")) + font="Arial 24" + )) return container #=============================================================================== diff --git a/examples/demo/image_plot_origin_and_orientation.py b/examples/demo/image_plot_origin_and_orientation.py index e8c8ec5e7..1d347634d 100644 --- a/examples/demo/image_plot_origin_and_orientation.py +++ b/examples/demo/image_plot_origin_and_orientation.py @@ -13,7 +13,7 @@ """ # Major library imports -from scipy.misc import lena +from scipy.misc import face # Enthought library imports from enable.api import Component, ComponentEditor @@ -52,7 +52,7 @@ def _plot_default(self): ('bottom right', 'v')] orientation_name = {'h': 'horizontal', 'v': 'vertical'} - pd = ArrayPlotData(image=lena()) + pd = ArrayPlotData(image=face()) # Plot some bessel functions and add the plots to our container for origin, orientation in arrangements: plot = Plot(pd, default_origin=origin, orientation=orientation) diff --git a/examples/demo/noninteractive.py b/examples/demo/noninteractive.py index 0479b3a5b..d80d14956 100644 --- a/examples/demo/noninteractive.py +++ b/examples/demo/noninteractive.py @@ -3,6 +3,8 @@ This demonstrates how to create a plot offscreen and save it to an image file on disk. """ +from __future__ import print_function + # Standard library imports import os import sys @@ -93,6 +95,7 @@ def get_directory(filename): if not os.path.isabs(path): print('Creating image: ' + os.path.join(os.getcwd(), path, filename)) + else: print('Creating image: ' + os.path.join(path, filename)) diff --git a/examples/demo/zoomed_plot/zoom_plot.py b/examples/demo/zoomed_plot/zoom_plot.py index ef18bd100..17ce2f391 100644 --- a/examples/demo/zoomed_plot/zoom_plot.py +++ b/examples/demo/zoomed_plot/zoom_plot.py @@ -24,7 +24,7 @@ from chaco.tools.api import RangeSelection # Relative imports -from zoom_overlay import ZoomOverlay +from .zoom_overlay import ZoomOverlay sample_path = os.path.join('examples','data','sample.wav') alt_path = os.path.join('..','data','sample.wav') @@ -33,7 +33,7 @@ numpts = 3000 def read_music_data(): - from wav_to_numeric import wav_to_numeric + from .wav_to_numeric import wav_to_numeric index, data = wav_to_numeric(fname) return index[:numpts], data[:numpts] diff --git a/setup.py b/setup.py index dbb3c15a1..6f340f46c 100644 --- a/setup.py +++ b/setup.py @@ -201,5 +201,5 @@ def write_version_py(filename=_VERSION_FILENAME): packages = find_packages(), platforms = ["Windows", "Linux", "Mac OS-X", "Unix", "Solaris"], zip_safe = False, - use_2to3=True, + use_2to3=False, )