Skip to content

Commit

Permalink
#601: added update_id functionality
Browse files Browse the repository at this point in the history
  • Loading branch information
aschonfeld committed Mar 24, 2022
1 parent 272bfbd commit 418b4ee
Show file tree
Hide file tree
Showing 4 changed files with 71 additions and 2 deletions.
1 change: 1 addition & 0 deletions dtale/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
# flake8: NOQA
from dtale.app import show, get_instance, instances, offline_chart # isort:skip
from dtale.cli.loaders import LOADERS # isort:skip
from dtale.global_state import update_id # isort:skip

ALLOW_CELL_EDITS = True
HIDE_SHUTDOWN = False
Expand Down
14 changes: 12 additions & 2 deletions dtale/global_state.py
Original file line number Diff line number Diff line change
Expand Up @@ -175,10 +175,10 @@ def get_data_inst(self, data_id):
data_id = int(data_id)
return self._data_store.get(data_id)

def new_data_inst(self, data_id=None):
def new_data_inst(self, data_id=None, instance=None):
if data_id is None:
data_id = self.build_data_id()
new_data = DtaleInstance(None)
new_data = instance or DtaleInstance(None)
data_id = int(data_id)
self._data_store[data_id] = new_data
return data_id
Expand Down Expand Up @@ -384,6 +384,16 @@ def cleanup(data_id=None):
_default_store.delete_instance(data_id)


def update_id(old_data_id, new_data_id):
if _default_store.contains(new_data_id):
raise Exception("Data already exists for id ({})".format(new_data_id))
curr_data = _default_store.get_data_inst(old_data_id)
_default_store.delete_instance(old_data_id)
data_id = int(new_data_id)
_default_store.new_data_inst(data_id, curr_data)
return data_id


def load_flag(data_id, flag_name, default):
import dtale

Expand Down
8 changes: 8 additions & 0 deletions dtale/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -247,6 +247,14 @@ def data(self, data):
"""
startup(self._url, data=data, data_id=self._data_id)

def update_id(self, new_data_id):
"""
Update current data_id to new data_id
:param new_data_id: the data_id to update to
"""
self._data_id = global_state.update_id(self._data_id, new_data_id)

def main_url(self):
"""
Helper function creating main :class:`flask:flask.Flask` route using instance's url & data_id
Expand Down
50 changes: 50 additions & 0 deletions tests/dtale/test_app.py
Original file line number Diff line number Diff line change
Expand Up @@ -756,3 +756,53 @@ def test_hide_columns():
)
assert global_state.get_dtypes(instance._data_id)[0]["visible"] is True
assert not global_state.get_dtypes(instance._data_id)[1]["visible"] is True


@pytest.mark.unit
def test_update_data_id():
import dtale.global_state as global_state
from dtale.app import show

global_state.clear_store()
df = pd.DataFrame(dict(a=[1, 2], b=[2, 3]))
with ExitStack() as stack:
stack.enter_context(mock.patch("dtale.app.DtaleFlask", MockDtaleFlask))
stack.enter_context(mock.patch("dtale.app.DtaleFlask.run", mock.Mock()))
stack.enter_context(
mock.patch("dtale.app.find_free_port", mock.Mock(return_value=9999))
)
stack.enter_context(
mock.patch("socket.gethostname", mock.Mock(return_value="localhost"))
)
stack.enter_context(
mock.patch("dtale.app.is_up", mock.Mock(return_value=False))
)
stack.enter_context(mock.patch("requests.get", mock.Mock()))
instance = show(data=df, ignore_duplicate=True, subprocess=False)
current_id = int(instance._data_id)
instance.update_id(current_id + 1)

assert len(global_state.get_dtypes(current_id + 1)) == 2
assert not global_state.contains(current_id)

global_state.clear_store()
with ExitStack() as stack:
stack.enter_context(mock.patch("dtale.app.DtaleFlask", MockDtaleFlask))
stack.enter_context(mock.patch("dtale.app.DtaleFlask.run", mock.Mock()))
stack.enter_context(
mock.patch("dtale.app.find_free_port", mock.Mock(return_value=9999))
)
stack.enter_context(
mock.patch("socket.gethostname", mock.Mock(return_value="localhost"))
)
stack.enter_context(
mock.patch("dtale.app.is_up", mock.Mock(return_value=False))
)
stack.enter_context(mock.patch("requests.get", mock.Mock()))
instance = show(data=df, ignore_duplicate=True, subprocess=False)

current_id = int(instance._data_id)
global_state.update_id(current_id, current_id + 1)

assert len(global_state.get_dtypes(current_id + 1)) == 2
assert not global_state.contains(current_id)

0 comments on commit 418b4ee

Please # to comment.