[Patchew-devel] [PATCH 3/3] Text to json converter for mbox

Shubham Jain posted 3 patches 6 years, 4 months ago
[Patchew-devel] [PATCH 3/3] Text to json converter for mbox
Posted by Shubham Jain 6 years, 4 months ago
- Mbox would now return a dictionary object which would help REST API deserialize easily into model object.
- Added test for text to json converter.

For recepients and sender couldn't use AddressSerializer as api.rest calls models which call back mbox. Possible soulution to replace to_representation in AddressSerializer with add_tuple_to_dic to remove code redundancy?
---
 mbox.py            |  18 ++++++++++
 tests/test_mbox.py | 102 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 120 insertions(+)

diff --git a/mbox.py b/mbox.py
index fe108f3..1296078 100644
--- a/mbox.py
+++ b/mbox.py
@@ -13,6 +13,7 @@ import email.utils
 import email.header
 import datetime
 import re
+from rest_framework.fields import DateTimeField
 
 def _parse_header(header):
     r = ''
@@ -34,6 +35,11 @@ def _addr_fmt_text(name, addr):
     else:
         return addr
 
+def addr_tuple_to_dic(obj):
+        if obj[0] != obj[1]:
+            return {"name": obj[0], "address": obj[1]}
+        else:
+            return {"address": obj[1]}
 
 class MboxMessage(object):
     """ Helper class to process mbox """
@@ -269,3 +275,15 @@ class MboxMessage(object):
         if c == 0:
             return True
         return False
+
+    def get_json(self):
+        """Return the JSON format of the mbox """
+        msg = {}
+        msg['message_id'] = self.get_message_id()
+        msg['in_reply_to'] = self.get_in_reply_to() or ""
+        msg['date'] = DateTimeField().to_representation(self.get_date())
+        msg['subject'] = self.get_subject()
+        msg['sender'] = addr_tuple_to_dic(self.get_from())
+        msg['recipients'] = [addr_tuple_to_dic(x) for x in (self.get_to() + self.get_cc())]
+        msg['mbox'] = self.get_mbox()
+        return msg
\ No newline at end of file
diff --git a/tests/test_mbox.py b/tests/test_mbox.py
index 8493df7..7a21d4a 100755
--- a/tests/test_mbox.py
+++ b/tests/test_mbox.py
@@ -52,5 +52,107 @@ Virtualization:  qemu.org | libvirt.org
             msg = mbox.MboxMessage(f.read())
         self.assertTrue(msg.is_patch())
 
