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

Paolo Bonzini pbonzini at redhat.com
Wed May 9 13:45:43 UTC 2018


On 08/05/2018 21:32, Shubham Jain wrote:
> - Mbox would now return a dictionary object which would help REST API deserialize easily into model object.
> - Add test for text to json converter.
> - Modified to_representation of AddressSerializer so that it use add_db_to_rest to avoid redundancy
> For recepients and sender while converting to json couldn't use AddressSerializer as api.rest calls models which call back mbox. Use add_db_to_rest instead.

The commit message is already a great improvement, here is my take:

MboxMessage already contains the parser for mbox files; add a method to
produce the same JSON representation used by the REST API, which will be
the basis for a text/plain parser in api.rest.

A little bit of code can be shared between the AddressSerializer and the
converter.  To avoid duplication, put it in a function addr_db_to_rest.

(It is not necessary to mention tests; it's already evident from the
list of modified files).


--

I still don't understand why you cannot use AddressSerializer just like
you use DateTimeField though.  DRF serializers in general are
independent from models.  The code is fine, so this is just for my
personal enlightenment. :) Did you get an error?

The dependency of mbox on api.rest would be very ugly, but it is easy to
avoid, just move the whole class to mbox.py.

Thanks,

Paolo

> ---
>  api/rest.py        |  6 ++----
>  mbox.py            | 18 ++++++++++++++++++
>  tests/test_mbox.py | 19 +++++++++++++++++++
>  3 files changed, 39 insertions(+), 4 deletions(-)
> 
> diff --git a/api/rest.py b/api/rest.py
> index ed40a10..06faf57 100644
> --- a/api/rest.py
> +++ b/api/rest.py
> @@ -23,6 +23,7 @@ from rest_framework.fields import SerializerMethodField, CharField, JSONField, E
>  from rest_framework.relations import HyperlinkedIdentityField
>  from rest_framework.response import Response
>  import rest_framework
> +from mbox import addr_db_to_rest
>  
>  SEARCH_PARAM = 'q'
>  
> @@ -123,10 +124,7 @@ class AddressSerializer(serializers.Serializer):
>      address = EmailField()
>      
>      def to_representation(self, obj):
> -        if obj[0] != obj[1]:
> -            return {"name": obj[0], "address": obj[1]}
> -        else:
> -            return {"address": obj[1]}
> +        return addr_db_to_rest(obj)
>  
>      def create(self, validated_data):
>          try:
> diff --git a/mbox.py b/mbox.py
> index fe108f3..35b2270 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_db_to_rest(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_db_to_rest(self.get_from())
> +        msg['recipients'] = [addr_db_to_rest(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..b63608d 100755
> --- a/tests/test_mbox.py
> +++ b/tests/test_mbox.py
> @@ -52,5 +52,24 @@ Virtualization:  qemu.org | libvirt.org
>              msg = mbox.MboxMessage(f.read())
>          self.assertTrue(msg.is_patch())
>  
> +    def test_get_json(self):
> +        dp = self.get_data_path("0001-simple-patch.mbox.gz")
> +        with open(dp, "r") as f:
> +            content = f.read()
> +            expected = {'message_id': '20160628014747.20971-1-famz at 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 at redhat.com'},
> +                        'recipients': [{'address': 'qemu-devel at nongnu.org'},
> +                                       {'name': 'Kevin Wolf', 'address': 'kwolf at redhat.com'},
> +                                       {'name': 'Alberto Garcia', 'address': 'berto at igalia.com'},
> +                                       {'address': 'qemu-block at nongnu.org'},
> +                                       {'name': 'Max Reitz', 'address': 'mreitz at redhat.com'}],
> +                        'mbox':content
> +                        }
> +            msg = mbox.MboxMessage(content).get_json()
> +        self.assertEqual(msg, expected)
> +
>  if __name__ == '__main__':
>      main()
> 




More information about the Patchew-devel mailing list