This is an automated email from the ASF dual-hosted git repository.
villebro pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-superset.git
The following commit(s) were added to refs/heads/master by this push:
new bc83b5f More intuitive display of negative time deltas (#8274) (#8276)
bc83b5f is described below
commit bc83b5fbe6c2a7858c7a056c3941ad76c1225058
Author: Ben <[email protected]>
AuthorDate: Sun Sep 22 18:37:43 2019 +0200
More intuitive display of negative time deltas (#8274) (#8276)
* WIP - Add easily interpretable negative timedelta formatting
* Add unit tests for utils.core.timedelta_f
* Reformat tests.utils_tests.test_timedelta_f test code. Fixes #8274.
* Add type annotations to utils.core.timedelta_f (#8274)
* Replace recursion with absolute value in utils.core.timedelta_f (#8274)
* Rename utils.core.timedelta_f to format_timedelta (#8274)
* Fix small typo (#8274)
---
superset/utils/core.py | 19 ++++++++++++++++++-
tests/utils_tests.py | 15 +++++++++++++++
2 files changed, 33 insertions(+), 1 deletion(-)
diff --git a/superset/utils/core.py b/superset/utils/core.py
index 7a74eb4..88f8df1 100644
--- a/superset/utils/core.py
+++ b/superset/utils/core.py
@@ -349,6 +349,23 @@ def datetime_f(dttm):
return "<nobr>{}</nobr>".format(dttm)
+def format_timedelta(td: timedelta) -> str:
+ """
+ Ensures negative time deltas are easily interpreted by humans
+
+ >>> td = timedelta(0) - timedelta(days=1, hours=5,minutes=6)
+ >>> str(td)
+ '-2 days, 18:54:00'
+ >>> format_timedelta(td)
+ '-1 day, 5:06:00'
+ """
+ if td < timedelta(0):
+ return "-" + str(abs(td))
+ else:
+ # Change this to format positive time deltas the way you want
+ return str(td)
+
+
def base_json_conv(obj):
if isinstance(obj, memoryview):
obj = obj.tobytes()
@@ -363,7 +380,7 @@ def base_json_conv(obj):
elif isinstance(obj, uuid.UUID):
return str(obj)
elif isinstance(obj, timedelta):
- return str(obj)
+ return format_timedelta(obj)
elif isinstance(obj, bytes):
try:
return obj.decode("utf-8")
diff --git a/tests/utils_tests.py b/tests/utils_tests.py
index 5efd44d..a076583 100644
--- a/tests/utils_tests.py
+++ b/tests/utils_tests.py
@@ -32,6 +32,7 @@ from superset.utils.core import (
base_json_conv,
convert_legacy_filters_into_adhoc,
datetime_f,
+ format_timedelta,
get_or_create_db,
get_since_until,
get_stacktrace,
@@ -120,6 +121,7 @@ class UtilsTestCase(unittest.TestCase):
assert isinstance(base_json_conv(set([1])), list) is True
assert isinstance(base_json_conv(Decimal("1.0")), float) is True
assert isinstance(base_json_conv(uuid.uuid4()), str) is True
+ assert isinstance(base_json_conv(timedelta(0)), str) is True
@patch("superset.utils.core.datetime")
def test_parse_human_timedelta(self, mock_datetime):
@@ -535,6 +537,19 @@ class UtilsTestCase(unittest.TestCase):
[a, b, c] = [int(v) for v in iso]
self.assertEquals(datetime_f(datetime(a, b, c)),
"<nobr>00:00:00</nobr>")
+ def test_format_timedelta(self):
+ self.assertEquals(format_timedelta(timedelta(0)), "0:00:00")
+ self.assertEquals(format_timedelta(timedelta(days=1)), "1 day,
0:00:00")
+ self.assertEquals(format_timedelta(timedelta(minutes=-6)), "-0:06:00")
+ self.assertEquals(
+ format_timedelta(timedelta(0) - timedelta(days=1, hours=5,
minutes=6)),
+ "-1 day, 5:06:00",
+ )
+ self.assertEquals(
+ format_timedelta(timedelta(0) - timedelta(days=16, hours=4,
minutes=3)),
+ "-16 days, 4:03:00",
+ )
+
def test_json_encoded_obj(self):
obj = {"a": 5, "b": ["a", "g", 5]}
val = '{"a": 5, "b": ["a", "g", 5]}'