Changeset 265:907c5153b355

Show
Ignore:
Timestamp:
19/07/11 13:29:30 (10 months ago)
Author:
Menno Smits <menno@…>
Branch:
default
Message:

Added normalise_times attribute (#96)

Allows caller to select whether datetimes returned by fetch are native
or aware.

Files:
6 modified

Legend:

Unmodified
Added
Removed
  • NEWS

    r264 r265  
    2727* interact.py can now read livetest.py INI files (#66) 
    2828* Added "debug" propety and setting of a log file (#90) 
     29* "normalise_times" attribute allows caller to select whether 
     30  datetimes returned by fetch() are native or not (#96) (Thanks Andrew 
     31  Scheller) 
    2932 
    3033Small Bug Fixes 
  • THANKS

    r233 r265  
    2525 
    2626Johannes Heckel 
    27      OAUTH and IDLE support.  
     27    OAUTH and IDLE support.  
     28 
     29Andrew Scheller 
     30    "normalise_times" support.      
    2831 
    2932Bug Reports 
  • imapclient/imapclient.py

    r258 r265  
    6767    ``False``). 
    6868 
     69    The *normalise_times* attribute specifies whether datetimes 
     70    returned by ``fetch()`` are normalised to the local system time 
     71    and include no timezone information (native), or are datetimes 
     72    that include timezone information (aware). By default 
     73    *normalise_times* is True (times are normalised to the local 
     74    system time). This attribute can be changed between ``fetch()`` 
     75    calls if required. 
     76 
    6977    The *debug* property can be used to enable debug logging. It can 
    7078    be set to an integer from 0 to 5 where 0 disables debug output and 
     
    95103        self.folder_encode = True 
    96104        self.log_file = sys.stderr 
     105        self.normalise_times = True 
    97106 
    98107        self._imap = self._create_IMAP4() 
     
    654663        self._checkok('fetch', typ, data) 
    655664        typ, data = self._imap._untagged_response(typ, data, 'FETCH') 
    656         return parse_fetch_response(data) 
     665        return parse_fetch_response(data, self.normalise_times) 
    657666 
    658667    def append(self, folder, msg, flags=(), msg_time=None): 
  • imapclient/response_parser.py

    r230 r265  
    5252 
    5353 
    54 def parse_fetch_response(text): 
     54def parse_fetch_response(text, normalise_times=True): 
    5555    """Pull apart IMAP FETCH responses as returned by imaplib. 
    5656 
     
    8989                msg_id = _int_or_error(value, 'invalid UID') 
    9090            elif word == 'INTERNALDATE': 
    91                 msg_data[word] = _convert_INTERNALDATE(value) 
     91                msg_data[word] = _convert_INTERNALDATE(value, normalise_times) 
    9292            elif word in ('BODY', 'BODYSTRUCTURE'): 
    9393                msg_data[word] = BodyData.create(value) 
     
    129129     
    130130 
    131 def _convert_INTERNALDATE(date_string): 
     131def _convert_INTERNALDATE(date_string, normalise_times=True): 
    132132    mo = imaplib.InternalDate.match('INTERNALDATE "%s"' % date_string) 
    133133    if not mo: 
     
    149149    dt = datetime(year, mon, day, hour, min, sec, 0, tz) 
    150150 
    151     # Normalise to host system's timezone 
    152     return dt.astimezone(FixedOffset.for_system()).replace(tzinfo=None) 
     151    if normalise_times: 
     152        # Normalise to host system's timezone 
     153        return dt.astimezone(FixedOffset.for_system()).replace(tzinfo=None) 
     154    return dt 
    153155 
    154156 
  • imapclient/test/test_IMAPClient.py

    r234 r265  
    66import socket 
    77import sys 
    8 import time 
    98from datetime import datetime 
    109from StringIO import StringIO 
     
    275274        self.assertIn('one', output) 
    276275        self.assertIn('two', output) 
    277          
    278  
     276 
     277class TestTimeNormalisation(IMAPClientTest): 
     278 
     279    def test_default(self): 
     280        self.assertTrue(self.client.normalise_times) 
     281 
     282    @patch('imapclient.imapclient.parse_fetch_response') 
     283    def test_pass_through(self, parse_fetch_response): 
     284        self.client._imap._command_complete.return_value = ('OK', sentinel.data) 
     285        self.client._imap._untagged_response.return_value = ('OK', sentinel.fetch_data) 
     286 
     287        def check(expected): 
     288            self.client.fetch(22, ['SOMETHING']) 
     289            parse_fetch_response.assert_called_with(sentinel.fetch_data, expected) 
     290 
     291        self.client.normalise_times = True 
     292        check(True) 
     293 
     294        self.client.normalise_times = False 
     295        check(False) 
    279296 
    280297if __name__ == '__main__': 
  • imapclient/test/test_response_parser.py

    r230 r265  
    286286                     
    287287 
    288     def test_INTERNALDATE(self): 
     288    def test_INTERNALDATE_normalised(self): 
    289289        def check(date_str, expected_dt): 
    290290            output = parse_fetch_response(['3 (INTERNALDATE "%s")' % date_str]) 
    291             self.assertEquals(output.keys(), [3]) 
    292             self.assertEquals(set(output[3].keys()), set(['INTERNALDATE', 'SEQ'])) 
    293291            actual_dt = output[3]['INTERNALDATE'] 
    294292            self.assert_(actual_dt.tzinfo is None)   # Returned date should be in local timezone 
    295293            expected_dt = datetime_to_native(expected_dt) 
    296             self.assert_(actual_dt == expected_dt, '%s != %s' % (actual_dt, expected_dt)) 
     294            self.assertEquals(actual_dt, expected_dt) 
    297295 
    298296        check(' 9-Feb-2007 17:08:08 -0430', 
     
    305303              datetime(2007, 12, 9, 17, 8, 8, 0, FixedOffset(0))) 
    306304 
     305    def test_INTERNALDATE(self): 
     306        def check(date_str, expected_dt): 
     307            output = parse_fetch_response(['3 (INTERNALDATE "%s")' % date_str], normalise_times=False) 
     308            actual_dt = output[3]['INTERNALDATE'] 
     309            self.assertEquals(actual_dt, expected_dt) 
     310 
     311        check(' 9-Feb-2007 17:08:08 -0430', 
     312              datetime(2007, 2, 9, 17, 8, 8, 0, FixedOffset(-4*60 - 30))) 
     313  
     314        check('12-Feb-2007 17:08:08 +0200', 
     315              datetime(2007, 2, 12, 17, 8, 8, 0, FixedOffset(2*60))) 
     316  
     317        check(' 9-Dec-2007 17:08:08 +0000', 
     318              datetime(2007, 12, 9, 17, 8, 8, 0, FixedOffset(0))) 
    307319 
    308320    def test_mixed_types(self):