From 03dd15d485ad89715780ecd58e8189e39c876770 Mon Sep 17 00:00:00 2001 From: medmunds Date: Fri, 11 Sep 2020 12:36:38 -0700 Subject: [PATCH] Cleanup: add reprs for Attachment, EmailAddress --- anymail/utils.py | 16 ++++++++++++++++ tests/test_utils.py | 12 ++++++++++++ 2 files changed, 28 insertions(+) diff --git a/anymail/utils.py b/anymail/utils.py index 403b406..ebe50e5 100644 --- a/anymail/utils.py +++ b/anymail/utils.py @@ -229,6 +229,10 @@ class EmailAddress: self.username = addr_spec self.domain = '' + def __repr__(self): + return "EmailAddress({display_name!r}, {addr_spec!r})".format( + display_name=self.display_name, addr_spec=self.addr_spec) + @property def address(self): if self._address is None: @@ -309,6 +313,18 @@ class Attachment: if self.content_type is None: self.content_type = self.mimetype + def __repr__(self): + details = [ + self.mimetype, + "len={length}".format(length=len(self.content)), + ] + if self.name: + details.append("name={name!r}".format(name=self.name)) + if self.inline: + details.insert(0, "inline") + details.append("content_id={content_id!r}".format(content_id=self.content_id)) + return "Attachment<{details}>".format(details=", ".join(details)) + @property def b64content(self): """Content encoded as a base64 ascii string""" diff --git a/tests/test_utils.py b/tests/test_utils.py index 161a7fb..aabf9b4 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -173,6 +173,10 @@ class ParseAddressListTests(SimpleTestCase): with self.assertRaisesMessage(ValueError, "cannot contain newlines"): _ = EmailAddress(name, addr) + def test_email_address_repr(self): + self.assertEqual("EmailAddress('Name', 'addr@example.com')", + repr(EmailAddress('Name', 'addr@example.com'))) + class NormalizedAttachmentTests(SimpleTestCase): """Test utils.Attachment""" @@ -188,6 +192,7 @@ class NormalizedAttachmentTests(SimpleTestCase): self.assertFalse(att.inline) self.assertIsNone(att.content_id) self.assertEqual(att.cid, "") + self.assertEqual(repr(att), "Attachment") def test_content_disposition_inline(self): image = MIMEImage(b";-)", "x-emoticon") @@ -198,11 +203,14 @@ class NormalizedAttachmentTests(SimpleTestCase): self.assertTrue(att.inline) # even without the Content-ID self.assertIsNone(att.content_id) self.assertEqual(att.cid, "") + self.assertEqual(repr(att), "Attachment") image["Content-ID"] = "" att = Attachment(image, "ascii") self.assertEqual(att.content_id, "") self.assertEqual(att.cid, "abc123@example.net") + self.assertEqual(repr(att), + "Attachment") def test_content_id_implies_inline(self): """A MIME object with a Content-ID should be assumed to be inline""" @@ -211,17 +219,21 @@ class NormalizedAttachmentTests(SimpleTestCase): att = Attachment(image, "ascii") self.assertTrue(att.inline) self.assertEqual(att.content_id, "") + self.assertEqual(repr(att), + "Attachment") # ... but not if explicit Content-Disposition says otherwise image["Content-Disposition"] = "attachment" att = Attachment(image, "ascii") self.assertFalse(att.inline) self.assertIsNone(att.content_id) # ignored for non-inline Attachment + self.assertEqual(repr(att), "Attachment") def test_content_type(self): att = Attachment(MIMEText("text", "plain", "iso8859-1"), "ascii") self.assertEqual(att.mimetype, "text/plain") self.assertEqual(att.content_type, 'text/plain; charset="iso8859-1"') + self.assertEqual(repr(att), "Attachment") class LazyCoercionTests(SimpleTestCase):