Skip to content

Commit d302541

Browse files
committed
Makes localizable methods return unicode strings
1 parent f3a2cbe commit d302541

File tree

18 files changed

+123
-111
lines changed

18 files changed

+123
-111
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22

33
## [Unreleased]
44

5+
### Changed
6+
7+
- `format()`, `diff_for_humans()`, `in_words()` and `to_xxx_string()` methods now return unicode strings.
8+
59
### Fixed
610

711
- Fixed `from_format()` raising an error with the alternative formatter.

pendulum/_compat.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
except NameError: # Python < 3.3
2222
FileNotFoundError = IOError # cf PEP-3151
2323

24+
2425
def decode(string, encodings=None):
2526
if not PY2 and not isinstance(string, bytes):
2627
return string

pendulum/formatting/alternative_formatter.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import re
44
import datetime
55

6+
from .._compat import decode
67
from .formatter import Formatter
78

89

@@ -316,7 +317,7 @@ def _format_localizable_token(self, dt, token, locale):
316317
# Defaulting to english
317318
return self._format_localizable_token(dt, token, 'en')
318319

319-
return trans
320+
return decode(trans)
320321

321322
def parse(self, time, fmt):
322323
"""

pendulum/formatting/classic_formatter.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import re
44
import datetime
55

6+
from .._compat import decode
67
from .formatter import Formatter
78

89

@@ -36,12 +37,13 @@ def format(self, dt, fmt, locale=None):
3637
fmt = re.sub('%(a|A|b|B|p)', lambda m: self._localize_directive(dt, m.group(1), locale), fmt)
3738

3839
if hasattr(dt, '_datetime'):
39-
return dt._datetime.strftime(fmt)
40-
41-
if hasattr(dt, '_time'):
42-
return dt._time.strftime(fmt)
40+
trans = dt._datetime.strftime(fmt)
41+
elif hasattr(dt, '_time'):
42+
trans = dt._time.strftime(fmt)
43+
else:
44+
trans = datetime.date(dt.year, dt.month, dt.day).strftime(fmt)
4345

44-
return datetime.date(dt.year, dt.month, dt.day).strftime(fmt)
46+
return decode(trans)
4547

4648
def _localize_directive(self, dt, directive, locale):
4749
"""

pendulum/formatting/difference_formatter.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
# -*- coding: utf-8 -*-
22

3+
from .._compat import decode
34
from ..translator import Translator
45

56

@@ -79,7 +80,7 @@ def diff_for_humans(self, date, other=None, absolute=False, locale=None):
7980
time = self._translator.transchoice(unit, count, {'count': count}, locale=locale)
8081

8182
if absolute:
82-
return time
83+
return decode(time)
8384

8485
is_future = diff.invert
8586

@@ -93,4 +94,6 @@ def diff_for_humans(self, date, other=None, absolute=False, locale=None):
9394
if try_key_exists != self._translator.transchoice(try_key_exists, count, locale=locale):
9495
time = self._translator.transchoice(try_key_exists, count, {'count': count}, locale=locale)
9596

96-
return self._translator.trans(trans_id, {'time': time}, locale=locale)
97+
trans = self._translator.trans(trans_id, {'time': time}, locale=locale)
98+
99+
return decode(trans)

pendulum/mixins/interval.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
# -*- coding: utf-8 -*-
22

3+
from .._compat import decode
34
from .default import TranslatableMixin
45

56

@@ -49,7 +50,7 @@ def in_words(self, locale=None, separator=' ', _periods=None):
4950
)
5051
parts.append(translation)
5152

52-
return separator.join(parts)
53+
return decode(separator.join(parts))
5354

5455
def __str__(self):
5556
return self.in_words()

tests/date_tests/test_strings.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ def test_repr(self):
4444

