Metadata-Version: 2.0
Name: multipart-reader
Version: 0.2
Summary: Multipart/* reader extracted from awsome `aiohttp` project, cf.: http://aiohttp.readthedocs.org/en/stable/multipart.html.
Home-page: https://github.com/novafloss/multipart-reader
Author: Florent Pigout
Author-email: florent.pigout@people-doc.com
License: MIT
Description-Content-Type: UNKNOWN
Keywords: multipart
Platform: UNKNOWN
Classifier: Development Status :: 4 - Beta
Classifier: Environment :: Console
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: Apache Software License
Classifier: Programming Language :: Python
Requires-Dist: future
Requires-Dist: setuptools (>=17.1)
Provides-Extra: release
Requires-Dist: wheel; extra == 'release'
Requires-Dist: zest.releaser; extra == 'release'
Provides-Extra: test
Requires-Dist: flake8; extra == 'test'
Requires-Dist: unittest2; extra == 'test'

================
Multipart Reader
================

.. image:: https://travis-ci.org/novafloss/multipart-reader.svg
   :target: https://travis-ci.org/novafloss/multipart-reader
   :alt: We are under CI!!


Permits to read a multipart content like, mixed, related, etc.

Thanks to the *aiohttp* project for the implementation, cf.:
http://aiohttp.readthedocs.org/en/stable/multipart.html. Unfortunately lot of
people have not yet moved to asyncio, or do not want the full *aiohttp* stack
to read the multipart content. 

Here we tried to keep all the *aiohttp* logic and coverage but the coroutines
mechanism.


What it does
============

It reads the same way multpart/x contents. Lets say we have the following
*multipart/related* content::

    >>> import json

    >>> from email.mime.multipart import MIMEMultipart
    >>> from email.mime.base import MIMEBase

    >>> multipart = MIMEMultipart('related')

    >>> part = MIMEBase('application', 'json')
    >>> part.set_payload(json.dumps({'foo': 'bar'}))
    >>> multipart.attach(part)

    >>> part = MIMEBase('application', 'octet-stream')
    >>> part.set_payload(b"Python will save the world. I don't know how. But it will.")
    >>> part.add_header('Content-Disposition', 'attachment', filename='python-save-the-world.txt')
    >>> multipart.attach(part)

Here is how we can read it::

    >>> import io

    >>> from multipart_reader import MultipartReader

    >>> content = multipart.as_string().split('\n\n', 1)[1]
    >>> headers = dict(multipart.items())

    >>> stream = io.BytesIO()
    >>> stream.write(content)
    >>> stream.seek(0)

    >>> reader = MultipartReader(headers, stream)

    >>> json_part = reader.next()
    >>> json_part.json()
    {'foo': 'bar'}

    >>> file_part = reader.next()
    >>> file_part.read()
    "Python will save the world. I don't know how. But it will."

    >>> file_part.filename
    'python-save-the-world.txt'

That's it ...


