| Index: third_party/logilab/common/date.py
 | 
| ===================================================================
 | 
| --- third_party/logilab/common/date.py	(revision 293047)
 | 
| +++ third_party/logilab/common/date.py	(working copy)
 | 
| @@ -1,4 +1,4 @@
 | 
| -# copyright 2003-2011 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
 | 
| +# copyright 2003-2012 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
 | 
|  # contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
 | 
|  #
 | 
|  # This file is part of logilab-common.
 | 
| @@ -22,11 +22,14 @@
 | 
|  
 | 
|  import math
 | 
|  import re
 | 
| -from locale import getpreferredencoding
 | 
| +import sys
 | 
| +from locale import getlocale, LC_TIME
 | 
|  from datetime import date, time, datetime, timedelta
 | 
|  from time import strptime as time_strptime
 | 
|  from calendar import monthrange, timegm
 | 
|  
 | 
| +from six.moves import range
 | 
| +
 | 
|  try:
 | 
|      from mx.DateTime import RelativeDateTime, Date, DateTimeType
 | 
|  except ImportError:
 | 
| @@ -130,7 +133,7 @@
 | 
|      end = datefactory(end.year, end.month, end.day, end)
 | 
|      holidays = [str2date(datestr, begin)
 | 
|                  for datestr in FRENCH_MOBILE_HOLIDAYS.values()]
 | 
| -    for year in xrange(begin.year, end.year+1):
 | 
| +    for year in range(begin.year, end.year+1):
 | 
|          for datestr in FRENCH_FIXED_HOLIDAYS.values():
 | 
|              date = str2date(datestr % year, begin)
 | 
|              if date not in holidays:
 | 
| @@ -187,8 +190,8 @@
 | 
|      end = todate(end)
 | 
|      if incmonth:
 | 
|          while begin < end:
 | 
| +            yield begin
 | 
|              begin = next_month(begin, incmonth)
 | 
| -            yield begin
 | 
|      else:
 | 
|          incr = get_step(begin, incday or 1)
 | 
|          while begin < end:
 | 
| @@ -279,29 +282,34 @@
 | 
|  
 | 
|  def ustrftime(somedate, fmt='%Y-%m-%d'):
 | 
|      """like strftime, but returns a unicode string instead of an encoded
 | 
| -    string which' may be problematic with localized date.
 | 
| -
 | 
| -    encoding is guessed by locale.getpreferredencoding()
 | 
| +    string which may be problematic with localized date.
 | 
|      """
 | 
| -    encoding = getpreferredencoding(do_setlocale=False) or 'UTF-8'
 | 
| -    try:
 | 
| -        return unicode(somedate.strftime(str(fmt)), encoding)
 | 
| -    except ValueError, exc:
 | 
| -        if somedate.year >= 1900:
 | 
| -            raise
 | 
| -        # datetime is not happy with dates before 1900
 | 
| -        # we try to work around this, assuming a simple
 | 
| -        # format string
 | 
| -        fields = {'Y': somedate.year,
 | 
| -                  'm': somedate.month,
 | 
| -                  'd': somedate.day,
 | 
| -                  }
 | 
| -        if isinstance(somedate, datetime):
 | 
| -            fields.update({'H': somedate.hour,
 | 
| -                           'M': somedate.minute,
 | 
| -                           'S': somedate.second})
 | 
| -        fmt = re.sub('%([YmdHMS])', r'%(\1)02d', fmt)
 | 
| -        return unicode(fmt) % fields
 | 
| +    if sys.version_info >= (3, 3):
 | 
| +        # datetime.date.strftime() supports dates since year 1 in Python >=3.3.
 | 
| +        return somedate.strftime(fmt)
 | 
| +    else:
 | 
| +        try:
 | 
| +            if sys.version_info < (3, 0):
 | 
| +                encoding = getlocale(LC_TIME)[1] or 'ascii'
 | 
| +                return unicode(somedate.strftime(str(fmt)), encoding)
 | 
| +            else:
 | 
| +                return somedate.strftime(fmt)
 | 
| +        except ValueError:
 | 
| +            if somedate.year >= 1900:
 | 
| +                raise
 | 
| +            # datetime is not happy with dates before 1900
 | 
| +            # we try to work around this, assuming a simple
 | 
| +            # format string
 | 
| +            fields = {'Y': somedate.year,
 | 
| +                      'm': somedate.month,
 | 
| +                      'd': somedate.day,
 | 
| +                      }
 | 
| +            if isinstance(somedate, datetime):
 | 
| +                fields.update({'H': somedate.hour,
 | 
| +                               'M': somedate.minute,
 | 
| +                               'S': somedate.second})
 | 
| +            fmt = re.sub('%([YmdHMS])', r'%(\1)02d', fmt)
 | 
| +            return unicode(fmt) % fields
 | 
|  
 | 
|  def utcdatetime(dt):
 | 
|      if dt.tzinfo is None:
 | 
| 
 |