4545
def test_format_with_locale(self):
4646
d = Date(1975, 12, 25)
47-
self.assertEqual('jeudi 25e jour de décembre 1975',
47+
self.assertEqual(u'jeudi 25e jour de décembre 1975',
4848
d.format('%A %d%_t jour de %B %Y', locale='fr'))
4949

5050
def test_set_formatter_globally(self):

tests/formatting_tests/test_alternative_formatter.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -200,9 +200,9 @@ def test_date_formats(self):
200200
self.assertEqual('07:03', f.format(d, 'LT', locale='fr'))
201201
self.assertEqual('07:03:06', f.format(d, 'LTS', locale='fr'))
202202
self.assertEqual('28/08/2016', f.format(d, 'L', locale='fr'))
203-
self.assertEqual('28 août 2016', f.format(d, 'LL', locale='fr'))
204-
self.assertEqual('28 août 2016 07:03', f.format(d, 'LLL', locale='fr'))
205-
self.assertEqual('dimanche 28 août 2016 07:03', f.format(d, 'LLLL', locale='fr'))
203+
self.assertEqual(u'28 août 2016', f.format(d, 'LL', locale='fr'))
204+
self.assertEqual(u'28 août 2016 07:03', f.format(d, 'LLL', locale='fr'))
205+
self.assertEqual(u'dimanche 28 août 2016 07:03', f.format(d, 'LLLL', locale='fr'))
206206

207207
def test_escape(self):
208208
f = AlternativeFormatter()

tests/formatting_tests/test_classic_formatter.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ def test_format_with_locale(self):
2020
d = Pendulum(1975, 12, 25, 14, 15, 16, tzinfo='Europe/Paris')
2121
f = ClassicFormatter()
2222
self.assertEqual(
23-
'jeudi 25e jour de décembre 1975 02:15:16 +01:00',
23+
u'jeudi 25e jour de décembre 1975 02:15:16 +01:00',
2424
f.format(d, '%A %d%_t jour de %B %Y %I:%M:%S %p %_z', locale='fr')
2525
)
2626

@@ -46,8 +46,8 @@ def test_month(self):
4646
self.assertEqual('Aug', f.format(d, '%b'))
4747
self.assertEqual('August', f.format(d, '%B'))
4848

49-
self.assertEqual('août', f.format(d, '%b', locale='fr'))
50-
self.assertEqual('août', f.format(d, '%B', locale='fr'))
49+
self.assertEqual(u'août', f.format(d, '%b', locale='fr'))
50+
self.assertEqual(u'août', f.format(d, '%B', locale='fr'))
5151

5252
def test_strftime(self):
5353
f = ClassicFormatter()

tests/localization_tests/test_da.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,24 +43,24 @@ def diff_for_humans(self):
4343
self.assertEqual('2 uger siden', d.diff_for_humans())
4444

4545
d = Pendulum.now().subtract(months=1)
46-
self.assertEqual('1 måned siden', d.diff_for_humans())
46+
self.assertEqual(u'1 måned siden', d.diff_for_humans())
4747

4848
d = Pendulum.now().subtract(months=2)
49-
self.assertEqual('2 måneder siden', d.diff_for_humans())
49+
self.assertEqual(u'2 måneder siden', d.diff_for_humans())
5050

5151
d = Pendulum.now().subtract(years=1)
52-
self.assertEqual('1 år siden', d.diff_for_humans())
52+
self.assertEqual(u'1 år siden', d.diff_for_humans())
5353

5454
d = Pendulum.now().subtract(years=2)
55-
self.assertEqual('2 år siden', d.diff_for_humans())
55+
self.assertEqual(u'2 år siden', d.diff_for_humans())
5656

5757
d = Pendulum.now().add(seconds=1)
5858
self.assertEqual('om 1 sekund', d.diff_for_humans())
5959

6060
d = Pendulum.now().add(seconds=1)
6161
d2 = Pendulum.now()
6262
self.assertEqual('1 sekund efter', d.diff_for_humans(d2))
63-
self.assertEqual('1 sekund før', d2.diff_for_humans(d))
63+
self.assertEqual(u'1 sekund før', d2.diff_for_humans(d))
6464

6565
self.assertEqual('1 sekund', d.diff_for_humans(d2, True))
6666
self.assertEqual('2 sekunder', d2.diff_for_humans(d.add(seconds=1), True))

0 commit comments

Comments
 (0)