{ "info": { "author": "John Thorvald Wodder II", "author_email": "headerparser@varonathe.org", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: PyPy", "Topic :: Communications :: Email", "Topic :: Communications :: Usenet News", "Topic :: Internet :: WWW/HTTP", "Topic :: Text Processing" ], "description": ".. image:: http://www.repostatus.org/badges/latest/active.svg\n :target: http://www.repostatus.org/#active\n :alt: Project Status: Active \u2014 The project has reached a stable, usable\n state and is being actively developed.\n\n.. image:: https://travis-ci.org/jwodder/headerparser.svg?branch=master\n :target: https://travis-ci.org/jwodder/headerparser\n\n.. image:: https://codecov.io/gh/jwodder/headerparser/branch/master/graph/badge.svg\n :target: https://codecov.io/gh/jwodder/headerparser\n\n.. image:: https://img.shields.io/pypi/pyversions/headerparser.svg\n :target: https://pypi.org/project/headerparser\n\n.. image:: https://img.shields.io/github/license/jwodder/headerparser.svg\n :target: https://opensource.org/licenses/MIT\n :alt: MIT License\n\n.. image:: https://img.shields.io/badge/Say%20Thanks-!-1EAEDB.svg\n :target: https://saythanks.io/to/jwodder\n\n`GitHub `_\n| `PyPI `_\n| `Documentation `_\n| `Issues `_\n| `Changelog `_\n\n``headerparser`` parses key-value pairs in the style of RFC 822 (e-mail)\nheaders and converts them into case-insensitive dictionaries with the trailing\nmessage body (if any) attached. Fields can be converted to other types, marked\nrequired, or given default values using an API based on the standard library's\n``argparse`` module. (Everyone loves ``argparse``, right?) Low-level\nfunctions for just scanning header fields (breaking them into sequences of\nkey-value pairs without any further processing) are also included.\n\nThe Format\n==========\nRFC 822-style headers are header fields that follow the general format of\ne-mail headers as specified by RFC 822 and friends: each field is a line of the\nform \"``Name: Value``\", with long values continued onto multiple lines\n(\"folded\") by indenting the extra lines. A blank line marks the end of the\nheader section and the beginning of the message body.\n\nThis basic grammar has been used by numerous textual formats besides e-mail,\nincluding but not limited to:\n\n- HTTP request & response headers\n- Usenet messages\n- most Python packaging metadata files\n- Debian packaging control files\n- ``META-INF/MANIFEST.MF`` files in Java JARs\n- a subset of the `YAML `_ serialization format\n\n\u2014 all of which this package can parse.\n\n\nInstallation\n============\nJust use `pip `_ (You have pip, right?) to install\n``headerparser`` and its dependencies::\n\n pip install headerparser\n\n\nExamples\n========\n\nDefine a parser::\n\n >>> import headerparser\n >>> parser = headerparser.HeaderParser()\n >>> parser.add_field('Name', required=True)\n >>> parser.add_field('Type', choices=['example', 'demonstration', 'prototype'], default='example')\n >>> parser.add_field('Public', type=headerparser.BOOL, default=False)\n >>> parser.add_field('Tag', multiple=True)\n >>> parser.add_field('Data')\n\nParse some headers and inspect the results::\n\n >>> msg = parser.parse_string('''\\\n ... Name: Sample Input\n ... Public: yes\n ... tag: doctest, examples,\n ... whatever\n ... TAG: README\n ... \n ... Wait, why I am using a body instead of the \"Data\" field?\n ... ''')\n >>> sorted(msg.keys())\n ['Name', 'Public', 'Tag', 'Type']\n >>> msg['Name']\n 'Sample Input'\n >>> msg['Public']\n True\n >>> msg['Tag']\n ['doctest, examples,\\n whatever', 'README']\n >>> msg['TYPE']\n 'example'\n >>> msg['Data']\n Traceback (most recent call last):\n ...\n KeyError: 'data'\n >>> msg.body\n 'Wait, why I am using a body instead of the \"Data\" field?\\n'\n\nFail to parse headers that don't meet your requirements::\n\n >>> parser.parse_string('Type: demonstration')\n Traceback (most recent call last):\n ...\n headerparser.errors.MissingFieldError: Required header field 'Name' is not present\n >>> parser.parse_string('Name: Bad type\\nType: other')\n Traceback (most recent call last):\n ...\n headerparser.errors.InvalidChoiceError: 'other' is not a valid choice for 'Type'\n >>> parser.parse_string('Name: unknown field\\nField: Value')\n Traceback (most recent call last):\n ...\n headerparser.errors.UnknownFieldError: Unknown header field 'Field'\n\nAllow fields you didn't even think of::\n\n >>> parser.add_additional()\n >>> msg = parser.parse_string('Name: unknown field\\nField: Value')\n >>> msg['Field']\n 'Value'\n\nJust split some headers into names & values and worry about validity later::\n\n >>> for field in headerparser.scan_string('''\\\n ... Name: Scanner Sample\n ... Unknown headers: no problem\n ... Unparsed-Boolean: yes\n ... CaSe-SeNsItIvE-rEsUlTs: true\n ... Whitespace around colons:optional\n ... Whitespace around colons : I already said it's optional.\n ... That means you have the _option_ to use as much as you want!\n ... \n ... And there's a body, too, I guess.\n ... '''): print(field)\n ('Name', 'Scanner Sample')\n ('Unknown headers', 'no problem')\n ('Unparsed-Boolean', 'yes')\n ('CaSe-SeNsItIvE-rEsUlTs', 'true')\n ('Whitespace around colons', 'optional')\n ('Whitespace around colons', \"I already said it's optional.\\n That means you have the _option_ to use as much as you want!\")\n (None, \"And there's a body, too, I guess.\\n\")\n\n\n", "description_content_type": "text/x-rst", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/jwodder/headerparser", "keywords": "e-mail,email,mail,rfc822,headers,rfc2822,rfc5322,parser", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "headerparser", "package_url": "https://pypi.org/project/headerparser/", "platform": "", "project_url": "https://pypi.org/project/headerparser/", "project_urls": { "Bug Tracker": "https://github.com/jwodder/headerparser/issues", "Documentation": "https://headerparser.readthedocs.io", "Homepage": "https://github.com/jwodder/headerparser", "Say Thanks!": "https://saythanks.io/to/jwodder", "Source Code": "https://github.com/jwodder/headerparser" }, "release_url": "https://pypi.org/project/headerparser/0.4.0/", "requires_dist": [ "six (~=1.1)" ], "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, <4", "summary": "argparse for mail-style headers", "version": "0.4.0" }, "last_serial": 5333564, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "51d5113dd26830714b525fb7231cf943", "sha256": "3c3f0208beb7752b82ac8953b2eccdd2545d7957be8d9d8e3e9a2c77c646440c" }, "downloads": -1, "filename": "headerparser-0.1.0-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "51d5113dd26830714b525fb7231cf943", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 16793, "upload_time": "2017-03-17T20:11:10", "url": "https://files.pythonhosted.org/packages/07/dc/0928ea77732a0ade9a8d5803a76d81370cb0f9aefdfe0843b3851118da2f/headerparser-0.1.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "16d3f81af73835109d4981bddd0f1943", "sha256": "390d003a5a65f9b317fd514ad77ec524f0cb8236fa26349adbd9d468faea0453" }, "downloads": -1, "filename": "headerparser-0.1.0.tar.gz", "has_sig": true, "md5_digest": "16d3f81af73835109d4981bddd0f1943", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18323, "upload_time": "2017-03-17T20:11:13", "url": "https://files.pythonhosted.org/packages/37/e9/aae30a018f7a8228bb5a7e0a9bdbb66c8726a3ecba7a6877f171b1617f98/headerparser-0.1.0.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "44d6e312c2eef5aa1ee42168eadc019b", "sha256": "1141cc11dc1f44f1731dc354a5d11d2eb4748957bdd73f304fb05884a200f4c2" }, "downloads": -1, "filename": "headerparser-0.2.0-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "44d6e312c2eef5aa1ee42168eadc019b", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, <4", "size": 18180, "upload_time": "2018-02-15T01:06:10", "url": "https://files.pythonhosted.org/packages/9e/63/e9c5809627cc739616b6197d95712587278ee3b68cd5085c589791bfc233/headerparser-0.2.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0b7f8cb709efeef4292567a583cd2ae9", "sha256": "3022bcfc423bab52d3b83a860af7aca0e0b04155e10434ed3d00449673f94121" }, "downloads": -1, "filename": "headerparser-0.2.0.tar.gz", "has_sig": true, "md5_digest": "0b7f8cb709efeef4292567a583cd2ae9", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, <4", "size": 24503, "upload_time": "2018-02-15T01:06:12", "url": "https://files.pythonhosted.org/packages/0f/01/05d8ae7ca81d066c2257bd022e9533203e1ba6f396ef4ab1c67b3fa7881b/headerparser-0.2.0.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "4cd894d08d3e29664d289c0d320ca16b", "sha256": "216ecee4a995c88c66764814c47c86109cf9fef564105a5a024d6efa6cdfb2b2" }, "downloads": -1, "filename": "headerparser-0.3.0-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "4cd894d08d3e29664d289c0d320ca16b", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, <4", "size": 15331, "upload_time": "2018-10-12T22:34:23", "url": "https://files.pythonhosted.org/packages/d2/79/1018ff7a5217d3c729cb6d8ed070d39b70e780e8a92d295190cb5fcec3ee/headerparser-0.3.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "42bc2c8b9b9db9a8fb7d1e6b69f90b32", "sha256": "747f6157670afea46cb7e3381e917e35734d7fa26706763678f33a65219474bb" }, "downloads": -1, "filename": "headerparser-0.3.0.tar.gz", "has_sig": true, "md5_digest": "42bc2c8b9b9db9a8fb7d1e6b69f90b32", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, <4", "size": 25091, "upload_time": "2018-10-12T22:34:24", "url": "https://files.pythonhosted.org/packages/c1/14/949be17abade4976a35be23323710bcf497e5f1313e7b21887f0545b54d3/headerparser-0.3.0.tar.gz" } ], "0.4.0": [ { "comment_text": "", "digests": { "md5": "17c6a95f51e8565ae127f22fe7d2d7e7", "sha256": "75857316449cdad212a3ba5c7b3b3177e45dd86e1f83b003f0b6b5108f14766e" }, "downloads": -1, "filename": "headerparser-0.4.0-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "17c6a95f51e8565ae127f22fe7d2d7e7", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, <4", "size": 16796, "upload_time": "2019-05-29T17:34:11", "url": "https://files.pythonhosted.org/packages/01/da/c6f6811e79df365c4e089ddf7704fdbb9062b5f1b8fc7aa8f21a62b2766a/headerparser-0.4.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "190d5f1e1391fbd14e8372c7c20ca700", "sha256": "b8ceae4c5e6133fda666d022684e93f9b3d45815c2c7881018123c71ff28c5cc" }, "downloads": -1, "filename": "headerparser-0.4.0.tar.gz", "has_sig": true, "md5_digest": "190d5f1e1391fbd14e8372c7c20ca700", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, <4", "size": 31285, "upload_time": "2019-05-29T17:34:14", "url": "https://files.pythonhosted.org/packages/ae/3b/c2b2f73880df51f1dd0d8f5111c886e1b34814028f58d14d9ece4a4c2acb/headerparser-0.4.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "17c6a95f51e8565ae127f22fe7d2d7e7", "sha256": "75857316449cdad212a3ba5c7b3b3177e45dd86e1f83b003f0b6b5108f14766e" }, "downloads": -1, "filename": "headerparser-0.4.0-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "17c6a95f51e8565ae127f22fe7d2d7e7", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, <4", "size": 16796, "upload_time": "2019-05-29T17:34:11", "url": "https://files.pythonhosted.org/packages/01/da/c6f6811e79df365c4e089ddf7704fdbb9062b5f1b8fc7aa8f21a62b2766a/headerparser-0.4.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "190d5f1e1391fbd14e8372c7c20ca700", "sha256": "b8ceae4c5e6133fda666d022684e93f9b3d45815c2c7881018123c71ff28c5cc" }, "downloads": -1, "filename": "headerparser-0.4.0.tar.gz", "has_sig": true, "md5_digest": "190d5f1e1391fbd14e8372c7c20ca700", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, <4", "size": 31285, "upload_time": "2019-05-29T17:34:14", "url": "https://files.pythonhosted.org/packages/ae/3b/c2b2f73880df51f1dd0d8f5111c886e1b34814028f58d14d9ece4a4c2acb/headerparser-0.4.0.tar.gz" } ] }