diff --git a/src/pendulum/formatting/formatter.py b/src/pendulum/formatting/formatter.py index b09977d0d..8ca004e58 100644 --- a/src/pendulum/formatting/formatter.py +++ b/src/pendulum/formatting/formatter.py @@ -68,6 +68,11 @@ class Formatter: _FROM_FORMAT_RE: re.Pattern[str] = re.compile(r"(? str: candidates = (cast("str", candidates),) pattern = f"(?P<{token}>{'|'.join(candidates)})" + if token in self._CASE_INSENSITIVE_TOKENS: + pattern = f"(?i:{pattern})" return pattern diff --git a/src/pendulum/locales/locale.py b/src/pendulum/locales/locale.py index 951ba8be6..01204a51b 100644 --- a/src/pendulum/locales/locale.py +++ b/src/pendulum/locales/locale.py @@ -90,10 +90,11 @@ def ordinalize(self, number: int) -> str: def match_translation(self, key: str, value: Any) -> dict[str, str] | None: translations = self.translation(key) - if value not in translations.values(): + by_value = {v.lower(): k for k, v in translations.items()} + if value.lower() not in by_value: return None - return cast(Dict[str, str], {v: k for k, v in translations.items()}[value]) + return cast(Dict[str, str], by_value[value.lower()]) def __repr__(self) -> str: return f"{self.__class__.__name__}('{self._locale}')" diff --git a/tests/datetime/test_from_format.py b/tests/datetime/test_from_format.py index ecf59632a..65e996528 100644 --- a/tests/datetime/test_from_format.py +++ b/tests/datetime/test_from_format.py @@ -104,6 +104,11 @@ def test_from_format_with_invalid_padded_day(): ("1", "E", "2018-01-29T00:00:00+00:00", "2018-02-02"), ("March", "MMMM", "2018-03-01T00:00:00+00:00", "2018-02-02"), ("Mar", "MMM", "2018-03-01T00:00:00+00:00", "2018-02-02"), + ("mar", "MMM", "2018-03-01T00:00:00+00:00", "2018-02-02"), + ("MARCH", "MMMM", "2018-03-01T00:00:00+00:00", "2018-02-02"), + ("14nov22", "DDMMMYY", "2022-11-14T00:00:00+00:00", None), + ("monday", "dddd", "2018-01-29T00:00:00+00:00", "2018-02-02"), + ("MON", "ddd", "2018-01-29T00:00:00+00:00", "2018-02-02"), ( "Thursday 25th December 1975 02:15:16 PM", "dddd Do MMMM YYYY hh:mm:ss A", @@ -164,6 +169,8 @@ def test_from_format(text, fmt, expected, now): ("lu", "dd", "2018-01-29T00:00:00+00:00"), ("mars", "MMMM", "2018-03-01T00:00:00+00:00"), ("mars", "MMM", "2018-03-01T00:00:00+00:00"), + ("Mars", "MMMM", "2018-03-01T00:00:00+00:00"), + ("LUNDI", "dddd", "2018-01-29T00:00:00+00:00"), ], ) def test_from_format_with_locale(text, fmt, expected):