Skip to content

Commit 101deef

Browse files
committed
Connected MSliceADSObserver and added tests
1 parent 8926101 commit 101deef

File tree

4 files changed

+70
-22
lines changed

4 files changed

+70
-22
lines changed

src/mslice/models/mslice_ads_observer.py

Lines changed: 1 addition & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -23,16 +23,14 @@ def wrapper(*args, **kwargs):
2323

2424

2525
class MSliceADSObserver(AnalysisDataServiceObserver):
26-
def __init__(self, delete_callback, clear_callback, replace_callback, rename_callback):
26+
def __init__(self, delete_callback, clear_callback, rename_callback):
2727
super(MSliceADSObserver, self).__init__()
2828
self.delete_callback = delete_callback
2929
self.clear_callback = clear_callback
30-
self.replace_callback = replace_callback
3130
self.rename_callback = rename_callback
3231

3332
self.observeDelete(True)
3433
self.observeRename(True)
35-
self.observeReplace(True)
3634
self.observeClear(True)
3735

3836
@_catch_exceptions
@@ -59,19 +57,3 @@ def clearHandle(self):
5957
Called when the ADS has been cleared, removes all data.
6058
"""
6159
self.clear_callback()
62-
63-
@_catch_exceptions
64-
def replaceHandle(self, name, workspace):
65-
"""
66-
Called when the ADS has replaced a workspace with one of the same name.
67-
Updates the workspace stored in the dict.
68-
:param name: The name of the workspace.
69-
:param workspace: A reference to the new workspace
70-
"""
71-
self.replace_callback(name, workspace)
72-
73-
def unsubscribe(self):
74-
self.observeDelete(False)
75-
self.observeRename(False)
76-
self.observeClear(False)
77-
self.observeReplace(False)

src/mslice/models/workspacemanager/workspace_provider.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,10 @@ def get_visible_workspace_names():
3636
return [key for key in iterkeys(_loaded_workspaces) if key[:2] != '__']
3737

3838

39+
def get_workspace_names():
40+
return [key for key in iterkeys(_loaded_workspaces)]
41+
42+
3943
def get_workspace_name(workspace):
4044
"""Returns the name of a workspace given the workspace handle"""
4145
if isinstance(workspace, string_types):

src/mslice/presenters/workspace_manager_presenter.py

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,15 @@
44
from .busy import show_busy
55
from mslice.widgets.workspacemanager.command import Command
66
from mslice.widgets.workspacemanager import TAB_2D, TAB_NONPSD
7+
from mslice.models.mslice_ads_observer import MSliceADSObserver
78
from mslice.models.workspacemanager.file_io import get_save_directory
89
from mslice.models.workspacemanager.workspace_algorithms import (save_workspaces, export_workspace_to_ads, subtract,
910
is_pixel_workspace, combine_workspace,
1011
add_workspace_runs, scale_workspaces,
1112
remove_workspace_from_ads)
1213
from mslice.models.workspacemanager.workspace_provider import (get_workspace_handle, get_visible_workspace_names,
13-
get_workspace_name, delete_workspace, rename_workspace)
14+
get_workspace_names, get_workspace_name,
15+
delete_workspace, rename_workspace)
1416
from .interfaces.workspace_manager_presenter import WorkspaceManagerPresenterInterface
1517
from .interfaces.main_presenter import MainPresenterInterface
1618
from .validation_decorators import require_main_presenter
@@ -38,6 +40,7 @@ def __init__(self, workspace_view):
3840
lambda: self._workspace_manager_view._display_error('Please select a Compose action from the dropdown menu'),
3941
Command.Scale: self._scale_workspace,
4042
Command.Bose: lambda: self._scale_workspace(is_bose=True)}
43+
self._ads_observer = MSliceADSObserver(self.delete_handle, self.clear_handle, self.rename_handle)
4144

4245
def register_master(self, main_presenter):
4346
assert (isinstance(main_presenter, MainPresenterInterface))
@@ -228,3 +231,19 @@ def update_displayed_workspaces(self):
228231

229232
def _clear_displayed_error(self):
230233
self._workspace_manager_view.clear_displayed_error()
234+
235+
def delete_handle(self, workspace):
236+
delete_workspace(workspace)
237+
self.update_displayed_workspaces()
238+
239+
def clear_handle(self):
240+
for workspace in get_workspace_names():
241+
delete_workspace(workspace)
242+
self.update_displayed_workspaces()
243+
244+
def rename_handle(self, workspace, new_name):
245+
if new_name is None:
246+
return
247+
if workspace in get_visible_workspace_names():
248+
rename_workspace(workspace, new_name)
249+
self.update_displayed_workspaces()

tests/workspacemanager_presenter_test.py

Lines changed: 45 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,21 @@
22
import unittest
33

44
import mock
5-
from mock import call, patch
5+
from mock import call, patch, MagicMock
66
import numpy as np
77

8+
from mantid.api import AnalysisDataService
9+
from mantid.simpleapi import RenameWorkspace
10+
11+
from mslice.models.mslice_ads_observer import MSliceADSObserver
812
from mslice.presenters.interfaces.main_presenter import MainPresenterInterface
913
from mslice.presenters.workspace_manager_presenter import WorkspaceManagerPresenter
1014
from mslice.views.interfaces.mainview import MainView
1115
from mslice.views.interfaces.workspace_view import WorkspaceView
1216
from mslice.widgets.workspacemanager.command import Command
1317
from mslice.widgets.workspacemanager import TAB_2D, TAB_NONPSD
1418
from mslice.util.mantid.mantid_algorithms import (AddSampleLog, CreateWorkspace, CreateSimulationWorkspace,
15-
ConvertToMD, CloneWorkspace)
19+
ConvertToMD, CloneWorkspace, CreateSampleWorkspace)
1620

1721

1822
class WorkspaceManagerPresenterTest(unittest.TestCase):
@@ -432,6 +436,45 @@ def test_compose_error(self):
432436
self.presenter.notify(Command.ComposeWorkspace)
433437
self.view._display_error.assert_called()
434438

439+
def test_ensure_that_the_ads_observer_calls_delete_handle(self, _):
440+
presenter = WorkspaceManagerPresenter(self.view)
441+
presenter.delete_handle = MagicMock()
442+
self.assertTrue(isinstance(presenter._ads_observer, MSliceADSObserver))
443+
presenter._ads_observer = MSliceADSObserver(
444+
presenter.delete_handle, presenter.clear_handle, presenter.rename_handle
445+
)
446+
447+
CreateSampleWorkspace(OutputWorkspace="ws", StoreInADS=True)
448+
AnalysisDataService.remove("ws")
449+
450+
presenter.delete_handle.assert_called_once_with("ws")
451+
452+
def test_ensure_that_the_ads_observer_calls_clear_handle(self, _):
453+
presenter = WorkspaceManagerPresenter(self.view)
454+
presenter.clear_handle = MagicMock()
455+
self.assertTrue(isinstance(presenter._ads_observer, MSliceADSObserver))
456+
presenter._ads_observer = MSliceADSObserver(
457+
presenter.delete_handle, presenter.clear_handle, presenter.rename_handle
458+
)
459+
460+
CreateSampleWorkspace(OutputWorkspace="ws", StoreInADS=True)
461+
AnalysisDataService.clear()
462+
463+
presenter.clear_handle.assert_called_once()
464+
465+
def test_ensure_that_the_ads_observer_calls_rename_handle(self, _):
466+
presenter = WorkspaceManagerPresenter(self.view)
467+
presenter.rename_handle = MagicMock()
468+
self.assertTrue(isinstance(presenter._ads_observer, MSliceADSObserver))
469+
presenter._ads_observer = MSliceADSObserver(
470+
presenter.delete_handle, presenter.clear_handle, presenter.rename_handle
471+
)
472+
473+
CreateSampleWorkspace(OutputWorkspace="ws", StoreInADS=True)
474+
RenameWorkspace(InputWorkspace="ws", OutputWorkspace="ws1")
475+
476+
presenter.rename_handle.assert_called_once_with("ws", "ws1")
477+
435478

436479
if __name__ == '__main__':
437480
unittest.main()

0 commit comments

Comments
 (0)