Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions babel/core.py
Original file line number Diff line number Diff line change
Expand Up @@ -855,7 +855,7 @@ def time_formats(self) -> localedata.LocaleDataDict:
Babel versions.

>>> Locale('en', 'US').time_formats['short']
<DateTimePattern u'h:mm a'>
<DateTimePattern u'h:mm\u202fa'>
>>> Locale('fr', 'FR').time_formats['long']
<DateTimePattern u'HH:mm:ss z'>
"""
Expand All @@ -869,7 +869,7 @@ def datetime_formats(self) -> localedata.LocaleDataDict:
Babel versions.

>>> Locale('en').datetime_formats['full']
u"{1} 'at' {0}"
u'{1}, {0}'
>>> Locale('th').datetime_formats['medium']
u'{1} {0}'
"""
Expand Down
18 changes: 9 additions & 9 deletions babel/dates.py
Original file line number Diff line number Diff line change
Expand Up @@ -497,7 +497,7 @@ def get_time_format(format: _PredefinedTimeFormat = 'medium', locale: Locale | s
format.

>>> get_time_format(locale='en_US')
<DateTimePattern u'h:mm:ss a'>
<DateTimePattern u'h:mm:ss\u202fa'>
>>> get_time_format('full', locale='de_DE')
<DateTimePattern u'HH:mm:ss zzzz'>

Expand Down Expand Up @@ -580,14 +580,14 @@ def get_timezone_location(

>>> tz = get_timezone('America/St_Johns')
>>> print(get_timezone_location(tz, locale='de_DE'))
Kanada (St. John’s) Zeit
Kanada (St. John’s) (Ortszeit)
>>> print(get_timezone_location(tz, locale='en'))
Canada (St. John’s) Time
>>> print(get_timezone_location(tz, locale='en', return_city=True))
St. John’s
>>> tz = get_timezone('America/Mexico_City')
>>> get_timezone_location(tz, locale='de_DE')
u'Mexiko (Mexiko-Stadt) Zeit'
u'Mexiko (Mexiko-Stadt) (Ortszeit)'

If the timezone is associated with a country that uses only a single
timezone, just the localized country name is returned:
Expand Down Expand Up @@ -823,13 +823,13 @@ def format_datetime(
>>> from datetime import datetime
>>> dt = datetime(2007, 4, 1, 15, 30)
>>> format_datetime(dt, locale='en_US')
u'Apr 1, 2007, 3:30:00 PM'
u'Apr 1, 2007, 3:30:00\u202fPM'

For any pattern requiring the display of the timezone:

>>> format_datetime(dt, 'full', tzinfo=get_timezone('Europe/Paris'),
... locale='fr_FR')
'dimanche 1 avril 2007 à 17:30:00 heure d’été d’Europe centrale'
'dimanche 1 avril 2007, 17:30:00 heure d’été d’Europe centrale'
>>> format_datetime(dt, "yyyy.MM.dd G 'at' HH:mm:ss zzz",
... tzinfo=get_timezone('US/Eastern'), locale='en')
u'2007.04.01 AD at 11:30:00 EDT'
Expand Down Expand Up @@ -864,7 +864,7 @@ def format_time(
>>> from datetime import datetime, time
>>> t = time(15, 30)
>>> format_time(t, locale='en_US')
u'3:30:00 PM'
u'3:30:00\u202fPM'
>>> format_time(t, format='short', locale='de_DE')
u'15:30'

Expand Down Expand Up @@ -905,7 +905,7 @@ def format_time(
u'15:30:00 heure normale d\u2019Europe centrale'
>>> format_time(t, format='full', tzinfo=get_timezone('US/Eastern'),
... locale='en_US')
u'3:30:00 PM Eastern Standard Time'
u'3:30:00\u202fPM Eastern Standard Time'

:param time: the ``time`` or ``datetime`` object; if `None`, the current
time in UTC is used
Expand Down Expand Up @@ -1137,7 +1137,7 @@ def format_interval(
'12:12\u201316:16'

>>> format_interval(time(5, 12), time(16, 16), "hm", locale="en_US")
'5:12 AM \u2013 4:16 PM'
'5:12\u202fAM\u2009–\u20094:16\u202fPM'

>>> format_interval(time(16, 18), time(16, 24), "Hm", locale="it")
'16:18\u201316:24'
Expand All @@ -1156,7 +1156,7 @@ def format_interval(
'16:18:00\uff5e16:24:00'

>>> format_interval(date(2016, 1, 15), date(2016, 1, 17), "xxx", locale="de")
'15.01.2016 \u2013 17.01.2016'
'15.01.2016\u2009–\u200917.01.2016'

:param start: First instant (datetime/date/time)
:param end: Second instant (datetime/date/time)
Expand Down
4 changes: 2 additions & 2 deletions babel/numbers.py
Original file line number Diff line number Diff line change
Expand Up @@ -558,9 +558,9 @@ def format_currency(
"""Return formatted currency value.

>>> format_currency(1099.98, 'USD', locale='en_US')
u'$1,099.98'
'$1,099.98'
>>> format_currency(1099.98, 'USD', locale='es_CO')
u'US$\\xa01.099,98'
u'US$1.099,98'
>>> format_currency(1099.98, 'EUR', locale='de_DE')
u'1.099,98\\xa0\\u20ac'

Expand Down
4 changes: 2 additions & 2 deletions babel/support.py
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ def datetime(
>>> from babel.dates import get_timezone
>>> fmt = Format('en_US', tzinfo=get_timezone('US/Eastern'))
>>> fmt.datetime(datetime(2007, 4, 1, 15, 30))
u'Apr 1, 2007, 11:30:00 AM'
u'Apr 1, 2007, 11:30:00\u202fAM'
"""
return format_datetime(datetime, format, tzinfo=self.tzinfo, locale=self.locale)

Expand All @@ -98,7 +98,7 @@ def time(
>>> from babel.dates import get_timezone
>>> fmt = Format('en_US', tzinfo=get_timezone('US/Eastern'))
>>> fmt.time(datetime(2007, 4, 1, 15, 30))
u'11:30:00 AM'
u'11:30:00\u202fAM'
"""
return format_time(time, format, tzinfo=self.tzinfo, locale=self.locale)

Expand Down
8 changes: 4 additions & 4 deletions scripts/download_import_cldr.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,10 @@
import zipfile
from urllib.request import urlretrieve

URL = 'http://unicode.org/Public/cldr/41/cldr-common-41.0.zip'
FILENAME = 'cldr-common-41.0.zip'
# Via https://unicode.org/Public/cldr/41/hashes/SHASUM512
FILESUM = 'c64f3338e292962817b043dd11e9c47f533c9b70d432f83e80654e20f4937c72b37e66a60485df43f734b1ff94ebf0452547a063076917889303c9653b4d6ce5'
URL = 'http://unicode.org/Public/cldr/42/cldr-common-42.0.zip'
FILENAME = 'cldr-common-42.0.zip'
# Via https://unicode.org/Public/cldr/42/hashes/SHASUM512
FILESUM = '315448fe6a9ac2d5a6a7fd1a27b38c5db30fed053654a803d50e3a8d06aa08ad153e8e57089fa094c561f41a54f37eecda0701b47a1813879902be71945aa38a'
BLKSIZE = 131072


Expand Down
4 changes: 4 additions & 0 deletions scripts/import_cldr.py
Original file line number Diff line number Diff line change
Expand Up @@ -925,6 +925,10 @@ def parse_currency_formats(data, tree):
)
elif child.tag == 'pattern':
pattern_type = child.attrib.get('type')
if child.attrib.get('draft') or child.attrib.get('alt'):
# Skip drafts and alternates.
# The `noCurrency` alternate for currencies was added in CLDR 42.
continue
pattern = numbers.parse_pattern(str(child.text))
if pattern_type:
# This is a compact currency format, see:
Expand Down
4 changes: 2 additions & 2 deletions tests/test_core.py
Original file line number Diff line number Diff line change
Expand Up @@ -228,11 +228,11 @@ def test_date_formats_property(self):
assert Locale('fr', 'FR').date_formats['long'].pattern == 'd MMMM y'

def test_time_formats_property(self):
assert Locale('en', 'US').time_formats['short'].pattern == 'h:mm a'
assert Locale('en', 'US').time_formats['short'].pattern == 'h:mm\u202fa'
assert Locale('fr', 'FR').time_formats['long'].pattern == 'HH:mm:ss z'

def test_datetime_formats_property(self):
assert Locale('en').datetime_formats['full'] == "{1} 'at' {0}"
assert Locale('en').datetime_formats['full'] == "{1}, {0}"
assert Locale('th').datetime_formats['medium'] == '{1} {0}'

def test_datetime_skeleton_property(self):
Expand Down
4 changes: 2 additions & 2 deletions tests/test_date_intervals.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ def test_format_interval_same_instant_1():


def test_format_interval_same_instant_2():
assert dates.format_interval(TEST_DT, TEST_DT, "xxx", fuzzy=False, locale="fi") == "8.1.2016 klo 11.46.15"
assert dates.format_interval(TEST_DT, TEST_DT, "xxx", fuzzy=False, locale="fi") == "8.1.2016 11.46.15"


def test_format_interval_same_instant_3():
Expand All @@ -40,7 +40,7 @@ def test_format_interval_in_tz(timezone_getter):
def test_format_interval_12_hour():
t2 = TEST_DT
t1 = t2 - datetime.timedelta(hours=1)
assert dates.format_interval(t1, t2, "hm", locale="en") == "10:46 \u2013 11:46 AM"
assert dates.format_interval(t1, t2, "hm", locale="en") == "10:46\u2009\u2013\u200911:46\u202fAM"


def test_format_interval_invalid_skeleton():
Expand Down
20 changes: 10 additions & 10 deletions tests/test_dates.py
Original file line number Diff line number Diff line change
Expand Up @@ -439,7 +439,7 @@ def test_get_datetime_format():


def test_get_time_format():
assert dates.get_time_format(locale='en_US').pattern == 'h:mm:ss a'
assert dates.get_time_format(locale='en_US').pattern == 'h:mm:ss\u202fa'
assert (dates.get_time_format('full', locale='de_DE').pattern ==
'HH:mm:ss zzzz')

Expand All @@ -460,19 +460,19 @@ def test_get_timezone_gmt(timezone_getter):
def test_get_timezone_location(timezone_getter):
tz = timezone_getter('America/St_Johns')
assert (dates.get_timezone_location(tz, locale='de_DE') ==
"Kanada (St. John\u2019s) Zeit")
"Kanada (St. John\u2019s) (Ortszeit)")
assert (dates.get_timezone_location(tz, locale='en') ==
'Canada (St. John’s) Time')
assert (dates.get_timezone_location(tz, locale='en', return_city=True) ==
'St. John’s')

tz = timezone_getter('America/Mexico_City')
assert (dates.get_timezone_location(tz, locale='de_DE') ==
'Mexiko (Mexiko-Stadt) Zeit')
'Mexiko (Mexiko-Stadt) (Ortszeit)')

tz = timezone_getter('Europe/Berlin')
assert (dates.get_timezone_location(tz, locale='de_DE') ==
'Deutschland (Berlin) Zeit')
'Deutschland (Berlin) (Ortszeit)')


@pytest.mark.parametrize(
Expand Down Expand Up @@ -564,16 +564,16 @@ def test_format_date():
def test_format_datetime(timezone_getter):
dt = datetime(2007, 4, 1, 15, 30)
assert (dates.format_datetime(dt, locale='en_US') ==
'Apr 1, 2007, 3:30:00 PM')
'Apr 1, 2007, 3:30:00\u202fPM')

full = dates.format_datetime(
dt, 'full',
tzinfo=timezone_getter('Europe/Paris'),
locale='fr_FR'
)
assert full == (
'dimanche 1 avril 2007 à 17:30:00 heure '
'd\u2019\xe9t\xe9 d\u2019Europe centrale'
'dimanche 1 avril 2007, 17:30:00 heure '
'd’été d’Europe centrale'
)
custom = dates.format_datetime(
dt, "yyyy.MM.dd G 'at' HH:mm:ss zzz",
Expand All @@ -585,7 +585,7 @@ def test_format_datetime(timezone_getter):

def test_format_time(timezone_getter):
t = time(15, 30)
assert dates.format_time(t, locale='en_US') == '3:30:00 PM'
assert dates.format_time(t, locale='en_US') == '3:30:00\u202fPM'
assert dates.format_time(t, format='short', locale='de_DE') == '15:30'

assert (dates.format_time(t, "hh 'o''clock' a", locale='en') ==
Expand All @@ -606,7 +606,7 @@ def test_format_time(timezone_getter):
assert paris == '15:30:00 heure normale d’Europe centrale'

us_east = dates.format_time(t, format='full', tzinfo=eastern, locale='en_US')
assert us_east == '3:30:00 PM Eastern Standard Time'
assert us_east == '3:30:00\u202fPM Eastern Standard Time'


def test_format_skeleton(timezone_getter):
Expand Down Expand Up @@ -720,7 +720,7 @@ def test_no_inherit_metazone_formatting(timezone_getter):
# See: https://github.com/python-babel/babel/issues/428
tz = timezone_getter('America/Los_Angeles')
t = _localize(tz, datetime(2016, 1, 6, 7))
assert dates.format_time(t, format='long', locale='en_US') == "7:00:00 AM PST"
assert dates.format_time(t, format='long', locale='en_US') == "7:00:00\u202fAM PST"
assert dates.format_time(t, format='long', locale='en_GB') == "07:00:00 Pacific Standard Time"
assert dates.get_timezone_name(t, width='short', locale='en_US') == "PST"
assert dates.get_timezone_name(t, width='short', locale='en_GB') == "Pacific Standard Time"
Expand Down
22 changes: 15 additions & 7 deletions tests/test_numbers.py
Original file line number Diff line number Diff line change
Expand Up @@ -300,6 +300,10 @@ def test_get_territory_currencies():

assert numbers.get_territory_currencies('QO', date(2013, 1, 1)) == []

# Croatia uses Euro starting in January 2023; this is in CLDR 42.
# See https://github.com/python-babel/babel/issues/942
assert 'EUR' in numbers.get_territory_currencies('HR', date(2023, 1, 1))


def test_get_decimal_symbol():
assert numbers.get_decimal_symbol('en_US') == '.'
Expand Down Expand Up @@ -384,7 +388,7 @@ def test_format_currency():
assert (numbers.format_currency(0, 'USD', locale='en_US')
== '$0.00')
assert (numbers.format_currency(1099.98, 'USD', locale='es_CO')
== 'US$\xa01.099,98')
== 'US$1.099,98')
assert (numbers.format_currency(1099.98, 'EUR', locale='de_DE')
== '1.099,98\xa0\u20ac')
assert (numbers.format_currency(1099.98, 'EUR', '\xa4\xa4 #,##0.00',
Expand All @@ -396,11 +400,11 @@ def test_format_currency():
locale='en_US')
== '$1,099.98')
assert (numbers.format_currency(1, 'USD', locale='es_AR')
== 'US$\xa01,00') # one
== 'US$1,00') # one
assert (numbers.format_currency(1000000, 'USD', locale='es_AR')
== 'US$\xa01.000.000,00') # many
== 'US$1.000.000,00') # many
assert (numbers.format_currency(0, 'USD', locale='es_AR')
== 'US$\xa00,00') # other
== 'US$0,00') # other


def test_format_currency_format_type():
Expand Down Expand Up @@ -445,8 +449,8 @@ def test_format_compact_currency():
assert numbers.format_compact_currency(1234, 'JPY', locale='ja_JP', format_type="short") == '¥1234'
assert numbers.format_compact_currency(123456, 'JPY', locale='ja_JP', format_type="short") == '¥12万'
assert numbers.format_compact_currency(123456, 'JPY', locale='ja_JP', format_type="short", fraction_digits=2) == '¥12.35万'
assert numbers.format_compact_currency(123, 'EUR', locale='yav', format_type="short") == '123\xa0€'
assert numbers.format_compact_currency(12345, 'EUR', locale='yav', format_type="short") == '12K\xa0€'
assert numbers.format_compact_currency(123, 'EUR', locale='yav', format_type="short") == '€\xa0123'
assert numbers.format_compact_currency(12345, 'EUR', locale='yav', format_type="short") == '€\xa012K'
assert numbers.format_compact_currency(123456789, 'EUR', locale='de_DE', fraction_digits=1) == '123,5\xa0Mio.\xa0€'


Expand Down Expand Up @@ -480,7 +484,11 @@ def test_format_compact_currency_invalid_format_type():
def test_format_currency_precision(input_value, expected_value):
# Test precision conservation.
assert numbers.format_currency(
decimal.Decimal(input_value), 'USD', locale='en_US', decimal_quantization=False) == expected_value
decimal.Decimal(input_value),
currency='USD',
locale='en_US',
decimal_quantization=False,
) == expected_value


def test_format_currency_quantization():
Expand Down
4 changes: 2 additions & 2 deletions tests/test_support.py
Original file line number Diff line number Diff line change
Expand Up @@ -304,12 +304,12 @@ def test_format_date():
def test_format_datetime(timezone_getter):
fmt = support.Format('en_US', tzinfo=timezone_getter('US/Eastern'))
when = datetime(2007, 4, 1, 15, 30)
assert fmt.datetime(when) == 'Apr 1, 2007, 11:30:00 AM'
assert fmt.datetime(when) == 'Apr 1, 2007, 11:30:00\u202fAM'


def test_format_time(timezone_getter):
fmt = support.Format('en_US', tzinfo=timezone_getter('US/Eastern'))
assert fmt.time(datetime(2007, 4, 1, 15, 30)) == '11:30:00 AM'
assert fmt.time(datetime(2007, 4, 1, 15, 30)) == '11:30:00\u202fAM'


def test_format_timedelta():
Expand Down