+    def test_get_json(self):
+        expected = {'message_id': '20160628014747.20971-1-famz@redhat.com',
+                    'in_reply_to': '',
+                    'date': '2016-06-28T01:47:47',
+                    'subject': '[Qemu-devel] [PATCH] quorum: Only compile when supported',
+                    'sender': {'name': 'Fam Zheng', 'address': 'famz@redhat.com'},
+                    'recipients': [{'address': 'qemu-devel@nongnu.org'},
+                                   {'name': 'Kevin Wolf', 'address': 'kwolf@redhat.com'},
+                                   {'name': 'Alberto Garcia', 'address': 'berto@igalia.com'},
+                                   {'address': 'qemu-block@nongnu.org'},
+                                   {'name': 'Max Reitz', 'address': 'mreitz@redhat.com'}],
+                    'mbox': 'Delivered-To: importer@patchew.org\nReceived-SPF: '
+                            'Pass (zoho.com: domain of qemu-devel-bounces@nongnu.org '
+                            'designates 208.118.235.17 as permitted sender )  client-ip: '
+                            '208.118.235.17\nReceived-SPF: pass (zoho.com: domain of '
+                            'gnu.org designates 208.118.235.17 as permitted sender) '
+                            'client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+'
+                            'importer=patchew.org@nongnu.org; helo=lists.gnu.org;\n'
+                            'Return-Path: <qemu-devel-bounces+importer=patchew.org@nongnu.org>'
+                            '\nReceived: from lists.gnu.org (lists.gnu.org [208.118.235.17]) '
+                            'by mx.zohomail.com\n\twith SMTPS id 1467078971424862.8927889595075;'
+                            ' Mon, 27 Jun 2016 18:56:11 -0700 (PDT)\nReceived: from localhost '
+                            '([::1]:33689 helo=lists.gnu.org)\n\tby lists.gnu.org with esmtp '
+                            '(Exim 4.71)\n\t(envelope-from <qemu-devel-bounces+importer='
+                            'patchew.org@nongnu.org>)\n\tid 1bHi94-0006LP-Ok\n\tfor '
+                            'importer@patchew.org; Mon, 27 Jun 2016 21:48:58 -0400\nReceived: '
+                            'from eggs.gnu.org ([2001:4830:134:3::10]:53270)\n\tby lists.gnu.org'
+                            ' with esmtp (Exim 4.71)\n\t(envelope-from <famz@redhat.com>) id '
+                            '1bHi8E-0002Lm-KR\n\tfor qemu-devel@nongnu.org; Mon, 27 Jun 2016 '
+                            '21:48:07 -0400\nReceived: from Debian-exim by eggs.gnu.org with '
+                            'spam-scanned (Exim 4.71)\n\t(envelope-from <famz@redhat.com>) '
+                            'id 1bHi8D-0008T4-N7\n\tfor qemu-devel@nongnu.org; Mon, 27 Jun '
+                            '2016 21:48:06 -0400\nReceived: from mx1.redhat.com '
+                            '([209.132.183.28]:47972)\n\tby eggs.gnu.org with esmtp '
+                            '(Exim 4.71)\n\t(envelope-from <famz@redhat.com>)\n\tid '
+                            '1bHi86-0008SN-IZ; Mon, 27 Jun 2016 21:47:58 -0400\nReceived: '
+                            'from int-mx10.intmail.prod.int.phx2.redhat.com\n\t'
+                            '(int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23])\n\t'
+                            '(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 '
+                            '(256/256 bits))\n\t(No client certificate requested)\n\tby '
+                            'mx1.redhat.com (Postfix) with ESMTPS id BDB007F088;\n\tTue, '
+                            '28 Jun 2016 01:47:57 +0000 (UTC)\nReceived: '
+                            'from ad.usersys.redhat.com (dhcp-15-133.nay.redhat.com\n\t'
+                            '[10.66.15.133])\n\tby int-mx10.intmail.prod.int.phx2.redhat.com'
+                            ' (8.14.4/8.14.4) with ESMTP\n\tid u5S1lssT024908; Mon, 27 Jun '
+                            '2016 21:47:55 -0400\nFrom: Fam Zheng <famz@redhat.com>\nTo: '
+                            'qemu-devel@nongnu.org\nDate: Tue, 28 Jun 2016 09:47:47 '
+                            '+0800\nMessage-Id: <20160628014747.20971-1-famz@redhat.com>\n'
+                            'X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23\nX-Greylist: '
+                            'Sender IP whitelisted, not delayed by milter-greylist-4.5.16\n\t'
+                            '(mx1.redhat.com [10.5.110.26]);\n\tTue, 28 Jun 2016 01:47:57 '
+                            '+0000 (UTC)\nX-detected-operating-system: by eggs.gnu.org: '
+                            'GNU/Linux 2.2.x-3.x [generic]\nX-Received-From: 209.132.183.28\n'
+                            'Subject: [Qemu-devel] [PATCH] quorum: Only compile when supported\n'
+                            'X-BeenThere: qemu-devel@nongnu.org\nX-Mailman-Version: 2.1.21\n'
+                            'Precedence: list\nList-Id: <qemu-devel.nongnu.org>\nList-Unsubscribe:'
+                            ' <https://lists.nongnu.org/mailman/options/qemu-devel>,\n\t'
+                            '<mailto:qemu-devel-request@nongnu.org?subject=unsubscribe>\n'
+                            'List-Archive: <http://lists.nongnu.org/archive/html/qemu-devel/>\n'
+                            'List-Post: <mailto:qemu-devel@nongnu.org>\nList-Help: '
+                            '<mailto:qemu-devel-request@nongnu.org?subject=help>\nList-Subscribe:'
+                            ' <https://lists.nongnu.org/mailman/listinfo/qemu-devel>,\n\t'
+                            '<mailto:qemu-devel-request@nongnu.org?subject=subscribe>\nCc:'
+                            ' Kevin Wolf <kwolf@redhat.com>, Alberto Garcia <berto@igalia.com>,'
+                            '\n\tqemu-block@nongnu.org, Max Reitz <mreitz@redhat.com>\nErrors-To:'
+                            ' qemu-devel-bounces+importer=patchew.org@nongnu.org\nSender: '
+                            '"Qemu-devel" <qemu-devel-bounces+importer=patchew.org@nongnu.org>\n'
+                            'X-ZohoMail-Owner: <20160628014747.20971-1-famz@redhat.com>+zmo_0_'
+                            '<qemu-devel-bounces+importer=patchew.org@nongnu.org>\n'
+                            'X-ZohoMail-Sender: 209.132.183.28\nX-ZohoMail: RSF_0  Z_629925259 '
+                            'SPT_1 Z_629926901 SPT_1  SS_1 SFPD SFPP UW2468 UB2468 ZFF-EB_1'
+                            ' COSF  ODL   SGR3_1_2_0_27046_53\nX-Zoho-Virus-Status: 2\n\n'
+                            'This was the only exceptional module init function that does '
+                            'something\nelse than a simple list of bdrv_register() calls, '
+                            'in all the block\ndrivers.\n\nThe qcrypto_hash_supports is actually'
+                            ' a static check, determined at\ncompile time.  Follow the '
+                            'block-job-$(CONFIG_FOO) convention for\nconsistency.\n\n'
+                            'Signed-off-by: Fam Zheng <famz@redhat.com>\n---\n block/'
+                            'Makefile.objs | 2 +-\n block/quorum.c      | 4 ----\n 2 files'
+                            ' changed, 1 insertion(+), 5 deletions(-)\n\ndiff --git a/block/'
+                            'Makefile.objs b/block/Makefile.objs\nindex 44a5416..c87d605 '
+                            '100644\n--- a/block/Makefile.objs\n+++ b/block/Makefile.objs\n@@'
+                            ' -3,7 +3,7 @@ block-obj-y += qcow2.o qcow2-refcount.o qcow2-cluster.o'
+                            ' qcow2-snapshot.o qcow2-c\n block-obj-y += qed.o qed-gencb.o '
+                            'qed-l2-cache.o qed-table.o qed-cluster.o\n block-obj-y += '
+                            'qed-check.o\n block-obj-$(CONFIG_VHDX) += vhdx.o vhdx-endian.o'
+                            ' vhdx-log.o\n-block-obj-y += quorum.o\n+block-obj-$(CONFIG_GNUTLS_HASH)'
+                            ' += quorum.o\n block-obj-y += parallels.o blkdebug.o blkverify.o '
+                            'blkreplay.o\n block-obj-y += block-backend.o snapshot.o qapi.o\n '
+                            'block-obj-$(CONFIG_WIN32) += raw-win32.o win32-aio.o\ndiff --git '
+                            'a/block/quorum.c b/block/quorum.c\nindex 331b726..18fbed8 100644\n'
+                            '--- a/block/quorum.c\n+++ b/block/quorum.c\n@@ -1113,10 +1113,6 @@'
+                            ' static BlockDriver bdrv_quorum = {\n \n static void bdrv_quorum_init'
+                            '(void)\n {\n-    if (!qcrypto_hash_supports(QCRYPTO_HASH_ALG_SHA256))'
+                            ' {\n-        /* SHA256 hash support is required for quorum device */\n-'
+                            '        return;\n-    }\n     bdrv_register(&bdrv_quorum);\n }\n \n-- \n'
+                            '2.9.0\n\n\n'}
+        dp = self.get_data_path("0001-simple-patch.mbox.gz")
+        with open(dp, "r") as f:
+            msg = mbox.MboxMessage(f.read()).get_json()
+        self.assertEqual(msg, expected)
+
 if __name__ == '__main__':
     main()
