diff -r e4c99610e1f7 -r b38e888ee7e3 embedded/mx/DateTime/ARPA.py --- a/embedded/mx/DateTime/ARPA.py Tue Apr 28 15:38:06 2009 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,227 +0,0 @@ -""" This module provides a set of constructors and routines to convert - between DateTime[Delta] instances and ARPA representations of date - and time. The format is specified by RFC822 + RFC1123. - - Note: Timezones are only interpreted by ParseDateTimeGMT(). All - other constructors silently ignore the time zone information. - - Copyright (c) 1998-2000, Marc-Andre Lemburg; mailto:mal@lemburg.com - Copyright (c) 2000-2007, eGenix.com Software GmbH; mailto:info@egenix.com - See the documentation for further information on copyrights, - or contact the author. All Rights Reserved. - -""" -import DateTime,Timezone -import re,string - -# Grammar: RFC822 + RFC1123 + depreciated RFC850 -_litday = '(?PMon|Tue|Wed|Thu|Fri|Sat|Sun)[a-z]*' -_litmonth = '(?PJan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)'\ - '[a-z]*' -_date = ('(?:(?P\d?\d)(?: +' + _litmonth + - ' +|-(?P\d?\d)-)(?P(?:\d\d)?\d\d))') -_zone = Timezone.zone -_time = ('(?:(?P\d\d):(?P\d\d)' - '(?::(?P\d\d))?(?: +'+_zone+')?)') -# Timezone information is made optional because some mail apps -# forget to add it (most of these seem to be spamming engines, btw). -# It defaults to UTC. - -_arpadate = '(?:'+ _litday + ',? )? *' + _date -_arpadatetime = '(?:'+ _litday + ',? )? *' + _date + ' +' + _time - -# We are not strict about the extra characters: some applications -# add extra information to the date header field. Additional spaces -# between the fields and extra characters in the literal day -# and month fields are also silently ignored. - -arpadateRE = re.compile(_arpadate) -arpadatetimeRE = re.compile(_arpadatetime) - -# Translation tables -litdaytable = {'mon':0, 'tue':1, 'wed':2, 'thu':3, 'fri':4, 'sat':5, 'sun':6 } -litmonthtable = {'jan':1, 'feb':2, 'mar':3, 'apr':4, 'may':5, 'jun':6, - 'jul':7, 'aug':8, 'sep':9, 'oct':10, 'nov':11, 'dec':12 } -_days = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] -_months = [None, 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', - 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' ] - -def ParseDate(arpastring,parse_arpadate=arpadateRE.match, - - strip=string.strip,atoi=string.atoi,atof=string.atof, - lower=string.lower): - - """ParseDate(arpastring) - - Returns a DateTime instance reflecting the given ARPA - date. Only the date part is parsed, any time part will be - ignored. The instance's time is set to 0:00:00. - - """ - s = strip(arpastring) - date = parse_arpadate(s) - if not date: - raise ValueError,'wrong format' - litday,day,litmonth,month,year = date.groups() - if len(year) == 2: - year = DateTime.add_century(atoi(year)) - else: - year = atoi(year) - if litmonth: - litmonth = lower(litmonth) - try: - month = litmonthtable[litmonth] - except KeyError: - raise ValueError,'wrong month format' - else: - month = atoi(month) - day = atoi(day) - # litday and timezone are ignored - return DateTime.DateTime(year,month,day) - -def ParseDateTime(arpastring,parse_arpadatetime=arpadatetimeRE.match, - - strip=string.strip,atoi=string.atoi,atof=string.atof, - lower=string.lower): - - """ParseDateTime(arpastring) - - Returns a DateTime instance reflecting the given ARPA date assuming - it is local time (timezones are silently ignored). - """ - s = strip(arpastring) - date = parse_arpadatetime(s) - if not date: - raise ValueError,'wrong format or unknown time zone' - litday,day,litmonth,month,year,hour,minute,second,zone = date.groups() - if len(year) == 2: - year = DateTime.add_century(atoi(year)) - else: - year = atoi(year) - if litmonth: - litmonth = lower(litmonth) - try: - month = litmonthtable[litmonth] - except KeyError: - raise ValueError,'wrong month format' - else: - month = atoi(month) - day = atoi(day) - hour = atoi(hour) - minute = atoi(minute) - if second is None: - second = 0.0 - else: - second = atof(second) - # litday and timezone are ignored - return DateTime.DateTime(year,month,day,hour,minute,second) - -def ParseDateTimeGMT(arpastring,parse_arpadatetime=arpadatetimeRE.match, - - strip=string.strip,atoi=string.atoi,atof=string.atof, - lower=string.lower): - - """ParseDateTimeGMT(arpastring) - - Returns a DateTime instance reflecting the given ARPA date converting - it to UTC (timezones are honored). - """ - s = strip(arpastring) - date = parse_arpadatetime(s) - if not date: - raise ValueError,'wrong format or unknown time zone' - litday,day,litmonth,month,year,hour,minute,second,zone = date.groups() - if len(year) == 2: - year = DateTime.add_century(atoi(year)) - else: - year = atoi(year) - if litmonth: - litmonth = lower(litmonth) - try: - month = litmonthtable[litmonth] - except KeyError: - raise ValueError,'wrong month format' - else: - month = atoi(month) - day = atoi(day) - hour = atoi(hour) - minute = atoi(minute) - if second is None: - second = 0.0 - else: - second = atof(second) - offset = Timezone.utc_offset(zone) - # litday is ignored - return DateTime.DateTime(year,month,day,hour,minute,second) - offset - -# Alias -ParseDateTimeUTC = ParseDateTimeGMT - -def str(datetime,tz=None): - - """str(datetime,tz=DateTime.tz_offset(datetime)) - - Returns the datetime instance as ARPA date string. tz can be given - as DateTimeDelta instance providing the time zone difference from - datetime's zone to UTC. It defaults to - DateTime.tz_offset(datetime) which assumes local time. """ - - if tz is None: - tz = datetime.gmtoffset() - return '%s, %02i %s %04i %02i:%02i:%02i %+03i%02i' % ( - _days[datetime.day_of_week], datetime.day, - _months[datetime.month], datetime.year, - datetime.hour, datetime.minute, datetime.second, - tz.hour,tz.minute) - -def strGMT(datetime): - - """ strGMT(datetime) - - Returns the datetime instance as ARPA date string assuming it - is given in GMT. """ - - return '%s, %02i %s %04i %02i:%02i:%02i GMT' % ( - _days[datetime.day_of_week], datetime.day, - _months[datetime.month], datetime.year, - datetime.hour, datetime.minute, datetime.second) - -def strUTC(datetime): - - """ strUTC(datetime) - - Returns the datetime instance as ARPA date string assuming it - is given in UTC. """ - - return '%s, %02i %s %04i %02i:%02i:%02i UTC' % ( - _days[datetime.day_of_week], datetime.day, - _months[datetime.month], datetime.year, - datetime.hour, datetime.minute, datetime.second) - -def _test(): - import sys, os, rfc822 - file = os.path.join(os.environ['HOME'], 'nsmail/Inbox') - f = open(file, 'r') - while 1: - m = rfc822.Message(f) - if not m: - break - print 'From:', m.getaddr('from') - print 'To:', m.getaddrlist('to') - print 'Subject:', m.getheader('subject') - raw = m.getheader('date') - try: - date = ParseDateTimeUTC(raw) - print 'Date:',strUTC(date) - except ValueError,why: - print 'PROBLEMS:',repr(raw),'-->',why - raw_input('...hit return to continue') - print - # Netscape mail file - while 1: - line = f.readline() - if line[:6] == 'From -': - break - -if __name__ == '__main__': - _test()