{ "info": { "author": "Pyrates", "author_email": "yohan.boniface@data.gouv.fr", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Environment :: Web Environment", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: MacOS :: MacOS X", "Operating System :: POSIX", "Programming Language :: Python :: 3" ], "description": "# Multifruits\n\nTasty multipart form data parser built with cython.\n\n\n## Install\n\n pip install multifruits\n\n\n## Usage\n\n`multifruits` has one `Parser` class and two helpers: `extract_filename` and\n`parse_content_disposition`.\n\n\n#### `Parser`\n\n`Parser` needs the `Content-Type` header value and a handler, which could\ndefine one or more of these methods:\n\n```python\non_body_begin()\non_part_begin()\non_header(name: bytes, value: bytes)\non_headers_complete()\non_data(data: bytes)\non_part_complete()\non_body_complete()\n```\n\nExample:\n\n```python\nfrom multifruits import Parser\n\nclass MyHandler:\n\n def on_part_begin(self):\n self.part = MyPart()\n\n def on_header(self, name, value):\n self.part.headers[name] = value\n\n def on_data(self, data):\n self.part.write(data)\n\nhandler = MyHandler()\nparser = Parser(handler, request.headers['Content-Type'])\nparser.feed_data(request.body) # You can pass chunks\n```\n\n#### Helpers\n\n##### `parse_content_disposition`\n\nTakes raw `Content-Disposition` header value and returns the disposition type\n(`attachment`, `form-data`, `inline` and so on) and the parameters parsed as a\ndictionary.\n\nExample:\n\n```python\ndtype, params = parse_content_disposition(b'inline; filename=\"foo.html\"')\nassert dtype == b'inline'\nassert params == {b'filename': b'foo.html'}\n```\n\n\n##### `extract_filename`\n\nTakes parameters from `parse_content_disposition` as a dict and tries to\nreturn the appropriated `str` filename (like `filename*`).\n\nExample:\n\n```python\nassert extract_filename({\n b'filename*': \"UTF-8''foo-\u00e4-\u20ac.html\".encode()\n}) == 'foo-\u00e4-\u20ac.html'\n```\n\n\n## Build from source\n\nYou need a virtualenv with cython installed, then:\n\n git clone https://github.com/pyrates/multifruits\n cd multifruits\n make compile\n python setup.py develop\n\n## Tests\n\nTo run tests:\n\n make test\n\n\n## Acknowledgements\n\n- https://github.com/iafonov/multipart-parser-c/\n- https://github.com/francoiscolas/multipart-parser/\n- https://github.com/felixge/node-formidable/", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/pyrates/multifruits", "keywords": "", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "multifruits", "package_url": "https://pypi.org/project/multifruits/", "platform": "POSIX", "project_url": "https://pypi.org/project/multifruits/", "project_urls": { "Homepage": "https://github.com/pyrates/multifruits" }, "release_url": "https://pypi.org/project/multifruits/0.1.4/", "requires_dist": null, "requires_python": "", "summary": "Tasty multipart form data parser built with cython.", "version": "0.1.4" }, "last_serial": 4555106, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "708200aa39788ca996470eaa4e78f527", "sha256": "5c4017a3f73b221cefaf1d67ec68184a882c48386d361ef881474d4d6c3b4d56" }, "downloads": -1, "filename": "multifruits-0.1.0-cp36-cp36m-macosx_10_6_intel.whl", "has_sig": false, "md5_digest": "708200aa39788ca996470eaa4e78f527", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 71601, "upload_time": "2017-12-11T19:26:43", "url": "https://files.pythonhosted.org/packages/78/ea/f426aaada9598ba31cef32ecaa9a42ebed9836468e612dcad4a9d5d55ad8/multifruits-0.1.0-cp36-cp36m-macosx_10_6_intel.whl" }, { "comment_text": "", "digests": { "md5": "2bdf8c9d67b87158543c88c6d9f78697", "sha256": "982009cc6cf48ee119fcd0eff85064164c9a0fe78176c1e147102df0efc9598c" }, "downloads": -1, "filename": "multifruits-0.1.0.tar.gz", "has_sig": false, "md5_digest": "2bdf8c9d67b87158543c88c6d9f78697", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 57111, "upload_time": "2017-12-11T19:26:41", "url": "https://files.pythonhosted.org/packages/07/1d/376e22deb79d95493bf58cb5a587db3f4215965d7b6561d18c650e9e4277/multifruits-0.1.0.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "8bbdfbdc05b17bb637151cb4afe5a4f9", "sha256": "f923b6577614c938543cabd6122218bd883101f12f00dd31449a2412fccf4c88" }, "downloads": -1, "filename": "multifruits-0.1.1.tar.gz", "has_sig": false, "md5_digest": "8bbdfbdc05b17bb637151cb4afe5a4f9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 58584, "upload_time": "2018-03-23T15:49:30", "url": "https://files.pythonhosted.org/packages/99/0e/a8b005948ee3ce20d2de20b2f189c69f9cd77c30979743a2acd11368437d/multifruits-0.1.1.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "14744543231e33cd1ade3f5710830e2c", "sha256": "0d37ee1284bdcdfd56e29dae5a262faf98809916c2265c7a6ce42bdc1abc91c0" }, "downloads": -1, "filename": "multifruits-0.1.2.tar.gz", "has_sig": false, "md5_digest": "14744543231e33cd1ade3f5710830e2c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 58782, "upload_time": "2018-12-03T09:51:32", "url": "https://files.pythonhosted.org/packages/00/ee/959303a1282a1c9c31bfaa4c70afaa72914828e24f602bbafa77d5b81a96/multifruits-0.1.2.tar.gz" } ], "0.1.3": [ { "comment_text": "", "digests": { "md5": "a2077b9e2a93cb2fcc59b9cf04591680", "sha256": "f443a90d73611ee2cf0940416d6865cbb4c2064c33b4d82fff6e20316019a737" }, "downloads": -1, "filename": "multifruits-0.1.3.tar.gz", "has_sig": false, "md5_digest": "a2077b9e2a93cb2fcc59b9cf04591680", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 58818, "upload_time": "2018-12-03T09:54:33", "url": "https://files.pythonhosted.org/packages/49/43/3a592316df7ceaf6b4b314ab80bd8e734fce69431f05cc0877b1d87510ec/multifruits-0.1.3.tar.gz" } ], "0.1.4": [ { "comment_text": "", "digests": { "md5": "270b669fdf51f39a1fa5cd32a45ec906", "sha256": "5c23c6db9b6c19c5c6d86fc2a1d987121c8d012d9b82cb7cab6222f19ce2497f" }, "downloads": -1, "filename": "multifruits-0.1.4.tar.gz", "has_sig": false, "md5_digest": "270b669fdf51f39a1fa5cd32a45ec906", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 58765, "upload_time": "2018-12-03T09:59:21", "url": "https://files.pythonhosted.org/packages/b6/bf/5ee3b7d5f167408a22d912183b3230bbe87a4181553e906996eb5ef8b2ec/multifruits-0.1.4.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "270b669fdf51f39a1fa5cd32a45ec906", "sha256": "5c23c6db9b6c19c5c6d86fc2a1d987121c8d012d9b82cb7cab6222f19ce2497f" }, "downloads": -1, "filename": "multifruits-0.1.4.tar.gz", "has_sig": false, "md5_digest": "270b669fdf51f39a1fa5cd32a45ec906", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 58765, "upload_time": "2018-12-03T09:59:21", "url": "https://files.pythonhosted.org/packages/b6/bf/5ee3b7d5f167408a22d912183b3230bbe87a4181553e906996eb5ef8b2ec/multifruits-0.1.4.tar.gz" } ] }