-- 
2.14.3 (Apple Git-98)

_______________________________________________
Patchew-devel mailing list
Patchew-devel@redhat.com
https://www.redhat.com/mailman/listinfo/patchew-devel
Re: [Patchew-devel] [PATCH 3/3] Text to json converter for mbox
Posted by Paolo Bonzini 6 years, 4 months ago
On 08/05/2018 13:50, Shubham Jain wrote:
> - Mbox would now return a dictionary object which would help REST API deserialize easily into model object.
> - Added test for text to json converter.
> 
> For recepients and sender couldn't use AddressSerializer as api.rest
> calls models which call back mbox. Possible soulution to replace
> to_representation in AddressSerializer with add_tuple_to_dic to
> remove code redundancy?
Yes, that makes sense!

Paolo

> ---
>  mbox.py            |  18 ++++++++++
>  tests/test_mbox.py | 102 +++++++++++++++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 120 insertions(+)
> 
> diff --git a/mbox.py b/mbox.py
> index fe108f3..1296078 100644
> --- a/mbox.py
> +++ b/mbox.py
> @@ -13,6 +13,7 @@ import email.utils
>  import email.header
>  import datetime
>  import re
> +from rest_framework.fields import DateTimeField
>  
>  def _parse_header(header):
>      r = ''
> @@ -34,6 +35,11 @@ def _addr_fmt_text(name, addr):
>      else:
>          return addr
>  
> +def addr_tuple_to_dic(obj):

Maybe addr_db_to_rest?  The idea is that the array representation is in
the database and the dictionary representation is used by the REST API.

