def setup_arrayeditor(qbot, data, title="", xlabels=None, ylabels=None): """Setups an arrayeditor.""" dlg = ArrayEditor() dlg.setup_and_check(data, title, xlabels=xlabels, ylabels=ylabels) dlg.show() qbot.addWidget(dlg) return dlg
def create_dialog(obj, obj_name): """Creates the editor dialog and returns a tuple (dialog, func) where func is the function to be called with the dialog instance as argument, after quitting the dialog box The role of this intermediate function is to allow easy monkey-patching. (uschmitt suggested this indirection here so that he can monkey patch oedit to show eMZed related data) """ # Local import from spyder_kernels.utils.nsview import (ndarray, FakeObject, Image, is_known_type, DataFrame, Series) from spyder.plugins.variableexplorer.widgets.texteditor import TextEditor from spyder.plugins.variableexplorer.widgets.collectionseditor import ( CollectionsEditor) from spyder.plugins.variableexplorer.widgets.arrayeditor import ( ArrayEditor) if DataFrame is not FakeObject: from spyder.plugins.variableexplorer.widgets.dataframeeditor import ( DataFrameEditor) conv_func = lambda data: data readonly = not is_known_type(obj) if isinstance(obj, ndarray) and ndarray is not FakeObject: dialog = ArrayEditor() if not dialog.setup_and_check(obj, title=obj_name, readonly=readonly): return elif isinstance(obj, Image) and Image is not FakeObject \ and ndarray is not FakeObject: dialog = ArrayEditor() import numpy as np data = np.array(obj) if not dialog.setup_and_check(data, title=obj_name, readonly=readonly): return from spyder.pil_patch import Image conv_func = lambda data: Image.fromarray(data, mode=obj.mode) elif isinstance(obj, (DataFrame, Series)) and DataFrame is not FakeObject: dialog = DataFrameEditor() if not dialog.setup_and_check(obj): return elif is_text_string(obj): dialog = TextEditor(obj, title=obj_name, readonly=readonly) else: dialog = CollectionsEditor() dialog.setup(obj, title=obj_name, readonly=readonly) def end_func(dialog): return conv_func(dialog.get_value()) return dialog, end_func
def launch_arrayeditor(data, title="", xlabels=None, ylabels=None): """Helper routine to launch an arrayeditor and return its result.""" dlg = ArrayEditor() assert dlg.setup_and_check(data, title, xlabels=xlabels, ylabels=ylabels) dlg.show() dlg.accept() # trigger slot connected to OK button return dlg.get_value()
def create_dialog(obj, obj_name): """Creates the editor dialog and returns a tuple (dialog, func) where func is the function to be called with the dialog instance as argument, after quitting the dialog box The role of this intermediate function is to allow easy monkey-patching. (uschmitt suggested this indirection here so that he can monkey patch oedit to show eMZed related data) """ # Local import conv_func = lambda data: data readonly = not is_known_type(obj) if isinstance(obj, np.ndarray) and np.ndarray is not FakeObject: dialog = ArrayEditor() if not dialog.setup_and_check(obj, title=obj_name, readonly=readonly): return elif (isinstance(obj, PIL.Image.Image) and PIL.Image is not FakeObject and np.ndarray is not FakeObject): dialog = ArrayEditor() data = np.array(obj) if not dialog.setup_and_check(data, title=obj_name, readonly=readonly): return conv_func = lambda data: PIL.Image.fromarray(data, mode=obj.mode) elif (isinstance(obj, (pd.DataFrame, pd.Series)) and pd.DataFrame is not FakeObject): dialog = DataFrameEditor() if not dialog.setup_and_check(obj): return elif is_text_string(obj): dialog = TextEditor(obj, title=obj_name, readonly=readonly) else: dialog = CollectionsEditor() dialog.setup(obj, title=obj_name, readonly=readonly) def end_func(dialog): return conv_func(dialog.get_value()) return dialog, end_func
def test_arrayeditor_edit_overflow(qtbot, monkeypatch): """ Test that entry of an overflowing integer is caught and handled properly. Integration regression test for spyder-ide/spyder#6114. """ MockQMessageBox = Mock() attr_to_patch = 'spyder.plugins.variableexplorer.widgets.arrayeditor.QMessageBox' monkeypatch.setattr(attr_to_patch, MockQMessageBox) # Numpy doesn't raise the OverflowError for ints smaller than 64 bits if not os.name == 'nt': int32_bit_exponent = 66 else: int32_bit_exponent = 34 test_parameters = [(1, np.int32, int32_bit_exponent), (2, np.int64, 66)] expected_array = np.array([5, 6, 7, 3, 4]) for idx, int_type, bit_exponent in test_parameters: test_array = np.arange(0, 5).astype(int_type) dialog = ArrayEditor() assert dialog.setup_and_check(test_array, '1D array', xlabels=None, ylabels=None) dialog.show() qtbot.waitForWindowShown(dialog) view = dialog.arraywidget.view qtbot.keyClick(view, Qt.Key_Down) qtbot.keyClick(view, Qt.Key_Up) qtbot.keyClicks(view, '5') qtbot.keyClick(view, Qt.Key_Down) qtbot.keyClick(view, Qt.Key_Space) qtbot.keyClicks(view.focusWidget(), str(int(2**bit_exponent))) qtbot.keyClick(view.focusWidget(), Qt.Key_Down) MockQMessageBox.critical.assert_called_with(ANY, "Error", ANY) assert MockQMessageBox.critical.call_count == idx qtbot.keyClicks(view, '7') qtbot.keyClick(view, Qt.Key_Up) qtbot.keyClicks(view, '6') qtbot.keyClick(view, Qt.Key_Down) qtbot.wait(200) dialog.accept() qtbot.wait(500) assert np.sum( expected_array == dialog.get_value()) == len(expected_array)
def test_arrayeditor_edit_1d_array(qtbot): exp_arr = np.array([1, 0, 2, 3, 4]) arr = np.arange(0, 5) dlg = ArrayEditor() assert dlg.setup_and_check(arr, '1D array', xlabels=None, ylabels=None) dlg.show() qtbot.waitForWindowShown(dlg) view = dlg.arraywidget.view qtbot.keyPress(view, Qt.Key_Down) qtbot.keyPress(view, Qt.Key_Up) qtbot.keyClicks(view, '1') qtbot.keyPress(view, Qt.Key_Down) qtbot.keyClicks(view, '0') qtbot.keyPress(view, Qt.Key_Down) qtbot.keyPress(view, Qt.Key_Return) assert np.sum(exp_arr == dlg.get_value()) == 5
def test_arrayeditor_edit_2d_array(qtbot): arr = np.ones((3, 3)) diff_arr = arr.copy() dlg = ArrayEditor() assert dlg.setup_and_check(arr, '2D array', xlabels=None, ylabels=None) dlg.show() qtbot.waitForWindowShown(dlg) view = dlg.arraywidget.view qtbot.keyPress(view, Qt.Key_Down) qtbot.keyPress(view, Qt.Key_Right) qtbot.keyClicks(view, '3') qtbot.keyPress(view, Qt.Key_Down) qtbot.keyPress(view, Qt.Key_Right) qtbot.keyClicks(view, '0') qtbot.keyPress(view, Qt.Key_Left) qtbot.keyPress(view, Qt.Key_Return) assert np.sum(diff_arr != dlg.get_value()) == 2
def test_arrayeditor_edit_complex_array(qtbot): """See: spyder-ide/spyder#7848""" cnum = -1+0.5j arr = (np.random.random((10, 10)) - 0.50) * cnum dlg = ArrayEditor() assert dlg.setup_and_check(arr, '2D complex array', xlabels=None, ylabels=None) dlg.show() qtbot.waitForWindowShown(dlg) view = dlg.arraywidget.view qtbot.keyPress(view, Qt.Key_Down) # Prevent the test from failing qtbot.wait(300) # This is the actual editor widget on the cell cell_editor = view.viewport().focusWidget() qtbot.keyClicks(cell_editor, str(cnum)) qtbot.keyPress(cell_editor, Qt.Key_Return) dlg.accept()