[Checkins] SVN: z3ext.formatter/trunk/src/z3ext/formatter/ added humandatetime tests

Nikolay Kim fafhrd91 at gmail.com
Wed Sep 30 10:38:04 EDT 2009


Log message for revision 104652:
  added humandatetime tests

Changed:
  U   z3ext.formatter/trunk/src/z3ext/formatter/README.txt
  U   z3ext.formatter/trunk/src/z3ext/formatter/humandatetime.py
  U   z3ext.formatter/trunk/src/z3ext/formatter/resources/humandatetime.js
  U   z3ext.formatter/trunk/src/z3ext/formatter/tests.py

-=-
Modified: z3ext.formatter/trunk/src/z3ext/formatter/README.txt
===================================================================
--- z3ext.formatter/trunk/src/z3ext/formatter/README.txt	2009-09-30 14:10:55 UTC (rev 104651)
+++ z3ext.formatter/trunk/src/z3ext/formatter/README.txt	2009-09-30 14:38:04 UTC (rev 104652)
@@ -114,7 +114,7 @@
    </html>
 
 
-Now let's chane timezone to US/Pacific, we change only time zone 
+Now let's chane timezone to US/Pacific, we change only time zone
 not datetime value
 
    >>> configlet.timezone = 'US/Pacific'
@@ -280,8 +280,8 @@
 ================
 
 We should define formatter factory and formatter itself
-Let's implement formatter that accept string and currency name and 
-format as currency. Format of TALES expression whould be as 
+Let's implement formatter that accept string and currency name and
+format as currency. Format of TALES expression whould be as
 'formatter:<formatter name>,<formatter var1>,<formatter var2>,...:<path expression>'
 <formatter name> is name of adapter that adapts IHTTPRequest to IFormatterFactory
 also expression will pass <formatter var[1-...]> as args to factory.
@@ -332,3 +332,202 @@
    >>> print page.render(request)
    121.04 $
    121.04 Eur