> +        if obj[0] != obj[1]:
> +            return {"name": obj[0], "address": obj[1]}
> +        else:
> +            return {"address": obj[1]}
>  
>  class MboxMessage(object):
>      """ Helper class to process mbox """
> @@ -269,3 +275,15 @@ class MboxMessage(object):
>          if c == 0:
>              return True
>          return False
> +
> +    def get_json(self):
> +        """Return the JSON format of the mbox """
> +        msg = {}
> +        msg['message_id'] = self.get_message_id()
> +        msg['in_reply_to'] = self.get_in_reply_to() or ""
> +        msg['date'] = DateTimeField().to_representation(self.get_date())
> +        msg['subject'] = self.get_subject()
> +        msg['sender'] = addr_tuple_to_dic(self.get_from())
> +        msg['recipients'] = [addr_tuple_to_dic(x) for x in (self.get_to() + self.get_cc())]
> +        msg['mbox'] = self.get_mbox()
> +        return msg
> \ No newline at end of file
> diff --git a/tests/test_mbox.py b/tests/test_mbox.py
> index 8493df7..7a21d4a 100755
> --- a/tests/test_mbox.py
> +++ b/tests/test_mbox.py
> @@ -52,5 +52,107 @@ Virtualization:  qemu.org | libvirt.org
>              msg = mbox.MboxMessage(f.read())
>          self.assertTrue(msg.is_patch())
>  
> +    def test_get_json(self):
> +        expected = {'message_id': '20160628014747.20971-1-famz@redhat.com',
> +                    'in_reply_to': '',
> +                    'date': '2016-06-28T01:47:47',
> +                    'subject': '[Qemu-devel] [PATCH] quorum: Only compile when supported',
> +                    'sender': {'name': 'Fam Zheng', 'address': 'famz@redhat.com'},
> +                    'recipients': [{'address': 'qemu-devel@nongnu.org'},
> +                                   {'name': 'Kevin Wolf', 'address': 'kwolf@redhat.com'},
> +                                   {'name': 'Alberto Garcia', 'address': 'berto@igalia.com'},
> +                                   {'address': 'qemu-block@nongnu.org'},
> +                                   {'name': 'Max Reitz', 'address': 'mreitz@redhat.com'}],
> +                    'mbox': 'Delivered-To: importer@patchew.org\nReceived-SPF: '
> +                            'Pass (zoho.com: domain of qemu-devel-bounces@nongnu.org '
> +                            'designates 208.118.235.17 as permitted sender )  client-ip: '
> +                            '208.118.235.17\nReceived-SPF: pass (zoho.com: domain of '
> +                            'gnu.org designates 208.118.235.17 as permitted sender) '
> +                            'client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+'
> +                            'importer=patchew.org@nongnu.org; helo=lists.gnu.org;\n'
> +                            'Return-Path: <qemu-devel-bounces+importer=patchew.org@nongnu.org>'
> +                            '\nReceived: from lists.gnu.org (lists.gnu.org [208.118.235.17]) '
> +                            'by mx.zohomail.com\n\twith SMTPS id 1467078971424862.8927889595075;'
> +                            ' Mon, 27 Jun 2016 18:56:11 -0700 (PDT)\nReceived: from localhost '
> +                            '([::1]:33689 helo=lists.gnu.org)\n\tby lists.gnu.org with esmtp '
> +                            '(Exim 4.71)\n\t(envelope-from <qemu-devel-bounces+importer='
> +                            'patchew.org@nongnu.org>)\n\tid 1bHi94-0006LP-Ok\n\tfor '
> +                            'importer@patchew.org; Mon, 27 Jun 2016 21:48:58 -0400\nReceived: '
> +                            'from eggs.gnu.org ([2001:4830:134:3::10]:53270)\n\tby lists.gnu.org'
> +                            ' with esmtp (Exim 4.71)\n\t(envelope-from <famz@redhat.com>) id '
> +                            '1bHi8E-0002Lm-KR\n\tfor qemu-devel@nongnu.org; Mon, 27 Jun 2016 '
> +                            '21:48:07 -0400\nReceived: from Debian-exim by eggs.gnu.org with '
> +                            'spam-scanned (Exim 4.71)\n\t(envelope-from <famz@redhat.com>) '
> +                            'id 1bHi8D-0008T4-N7\n\tfor qemu-devel@nongnu.org; Mon, 27 Jun '
> +                            '2016 21:48:06 -0400\nReceived: from mx1.redhat.com '
> +                            '([209.132.183.28]:47972)\n\tby eggs.gnu.org with esmtp '
> +                            '(Exim 4.71)\n\t(envelope-from <famz@redhat.com>)\n\tid '
> +                            '1bHi86-0008SN-IZ; Mon, 27 Jun 2016 21:47:58 -0400\nReceived: '
> +                            'from int-mx10.intmail.prod.int.phx2.redhat.com\n\t'
> +                            '(int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23])\n\t'
> +                            '(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 '
> +                            '(256/256 bits))\n\t(No client certificate requested)\n\tby '
> +                            'mx1.redhat.com (Postfix) with ESMTPS id BDB007F088;\n\tTue, '
> +                            '28 Jun 2016 01:47:57 +0000 (UTC)\nReceived: '
> +                            'from ad.usersys.redhat.com (dhcp-15-133.nay.redhat.com\n\t'
> +                            '[10.66.15.133])\n\tby int-mx10.intmail.prod.int.phx2.redhat.com'
> +                            ' (8.14.4/8.14.4) with ESMTP\n\tid u5S1lssT024908; Mon, 27 Jun '
> +                            '2016 21:47:55 -0400\nFrom: Fam Zheng <famz@redhat.com>\nTo: '
> +                            'qemu-devel@nongnu.org\nDate: Tue, 28 Jun 2016 09:47:47 '
> +                            '+0800\nMessage-Id: <20160628014747.20971-1-famz@redhat.com>\n'
> +                            'X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23\nX-Greylist: '
> +                            'Sender IP whitelisted, not delayed by milter-greylist-4.5.16\n\t'
> +                            '(mx1.redhat.com [10.5.110.26]);\n\tTue, 28 Jun 2016 01:47:57 '
> +                            '+0000 (UTC)\nX-detected-operating-system: by eggs.gnu.org: '
> +                            'GNU/Linux 2.2.x-3.x [generic]\nX-Received-From: 209.132.183.28\n'
> +                            'Subject: [Qemu-devel] [PATCH] quorum: Only compile when supported\n'
> +                            'X-BeenThere: qemu-devel@nongnu.org\nX-Mailman-Version: 2.1.21\n'
> +                            'Precedence: list\nList-Id: <qemu-devel.nongnu.org>\nList-Unsubscribe:'
> +                            ' <https://lists.nongnu.org/mailman/options/qemu-devel>,\n\t'
> +                            '<mailto:qemu-devel-request@nongnu.org?subject=unsubscribe>\n'
> +                            'List-Archive: <http://lists.nongnu.org/archive/html/qemu-devel/>\n'
> +                            'List-Post: <mailto:qemu-devel@nongnu.org>\nList-Help: '
> +                            '<mailto:qemu-devel-request@nongnu.org?subject=help>\nList-Subscribe:'
> +                            ' <https://lists.nongnu.org/mailman/listinfo/qemu-devel>,\n\t'
> +                            '<mailto:qemu-devel-request@nongnu.org?subject=subscribe>\nCc:'
> +                            ' Kevin Wolf <kwolf@redhat.com>, Alberto Garcia <berto@igalia.com>,'
> +                            '\n\tqemu-block@nongnu.org, Max Reitz <mreitz@redhat.com>\nErrors-To:'
> +                            ' qemu-devel-bounces+importer=patchew.org@nongnu.org\nSender: '
> +                            '"Qemu-devel" <qemu-devel-bounces+importer=patchew.org@nongnu.org>\n'
> +                            'X-ZohoMail-Owner: <20160628014747.20971-1-famz@redhat.com>+zmo_0_'
> +                            '<qemu-devel-bounces+importer=patchew.org@nongnu.org>\n'
> +                            'X-ZohoMail-Sender: 209.132.183.28\nX-ZohoMail: RSF_0  Z_629925259 '
> +                            'SPT_1 Z_629926901 SPT_1  SS_1 SFPD SFPP UW2468 UB2468 ZFF-EB_1'
> +                            ' COSF  ODL   SGR3_1_2_0_27046_53\nX-Zoho-Virus-Status: 2\n\n'
> +                            'This was the only exceptional module init function that does '
> +                            'something\nelse than a simple list of bdrv_register() calls, '
> +                            'in all the block\ndrivers.\n\nThe qcrypto_hash_supports is actually'
> +                            ' a static check, determined at\ncompile time.  Follow the '
> +                            'block-job-$(CONFIG_FOO) convention for\nconsistency.\n\n'
> +                            'Signed-off-by: Fam Zheng <famz@redhat.com>\n---\n block/'
> +                            'Makefile.objs | 2 +-\n block/quorum.c      | 4 ----\n 2 files'
> +                            ' changed, 1 insertion(+), 5 deletions(-)\n\ndiff --git a/block/'
> +                            'Makefile.objs b/block/Makefile.objs\nindex 44a5416..c87d605 '
> +                            '100644\n--- a/block/Makefile.objs\n+++ b/block/Makefile.objs\n@@'
> +                            ' -3,7 +3,7 @@ block-obj-y += qcow2.o qcow2-refcount.o qcow2-cluster.o'
> +                            ' qcow2-snapshot.o qcow2-c\n block-obj-y += qed.o qed-gencb.o '
> +                            'qed-l2-cache.o qed-table.o qed-cluster.o\n block-obj-y += '
> +                            'qed-check.o\n block-obj-$(CONFIG_VHDX) += vhdx.o vhdx-endian.o'
> +                            ' vhdx-log.o\n-block-obj-y += quorum.o\n+block-obj-$(CONFIG_GNUTLS_HASH)'
> +                            ' += quorum.o\n block-obj-y += parallels.o blkdebug.o blkverify.o '
> +                            'blkreplay.o\n block-obj-y += block-backend.o snapshot.o qapi.o\n '
> +                            'block-obj-$(CONFIG_WIN32) += raw-win32.o win32-aio.o\ndiff --git '
> +                            'a/block/quorum.c b/block/quorum.c\nindex 331b726..18fbed8 100644\n'
> +                            '--- a/block/quorum.c\n+++ b/block/quorum.c\n@@ -1113,10 +1113,6 @@'
> +                            ' static BlockDriver bdrv_quorum = {\n \n static void bdrv_quorum_init'
> +                            '(void)\n {\n-    if (!qcrypto_hash_supports(QCRYPTO_HASH_ALG_SHA256))'
> +                            ' {\n-        /* SHA256 hash support is required for quorum device */\n-'
> +                            '        return;\n-    }\n     bdrv_register(&bdrv_quorum);\n }\n \n-- \n'
> +                            '2.9.0\n\n\n'}
> +        dp = self.get_data_path("0001-simple-patch.mbox.gz")

