Skip to content

Commit 701358e

Browse files
committed
Make LocaleDataDict Generic and fix core and numbers types
1 parent 373a52f commit 701358e

2 files changed

Lines changed: 93 additions & 48 deletions

File tree

babel/core.py

Lines changed: 73 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424
if TYPE_CHECKING:
2525
from typing_extensions import Literal, TypeAlias
2626

27+
from babel import dates, numbers
28+
2729
_GLOBAL_KEY: TypeAlias = Literal[
2830
"all_currencies",
2931
"currency_fractions",
@@ -306,7 +308,7 @@ def parse(
306308
there is a locale ``en`` that can exist
307309
by itself.
308310
:raise `ValueError`: if the string does not appear to be a valid locale
309-
identifier
311+
identifier or ``None`` is passed
310312
:raise `UnknownLocaleError`: if no locale data is available for the
311313
requested locale
312314
:raise `TypeError`: if the identifier is not a string or a `Locale`
@@ -423,7 +425,7 @@ def __str__(self) -> str:
423425
self.modifier))
424426

425427
@property
426-
def _data(self) -> localedata.LocaleDataDict:
428+
def _data(self) -> localedata.LocaleDataDict[str, Any]:
427429
if self.__data is None:
428430
self.__data = localedata.LocaleDataDict(localedata.load(str(self)))
429431
return self.__data
@@ -541,7 +543,7 @@ def english_name(self) -> str | None:
541543
# { General Locale Display Names
542544

543545
@property
544-
def languages(self) -> localedata.LocaleDataDict:
546+
def languages(self) -> localedata.LocaleDataDict[str, str]:
545547
"""Mapping of language codes to translated language names.
546548
547549
>>> Locale('de', 'DE').languages['ja']
@@ -553,7 +555,7 @@ def languages(self) -> localedata.LocaleDataDict:
553555
return self._data['languages']
554556

555557
@property
556-
def scripts(self) -> localedata.LocaleDataDict:
558+
def scripts(self) -> localedata.LocaleDataDict[str, str]:
557559
"""Mapping of script codes to translated script names.
558560
559561
>>> Locale('en', 'US').scripts['Hira']
@@ -565,7 +567,7 @@ def scripts(self) -> localedata.LocaleDataDict:
565567
return self._data['scripts']
566568

567569
@property
568-
def territories(self) -> localedata.LocaleDataDict:
570+
def territories(self) -> localedata.LocaleDataDict[str, str]:
569571
"""Mapping of script codes to translated script names.
570572
571573
>>> Locale('es', 'CO').territories['DE']
@@ -577,7 +579,7 @@ def territories(self) -> localedata.LocaleDataDict:
577579
return self._data['territories']
578580

579581
@property
580-
def variants(self) -> localedata.LocaleDataDict:
582+
def variants(self) -> localedata.LocaleDataDict[str, str]:
581583
"""Mapping of script codes to translated script names.
582584
583585
>>> Locale('de', 'DE').variants['1901']
@@ -588,7 +590,7 @@ def variants(self) -> localedata.LocaleDataDict:
588590
# { Number Formatting
589591

590592
@property
591-
def currencies(self) -> localedata.LocaleDataDict:
593+
def currencies(self) -> localedata.LocaleDataDict[str, str]:
592594
"""Mapping of currency codes to translated currency names. This
593595
only returns the generic form of the currency name, not the count
594596
specific one. If an actual number is requested use the
@@ -602,7 +604,7 @@ def currencies(self) -> localedata.LocaleDataDict:
602604
return self._data['currency_names']
603605

604606
@property
605-
def currency_symbols(self) -> localedata.LocaleDataDict:
607+
def currency_symbols(self) -> localedata.LocaleDataDict[str, str]:
606608
"""Mapping of currency codes to symbols.
607609
608610
>>> Locale('en', 'US').currency_symbols['USD']
@@ -613,7 +615,7 @@ def currency_symbols(self) -> localedata.LocaleDataDict:
613615
return self._data['currency_symbols']
614616

