diff --git a/arrow/arrow.py b/arrow/arrow.py index f0a57f04..ae226748 100644 --- a/arrow/arrow.py +++ b/arrow/arrow.py @@ -1412,6 +1412,10 @@ def dehumanize(self, input_string: str, locale: str = "en_us") -> "Arrow": search_string = str(time_string) search_string = search_string.format(r"\d+") + # Make trailing 's' optional so both "1 day" and "2 days" match + if search_string.endswith("s"): + search_string = search_string[:-1] + "s?" + # Create search pattern and find within string pattern = re.compile(rf"(^|\b|\d){search_string}") match = pattern.search(input_string) diff --git a/tests/test_arrow.py b/tests/test_arrow.py index b595e4e2..8069965e 100644 --- a/tests/test_arrow.py +++ b/tests/test_arrow.py @@ -2987,6 +2987,21 @@ def test_czech_slovak(self): assert arw.dehumanize(past_string, locale=lang) == past assert arw.dehumanize(future_string, locale=lang) == future + def test_singular_units(self): + arw = arrow.Arrow(2023, 1, 1) + + assert arw.dehumanize("1 day ago") == arw.shift(days=-1) + assert arw.dehumanize("1 hour ago") == arw.shift(hours=-1) + assert arw.dehumanize("1 minute ago") == arw.shift(minutes=-1) + assert arw.dehumanize("1 second ago") == arw.shift(seconds=-1) + assert arw.dehumanize("1 week ago") == arw.shift(weeks=-1) + assert arw.dehumanize("1 month ago") == arw.shift(months=-1) + assert arw.dehumanize("1 year ago") == arw.shift(years=-1) + + assert arw.dehumanize("in 1 day") == arw.shift(days=1) + assert arw.dehumanize("in 1 hour") == arw.shift(hours=1) + assert arw.dehumanize("in 1 minute") == arw.shift(minutes=1) + class TestArrowIsBetween: def test_start_before_end(self):