Message.date refactored

This commit is contained in:
Sergey Lavrinenko 2015-03-14 17:42:01 +03:00
parent 0bec159b76
commit 9c2a17fe05
4 changed files with 55 additions and 29 deletions

View File

@ -1,8 +1,7 @@
# coding: utf-8
from __future__ import unicode_literals
import time
from email.utils import formatdate, getaddresses
from time import mktime
from email.utils import getaddresses
from dateutil.parser import parse as dateutil_parse
@ -10,7 +9,7 @@ from .compat import (string_types, is_callable, to_bytes)
from .utils import (SafeMIMEText, SafeMIMEMultipart, sanitize_address,
parse_name_and_email, load_email_charsets,
encode_header as encode_header_,
renderable)
renderable, format_date_header)
from .exc import BadHeaderError
from .backend import ObjectFactory, SMTPBackend
from .store import MemoryFileStore, BaseFile
@ -126,25 +125,21 @@ class BaseMessage(object):
def render(self, **kwargs):
self.render_data = kwargs
def set_date(self, value, reformat_date=True):
if isinstance(value, string_types) and reformat_date:
_d = dateutil_parse(value)
value = time.mktime(_d.timetuple())
value = formatdate(value, True)
def set_date(self, value):
self._date = value
def get_date(self):
if self._date is False:
v = self._date
if v is False:
return None
timeval = self._date
if timeval:
if is_callable(timeval):
timeval = timeval()
elif timeval is None:
timeval = formatdate(None, True)
return timeval
if is_callable(v):
v = v()
if not isinstance(v, string_types):
v = format_date_header(v)
return v
message_date = property(get_date, set_date)
date = property(get_date, set_date)
message_date = date
def message_id(self):
mid = self._message_id
@ -209,7 +204,7 @@ class MessageBuildMixin(object):
msg.policy = self.policy
msg.preamble = self.ROOT_PREAMBLE
self.set_header(msg, 'Date', self.message_date, encode=False)
self.set_header(msg, 'Date', self.date, encode=False)
self.set_header(msg, 'Message-ID', self.message_id(), encode=False)
if self._headers:

View File

@ -45,15 +45,24 @@ def test_date():
# default date is "current timestamp"
m = emails.Message()
assert dateutil_parse(m.message_date).replace(tzinfo=None) >= datetime.datetime.now() - datetime.timedelta(seconds=3)
assert dateutil_parse(m.date).replace(tzinfo=None) >= datetime.datetime.utcnow() - datetime.timedelta(seconds=3)
# check date as constant
m.message_date = '2015-01-01'
assert m.message_date.startswith('Thu, 01 Jan 2015 00:00:00')
m.date = '2015-01-01'
assert m.date == '2015-01-01'
assert m.message_date == m.date # message_date is legacy
# check date as func
m.message_date = lambda **kw: 'D'
assert m.message_date == 'D'
# check date as func with string result
m.date = lambda **kw: 'D'
assert m.date == 'D'
# check date as func with time result
m.date = lambda **kw: 1426339147.572459
assert 'Mar 2015' in m.date
# check date as func with datetime result
m.date = lambda **kw: datetime.datetime(2015, 1, 1)
assert m.date.startswith('Thu, 01 Jan 2015 00:00:00')
def test_after_build():

View File

@ -1,8 +1,10 @@
# encoding: utf-8
from __future__ import unicode_literals
import pytest
from emails.utils import (parse_name_and_email,
encode_header, decode_header, sanitize_address, fetch_url, MessageID)
import datetime
import time
from emails.utils import (parse_name_and_email, encode_header, decode_header, sanitize_address, fetch_url,
MessageID, format_date_header)
from emails.exc import HTTPLoaderError
def test_parse_name_and_email():
@ -58,3 +60,10 @@ def test_url_fix():
# Check url with unicode and spaces
r = fetch_url('http://lavr.github.io/python-emails/tests/url-fix/Пушкин А.С.jpg')
assert len(r.content) == 12910
def test_format_date():
current_year = str(datetime.datetime.now().year)
assert current_year in format_date_header(None)
assert current_year in format_date_header(datetime.datetime.now())
assert current_year in format_date_header(time.time())

View File

@ -2,6 +2,7 @@
from __future__ import unicode_literals
import os
import socket
from time import mktime
from datetime import datetime
from random import randrange
from functools import wraps
@ -11,7 +12,7 @@ from email import generator
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header, decode_header as decode_header_
from email.utils import formataddr, parseaddr
from email.utils import formataddr, parseaddr, formatdate
import requests
@ -217,4 +218,16 @@ def renderable(f):
else:
return r
return wrapper
return wrapper
def format_date_header(v, localtime=True):
if isinstance(v, datetime):
return formatdate(mktime(v.timetuple()), localtime)
elif isinstance(v, float):
# probably timestamp
return formatdate(v, localtime)
elif v is None:
return formatdate(None, localtime)
else:
return v