def test_view_module_in_coledit(): """ Test that modules don't produce an error when opening in Variable Explorer. Also check that they are set as readonly. Regression test for issue #6080 . """ editor = CollectionsEditor() editor.setup(os, "module_test", readonly=False) assert editor.widget.editor.readonly
def show_syspath(self, syspath): """Show sys.path contents.""" if syspath is not None: editor = CollectionsEditor(self) editor.setup(syspath, title="sys.path contents", readonly=True, width=600, icon=ima.icon('syspath')) self.dialog_manager.show(editor) else: return
def test_collectionseditor_with_class_having_buggy_copy(qtbot): """ Test that editor for object whose .copy() returns a different type is readonly; cf. issue #6936. """ class MyDictWithBuggyCopy(dict): pass md = MyDictWithBuggyCopy({1: 2}) editor = CollectionsEditor() editor.setup(md) assert editor.widget.editor.readonly
def test_pandas_dateoffset_view(): """ Test that pandas ``DateOffset`` objs can be viewied in CollectionsEditor. Regression test for issue #6729 . """ test_dateoffset = pandas.DateOffset() col_editor = CollectionsEditor(None) col_editor.setup(test_dateoffset) col_editor.show() assert col_editor.get_value() col_editor.accept()
def test_collectionseditor_with_class_having_correct_copy(qtbot): """ Test that editor for object whose .copy() returns the same type is not readonly; cf. issue #6936. """ class MyDictWithCorrectCopy(dict): def copy(self): return MyDictWithCorrectCopy(self) md = MyDictWithCorrectCopy({1: 2}) editor = CollectionsEditor() editor.setup(md) assert not editor.widget.editor.readonly
def test_xml_dom_element_view(): """ Test that XML DOM ``Element``s are able to be viewied in CollectionsEditor. Regression test for issue #5642 . """ xml_path = path.join(LOCATION, 'dom_element_test.xml') with open(xml_path) as xml_file: xml_data = xml_file.read() xml_content = parseString(xml_data) xml_element = xml_content.getElementsByTagName("note")[0] col_editor = CollectionsEditor(None) col_editor.setup(xml_element) col_editor.show() assert col_editor.get_value() col_editor.accept()
def test_edit_nonsettable_objects(qtbot, nonsettable_objects_data): """ Test that errors trying to edit attributes in ColEdit are handled properly. Integration regression test for issues #6727 and #6728 . """ for test_obj, expected_obj, keys in nonsettable_objects_data: col_editor = CollectionsEditor(None) col_editor.setup(test_obj) col_editor.show() qtbot.waitForWindowShown(col_editor) view = col_editor.widget.editor indicies = [view.model.get_index_from_key(key) for key in keys] for _ in range(3): qtbot.keyClick(view, Qt.Key_Right) last_row = -1 rows_to_test = [index.row() for index in indicies] for row in rows_to_test: for _ in range(row - last_row - 1): qtbot.keyClick(view, Qt.Key_Down) qtbot.keyClick(view, Qt.Key_Space) qtbot.keyClick(view.focusWidget(), Qt.Key_Backspace) qtbot.keyClicks(view.focusWidget(), "2") qtbot.keyClick(view.focusWidget(), Qt.Key_Down) last_row = row qtbot.wait(100) # Due to numpy's deliberate breakage of __eq__ comparison assert all([key == "_typ" or (getattr(col_editor.get_value(), key) == getattr(expected_obj, key)) for key in keys]) col_editor.accept() qtbot.wait(200) # Same reason as above assert all([key == "_typ" or (getattr(col_editor.get_value(), key) == getattr(expected_obj, key)) for key in keys]) assert all([getattr(test_obj, key) == getattr(expected_obj, key) for key in keys])
def show_syspath(self): """Show sys.path""" editor = CollectionsEditor() editor.setup(sys.path, title="sys.path", readonly=True, width=600, icon=ima.icon('syspath')) self.dialog_manager.show(editor)
def createEditor(self, parent, option, index, object_explorer=False): """Overriding method createEditor""" self.sig_open_editor.emit() if index.column() < 3: return None if self.show_warning(index): answer = QMessageBox.warning( self.parent(), _("Warning"), _("Opening this variable can be slow\n\n" "Do you want to continue anyway?"), QMessageBox.Yes | QMessageBox.No) if answer == QMessageBox.No: return None try: value = self.get_value(index) if value is None: return None except Exception as msg: QMessageBox.critical( self.parent(), _("Error"), _("Spyder was unable to retrieve the value of " "this variable from the console.<br><br>" "The error message was:<br>" "%s") % to_text_string(msg)) return key = index.model().get_key(index) readonly = (isinstance(value, (tuple, set)) or self.parent().readonly or not is_known_type(value)) # CollectionsEditor for a list, tuple, dict, etc. if isinstance(value, (list, set, tuple, dict)) and not object_explorer: from spyder.plugins.variableexplorer.widgets.collectionseditor \ import CollectionsEditor editor = CollectionsEditor(parent=parent) editor.setup(value, key, icon=self.parent().windowIcon(), readonly=readonly) self.create_dialog( editor, dict(model=index.model(), editor=editor, key=key, readonly=readonly)) return None # ArrayEditor for a Numpy array elif (isinstance(value, (ndarray, MaskedArray)) and ndarray is not FakeObject and not object_explorer): editor = ArrayEditor(parent=parent) if not editor.setup_and_check(value, title=key, readonly=readonly): return self.create_dialog( editor, dict(model=index.model(), editor=editor, key=key, readonly=readonly)) return None # ArrayEditor for an images elif (isinstance(value, Image) and ndarray is not FakeObject and Image is not FakeObject and not object_explorer): arr = array(value) editor = ArrayEditor(parent=parent) if not editor.setup_and_check(arr, title=key, readonly=readonly): return conv_func = lambda arr: Image.fromarray(arr, mode=value.mode) self.create_dialog( editor, dict(model=index.model(), editor=editor, key=key, readonly=readonly, conv=conv_func)) return None # DataFrameEditor for a pandas dataframe, series or index elif (isinstance(value, (DataFrame, Index, Series)) and DataFrame is not FakeObject and not object_explorer): editor = DataFrameEditor(parent=parent) if not editor.setup_and_check(value, title=key): return editor.dataModel.set_format(index.model().dataframe_format) editor.sig_option_changed.connect(self.change_option) self.create_dialog( editor, dict(model=index.model(), editor=editor, key=key, readonly=readonly)) return None # QDateEdit and QDateTimeEdit for a dates or datetime respectively elif isinstance(value, datetime.date) and not object_explorer: # Needed to handle NaT values # See spyder-ide/spyder#8329 try: value.time() except ValueError: self.sig_editor_shown.emit() return None if readonly: self.sig_editor_shown.emit() return None else: if isinstance(value, datetime.datetime): editor = QDateTimeEdit(value, parent=parent) else: editor = QDateEdit(value, parent=parent) editor.setCalendarPopup(True) editor.setFont(get_font(font_size_delta=DEFAULT_SMALL_DELTA)) self.sig_editor_shown.emit() return editor # TextEditor for a long string elif is_text_string(value) and len(value) > 40 and not object_explorer: te = TextEditor(None, parent=parent) if te.setup_and_check(value): editor = TextEditor(value, key, readonly=readonly, parent=parent) self.create_dialog( editor, dict(model=index.model(), editor=editor, key=key, readonly=readonly)) return None # QLineEdit for an individual value (int, float, short string, etc) elif is_editable_type(value) and not object_explorer: if readonly: self.sig_editor_shown.emit() return None else: editor = QLineEdit(parent=parent) editor.setFont(get_font(font_size_delta=DEFAULT_SMALL_DELTA)) editor.setAlignment(Qt.AlignLeft) # This is making Spyder crash because the QLineEdit that it's # been modified is removed and a new one is created after # evaluation. So the object on which this method is trying to # act doesn't exist anymore. # editor.returnPressed.connect(self.commitAndCloseEditor) self.sig_editor_shown.emit() return editor # ObjectExplorer for an arbitrary Python object else: show_callable_attributes = index.model().show_callable_attributes show_special_attributes = index.model().show_special_attributes dataframe_format = index.model().dataframe_format if show_callable_attributes is None: show_callable_attributes = False if show_special_attributes is None: show_special_attributes = False from spyder.plugins.variableexplorer.widgets.objectexplorer \ import ObjectExplorer editor = ObjectExplorer( value, name=key, parent=parent, show_callable_attributes=show_callable_attributes, show_special_attributes=show_special_attributes, dataframe_format=dataframe_format, readonly=readonly) editor.sig_option_changed.connect(self.change_option) self.create_dialog( editor, dict(model=index.model(), editor=editor, key=key, readonly=readonly)) return None