615617
@property
616-
def number_symbols(self) -> localedata.LocaleDataDict:
618+
def number_symbols(self) -> localedata.LocaleDataDict[str, str]:
617619
"""Symbols used in number formatting.
618620
619621
.. note:: The format of the value returned may change between
@@ -625,7 +627,7 @@ def number_symbols(self) -> localedata.LocaleDataDict:
625627
return self._data['number_symbols']
626628

627629
@property
628-
def decimal_formats(self) -> localedata.LocaleDataDict:
630+
def decimal_formats(self) -> localedata.LocaleDataDict[str | None, numbers.NumberPattern]:
629631
"""Locale patterns for decimal number formatting.
630632
631633
.. note:: The format of the value returned may change between
@@ -637,7 +639,11 @@ def decimal_formats(self) -> localedata.LocaleDataDict:
637639
return self._data['decimal_formats']
638640

639641
@property
640-
def compact_decimal_formats(self) -> localedata.LocaleDataDict:
642+
def compact_decimal_formats(
643+
self
644+
) -> localedata.LocaleDataDict[
645+
str, localedata.LocaleDataDict[str, localedata.LocaleDataDict[str, numbers.NumberPattern]]
646+
]:
641647
"""Locale patterns for compact decimal number formatting.
642648
643649
.. note:: The format of the value returned may change between
@@ -649,7 +655,7 @@ def compact_decimal_formats(self) -> localedata.LocaleDataDict:
649655
return self._data['compact_decimal_formats']
650656

651657
@property
652-
def currency_formats(self) -> localedata.LocaleDataDict:
658+
def currency_formats(self) -> localedata.LocaleDataDict[str, numbers.NumberPattern]:
653659
"""Locale patterns for currency number formatting.
654660
655661
.. note:: The format of the value returned may change between
@@ -663,7 +669,11 @@ def currency_formats(self) -> localedata.LocaleDataDict:
663669
return self._data['currency_formats']
664670

665671
@property
666-
def compact_currency_formats(self) -> localedata.LocaleDataDict:
672+
def compact_currency_formats(
673+
self
674+
) -> localedata.LocaleDataDict[
675+
str, localedata.LocaleDataDict[str, localedata.LocaleDataDict[str, numbers.NumberPattern]]
676+
]:
667677
"""Locale patterns for compact currency number formatting.
668678
669679
.. note:: The format of the value returned may change between
@@ -675,7 +685,7 @@ def compact_currency_formats(self) -> localedata.LocaleDataDict:
675685
return self._data['compact_currency_formats']
676686

677687
@property
678-
def percent_formats(self) -> localedata.LocaleDataDict:
688+
def percent_formats(self) -> localedata.LocaleDataDict[str | None, numbers.NumberPattern]:
679689
"""Locale patterns for percent number formatting.
680690
681691
.. note:: The format of the value returned may change between
@@ -687,7 +697,7 @@ def percent_formats(self) -> localedata.LocaleDataDict:
687697
return self._data['percent_formats']
688698

689699
@property
690-
def scientific_formats(self) -> localedata.LocaleDataDict:
700+
def scientific_formats(self) -> localedata.LocaleDataDict[str | None, numbers.NumberPattern]:
691701
"""Locale patterns for scientific number formatting.
692702
693703
.. note:: The format of the value returned may change between
@@ -701,7 +711,7 @@ def scientific_formats(self) -> localedata.LocaleDataDict:
701711
# { Calendar Information and Date Formatting
702712

703713
@property
704-
def periods(self) -> localedata.LocaleDataDict:
714+
def periods(self) -> localedata.LocaleDataDict[str, str]:
705715
"""Locale display names for day periods (AM/PM).
706716
707717
>>> Locale('en', 'US').periods['am']
@@ -713,21 +723,31 @@ def periods(self) -> localedata.LocaleDataDict:
713723
return localedata.LocaleDataDict({}) # pragma: no cover
714724