+
+
+humanDatetime formatter
+-----------------------
+
+   >>> now = datetime.now(UTC)
+
+   >>> fpage = ZPTPage()
+   >>> fpage.pt_edit(u'''
+   ... <html>
+   ...   <body>
+   ...     <tal:block tal:content="structure formatter:humanDatetime:options/now" />
+   ...     <tal:block tal:content="structure formatter:humanDatetime,short:options/now" />
+   ...     <tal:block tal:content="structure formatter:humanDatetime,medium:options/now" />
+   ...     <tal:block tal:content="structure formatter:humanDatetime,full:options/now" />
+   ...   </body>
+   ... </html>''', 'text/html')
+
+Now datetime
+
+   >>> print fpage.render(request, now=now)
+   <html>
+      <body>
+        <span class="z3ext-formatter-humandatetime" value="...">0 second(s) ago</span>
+        <span class="z3ext-formatter-humandatetime" value="...">0 second(s) ago</span>
+        <span class="z3ext-formatter-humandatetime" value="...">0 second(s) ago</span>
+        <span class="z3ext-formatter-humandatetime" value="...">0 second(s) ago</span>
+      </body>
+    </html>
+
+   >>> today = now - timedelta(seconds=1)
+
+   >>> print fpage.render(request, now=today)
+   <html>
+      <body>
+        <span class="z3ext-formatter-humandatetime" value="...">1 second(s) ago</span>
+        <span class="z3ext-formatter-humandatetime" value="...">1 second(s) ago</span>
+        <span class="z3ext-formatter-humandatetime" value="...">1 second(s) ago</span>
+        <span class="z3ext-formatter-humandatetime" value="...">1 second(s) ago</span>
+      </body>
+    </html>
+
+   >>> today = now - timedelta(minutes=1)
+
+   >>> print fpage.render(request, now=today)
+   <html>
+      <body>
+        <span class="z3ext-formatter-humandatetime" value="...">1 minute(s) ago</span>
+        <span class="z3ext-formatter-humandatetime" value="...">1 minute(s) ago</span>
+        <span class="z3ext-formatter-humandatetime" value="...">1 minute(s) ago</span>
+        <span class="z3ext-formatter-humandatetime" value="...">1 minute(s) ago</span>
+      </body>
+    </html>
+
+   >>> today = now - timedelta(hours=1)
+
+   >>> print fpage.render(request, now=today)
+   <html>
+      <body>
+        <span class="z3ext-formatter-humandatetime" value="...">1 hour(s) ago</span>
+        <span class="z3ext-formatter-humandatetime" value="...">1 hour(s) ago</span>
+        <span class="z3ext-formatter-humandatetime" value="...">1 hour(s) ago</span>
+        <span class="z3ext-formatter-humandatetime" value="...">1 hour(s) ago</span>
+      </body>
+    </html>
+
+   >>> today = now - timedelta(days=1)
+
+   >>> print fpage.render(request, now=today)
+   <html>
+      <body>
+        <span class="z3ext-formatter-humandatetime" value="...">1 day(s) ago</span>
+        <span class="z3ext-formatter-humandatetime" value="...">1 day(s) ago</span>
+        <span class="z3ext-formatter-humandatetime" value="...">1 day(s) ago</span>
+        <span class="z3ext-formatter-humandatetime" value="...">1 day(s) ago</span>
+      </body>
+    </html>
+
+   >>> today = now - timedelta(days=7)
+
+   >>> print fpage.render(request, now=today)
+   <html>
+      <body>
+        <span class="z3ext-formatter-humandatetime" value="...">1 week(s) ago</span>
+        <span class="z3ext-formatter-humandatetime" value="...">1 week(s) ago</span>
+        <span class="z3ext-formatter-humandatetime" value="...">1 week(s) ago</span>
+        <span class="z3ext-formatter-humandatetime" value="...">1 week(s) ago</span>
+      </body>
+    </html>
+
+   >>> today = now - timedelta(days=30)
+
+   >>> print fpage.render(request, now=today)
+   <html>
+      <body>
+        <span class="z3ext-formatter-humandatetime" value="...">1 month(s) ago</span>
+        <span class="z3ext-formatter-humandatetime" value="...">1 month(s) ago</span>
+        <span class="z3ext-formatter-humandatetime" value="...">1 month(s) ago</span>
+        <span class="z3ext-formatter-humandatetime" value="...">1 month(s) ago</span>
+      </body>
+    </html>
+
+   >>> today = now - timedelta(days=367)
+
+   >>> print fpage.render(request, now=today)
+   <html>
+      <body>
+        <span class="z3ext-formatter-humandatetime" value="...">1 year(s) ago</span>
+        <span class="z3ext-formatter-humandatetime" value="...">1 year(s) ago</span>
+        <span class="z3ext-formatter-humandatetime" value="...">1 year(s) ago</span>
+        <span class="z3ext-formatter-humandatetime" value="...">1 year(s) ago</span>
+      </body>
+    </html>
+
+Tomorrow's datetime
+
+   >>> today = now + timedelta(seconds=1)
+
+   >>> print fpage.render(request, now=today)
+   <html>
+      <body>
+        <span class="z3ext-formatter-humandatetime" value="...">in 1 second(s)</span>
+        <span class="z3ext-formatter-humandatetime" value="...">in 1 second(s)</span>
+        <span class="z3ext-formatter-humandatetime" value="...">in 1 second(s)</span>
+        <span class="z3ext-formatter-humandatetime" value="...">in 1 second(s)</span>
+      </body>
+    </html>
+
+   >>> today = now + timedelta(minutes=1)
+
+   >>> print fpage.render(request, now=today)
+   <html>
+      <body>
+        <span class="z3ext-formatter-humandatetime" value="...">in 1 minute(s)</span>
+        <span class="z3ext-formatter-humandatetime" value="...">in 1 minute(s)</span>
+        <span class="z3ext-formatter-humandatetime" value="...">in 1 minute(s)</span>
+        <span class="z3ext-formatter-humandatetime" value="...">in 1 minute(s)</span>
+      </body>
+    </html>
+
+   >>> today = now + timedelta(hours=1)
+
+   >>> print fpage.render(request, now=today)
+   <html>
+      <body>
+        <span class="z3ext-formatter-humandatetime" value="...">in 1 hour(s)</span>
+        <span class="z3ext-formatter-humandatetime" value="...">in 1 hour(s)</span>
+        <span class="z3ext-formatter-humandatetime" value="...">in 1 hour(s)</span>
+        <span class="z3ext-formatter-humandatetime" value="...">in 1 hour(s)</span>
+      </body>
+    </html>
+
+   >>> today = now + timedelta(days=1)
+
+   >>> print fpage.render(request, now=today)
+   <html>
+      <body>
+        <span class="z3ext-formatter-humandatetime" value="...">in 1 day(s)</span>
+        <span class="z3ext-formatter-humandatetime" value="...">in 1 day(s)</span>
+        <span class="z3ext-formatter-humandatetime" value="...">in 1 day(s)</span>
+        <span class="z3ext-formatter-humandatetime" value="...">in 1 day(s)</span>
+      </body>
+    </html>
+
+  >>> today = now + timedelta(days=7)
+
+  >>> print fpage.render(request, now=today)
+   <html>
+      <body>
+        <span class="z3ext-formatter-humandatetime" value="...">in 1 week(s)</span>
+        <span class="z3ext-formatter-humandatetime" value="...">in 1 week(s)</span>
+        <span class="z3ext-formatter-humandatetime" value="...">in 1 week(s)</span>
+        <span class="z3ext-formatter-humandatetime" value="...">in 1 week(s)</span>
+      </body>
+    </html>
+
+  >>> today = now + timedelta(days=30)
+
+  >>> print fpage.render(request, now=today)
+   <html>
+      <body>
+        <span class="z3ext-formatter-humandatetime" value="...">in 1 month(s)</span>
+        <span class="z3ext-formatter-humandatetime" value="...">in 1 month(s)</span>
+        <span class="z3ext-formatter-humandatetime" value="...">in 1 month(s)</span>
+        <span class="z3ext-formatter-humandatetime" value="...">in 1 month(s)</span>
+      </body>
+    </html>
+
+  >>> today = now + timedelta(days=365)
+
+  >>> print fpage.render(request, now=today)
+   <html>
+      <body>
+        <span class="z3ext-formatter-humandatetime" value="...">in 1 year(s)</span>
+        <span class="z3ext-formatter-humandatetime" value="...">in 1 year(s)</span>
+        <span class="z3ext-formatter-humandatetime" value="...">in 1 year(s)</span>
+        <span class="z3ext-formatter-humandatetime" value="...">in 1 year(s)</span>
+      </body>
+    </html>
\ No newline at end of file

