You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@superset.apache.org by vi...@apache.org on 2023/04/26 10:59:41 UTC

[superset] branch master updated: fix(utils): evaluate date parser multiple holiday results correctly (#23685)

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/superset.git


The following commit(s) were added to refs/heads/master by this push:
     new ff126542d8 fix(utils): evaluate date parser multiple holiday results correctly (#23685)
ff126542d8 is described below

commit ff126542d8667d86d5785696adc097ec4309201c
Author: Arkadii Yakovets <ar...@cho.red>
AuthorDate: Wed Apr 26 03:59:31 2023 -0700

    fix(utils): evaluate date parser multiple holiday results correctly (#23685)
---
 requirements/base.txt                       |  3 +--
 setup.py                                    |  2 +-
 superset/utils/date_parser.py               |  4 ++--
 tests/unit_tests/utils/date_parser_tests.py | 22 ++++++++++++++++++++++
 4 files changed, 26 insertions(+), 5 deletions(-)

diff --git a/requirements/base.txt b/requirements/base.txt
index 5e54e1e06d..a8a61ef6e6 100644
--- a/requirements/base.txt
+++ b/requirements/base.txt
@@ -130,7 +130,7 @@ hashids==1.3.1
     # via apache-superset
 hijri-converter==2.2.4
     # via holidays
-holidays==0.17.2
+holidays==0.23
     # via apache-superset
 humanize==3.11.0
     # via apache-superset
@@ -298,7 +298,6 @@ typing-extensions==4.4.0
     #   apache-superset
     #   flask-limiter
     #   limits
-    #   rich
 urllib3==1.26.6
     # via selenium
 vine==5.0.0
diff --git a/setup.py b/setup.py
index 664d320b22..c63bd21042 100644
--- a/setup.py
+++ b/setup.py
@@ -96,7 +96,7 @@ setup(
         "graphlib-backport",
         "gunicorn>=20.1.0; sys_platform != 'win32'",
         "hashids>=1.3.1, <2",
-        "holidays>=0.17.2, <0.18",
+        "holidays>=0.23, <0.24",
         "humanize",
         "isodate",
         "markdown>=3.0",
diff --git a/superset/utils/date_parser.py b/superset/utils/date_parser.py
index d23cd01de8..7cdc23784a 100644
--- a/superset/utils/date_parser.py
+++ b/superset/utils/date_parser.py
@@ -386,8 +386,8 @@ class EvalHolidayFunc:  # pylint: disable=too-few-public-methods
         country = country.eval() if country else "US"
 
         holiday_lookup = country_holidays(country, years=[holiday_year], observed=False)
-        searched_result = holiday_lookup.get_named(holiday)
-        if len(searched_result) == 1:
+        searched_result = holiday_lookup.get_named(holiday, lookup="istartswith")
+        if len(searched_result) > 0:
             return dttm_from_timetuple(searched_result[0].timetuple())
         raise ValueError(
             _("Unable to find such a holiday: [%(holiday)s]", holiday=holiday)
diff --git a/tests/unit_tests/utils/date_parser_tests.py b/tests/unit_tests/utils/date_parser_tests.py
index f3c8b69680..fb0fe07d29 100644
--- a/tests/unit_tests/utils/date_parser_tests.py
+++ b/tests/unit_tests/utils/date_parser_tests.py
@@ -60,10 +60,14 @@ def mock_parse_human_datetime(s: str) -> Optional[datetime]:
         return datetime(2017, 4, 7)
     elif s in ["5 days", "5 days ago"]:
         return datetime(2016, 11, 2)
+    elif s == "2000-01-01T00:00:00":
+        return datetime(2000, 1, 1)
     elif s == "2018-01-01T00:00:00":
         return datetime(2018, 1, 1)
     elif s == "2018-12-31T23:59:59":
         return datetime(2018, 12, 31, 23, 59, 59)
+    elif s == "2022-01-01T00:00:00":
+        return datetime(2022, 1, 1)
     else:
         return None
 
@@ -260,12 +264,30 @@ def test_datetime_eval() -> None:
     expected = datetime(2018, 9, 3, 0, 0, 0)
     assert result == expected
 
+    result = datetime_eval(
+        "holiday('Eid al-Fitr', datetime('2000-01-01T00:00:00'), 'SA')"
+    )
+    expected = datetime(2000, 1, 8, 0, 0, 0)
+    assert result == expected
+
     result = datetime_eval(
         "holiday('Boxing day', datetime('2018-01-01T00:00:00'), 'UK')"
     )
     expected = datetime(2018, 12, 26, 0, 0, 0)
     assert result == expected
 
+    result = datetime_eval(
+        "holiday('Juneteenth', datetime('2022-01-01T00:00:00'), 'US')"
+    )
+    expected = datetime(2022, 6, 19, 0, 0, 0)
+    assert result == expected
+
+    result = datetime_eval(
+        "holiday('Independence Day', datetime('2022-01-01T00:00:00'), 'US')"
+    )
+    expected = datetime(2022, 7, 4, 0, 0, 0)
+    assert result == expected
+
     result = datetime_eval(
         "lastday(dateadd(datetime('2018-01-01T00:00:00'), 1, month), month)"
     )