To avoid copying the entire body, you could do here:

   with open(dp, "r") as f:
       content = f.read()
       expected = { ...,  'mbox': content }
       msg = mbox.MboxMessage(content).get_json()
       self.assertEqual(msg, expected)

Paolo

> +        with open(dp, "r") as f:
> +            msg = mbox.MboxMessage(f.read()).get_json()
> +        self.assertEqual(msg, expected)
> +
>  if __name__ == '__main__':
>      main()
> 

_______________________________________________
Patchew-devel mailing list
Patchew-devel@redhat.com
https://www.redhat.com/mailman/listinfo/patchew-devel
Re: [Patchew-devel] [PATCH 3/3] Text to json converter for mbox
Posted by Shubham Jain 6 years, 4 months ago
That's a nice hack. Thanks. :)


On Tue, May 8, 2018 at 6:46 PM Paolo Bonzini <pbonzini@redhat.com> wrote:

> On 08/05/2018 13:50, Shubham Jain wrote:
> > - Mbox would now return a dictionary object which would help REST API
> deserialize easily into model object.
> > - Added test for text to json converter.
> >
> > For recepients and sender couldn't use AddressSerializer as api.rest
> > calls models which call back mbox. Possible soulution to replace
> > to_representation in AddressSerializer with add_tuple_to_dic to
> > remove code redundancy?
> Yes, that makes sense!
>
> Paolo
>
> > ---
> >  mbox.py            |  18 ++++++++++
> >  tests/test_mbox.py | 102
> +++++++++++++++++++++++++++++++++++++++++++++++++++++
> >  2 files changed, 120 insertions(+)
> >
> > diff --git a/mbox.py b/mbox.py
> > index fe108f3..1296078 100644
> > --- a/mbox.py
> > +++ b/mbox.py
> > @@ -13,6 +13,7 @@ import email.utils
> >  import email.header
> >  import datetime
> >  import re
> > +from rest_framework.fields import DateTimeField
> >
> >  def _parse_header(header):
> >      r = ''
> > @@ -34,6 +35,11 @@ def _addr_fmt_text(name, addr):
> >      else:
> >          return addr
> >
> > +def addr_tuple_to_dic(obj):
>
> Maybe addr_db_to_rest?  The idea is that the array representation is in
> the database and the dictionary representation is used by the REST API.
>
> > +        if obj[0] != obj[1]:
> > +            return {"name": obj[0], "address": obj[1]}
> > +        else:
> > +            return {"address": obj[1]}
> >
> >  class MboxMessage(object):
> >      """ Helper class to process mbox """
> > @@ -269,3 +275,15 @@ class MboxMessage(object):
> >          if c == 0:
> >              return True
> >          return False
> > +
> > +    def get_json(self):
> > +        """Return the JSON format of the mbox """
> > +        msg = {}
> > +        msg['message_id'] = self.get_message_id()
> > +        msg['in_reply_to'] = self.get_in_reply_to() or ""
> > +        msg['date'] = DateTimeField().to_representation(self.get_date())
> > +        msg['subject'] = self.get_subject()
> > +        msg['sender'] = addr_tuple_to_dic(self.get_from())
> > +        msg['recipients'] = [addr_tuple_to_dic(x) for x in
> (self.get_to() + self.get_cc())]
> > +        msg['mbox'] = self.get_mbox()
> > +        return msg
> > \ No newline at end of file
> > diff --git a/tests/test_mbox.py b/tests/test_mbox.py
> > index 8493df7..7a21d4a 100755
> > --- a/tests/test_mbox.py
> > +++ b/tests/test_mbox.py
> > @@ -52,5 +52,107 @@ Virtualization:  qemu.org | libvirt.org
> >              msg = mbox.MboxMessage(f.read())
> >          self.assertTrue(msg.is_patch())
> >
> > +    def test_get_json(self):
> > +        expected = {'message_id': '
> 20160628014747.20971-1-famz@redhat.com',
> > +                    'in_reply_to': '',
> > +                    'date': '2016-06-28T01:47:47',
> > +                    'subject': '[Qemu-devel] [PATCH] quorum: Only
> compile when supported',
> > +                    'sender': {'name': 'Fam Zheng', 'address': '
> famz@redhat.com'},
> > +                    'recipients': [{'address': 'qemu-devel@nongnu.org
> '},
> > +                                   {'name': 'Kevin Wolf', 'address': '
> kwolf@redhat.com'},
> > +                                   {'name': 'Alberto Garcia',
> 'address': 'berto@igalia.com'},
> > +                                   {'address': 'qemu-block@nongnu.org
> '},
> > +                                   {'name': 'Max Reitz', 'address': '
> mreitz@redhat.com'}],
> > +                    'mbox': 'Delivered-To: importer@patchew.org\nReceived-SPF:
> '
> > +                            'Pass (zoho.com: domain of
> qemu-devel-bounces@nongnu.org '
> > +                            'designates 208.118.235.17 as permitted
> sender )  client-ip: '
> > +                            '208.118.235.17\nReceived-SPF: pass (
> zoho.com: domain of '
> > +                            'gnu.org designates 208.118.235.17 as
> permitted sender) '
> > +                            'client-ip=208.118.235.17;
> envelope-from=qemu-devel-bounces+'
> > +                            'importer=patchew.org@nongnu.org; helo=
> lists.gnu.org;\n'
> > +                            'Return-Path: <qemu-devel-bounces+importer=
> patchew.org@nongnu.org>'
> > +                            '\nReceived: from lists.gnu.org (
> lists.gnu.org [208.118.235.17]) '
> > +                            'by mx.zohomail.com\n\twith SMTPS id
> 1467078971424862.8927889595075;'
> > +                            ' Mon, 27 Jun 2016 18:56:11 -0700
> (PDT)\nReceived: from localhost '
> > +                            '([::1]:33689 helo=lists.gnu.org)\n\tby
> lists.gnu.org with esmtp '
> > +                            '(Exim 4.71)\n\t(envelope-from
> <qemu-devel-bounces+importer='
> > +                            'patchew.org@nongnu.org>)\n\tid
> 1bHi94-0006LP-Ok\n\tfor '
> > +                            'importer@patchew.org; Mon, 27 Jun 2016
> 21:48:58 -0400\nReceived: '
> > +                            'from eggs.gnu.org
> ([2001:4830:134:3::10]:53270)\n\tby lists.gnu.org'
> > +                            ' with esmtp (Exim 4.71)\n\t(envelope-from <
> famz@redhat.com>) id '
> > +                            '1bHi8E-0002Lm-KR\n\tfor
> qemu-devel@nongnu.org; Mon, 27 Jun 2016 '
> > +                            '21:48:07 -0400\nReceived: from Debian-exim
> by eggs.gnu.org with '
> > +                            'spam-scanned (Exim 4.71)\n\t(envelope-from
> <famz@redhat.com>) '
> > +                            'id 1bHi8D-0008T4-N7\n\tfor
> qemu-devel@nongnu.org; Mon, 27 Jun '
> > +                            '2016 21:48:06 -0400\nReceived: from
> mx1.redhat.com '
> > +                            '([209.132.183.28]:47972)\n\tby
> eggs.gnu.org with esmtp '
> > +                            '(Exim 4.71)\n\t(envelope-from <
> famz@redhat.com>)\n\tid '
> > +                            '1bHi86-0008SN-IZ; Mon, 27 Jun 2016
> 21:47:58 -0400\nReceived: '
> > +                            'from
> int-mx10.intmail.prod.int.phx2.redhat.com\n\t'
> > +                            '(int-mx10.intmail.prod.int.phx2.redhat.com
> [10.5.11.23])\n\t'
> > +                            '(using TLSv1.2 with cipher
> ECDHE-RSA-AES256-GCM-SHA384 '
> > +                            '(256/256 bits))\n\t(No client certificate
> requested)\n\tby '
> > +                            'mx1.redhat.com (Postfix) with ESMTPS id
> BDB007F088;\n\tTue, '
> > +                            '28 Jun 2016 01:47:57 +0000
> (UTC)\nReceived: '
> > +                            'from ad.usersys.redhat.com (
> dhcp-15-133.nay.redhat.com\n\t'
> > +                            '[10.66.15.133])\n\tby
> int-mx10.intmail.prod.int.phx2.redhat.com'
> > +                            ' (8.14.4/8.14.4) with ESMTP\n\tid
> u5S1lssT024908; Mon, 27 Jun '
> > +                            '2016 21:47:55 -0400\nFrom: Fam Zheng <
> famz@redhat.com>\nTo: '
> > +                            'qemu-devel@nongnu.org\nDate: Tue, 28 Jun
> 2016 09:47:47 '
> > +                            '+0800\nMessage-Id: <
> 20160628014747.20971-1-famz@redhat.com>\n'
> > +                            'X-Scanned-By: MIMEDefang 2.68 on
> 10.5.11.23\nX-Greylist: '
> > +                            'Sender IP whitelisted, not delayed by
> milter-greylist-4.5.16\n\t'
> > +                            '(mx1.redhat.com [10.5.110.26]);\n\tTue,
> 28 Jun 2016 01:47:57 '
> > +                            '+0000 (UTC)\nX-detected-operating-system:
> by eggs.gnu.org: '
> > +                            'GNU/Linux 2.2.x-3.x
> [generic]\nX-Received-From: 209.132.183.28\n'
> > +                            'Subject: [Qemu-devel] [PATCH] quorum: Only
> compile when supported\n'
> > +                            'X-BeenThere: qemu-devel@nongnu.org\nX-Mailman-Version:
> 2.1.21\n'
> > +                            'Precedence: list\nList-Id: <
> qemu-devel.nongnu.org>\nList-Unsubscribe:'
> > +                            ' <
> https://lists.nongnu.org/mailman/options/qemu-devel>,\n\t'
> > +                            '<mailto:qemu-devel-request@nongnu.org
> ?subject=unsubscribe>\n'
> > +                            'List-Archive: <
> http://lists.nongnu.org/archive/html/qemu-devel/>\n'
> > +                            'List-Post: <mailto:qemu-devel@nongnu.org>\nList-Help:
> '
> > +                            '<mailto:qemu-devel-request@nongnu.org
> ?subject=help>\nList-Subscribe:'
> > +                            ' <
> https://lists.nongnu.org/mailman/listinfo/qemu-devel>,\n\t'
> > +                            '<mailto:qemu-devel-request@nongnu.org
> ?subject=subscribe>\nCc:'
> > +                            ' Kevin Wolf <kwolf@redhat.com>, Alberto
> Garcia <berto@igalia.com>,'
> > +                            '\n\tqemu-block@nongnu.org, Max Reitz <
> mreitz@redhat.com>\nErrors-To:'
> > +                            ' qemu-devel-bounces+importer=
> patchew.org@nongnu.org\nSender: '
> > +                            '"Qemu-devel" <qemu-devel-bounces+importer=
> patchew.org@nongnu.org>\n'
> > +                            'X-ZohoMail-Owner: <
> 20160628014747.20971-1-famz@redhat.com>+zmo_0_'
> > +                            '<qemu-devel-bounces+importer=
> patchew.org@nongnu.org>\n'
> > +                            'X-ZohoMail-Sender:
> 209.132.183.28\nX-ZohoMail: RSF_0  Z_629925259 '
> > +                            'SPT_1 Z_629926901 SPT_1  SS_1 SFPD SFPP
> UW2468 UB2468 ZFF-EB_1'
> > +                            ' COSF  ODL
>  SGR3_1_2_0_27046_53\nX-Zoho-Virus-Status: 2\n\n'
> > +                            'This was the only exceptional module init
> function that does '
> > +                            'something\nelse than a simple list of
> bdrv_register() calls, '
> > +                            'in all the block\ndrivers.\n\nThe
> qcrypto_hash_supports is actually'
> > +                            ' a static check, determined at\ncompile
> time.  Follow the '
> > +                            'block-job-$(CONFIG_FOO) convention
> for\nconsistency.\n\n'
> > +                            'Signed-off-by: Fam Zheng <famz@redhat.com>\n---\n
> block/'
> > +                            'Makefile.objs | 2 +-\n block/quorum.c
> | 4 ----\n 2 files'
> > +                            ' changed, 1 insertion(+), 5
> deletions(-)\n\ndiff --git a/block/'
> > +                            'Makefile.objs b/block/Makefile.objs\nindex
> 44a5416..c87d605 '
> > +                            '100644\n--- a/block/Makefile.objs\n+++
> b/block/Makefile.objs\n@@'
> > +                            ' -3,7 +3,7 @@ block-obj-y += qcow2.o
> qcow2-refcount.o qcow2-cluster.o'
> > +                            ' qcow2-snapshot.o qcow2-c\n block-obj-y +=
> qed.o qed-gencb.o '
> > +                            'qed-l2-cache.o qed-table.o qed-cluster.o\n
> block-obj-y += '
> > +                            'qed-check.o\n block-obj-$(CONFIG_VHDX) +=
> vhdx.o vhdx-endian.o'
> > +                            ' vhdx-log.o\n-block-obj-y +=
> quorum.o\n+block-obj-$(CONFIG_GNUTLS_HASH)'
> > +                            ' += quorum.o\n block-obj-y += parallels.o
> blkdebug.o blkverify.o '
> > +                            'blkreplay.o\n block-obj-y +=
> block-backend.o snapshot.o qapi.o\n '
> > +                            'block-obj-$(CONFIG_WIN32) += raw-win32.o
> win32-aio.o\ndiff --git '
> > +                            'a/block/quorum.c b/block/quorum.c\nindex
> 331b726..18fbed8 100644\n'
> > +                            '--- a/block/quorum.c\n+++
> b/block/quorum.c\n@@ -1113,10 +1113,6 @@'
> > +                            ' static BlockDriver bdrv_quorum = {\n \n
> static void bdrv_quorum_init'
> > +                            '(void)\n {\n-    if
> (!qcrypto_hash_supports(QCRYPTO_HASH_ALG_SHA256))'
> > +                            ' {\n-        /* SHA256 hash support is
> required for quorum device */\n-'
> > +                            '        return;\n-    }\n
>  bdrv_register(&bdrv_quorum);\n }\n \n-- \n'
> > +                            '2.9.0\n\n\n'}
> > +        dp = self.get_data_path("0001-simple-patch.mbox.gz")
>
> To avoid copying the entire body, you could do here:
>
>    with open(dp, "r") as f:
>        content = f.read()
>        expected = { ...,  'mbox': content }
>        msg = mbox.MboxMessage(content).get_json()
>        self.assertEqual(msg, expected)
>
> Paolo
>
> > +        with open(dp, "r") as f:
> > +            msg = mbox.MboxMessage(f.read()).get_json()
> > +        self.assertEqual(msg, expected)
> > +
> >  if __name__ == '__main__':
> >      main()
> >
>
>
_______________________________________________
Patchew-devel mailing list
Patchew-devel@redhat.com
https://www.redhat.com/mailman/listinfo/patchew-devel