changeset 397:ff9a6a37eb72

The `format_timedelta` function now returns, for example, ?1 day? instead of ?0 days? if the granularity is `day` and the delta is less than a day but greater than zero.
author cmlenz
date Tue, 15 Jul 2008 16:02:17 +0000
parents 45a5b2266001
children c37bc86b4e3a
files ChangeLog babel/dates.py babel/tests/dates.py doc/dates.txt
diffstat 4 files changed, 29 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+Version 1.0
+http://svn.edgewall.org/repos/babel/tags/1.0.0/
+(???, from branches/stable/1.0.x)
+
+ * Added support for the locale plural rules defined by the CLDR.
+ * Added `format_timedelta` function to support localized formatting of
+   relative times with strings such as "2 days" or "1 month" (ticket #126).
+
+
 Version 0.9.3
 http://svn.edgewall.org/repos/babel/tags/0.9.3/
 (Jul 9 2008, from branches/stable/0.9.x)
--- a/babel/dates.py
+++ b/babel/dates.py
@@ -613,7 +613,7 @@
     
     >>> format_timedelta(timedelta(hours=3), granularity='day',
     ...                  locale='en_US')
-    u'0 days'
+    u'1 day'
 
     The threshold parameter can be used to determine at which value the
     presentation switches to the next higher unit. A higher threshold factor
@@ -643,6 +643,8 @@
     for unit, secs_per_unit in TIMEDELTA_UNITS:
         value = abs(seconds) / secs_per_unit
         if value >= threshold or unit == granularity:
+            if unit == granularity and value > 0:
+                value = max(1, value)
             value = int(round(value))
             plural_form = locale.plural_form(value)
             pattern = locale._data['unit_patterns'][unit][plural_form]
--- a/babel/tests/dates.py
+++ b/babel/tests/dates.py
@@ -238,6 +238,21 @@
                           "yyyy-MM-dd HH:mm", locale='en_US')
 
 
+class FormatTimedeltaTestCase(unittest.TestCase):
+
+    def test_zero_seconds(self):
+        string = dates.format_timedelta(timedelta(seconds=0), locale='en')
+        self.assertEqual('0 seconds', string)
+        string = dates.format_timedelta(timedelta(seconds=0),
+                                        granularity='hour', locale='en')
+        self.assertEqual('0 hours', string)
+
+    def test_small_value_with_granularity(self):
+        string = dates.format_timedelta(timedelta(seconds=42),
+                                        granularity='hour', locale='en')
+        self.assertEqual('1 hour', string)
+
+
 def suite():
     suite = unittest.TestSuite()
     suite.addTest(doctest.DocTestSuite(dates))
@@ -246,5 +261,6 @@
     suite.addTest(unittest.makeSuite(FormatTimeTestCase))
     return suite
 
+
 if __name__ == '__main__':
     unittest.main(defaultTest='suite')
--- a/doc/dates.txt
+++ b/doc/dates.txt
@@ -234,7 +234,7 @@
     >>> format_timedelta(delta, threshold=1.2, locale='en_US')
     u'6 days'
     >>> format_timedelta(delta, granularity='month', locale='en_US')
-    u'0 months'
+    u'1 month'
 
 
 Time-zone Support
Copyright (C) 2012-2017 Edgewall Software