Skip to content

Commit

Permalink
#475: fixes for DtaleRedis issues
Browse files Browse the repository at this point in the history
  • Loading branch information
aschonfeld committed May 12, 2021
1 parent 1646b09 commit 3815a83
Show file tree
Hide file tree
Showing 5 changed files with 59 additions and 18 deletions.
12 changes: 10 additions & 2 deletions dtale/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,15 @@
ACTIVE_HOST = None
ACTIVE_PORT = None

SHORT_LIFE_PATHS = ["dist", "dash"]
_basepath = os.path.dirname(__file__)
_filepath = os.path.abspath(os.path.join(_basepath, "static"))

SHORT_LIFE_PATHS = [
"dist",
os.path.join(_filepath, "dist"),
"dash",
os.path.join(_filepath, "dash"),
]
SHORT_LIFE_TIMEOUT = 60

REAPER_TIMEOUT = 60.0 * 60.0 # one-hour
Expand Down Expand Up @@ -248,7 +256,7 @@ def get_send_file_max_age(self, name):
otherwise SHORT_LIFE_TIMEOUT
"""
if name and any([name.startswith(path) for path in SHORT_LIFE_PATHS]):
if name and any([str(name).startswith(path) for path in SHORT_LIFE_PATHS]):
return SHORT_LIFE_TIMEOUT
return super(DtaleFlask, self).get_send_file_max_age(name)

Expand Down
29 changes: 26 additions & 3 deletions dtale/global_state.py
Original file line number Diff line number Diff line change
Expand Up @@ -206,47 +206,65 @@ def get_metadata(self, data_id):
def set_data(self, data_id=None, val=None):
if data_id is None:
data_id = self.new_data_inst()
if int(data_id) not in self._data_store.keys():
data_id = int(data_id)
if data_id not in self._data_store.keys():
data_id = self.new_data_inst(int(data_id))
data_inst = self.get_data_inst(data_id)
data_inst.data = val
self._data_store[data_id] = data_inst

def set_dataset(self, data_id, val):
data_id = int(data_id)
data_inst = self.get_data_inst(data_id)
data_inst.dataset = val
self._data_store[data_id] = data_inst

def set_dataset_dim(self, data_id, val):
data_id = int(data_id)
data_inst = self.get_data_inst(data_id)
data_inst.dataset_dim = val
self._data_store[data_id] = data_inst

def set_dtypes(self, data_id, val):
data_id = int(data_id)
data_inst = self.get_data_inst(data_id)
data_inst.dtypes = val
self._data_store[data_id] = data_inst

def set_name(self, data_id, val):
if val in [None, ""]:
return
if val in self._data_names:
raise Exception("Name {} already exists!".format(val))
data_inst = self.get_data_inst(data_id)
self._data_names[val] = int(data_id)
data_id = int(data_id)
self._data_names[val] = data_id
data_inst.name = val
self._data_store[data_id] = data_inst

def set_context_variables(self, data_id, val):
data_id = int(data_id)
data_inst = self.get_data_inst(data_id)
data_inst.context_variables = val
self._data_store[data_id] = data_inst

def set_settings(self, data_id, val):
data_id = int(data_id)
data_inst = self.get_data_inst(data_id)
data_inst.settings = val
self._data_store[data_id] = data_inst

def set_metadata(self, data_id, val):
data_id = int(data_id)
data_inst = self.get_data_inst(data_id)
data_inst.metadata = val
self._data_store[data_id] = data_inst

def set_history(self, data_id, val):
data_id = int(data_id)
data_inst = self.get_data_inst(data_id)
data_inst.history = val
self._data_store[data_id] = data_inst

def delete_instance(self, data_id):
data_id = int(data_id)
Expand Down Expand Up @@ -512,6 +530,9 @@ def get(self, name, *args, **kwargs):
if value is not None:
return pickle.loads(value)

def keys(self):
return [int(k) for k in super(DtaleRedis, self).keys()]

def set(self, name, value, *args, **kwargs):
value = pickle.dumps(value)
return super(DtaleRedis, self).set(name, value, *args, **kwargs)
Expand All @@ -520,7 +541,9 @@ def clear(self):
self.flushdb()

def to_dict(self):
return {k.decode("utf-8"): self.get(k) for k in self.keys()}
return {
k.decode("utf-8"): self.get(k) for k in super(DtaleRedis, self).keys()
}

def items(self):
return self.to_dict().items()
Expand Down
1 change: 1 addition & 0 deletions requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ itsdangerous
kaleido==0.1.0; python_version <= '3.6'
kaleido; python_version > '3.6'
missingno
nbformat
networkx==2.2; python_version < '3.0'
networkx; python_version >= '3.0'
openpyxl==2.6.4; python_version < '3.0'
Expand Down
33 changes: 21 additions & 12 deletions tests/dtale/test_column_filters.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import pandas as pd
import pytest
from pkg_resources import parse_version

from dtale.column_filters import DateFilter, NumericFilter, StringFilter

Expand All @@ -23,42 +24,50 @@ def test_date():

@pytest.mark.unit
def test_string():
is_pandas25 = parse_version(pd.__version__) >= parse_version("0.25.0")

def build_query(fltr):
query = fltr.build_filter()["query"]
if is_pandas25:
return query
return query.replace("`", "")

df = pd.DataFrame(dict(foo=["AAA", "aaa", "ABB", "ACC"]))

cfg = dict(action="equals", operand="=", value=["AAA"])
assert len(df.query(StringFilter("foo", "S", cfg).build_filter()["query"])) == 1

assert len(df.query(build_query(StringFilter("foo", "S", cfg)))) == 1
cfg["operand"] = "ne"
assert len(df.query(StringFilter("foo", "S", cfg).build_filter()["query"])) == 3
assert len(df.query(build_query(StringFilter("foo", "S", cfg)))) == 3

cfg["value"] = ["AAA", "aaa"]
cfg["operand"] = "="
assert len(df.query(StringFilter("foo", "S", cfg).build_filter()["query"])) == 2
assert len(df.query(build_query(StringFilter("foo", "S", cfg)))) == 2

cfg["raw"] = "AA"
cfg["action"] = "startswith"
assert len(df.query(StringFilter("foo", "S", cfg).build_filter()["query"])) == 2
assert len(df.query(build_query(StringFilter("foo", "S", cfg)))) == 2
cfg["operand"] = "ne"
assert len(df.query(StringFilter("foo", "S", cfg).build_filter()["query"])) == 2
assert len(df.query(build_query(StringFilter("foo", "S", cfg)))) == 2
cfg["action"] = "endswith"
cfg["operand"] = "="
assert len(df.query(StringFilter("foo", "S", cfg).build_filter()["query"])) == 2
assert len(df.query(build_query(StringFilter("foo", "S", cfg)))) == 2
cfg["caseSensitive"] = True
assert len(df.query(StringFilter("foo", "S", cfg).build_filter()["query"])) == 1
assert len(df.query(build_query(StringFilter("foo", "S", cfg)))) == 1

cfg["action"] = "contains"
cfg["caseSensitive"] = False
cfg["raw"] = "A"
assert len(df.query(StringFilter("foo", "S", cfg).build_filter()["query"])) == 4
assert len(df.query(build_query(StringFilter("foo", "S", cfg)))) == 4
cfg["caseSensitive"] = True
assert len(df.query(StringFilter("foo", "S", cfg).build_filter()["query"])) == 3
assert len(df.query(build_query(StringFilter("foo", "S", cfg)))) == 3
cfg["raw"] = "D"
assert len(df.query(StringFilter("foo", "S", cfg).build_filter()["query"])) == 0
assert len(df.query(build_query(StringFilter("foo", "S", cfg)))) == 0

cfg["action"] = "length"
cfg["raw"] = "3"
assert len(df.query(StringFilter("foo", "S", cfg).build_filter()["query"])) == 4
assert len(df.query(build_query(StringFilter("foo", "S", cfg)))) == 4

df = pd.DataFrame(dict(foo=["a", "aa", "aaa", "aaaa"]))
cfg["raw"] = "1,3"
assert len(df.query(StringFilter("foo", "S", cfg).build_filter()["query"])) == 3
assert len(df.query(build_query(StringFilter("foo", "S", cfg)))) == 3
2 changes: 1 addition & 1 deletion tests/dtale/test_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -287,7 +287,7 @@ def test_shutdown(unittest):
@pytest.mark.unit
def test_get_send_file_max_age():
with app.app_context():
assert 43200 == app.get_send_file_max_age("test")
assert app.get_send_file_max_age("test") in [43200, None]
assert 60 == app.get_send_file_max_age("dist/test.js")


Expand Down

0 comments on commit 3815a83

Please sign in to comment.