{ "info": { "author": "Daniel Gerber", "author_email": "daniel.g.gerber@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.2", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Topic :: Internet" ], "description": "This module provides regular expressions according to `RFC 3986 \"Uniform\nResource Identifier (URI): Generic Syntax\"\n`_ and `RFC 3987 \"Internationalized\nResource Identifiers (IRIs)\" `_, and\nutilities for composition and relative resolution of references.\n\n\nAPI\n---\n\n**match** (string, rule='IRI_reference')\n Convenience function for checking if `string` matches a specific rule.\n\n Returns a match object or None::\n\n >>> assert match('%C7X', 'pct_encoded') is None\n >>> assert match('%C7', 'pct_encoded')\n >>> assert match('%c7', 'pct_encoded')\n\n\n\n**parse** (string, rule='IRI_reference')\n Parses `string` according to `rule` into a dict of subcomponents.\n\n If `rule` is None, parse an IRI_reference `without validation\n `_.\n\n If regex_ is available, any rule is supported; with re_, `rule` must be\n 'IRI_reference' or some special case thereof ('IRI', 'absolute_IRI',\n 'irelative_ref', 'irelative_part', 'URI_reference', 'URI', 'absolute_URI',\n 'relative_ref', 'relative_part'). ::\n\n >>> d = parse('http://tools.ietf.org/html/rfc3986#appendix-A',\n ... rule='URI')\n >>> assert all([ d['scheme'] == 'http',\n ... d['authority'] == 'tools.ietf.org',\n ... d['path'] == '/html/rfc3986',\n ... d['query'] == None,\n ... d['fragment'] == 'appendix-A' ])\n\n\n\n**compose** (\\*\\*parts)\n Returns an URI composed_ from named parts.\n\n .. _composed: http://tools.ietf.org/html/rfc3986#section-5.3\n\n\n**resolve** (base, uriref, strict=True, return_parts=False)\n Resolves_ an `URI reference` relative to a `base` URI.\n\n `Test cases `_::\n\n >>> base = resolve.test_cases_base\n >>> for relative, resolved in resolve.test_cases.items():\n ... assert resolve(base, relative) == resolved\n\n If `return_parts` is True, returns a dict of named parts instead of\n a string.\n\n Examples::\n\n >>> assert resolve('urn:rootless', '../../name') == 'urn:name'\n >>> assert resolve('urn:root/less', '../../name') == 'urn:/name'\n >>> assert resolve('http://a/b', 'http:g') == 'http:g'\n >>> assert resolve('http://a/b', 'http:g', strict=False) == 'http://a/g'\n\n .. _Resolves: http://tools.ietf.org/html/rfc3986#section-5.2\n\n\n\n**patterns**\n A dict of regular expressions with useful group names.\n Compilable (with regex_ only) without need for any particular compilation\n flag.\n\n**[bmp_][u]patterns[_no_names]**\n Alternative versions of `patterns`.\n [u]nicode strings without group names for the re_ module.\n BMP only for narrow builds.\n\n**get_compiled_pattern** (rule, flags=0)\n Returns a compiled pattern object for a rule name or template string.\n\n Usage for validation::\n\n >>> uri = get_compiled_pattern('^%(URI)s$')\n >>> assert uri.match('http://tools.ietf.org/html/rfc3986#appendix-A')\n >>> assert not get_compiled_pattern('^%(relative_ref)s$').match('#f#g')\n >>> from unicodedata import lookup\n >>> smp = 'urn:' + lookup('OLD ITALIC LETTER A') # U+00010300\n >>> assert not uri.match(smp)\n >>> m = get_compiled_pattern('^%(IRI)s$').match(smp)\n\n On narrow builds, non-BMP characters are (incorrectly) excluded::\n\n >>> assert NARROW_BUILD == (not m)\n\n For parsing, some subcomponents are captured in named groups (*only if*\n regex_ is available, otherwise see `parse`)::\n\n >>> match = uri.match('http://tools.ietf.org/html/rfc3986#appendix-A')\n >>> d = match.groupdict()\n >>> if REGEX:\n ... assert all([ d['scheme'] == 'http',\n ... d['authority'] == 'tools.ietf.org',\n ... d['path'] == '/html/rfc3986',\n ... d['query'] == None,\n ... d['fragment'] == 'appendix-A' ])\n\n >>> for r in patterns.keys():\n ... assert get_compiled_pattern(r)\n\n\n\n**format_patterns** (\\*\\*names)\n Returns a dict of patterns (regular expressions) keyed by\n `rule names for URIs`_ and `rule names for IRIs`_.\n\n See also the module level dicts of patterns, and `get_compiled_pattern`.\n\n To wrap a rule in a named capture group, pass it as keyword argument:\n rule_name='group_name'. By default, the formatted patterns contain no\n named groups.\n\n Patterns are `str` instances (be it in python 2.x or 3.x) containing ASCII\n characters only.\n\n Caveats:\n\n - with re_, named capture groups cannot occur on multiple branches of an\n alternation\n\n - with re_ before python 3.3, ``\\u`` and ``\\U`` escapes must be\n preprocessed (see `issue3665 `_)\n\n - on narrow builds, character ranges beyond BMP are not supported\n\n .. _rule names for URIs: http://tools.ietf.org/html/rfc3986#appendix-A\n .. _rule names for IRIs: http://tools.ietf.org/html/rfc3987#section-2.2\n\n\n\nDependencies\n------------\n\nSome features require regex_.\n\nThis package's docstrings are tested on python 2.6, 2.7, and 3.2 to 3.6.\nNote that in python<=3.2, characters beyond the Basic Multilingual Plane are\nnot supported on narrow builds (see `issue12729\n`_).\n\n\nRelease notes\n-------------\n\nversion 1.3.8:\n\n- fixed deprecated escape sequence\n\nversion 1.3.6:\n\n- fixed a bug in IPv6 pattern:\n\n >>> assert match('::0:0:0:0:0.0.0.0', 'IPv6address')\n\nversion 1.3.4:\n\n- allowed for lower case percent encoding\n\nversion 1.3.3:\n\n- fixed a bug in `resolve` which left \"../\" at the beginning of some paths\n\nversion 1.3.2:\n\n- convenience function `match`\n- patterns restricted to the BMP for narrow builds\n- adapted doctests for python 3.3\n- compatibility with python 2.6 (thanks to Thijs Janssen)\n\nversion 1.3.1:\n\n- some re_ compatibility: get_compiled_pattern, parse\n- dropped regex_ from setup.py requirements\n\nversion 1.3.0:\n\n- python 3.x compatibility\n- format_patterns\n\nversion 1.2.1:\n\n- compose, resolve\n\n\n.. _re: http://docs.python.org/library/re\n.. _regex: http://pypi.python.org/pypi/regex\n\n\nSupport\n-------\nThis is free software. You may show your appreciation with a `donation`_.\n\n.. _donation: http://danielgerber.net/\u00a4#Thanks-for-python-package-rfc3987\n\n\n\n", "description_content_type": "", "docs_url": null, "download_url": "https://github.com/dgerber/rfc3987", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://pypi.python.org/pypi/rfc3987", "keywords": "URI IRI URL rfc3986 rfc3987 validation", "license": "GNU GPLv3+", "maintainer": "", "maintainer_email": "", "name": "rfc3987", "package_url": "https://pypi.org/project/rfc3987/", "platform": "", "project_url": "https://pypi.org/project/rfc3987/", "project_urls": { "Download": "https://github.com/dgerber/rfc3987", "Homepage": "http://pypi.python.org/pypi/rfc3987" }, "release_url": "https://pypi.org/project/rfc3987/1.3.8/", "requires_dist": null, "requires_python": "", "summary": "Parsing and validation of URIs (RFC 3986) and IRIs (RFC 3987)", "version": "1.3.8" }, "last_serial": 4114130, "releases": { "1.1": [ { "comment_text": "", "digests": { "md5": "0380116b1a3d9729d10328a4a046fb25", "sha256": "5dec5233d11ee5cc978028d6c9a325ee06f0a50699334ba74cb3315266b1195f" }, "downloads": -1, "filename": "rfc3987-1.1.tar.gz", "has_sig": false, "md5_digest": "0380116b1a3d9729d10328a4a046fb25", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3404, "upload_time": "2012-03-22T15:45:40", "url": "https://files.pythonhosted.org/packages/03/2d/32af328092f787263e03ab55b64194233a961d72860244736853dda942ec/rfc3987-1.1.tar.gz" } ], "1.2.1": [ { "comment_text": "", "digests": { "md5": "11c7ba78b3e08b06ddaacb39360754ce", "sha256": "13fc7b7a7c827f408968d83b20b3d6b09dd626a5bba3a53af3689d40d1916395" }, "downloads": -1, "filename": "rfc3987-1.2.1.tar.gz", "has_sig": false, "md5_digest": "11c7ba78b3e08b06ddaacb39360754ce", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5325, "upload_time": "2012-03-29T12:23:51", "url": "https://files.pythonhosted.org/packages/09/ca/61fa927437e54b56c5c7945aa9ae7731599b510cf28fd1731804a0f23e31/rfc3987-1.2.1.tar.gz" } ], "1.3.0": [ { "comment_text": "", "digests": { "md5": "22d39de903971cbabf2275e0c3034a7a", "sha256": "102634dbf7f5af1c1e5caea6bb41b15c14f55db05b35e45bdbefb2985f84fac4" }, "downloads": -1, "filename": "rfc3987-1.3.0.tar.gz", "has_sig": false, "md5_digest": "22d39de903971cbabf2275e0c3034a7a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6350, "upload_time": "2012-04-25T14:30:49", "url": "https://files.pythonhosted.org/packages/0d/93/d04ace1aa1985ca738d0e3721af1fc7374d7ab8a94d49071ca6ae7179135/rfc3987-1.3.0.tar.gz" } ], "1.3.1": [ { "comment_text": "", "digests": { "md5": "397b1c1cd8b934269e53a621d56d9ed2", "sha256": "e73b7c3c0894cb525877587b5fabb350bddb88446439ac0c04acd1d61c6b982b" }, "downloads": -1, "filename": "rfc3987-1.3.1.tar.gz", "has_sig": false, "md5_digest": "397b1c1cd8b934269e53a621d56d9ed2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7051, "upload_time": "2012-06-02T18:17:22", "url": "https://files.pythonhosted.org/packages/1d/9d/ab69d12c4271dd5621325e1489536660c01444c28c019186e0e3ccf55685/rfc3987-1.3.1.tar.gz" } ], "1.3.2": [ { "comment_text": "", "digests": { "md5": "df65775d808c99a93a8f2d38604cbd9e", "sha256": "f7bbc0408e8b5f11ad544d7d1ef4ef31c166d02570907d59ec4535bc1eaa8f8d" }, "downloads": -1, "filename": "rfc3987-1.3.2.tar.gz", "has_sig": false, "md5_digest": "df65775d808c99a93a8f2d38604cbd9e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7377, "upload_time": "2013-10-30T10:52:55", "url": "https://files.pythonhosted.org/packages/58/1c/d5611c4067b33233ed9ffb733d03003b4608e99f017f3ce52e9d910ca1e3/rfc3987-1.3.2.tar.gz" } ], "1.3.3": [ { "comment_text": "", "digests": { "md5": "2f3df6a431e98caae8e37ac990314a28", "sha256": "2f67d21bebff1a3b04e48f82b9bbd01a28d0bfbdae9dc5de20ee7fa73c219aeb" }, "downloads": -1, "filename": "rfc3987-1.3.3.tar.gz", "has_sig": false, "md5_digest": "2f3df6a431e98caae8e37ac990314a28", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7544, "upload_time": "2013-12-09T09:06:23", "url": "https://files.pythonhosted.org/packages/ca/11/452b207faa0ab930117b84db31d88692bf42ca75c4c9d509ab6b3e7216e8/rfc3987-1.3.3.tar.gz" } ], "1.3.4": [ { "comment_text": "", "digests": { "md5": "40218a2f7c5c04c46ac03da73b27ee18", "sha256": "8bdd8bf28431bae754d34d60a23ca37aefa2cf8ade2de4a0e9d86e4a688b0c2e" }, "downloads": -1, "filename": "rfc3987-1.3.4.tar.gz", "has_sig": false, "md5_digest": "40218a2f7c5c04c46ac03da73b27ee18", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7637, "upload_time": "2014-03-08T10:38:56", "url": "https://files.pythonhosted.org/packages/b9/0f/817556896852b1305a86b77650bfa6ab73c6b55aa2c0589e979ea746477a/rfc3987-1.3.4.tar.gz" } ], "1.3.5": [ { "comment_text": "", "digests": { "md5": "a9c5ef8c3a988f1900c6bab2eb041718", "sha256": "7bcc47e4fb15b5215c244c8255cc02490f70ab166b05506174eb31a405626c26" }, "downloads": -1, "filename": "rfc3987-1.3.5-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "a9c5ef8c3a988f1900c6bab2eb041718", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 13474, "upload_time": "2016-01-22T11:18:22", "url": "https://files.pythonhosted.org/packages/53/bc/4a7bdd89bdb1a1e8e5798799920763cc996fd9f1211e0fba0c8a909a7216/rfc3987-1.3.5-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d129a862af0a4a096f0fc5fea8ed776d", "sha256": "ed37b839553370971a1d5cd53392206206c56ea550d435ef45e6d94e7df50697" }, "downloads": -1, "filename": "rfc3987-1.3.5.tar.gz", "has_sig": false, "md5_digest": "d129a862af0a4a096f0fc5fea8ed776d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8509, "upload_time": "2016-01-22T11:18:11", "url": "https://files.pythonhosted.org/packages/8a/13/81fbf1bbfc88e7df6b9a3c0202fff36461ae6dc9790268b6e60a116c5904/rfc3987-1.3.5.tar.gz" } ], "1.3.6": [ { "comment_text": "", "digests": { "md5": "eaa3061b361506363a17233a28e8eae6", "sha256": "0996b8bb785852d323687afb6ac0543072dd1e6e624505d45d10d1e40b24c8e4" }, "downloads": -1, "filename": "rfc3987-1.3.6-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "eaa3061b361506363a17233a28e8eae6", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 13344, "upload_time": "2016-05-19T15:52:14", "url": "https://files.pythonhosted.org/packages/e3/3c/88b8f2790b38a99fcb9841102aada50f244998384e23fae12a262a311eea/rfc3987-1.3.6-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "da7dabf5ee0b1426a2c6c4f8406ee0d3", "sha256": "599801156e35b5054138585c92ab4d1b729b0f2feeb961b65347116764df4aa7" }, "downloads": -1, "filename": "rfc3987-1.3.6.tar.gz", "has_sig": false, "md5_digest": "da7dabf5ee0b1426a2c6c4f8406ee0d3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8434, "upload_time": "2016-05-19T15:52:36", "url": "https://files.pythonhosted.org/packages/14/65/b414c853e8d02a1011ef7587d1bd43478f87a2d58f127a4c794e1f778de1/rfc3987-1.3.6.tar.gz" } ], "1.3.7": [ { "comment_text": "", "digests": { "md5": "c6e2241c6ad18d1f231ac22643821e3e", "sha256": "eb58b75dcc029c43d4be6dc2518fdd37c816c3acb2be1680f8a44071a2483b10" }, "downloads": -1, "filename": "rfc3987-1.3.7-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "c6e2241c6ad18d1f231ac22643821e3e", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 13338, "upload_time": "2016-10-03T09:48:33", "url": "https://files.pythonhosted.org/packages/4b/1d/315c7ce4b928af5f334bea695b274517249e56111e25032093cbdc219a55/rfc3987-1.3.7-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "aa108c7590902fe609c036864ecb7f84", "sha256": "91a7826b0a26c246a5a91bef09c2c0809c713a689be689b9571e78a13f6557a4" }, "downloads": -1, "filename": "rfc3987-1.3.7.tar.gz", "has_sig": false, "md5_digest": "aa108c7590902fe609c036864ecb7f84", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20701, "upload_time": "2016-10-03T09:48:36", "url": "https://files.pythonhosted.org/packages/b1/fb/4c6eb50dcca68e8b1cbe2a550946a21223c10a8080e13f6580be5f6b5596/rfc3987-1.3.7.tar.gz" } ], "1.3.8": [ { "comment_text": "", "digests": { "md5": "846284d5da753a8c07830655ca29b6e4", "sha256": "10702b1e51e5658843460b189b185c0366d2cf4cff716f13111b0ea9fd2dce53" }, "downloads": -1, "filename": "rfc3987-1.3.8-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "846284d5da753a8c07830655ca29b6e4", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 13377, "upload_time": "2018-07-29T17:23:45", "url": "https://files.pythonhosted.org/packages/65/d4/f7407c3d15d5ac779c3dd34fbbc6ea2090f77bd7dd12f207ccf881551208/rfc3987-1.3.8-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b6c4028acdc788a9ba697e1c1d6b896c", "sha256": "d3c4d257a560d544e9826b38bc81db676890c79ab9d7ac92b39c7a253d5ca733" }, "downloads": -1, "filename": "rfc3987-1.3.8.tar.gz", "has_sig": false, "md5_digest": "b6c4028acdc788a9ba697e1c1d6b896c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20700, "upload_time": "2018-07-29T17:23:47", "url": "https://files.pythonhosted.org/packages/14/bb/f1395c4b62f251a1cb503ff884500ebd248eed593f41b469f89caa3547bd/rfc3987-1.3.8.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "846284d5da753a8c07830655ca29b6e4", "sha256": "10702b1e51e5658843460b189b185c0366d2cf4cff716f13111b0ea9fd2dce53" }, "downloads": -1, "filename": "rfc3987-1.3.8-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "846284d5da753a8c07830655ca29b6e4", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 13377, "upload_time": "2018-07-29T17:23:45", "url": "https://files.pythonhosted.org/packages/65/d4/f7407c3d15d5ac779c3dd34fbbc6ea2090f77bd7dd12f207ccf881551208/rfc3987-1.3.8-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b6c4028acdc788a9ba697e1c1d6b896c", "sha256": "d3c4d257a560d544e9826b38bc81db676890c79ab9d7ac92b39c7a253d5ca733" }, "downloads": -1, "filename": "rfc3987-1.3.8.tar.gz", "has_sig": false, "md5_digest": "b6c4028acdc788a9ba697e1c1d6b896c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20700, "upload_time": "2018-07-29T17:23:47", "url": "https://files.pythonhosted.org/packages/14/bb/f1395c4b62f251a1cb503ff884500ebd248eed593f41b469f89caa3547bd/rfc3987-1.3.8.tar.gz" } ] }