Modified: z3ext.formatter/trunk/src/z3ext/formatter/humandatetime.py
===================================================================
--- z3ext.formatter/trunk/src/z3ext/formatter/humandatetime.py	2009-09-30 14:10:55 UTC (rev 104651)
+++ z3ext.formatter/trunk/src/z3ext/formatter/humandatetime.py	2009-09-30 14:38:04 UTC (rev 104652)
@@ -15,63 +15,78 @@
 
 $Id$
 """
-from pytz import utc, timezone
-from datetime import datetime
+from pytz import utc, timezone, FixedOffset
+from datetime import datetime, timedelta
 from zope import interface, component
 from zope.i18n import translate
 from zope.component import getUtility
 from zope.publisher.interfaces.http import IHTTPRequest
 
-from interfaces import IFormatter, IFormatterFactory, IFormatterConfiglet
+from interfaces import IFormatter, IFormatterFactory, IFormatterConfiglet, _
 
 
 class HumanDatetimeFormatter(object):
     interface.implements(IFormatter)
 
+    messages = {'past': {'year': u'${value} year(s) ago',
+                         'month': u'${value} month(s) ago',
+                         'week': u'${value} week(s) ago',
+                         'day': u'${value} day(s) ago',
+                         'hour': u'${value} hour(s) ago',
+                         'minute': u'${value} minute(s) ago',
+                         'second': u'${value} second(s) ago',
+                         },
+                'future': {'year': u'in ${value} year(s)',
+                         'month': u'in ${value} month(s)',
+                         'week': u'in ${value} week(s)',
+                         'day': u'in ${value} day(s)',
+                         'hour': u'in ${value} hour(s)',
+                         'minute': u'in ${value} minute(s)',
+                         'second': u'in ${value} second(s)',
+                         }}
+
     def __init__(self, request, *args):
         self.request = request
 
     def format(self, value):
-        configlet = getUtility(IFormatterConfiglet)
-        tz = timezone(configlet.timezone)
-
         if value.tzinfo is None:
-            value = datetime(value.year, value.month, value.day, value.hour,
-                             value.minute, value.second, value.microsecond, tz)
+            value = utc.localize(datetime)
+        now = datetime.now(utc)
+        delta = now - value.astimezone(utc)
+        key = 'past'
+        if delta < timedelta():
+            delta = - delta + timedelta(seconds=1) #due to python implementation
+            key = 'future'
+        offset = (value.tzinfo.utcoffset(value).seconds/600)*10
+        value = FixedOffset(offset).normalize(value)
 
-        value = value.astimezone(tz)
-        delta = datetime.now(utc) - value.astimezone(utc)
-
         years, months, weeks, hours, minutes = (
             delta.days/365, delta.days/30, delta.days/7,
             delta.seconds/3600, delta.seconds/60)
         formatted = None
         if years > 0:
-            formatted = translate(
-                u'${value} year(s) ago', 'z3ext.formatter',
-                mapping={'value': years})
-
-        if months > 0:
-            formatted = translate(u'${value} month(s) ago', 'z3ext.formatter',
+            formatted = translate(self.messages[key]['year'], 'z3ext.formatter',
+                             mapping={'value': years})
+        elif months > 0:
+            formatted = translate(self.messages[key]['month'],'z3ext.formatter',
                              mapping={'value': months})
         elif weeks > 0:
-            formatted = translate(u'${value} week(s) ago', 'z3ext.formatter',
+            formatted = translate(self.messages[key]['week'], 'z3ext.formatter',
                              mapping={'value': weeks})
         elif delta.days > 0:
-            formatted = translate(u'${value} day(s) ago', 'z3ext.formatter',
+            formatted = translate(self.messages[key]['day'], 'z3ext.formatter',
                              mapping={'value': delta.days})
         elif hours > 0:
-            formatted = translate(u'${value} hour(s) ago', 'z3ext.formatter',
+            formatted = translate(self.messages[key]['hour'], 'z3ext.formatter',
                              mapping={'value': hours})
         elif minutes > 0:
-            formatted = translate(u'${value} minute(s) ago', 'z3ext.formatter',
+            formatted = translate(self.messages[key]['minute'], 'z3ext.formatter',
                              mapping={'value': minutes})
         else:
-            formatted = translate(u'${value} second(s) ago', 'z3ext.formatter',
+            formatted = translate(self.messages[key]['second'], 'z3ext.formatter',
                          mapping={'value': delta.seconds})
-
         return """<span class="z3ext-formatter-humandatetime" value="%s">%s</span>""" \
-                % (value.strftime('%Y %B %d %H:%M:%S %Z'), formatted)
+                % (value.strftime('%Y %B %d %H:%M:%S %z'), formatted)
 
 
 class HumanDatetimeFormatterFactory(object):

Modified: z3ext.formatter/trunk/src/z3ext/formatter/resources/humandatetime.js
===================================================================
--- z3ext.formatter/trunk/src/z3ext/formatter/resources/humandatetime.js	2009-09-30 14:10:55 UTC (rev 104651)
+++ z3ext.formatter/trunk/src/z3ext/formatter/resources/humandatetime.js	2009-09-30 14:38:04 UTC (rev 104652)
@@ -1,21 +1,34 @@
-var my_dictionary = {
-    'year(s) ago'  : 'year(s) ago',
-    'month(s) ago'  : 'month(s) ago',
-    'weeks(s) ago': 'weeks(s) ago',
-    'days(s) ago' : 'days(s) ago',
-    'hours(s) ago' : 'hours(s) ago',
-    'minutes(s) ago' : 'minutes(s) ago',
-    'second(s) ago' : 'second(s) ago'
+var past_dictionary = {
+    '%s year(s) ago'  : '%s year(s) ago',
+    '%s month(s) ago'  : '%s month(s) ago',
+    '%s week(s) ago': '%s week(s) ago',
+    '%s day(s) ago' : '%s day(s) ago',
+    '%s hour(s) ago' : '%s hour(s) ago',
+    '%s minute(s) ago' : '%s minute(s) ago',
+    '%s second(s) ago' : '%s second(s) ago'
 };
 
-$.i18n.setDictionary(my_dictionary);
+var future_dictionary = {
+        '%s year(s) ago'  : '%s year(s) ago',
+        '%s month(s) ago'  : '%s month(s) ago',
+        '%s week(s) ago': '%s week(s) ago',
+        '%s day(s) ago' : '%s day(s) ago',
+        '%s hour(s) ago' : '%s hour(s) ago',
+        '%s minute(s) ago' : '%s minute(s) ago',
+        '%s second(s) ago' : '%s second(s) ago'
+    };
 
 function setFormatter(el)
 {
-    var time = new Date()
+    var time = new Date();
     time.setTime(Date.parse(el.attr('value')));
     var new_time = new Date();
     delta = new_time-time;
+    $.i18n.setDictionary(past_dictionary);
+    if (delta < 0) {
+        delta = Math.abs(delta);
+        $.i18n.setDictionary(future_dictionary)
+    }
     years = Math.floor(delta/(365*24*60*60*1000.0));
     months = Math.floor(delta/(30*24*60*60*1000.0));
     weeks = Math.floor(delta/(7*24*60*60*1000.0));
@@ -25,19 +38,19 @@
     seconds = Math.floor(delta/(1000.0));
     var res;
     if (years)
-        res = years + ' ' +$.i18n._('year(s) ago')
+        res = $.i18n._('%s year(s) ago', [years])
     else if (months)
-        res = months + ' ' +$.i18n._('month(s) ago')
+        res = $.i18n._('%s month(s) ago', [months])
     else if (weeks)
-        res = weeks + ' ' +$.i18n._('weeks(s) ago')
+        res = $.i18n._('%s week(s) ago', [weeks])
     else if (days)
-        res = days + ' ' +$.i18n._('days(s) ago')
+        res = $.i18n._('%s day(s) ago', [days])
     else if (hours)
-        res = hours + ' ' +$.i18n._('hours(s) ago')
+        res = $.i18n._('%s hour(s) ago', [hours])
     else if (minutes)
-        res = minutes + ' ' +$.i18n._('minutes(s) ago')
+        res = $.i18n._('%s minute(s) ago', [minutes])
     else
-        res = seconds + ' ' +$.i18n._('second(s) ago')
+        res = $.i18n._('%s second(s) ago', [seconds])
     el.text(res);
     el.attr('processed', 'true')
 }
@@ -52,43 +65,4 @@
             setFormatter(el);
         }
     }
-});
-
-/*
-d1 = datetime.now(utc)
-d2 = value.astimezone(utc)
-
-delta = d1 - d2
-
-years, months, weeks, hours, minutes = (
-    delta.days/365, delta.days/30, delta.days/7,
-    delta.seconds/3600, delta.seconds/60)
-
-if years > 0:
-    return translate(
-        u'${value} year(s) ago', 'z3ext.formatter',
-        mapping={'value': years})
-
-if months > 0:
-    return translate(u'${value} month(s) ago', 'z3ext.formatter',
-                     mapping={'value': months})
-
-if weeks > 0:
-    return translate(u'${value} week(s) ago', 'z3ext.formatter',
-                     mapping={'value': weeks})
-
-if delta.days > 0:
-    return translate(u'${value} day(s) ago', 'z3ext.formatter',
-                     mapping={'value': delta.days})
-
-if hours > 0:
-    return translate(u'${value} hour(s) ago', 'z3ext.formatter',
-                     mapping={'value': hours})
-
-if minutes > 0:
-    return translate(u'${value} minute(s) ago', 'z3ext.formatter',
-                     mapping={'value': minutes})
-
-return translate(u'${value} second(s) ago', 'z3ext.formatter',
-                 mapping={'value': delta.seconds})
-*/
\ No newline at end of file
+});
\ No newline at end of file

Modified: z3ext.formatter/trunk/src/z3ext/formatter/tests.py
===================================================================
--- z3ext.formatter/trunk/src/z3ext/formatter/tests.py	2009-09-30 14:10:55 UTC (rev 104651)
+++ z3ext.formatter/trunk/src/z3ext/formatter/tests.py	2009-09-30 14:38:04 UTC (rev 104652)
@@ -30,7 +30,7 @@
 from z3ext.controlpanel.testing import setUpControlPanel
 
 from z3ext.formatter import \
-    dformatter, dtformatter, fancydatetime, timeformatter
+    dformatter, dtformatter, fancydatetime, timeformatter, humandatetime
 from z3ext.formatter.expression import FormatterExpression
 
 
@@ -54,6 +54,8 @@
     provideAdapter(dtformatter.DatetimeFormatterFactory, name='dateTime')
     provideAdapter(
         fancydatetime.FancyDatetimeFormatterFactory, name='fancyDatetime')
+    provideAdapter(
+        humandatetime.HumanDatetimeFormatterFactory, name='humanDatetime')
     provideAdapter(timeformatter.TimeFormatterFactory, name='time')
 
 



More information about the checkins mailing list