def test_try_reader_from_settings(make_napari_viewer, tmpdir, layers): """Test opening file with reader saved in settings""" viewer = make_napari_viewer() im_pth = os.path.join(tmpdir, 'layer.png') extension = '.png' layers[0].save(im_pth, plugin=BUILTINS_DISP) readers = {BUILTINS_DISP: BUILTINS_NAME} with restore_settings_on_exit(): # read successfully with settings get_settings().plugins.extension2reader = {extension: BUILTINS_DISP} error_message = viewer.window._qt_viewer._try_reader_from_settings( readers, extension, im_pth) assert error_message is None assert len(viewer.layers) == 1 assert viewer.layers[0].source.reader_plugin == BUILTINS_NAME # find plugin from settings but it fails to read os.remove(im_pth) error_message = viewer.window._qt_viewer._try_reader_from_settings( readers, extension, im_pth) assert error_message.startswith( f"Tried to open file with {BUILTINS_DISP}, but reading failed") # fail to find plugin from settings with restore_settings_on_exit(): get_settings().plugins.extension2reader = { extension: 'not-a-real-name' } error_message = viewer.window._qt_viewer._try_reader_from_settings( readers, extension, im_pth) assert error_message.startswith( "Can't find not-a-real-name plugin associated with .png files.")
def test_extension2reader_removal(extension2reader_widget, qtbot): with restore_settings_on_exit(): get_settings().plugins.extension2reader = { '.test': 'test-plugin', '.abc': 'abc-plugin', } widget = extension2reader_widget() assert widget._table.rowCount() == 2 btn_to_click = widget._table.cellWidget(0, 1).findChild(QPushButton) qtbot.mouseClick(btn_to_click, Qt.LeftButton) assert get_settings().plugins.extension2reader == { '.abc': 'abc-plugin' } assert widget._table.rowCount() == 1 assert widget._table.item(0, 0).text() == '.abc' # remove remaining extension btn_to_click = widget._table.cellWidget(0, 1).findChild(QPushButton) qtbot.mouseClick(btn_to_click, Qt.LeftButton) assert get_settings().plugins.extension2reader == {} assert widget._table.rowCount() == 1 assert ("No filename preferences found" in widget._table.item(0, 0).text())
def test_get_preferred_reader_complex_pattern(): pth = 'my-specific-folder/my_file.tif' with restore_settings_on_exit(): get_settings().plugins.extension2reader = { 'my-specific-folder/*.tif': 'fake-plugin' } reader = get_preferred_reader(pth) assert reader == 'fake-plugin'
def test_extension2reader_defaults(extension2reader_widget, ): with restore_settings_on_exit(): get_settings().plugins.extension2reader = {} widget = extension2reader_widget() assert widget._table.rowCount() == 1 assert (widget._table.itemAt( 0, 0).text() == 'No filename preferences found.')
def test_extension2reader_with_settings(extension2reader_widget, ): with restore_settings_on_exit(): get_settings().plugins.extension2reader = {'.test': 'test-plugin'} widget = extension2reader_widget() assert widget._table.rowCount() == 1 assert widget._table.item(0, 0).text() == '.test' assert (widget._table.cellWidget( 0, 1).findChild(QLabel).text() == 'test-plugin')
def test_coercion_to_glob_doesnt_change_settings(): with restore_settings_on_exit(): settings = {'*.tif': 'fake-plugin', '.csv': 'other-plugin'} get_settings().plugins.extension2reader = settings settings = _coerce_extensions_to_globs(settings) assert settings == {'*.tif': 'fake-plugin', '*.csv': 'other-plugin'} assert get_settings().plugins.extension2reader == { '*.tif': 'fake-plugin', '.csv': 'other-plugin', }
def test_open_or_get_error_preferred_fails(tmp_path): viewer = ViewerModel() pth = tmp_path / 'my-file.npy' with restore_settings_on_exit(): get_settings().plugins.extension2reader = {'.npy': 'napari'} with pytest.raises(ReaderPluginError, match='Tried opening with napari, but failed.'): viewer._open_or_raise_error([str(pth)])
def test_open_or_get_error_cant_find_plugin(mock_npe2_pm, tmp_reader): """Test correct error message is returned when prefered plugin is missing.""" viewer = ViewerModel() with restore_settings_on_exit(): get_settings().plugins.extension2reader = {'*.fake': 'fake-reader'} tmp_reader(mock_npe2_pm, 'other-fake-reader') with pytest.raises(MissingAssociatedReaderError, match="Can't find fake-reader plugin"): viewer._open_or_raise_error(['my_file.fake'])
def test_get_and_try_preferred_reader(make_napari_viewer, tmpdir, layers): """Test opening file with user preference and persisting preference""" viewer = make_napari_viewer() im_pth = os.path.join(tmpdir, 'layer.png') layers[0].save(im_pth, plugin=BUILTINS_DISP) error_message = 'Test error message' readers = {BUILTINS_DISP: BUILTINS_NAME, 'not-a-plugin': 'not-a-plugin'} # open successfully without persisting with restore_settings_on_exit(): get_settings().plugins.extension2reader = {} reader_dialog = MockQtReaderDialog( im_pth, readers=readers, error_message=error_message ) reader_dialog._set_plugin_choice(BUILTINS_DISP) reader_dialog._set_persist_choice(False) viewer.window._qt_viewer._get_and_try_preferred_reader( reader_dialog, readers, error_message ) assert len(viewer.layers) == 1 assert viewer.layers[0].source.reader_plugin == BUILTINS_NAME assert get_settings().plugins.extension2reader == {} # open successfully and persist choice with restore_settings_on_exit(): get_settings().plugins.extension2reader = {} reader_dialog = MockQtReaderDialog( im_pth, readers=readers, error_message=error_message, extension='.png', ) reader_dialog._set_plugin_choice(BUILTINS_DISP) reader_dialog._set_persist_choice(True) viewer.window._qt_viewer._get_and_try_preferred_reader( reader_dialog, readers, error_message ) assert get_settings().plugins.extension2reader == { '.png': BUILTINS_DISP }
def test_open_or_get_error_prefered_plugin(mock_npe2_pm, tmp_reader, tmp_path): """Test plugin preference is respected.""" viewer = ViewerModel() pth = tmp_path / 'my-file.npy' np.save(pth, np.random.random((10, 10))) with restore_settings_on_exit(): get_settings().plugins.extension2reader = {'*.npy': 'builtins'} tmp_reader(mock_npe2_pm, 'fake-reader', filename_patterns=['*.npy']) tmp_reader(mock_npe2_pm, 'other-fake-reader', filename_patterns=['*.npy']) added = viewer._open_or_raise_error([str(pth)]) assert len(added) == 1 assert added[0].source.reader_plugin == 'builtins'
def test_open_or_get_error_cant_find_plugin( tmp_path, mock_npe2_pm, tmp_reader ): """Test user is warned and only plugin used if preferred plugin missing.""" viewer = ViewerModel() pth = tmp_path / 'my-file.npy' np.save(pth, np.random.random((10, 10))) with restore_settings_on_exit(): get_settings().plugins.extension2reader = {'*.npy': 'fake-reader'} with pytest.warns( RuntimeWarning, match="Can't find fake-reader plugin" ): added = viewer._open_or_raise_error([str(pth)]) assert len(added) == 1 assert added[0].source.reader_plugin == 'builtins'
def test_adding_new_preference_no_asterisk(extension2reader_widget, qtbot, tmp_reader, mock_npe2_pm): tmp_reader(mock_npe2_pm, 'npy-reader', filename_patterns=['*.npy']) tif_reader = tmp_reader(mock_npe2_pm, 'tif-reader', filename_patterns=['*.tif']) tif_reader.manifest.display_name = "TIF Reader" widget = extension2reader_widget(npe1_readers={}) widget._fn_pattern_edit.setText('.tif') # will be filtered and tif-reader will be only item widget._new_reader_dropdown.setCurrentIndex(0) with restore_settings_on_exit(): get_settings().plugins.extension2reader = {} widget._save_new_preference(True) settings = get_settings().plugins.extension2reader assert '*.tif' in settings assert settings['*.tif'] == 'tif-reader'
def test_open_or_get_error_no_prefered_plugin_many_available( mock_npe2_pm, tmp_reader ): """Test MultipleReaderError raised if preferred plugin missing.""" viewer = ViewerModel() with restore_settings_on_exit(): get_settings().plugins.extension2reader = {'*.fake': 'not-a-plugin'} tmp_reader(mock_npe2_pm, 'fake-reader', filename_patterns=['*.fake']) tmp_reader( mock_npe2_pm, 'other-fake-reader', filename_patterns=['*.fake'] ) with pytest.warns( RuntimeWarning, match="Can't find not-a-plugin plugin" ): with pytest.raises( MultipleReaderError, match='Multiple plugins found capable' ): viewer._open_or_raise_error(['my_file.fake'])
def test_editing_preference(extension2reader_widget, qtbot, tmp_reader, mock_npe2_pm): tmp_reader(mock_npe2_pm, 'tif-reader', filename_patterns=['*.tif']) tmp_reader(mock_npe2_pm, 'other-tif-reader', filename_patterns=['*.tif']) with restore_settings_on_exit(): get_settings().plugins.extension2reader = {'*.tif': 'tif-reader'} widget = extension2reader_widget(npe1_readers={}) widget._fn_pattern_edit.setText('*.tif') # will be filtered and other-tif-reader will be first item widget._new_reader_dropdown.setCurrentIndex(0) original_row_count = widget._table.rowCount() widget._save_new_preference(True) settings = get_settings().plugins.extension2reader assert '*.tif' in settings assert settings['*.tif'] == 'other-tif-reader' assert widget._table.rowCount() == original_row_count plugin_label = widget._table.cellWidget(original_row_count - 1, 1).findChild(QLabel) assert plugin_label.text() == 'other-tif-reader'
def test_open_with_dialog_choices_persist(make_napari_viewer, tmp_path): pth = tmp_path / 'my-file.npy' np.save(pth, np.random.random((10, 10))) display_name = 'builtins' persist = True extension = '.npy' readers = {'builtins': 'builtins'} paths = [str(pth)] stack = False with restore_settings_on_exit(): viewer = make_napari_viewer() open_with_dialog_choices( display_name, persist, extension, readers, paths, stack, viewer.window._qt_viewer, ) assert len(viewer.layers) == 1 assert get_settings().plugins.extension2reader['.npy'] == 'builtins'
def test_open_with_dialog_choices_raises(make_napari_viewer): pth = 'my-file.fake' display_name = 'Fake Plugin' persist = True extension = '.fake' readers = {'fake-plugin': 'Fake Plugin'} paths = [str(pth)] stack = False with restore_settings_on_exit(): viewer = make_napari_viewer() get_settings().plugins.extension2reader = {} with pytest.raises(ValueError): open_with_dialog_choices( display_name, persist, extension, readers, paths, stack, viewer.window._qt_viewer, ) # settings weren't saved because reading failed get_settings().plugins.extension2reader == {}
def test_adding_new_preference(extension2reader_widget, qtbot, tmp_reader, mock_npe2_pm): tmp_reader(mock_npe2_pm, 'npy-reader', filename_patterns=['*.npy']) tif_reader = tmp_reader(mock_npe2_pm, 'tif-reader', filename_patterns=['*.tif']) tif_reader.manifest.display_name = "TIF Reader" widget = extension2reader_widget(npe1_readers={}) widget._fn_pattern_edit.setText('*.tif') # will be filtered and tif-reader will be only item widget._new_reader_dropdown.setCurrentIndex(0) with restore_settings_on_exit(): get_settings().plugins.extension2reader = {} widget._save_new_preference(True) settings = get_settings().plugins.extension2reader assert '*.tif' in settings assert settings['*.tif'] == 'tif-reader' assert (widget._table.item(widget._table.rowCount() - 1, 0).text() == '*.tif') plugin_label = widget._table.cellWidget(widget._table.rowCount() - 1, 1).findChild(QLabel) assert plugin_label.text() == 'TIF Reader'
def test_get_preferred_reader_no_readers(): pth = 'my_file.tif' with restore_settings_on_exit(): get_settings().plugins.extension2reader = {} reader = get_preferred_reader(pth) assert reader is None
def test_get_preferred_reader_for_extension(): pth = 'my_file.tif' with restore_settings_on_exit(): get_settings().plugins.extension2reader = {'.tif': 'fake-plugin'} reader = get_preferred_reader(pth) assert reader == 'fake-plugin'