Message.date refactored
This commit is contained in:
parent
0bec159b76
commit
9c2a17fe05
|
@ -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:
|
||||
|
|
|
@ -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():
|
||||
|
|
|
@ -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())
|
||||
|
|
|
@ -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
|
Reference in New Issue