715725
@property
716-
def day_periods(self) -> localedata.LocaleDataDict:
726+
def day_periods(
727+
self
728+
) -> localedata.LocaleDataDict[
729+
str, localedata.LocaleDataDict[str, localedata.LocaleDataDict[str, str]]
730+
]:
717731
"""Locale display names for various day periods (not necessarily only AM/PM).
718732
719733
These are not meant to be used without the relevant `day_period_rules`.
720734
"""
721735
return self._data['day_periods']
722736

723737
@property
724-
def day_period_rules(self) -> localedata.LocaleDataDict:
738+
def day_period_rules(
739+
self
740+
) -> localedata.LocaleDataDict[str | None, localedata.LocaleDataDict[str, str]]:
725741
"""Day period rules for the locale. Used by `get_period_id`.
726742
"""
727743
return self._data.get('day_period_rules', localedata.LocaleDataDict({}))
728744

729745
@property
730-
def days(self) -> localedata.LocaleDataDict:
746+
def days(
747+
self
748+
) -> localedata.LocaleDataDict[
749+
str, localedata.LocaleDataDict[str, localedata.LocaleDataDict[int, str]]
750+
]:
731751
"""Locale display names for weekdays.
732752
733753
>>> Locale('de', 'DE').days['format']['wide'][3]
@@ -736,7 +756,11 @@ def days(self) -> localedata.LocaleDataDict:
736756
return self._data['days']
737757

738758
@property
739-
def months(self) -> localedata.LocaleDataDict:
759+
def months(
760+
self
761+
) -> localedata.LocaleDataDict[
762+
str, localedata.LocaleDataDict[str, localedata.LocaleDataDict[int, str]]
763+
]:
740764
"""Locale display names for months.
741765
742766
>>> Locale('de', 'DE').months['format']['wide'][10]
@@ -745,7 +769,11 @@ def months(self) -> localedata.LocaleDataDict:
745769
return self._data['months']
746770

747771
@property
748-
def quarters(self) -> localedata.LocaleDataDict:
772+
def quarters(
773+
self
774+
) -> localedata.LocaleDataDict[
775+
str, localedata.LocaleDataDict[str, localedata.LocaleDataDict[int, str]]
776+
]:
749777
"""Locale display names for quarters.
750778
751779
>>> Locale('de', 'DE').quarters['format']['wide'][1]
@@ -754,7 +782,7 @@ def quarters(self) -> localedata.LocaleDataDict:
754782
return self._data['quarters']
755783

756784
@property
757-
def eras(self) -> localedata.LocaleDataDict:
785+
def eras(self) -> localedata.LocaleDataDict[str, localedata.LocaleDataDict[int, str]]:
758786
"""Locale display names for eras.
759787
760788
.. note:: The format of the value returned may change between
@@ -768,7 +796,11 @@ def eras(self) -> localedata.LocaleDataDict:
768796
return self._data['eras']
769797

770798
@property
771-
def time_zones(self) -> localedata.LocaleDataDict:
799+
def time_zones(
800+
self
801+
) -> localedata.LocaleDataDict[
802+
str, localedata.LocaleDataDict[str, localedata.LocaleDataDict[str, str]]
803+
]:
772804
"""Locale display names for time zones.
773805
774806
.. note:: The format of the value returned may change between
@@ -782,7 +814,11 @@ def time_zones(self) -> localedata.LocaleDataDict:
782814
return self._data['time_zones']
783815

784816
@property
785-
def meta_zones(self) -> localedata.LocaleDataDict:
817+
def meta_zones(
818+
self
819+
) -> localedata.LocaleDataDict[
820+
str, localedata.LocaleDataDict[str, localedata.LocaleDataDict[str, str]]
821+
]:
786822
"""Locale display names for meta time zones.
787823
788824
Meta time zones are basically groups of different Olson time zones that
@@ -799,7 +835,7 @@ def meta_zones(self) -> localedata.LocaleDataDict:
799835
return self._data['meta_zones']
800836

801837
@property
802-
def zone_formats(self) -> localedata.LocaleDataDict:
838+
def zone_formats(self) -> localedata.LocaleDataDict[str, str]:
803839
"""Patterns related to the formatting of time zones.
804840
805841
.. note:: The format of the value returned may change between
@@ -854,7 +890,7 @@ def min_week_days(self) -> int:
854890
return self._data['week_data']['min_days']
855891

856892
@property
857-
def date_formats(self) -> localedata.LocaleDataDict:
893+
def date_formats(self) -> localedata.LocaleDataDict[str, dates.DateTimePattern]:
858894
"""Locale patterns for date formatting.
859895
860896
.. note:: The format of the value returned may change between
@@ -868,7 +904,7 @@ def date_formats(self) -> localedata.LocaleDataDict:
868904
return self._data['date_formats']
869905

870906
@property
871-
def time_formats(self) -> localedata.LocaleDataDict:
907+
def time_formats(self) -> localedata.LocaleDataDict[str, dates.DateTimePattern]:
872908
"""Locale patterns for time formatting.
873909
874910
.. note:: The format of the value returned may change between
@@ -882,7 +918,7 @@ def time_formats(self) -> localedata.LocaleDataDict:
882918
return self._data['time_formats']
883919

884920
@property
885-
def datetime_formats(self) -> localedata.LocaleDataDict:
921+
def datetime_formats(self) -> localedata.LocaleDataDict[str, str]:
886922
"""Locale patterns for datetime formatting.
887923
888924
.. note:: The format of the value returned may change between
@@ -896,7 +932,7 @@ def datetime_formats(self) -> localedata.LocaleDataDict:
896932
return self._data['datetime_formats']
897933

898934
@property
899-
def datetime_skeletons(self) -> localedata.LocaleDataDict:
935+
def datetime_skeletons(self) -> localedata.LocaleDataDict[str, dates.DateTimePattern]:
900936
"""Locale patterns for formatting parts of a datetime.
901937
902938
>>> Locale('en').datetime_skeletons['MEd']
@@ -909,7 +945,9 @@ def datetime_skeletons(self) -> localedata.LocaleDataDict:
909945
return self._data['datetime_skeletons']
910946

911947
@property
912-
def interval_formats(self) -> localedata.LocaleDataDict:
948+
def interval_formats(
949+
self
950+
) -> localedata.LocaleDataDict[str | None, str | localedata.LocaleDataDict[str, list[str]]]:
913951
"""Locale patterns for interval formatting.
914952
915953
.. note:: The format of the value returned may change between
@@ -946,7 +984,7 @@ def plural_form(self) -> PluralRule:
946984
return self._data.get('plural_form', _default_plural_rule)
947985

948986
@property
949-
def list_patterns(self) -> localedata.LocaleDataDict:
987+
def list_patterns(self) -> localedata.LocaleDataDict[str, localedata.LocaleDataDict[str, str]]:
950988
"""Patterns for generating lists
951989
952990
.. note:: The format of the value returned may change between
@@ -979,7 +1017,7 @@ def ordinal_form(self) -> PluralRule:
9791017
return self._data.get('ordinal_form', _default_plural_rule)
9801018

9811019
@property
982-
def measurement_systems(self) -> localedata.LocaleDataDict:
1020+
def measurement_systems(self) -> localedata.LocaleDataDict[str, str]:
9831021
"""Localized names for various measurement systems.
9841022
9851023
>>> Locale('fr', 'FR').measurement_systems['US']
@@ -1013,7 +1051,9 @@ def text_direction(self) -> str:
10131051
return ''.join(word[0] for word in self.character_order.split('-'))
10141052

10151053
@property
1016-
def unit_display_names(self) -> localedata.LocaleDataDict:
1054+
def unit_display_names(
1055+
self
1056+
) -> localedata.LocaleDataDict[str, localedata.LocaleDataDict[str, str]]:
10171057
"""Display names for units of measurement.
10181058
10191059
.. seealso::

0 commit comments

Comments
 (0)