{ "info": { "author": "William W. Fisher", "author_email": "william.w.fisher@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Topic :: Software Development :: Internationalization" ], "description": "PRECIS-i18n: Internationalized Usernames and Passwords\n======================================================\n\n|MIT licensed| |Build Status| |codecov.io|\n\nIf you want your application to accept unicode user names and passwords,\nyou must be careful in how you validate and compare them. The PRECIS\nframework makes internationalized user names and passwords safer for use\nby applications. PRECIS profiles transform unicode strings into a\ncanonical form, suitable for comparison.\n\nThis module implements the PRECIS Framework as described in:\n\n- PRECIS Framework: Preparation, Enforcement, and Comparison of\n Internationalized Strings in Application Protocols (`RFC\n 8264 `__)\n- Preparation, Enforcement, and Comparison of Internationalized Strings\n Representing Usernames and Passwords (`RFC\n 8265 `__)\n- Preparation, Enforcement, and Comparison of Internationalized Strings\n Representing Nicknames (`RFC\n 8266 `__)\n\nRequires Python 3.3 or later.\n\nUsage\n-----\n\nUse the ``get_profile`` function to obtain a profile object, then use\nits ``enforce`` method. The ``enforce`` method returns a Unicode string.\n\n::\n\n\n >>> from precis_i18n import get_profile\n >>> username = get_profile('UsernameCaseMapped')\n >>> username.enforce('Kevin')\n 'kevin'\n >>> username.enforce('\\u212Aevin')\n 'kevin'\n >>> username.enforce('\\uFF2Bevin')\n 'kevin'\n >>> username.enforce('\\U0001F17Aevin')\n Traceback (most recent call last):\n ...\n UnicodeEncodeError: 'UsernameCaseMapped' codec can't encode character '\\U0001f17a' in position 0: DISALLOWED/symbols\n\nAlternatively, you can use the Python ``str.encode`` API. Import the\n``precis_i18n.codec`` module to register the PRECIS codec names. Now you\ncan use the ``str.encode`` method with any unicode string. The result\nwill be a UTF-8 encoded byte string or a ``UnicodeEncodeError`` if the\nstring is disallowed.\n\n::\n\n\n >>> import precis_i18n.codec\n >>> 'Kevin'.encode('UsernameCasePreserved')\n b'Kevin'\n >>> '\\u212Aevin'.encode('UsernameCasePreserved')\n b'Kevin'\n >>> '\\uFF2Bevin'.encode('UsernameCasePreserved')\n b'Kevin'\n >>> '\\u212Aevin'.encode('UsernameCaseMapped')\n b'kevin'\n >>> '\\uFF2Bevin'.encode('OpaqueString')\n b'\\xef\\xbc\\xabevin'\n >>> '\\U0001F17Aevin'.encode('UsernameCasePreserved')\n Traceback (most recent call last):\n ...\n UnicodeEncodeError: 'UsernameCasePreserved' codec can't encode character '\\U0001f17a' in position 0: DISALLOWED/symbols\n\nSupported Profiles and Codecs\n-----------------------------\n\nEach PRECIS profile has a corresponding codec name. The ``CaseMapped``\nvariant converts the string to lower case for implementing\ncase-insensitive comparison.\n\n- UsernameCasePreserved\n- UsernameCaseMapped\n- OpaqueString\n- NicknameCasePreserved\n- NicknameCaseMapped\n\nThe ``CaseMapped`` profiles use Unicode ``ToLower`` per the latest RFC. Previous\nverions of this package used Unicode Default Case Folding. There are CaseMapped variants\nfor different case transformations. These profile names are deprecated:\n\n- UsernameCaseMapped:ToLower\n- UsernameCaseMapped:CaseFold\n- NicknameCaseMapped:ToLower\n- NicknameCaseMapped:CaseFold\n\nThe PRECIS base string classes are also available as codecs:\n\n- IdentifierClass\n- FreeFormClass\n\nUserparts and Space Delimited Usernames\n---------------------------------------\n\nThe Username profiles in this implementation do not allow spaces. The Username\nprofiles correspond to the definition of \"userparts\" in RFC 8265. If you want to\nallow spaces in your application's usernames, you must split the string first.\n\n::\n\n def enforce_app_username(name):\n profile = precis_i18n.get_profile('UsernameCasePreserved')\n userparts = [profile.enforce(userpart) for userpart in name.split(' ')]\n return ' '.join(userparts)\n\nBe aware that a username constructed this way can contain bidirectional text in\nthe separate userparts.\n\nError Messages\n--------------\n\nA PRECIS profile raises a ``UnicodeEncodeError`` exception if a string\nis disallowed. The ``reason`` field specifies the kind of error.\n\n+------------------------------+---------------------------------------------+\n| Reason | Explanation |\n+==============================+=============================================+\n| DISALLOWED/arabic\\_indic | Arabic-Indic digits cannot be mixed with |\n| | Extended Arabic-Indic Digits. (Context) |\n+------------------------------+---------------------------------------------+\n| DISALLOWED/bidi\\_rule | Right-to-left string cannot contain |\n| | left-to-right characters due to the \"Bidi\" |\n| | rule. (Context) |\n+------------------------------+---------------------------------------------+\n| DISALLOWED/controls | Control character is not allowed. |\n+------------------------------+---------------------------------------------+\n| DISALLOWED/empty | After applying the profile, the result |\n| | cannot be empty. |\n+------------------------------+---------------------------------------------+\n| DISALLOWED/exceptions | Exception character is not allowed. |\n+------------------------------+---------------------------------------------+\n| DISALLOWED/extended\\_arabic\\ | Extended Arabic-Indic digits cannot be |\n| _indic | mixed with Arabic-Indic Digits. (Context) |\n+------------------------------+---------------------------------------------+\n| DISALLOWED/greek\\_keraia | Greek keraia must be followed by a Greek |\n| | character. (Context) |\n+------------------------------+---------------------------------------------+\n| DISALLOWED/has\\_compat | Compatibility characters are not allowed. |\n+------------------------------+---------------------------------------------+\n| DISALLOWED/hebrew\\ | Hebrew punctuation geresh or gershayim must |\n| _punctuation | be preceded by Hebrew character. (Context) |\n+------------------------------+---------------------------------------------+\n| DISALLOWED/katakana\\_middle\\ | Katakana middle dot must be accompanied by |\n| _dot | a Hiragana, Katakana, or Han character. |\n| | (Context) |\n+------------------------------+---------------------------------------------+\n| DISALLOWED/middle\\_dot | Middle dot must be surrounded by the letter |\n| | 'l'. (Context) |\n+------------------------------+---------------------------------------------+\n| DISALLOWED/not\\_idempotent | After reapplying the profile, the result is |\n| | not stable. |\n+------------------------------+---------------------------------------------+\n| DISALLOWED/old\\_hangul\\_jamo | Conjoining Hangul Jamo is not allowed. |\n+------------------------------+---------------------------------------------+\n| DISALLOWED/other | Other character is not allowed. |\n+------------------------------+---------------------------------------------+\n| DISALLOWED/other\\_letter\\ | Non-traditional letter or digit is not |\n| _digits | allowed. |\n+------------------------------+---------------------------------------------+\n| DISALLOWED/precis\\ | Default ignorable or non-character is not |\n| _ignorable\\_properties | allowed. |\n+------------------------------+---------------------------------------------+\n| DISALLOWED/punctuation | Non-ASCII punctuation character is not |\n| | allowed. |\n+------------------------------+---------------------------------------------+\n| DISALLOWED/spaces | Space character is not allowed. |\n+------------------------------+---------------------------------------------+\n| DISALLOWED/symbols | Non-ASCII symbol character is not allowed. |\n+------------------------------+---------------------------------------------+\n| DISALLOWED/unassigned | Unassigned unicode character is not |\n| | allowed. |\n+------------------------------+---------------------------------------------+\n| DISALLOWED/zero\\_width\\ | Zero width joiner must immediately follow a |\n| _joiner | combining virama. (Context) |\n+------------------------------+---------------------------------------------+\n| DISALLOWED/zero\\_width\\ | Zero width non-joiner must immediately |\n| _nonjoiner | follow a combining virama, or appear where |\n| | it breaks a cursive connection in a |\n| | formally cursive script. (Context) |\n+------------------------------+---------------------------------------------+\n\n.. |MIT licensed| image:: https://img.shields.io/badge/license-MIT-blue.svg\n :target: https://raw.githubusercontent.com/byllyfish/precis_i18n/master/LICENSE.txt\n.. |Build Status| image:: https://travis-ci.org/byllyfish/precis_i18n.svg?branch=master\n :target: https://travis-ci.org/byllyfish/precis_i18n\n.. |codecov.io| image:: https://codecov.io/gh/byllyfish/precis_i18n/coverage.svg?branch=master\n :target: https://codecov.io/gh/byllyfish/precis_i18n?branch=master\n\n\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/byllyfish/precis_i18n", "keywords": "precis codec username password", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "precis-i18n", "package_url": "https://pypi.org/project/precis-i18n/", "platform": "", "project_url": "https://pypi.org/project/precis-i18n/", "project_urls": { "Homepage": "https://github.com/byllyfish/precis_i18n" }, "release_url": "https://pypi.org/project/precis-i18n/1.0.1/", "requires_dist": null, "requires_python": "", "summary": "PRECIS-i18n: Internationalized Usernames and Passwords", "version": "1.0.1" }, "last_serial": 5527867, "releases": { "0.2.0": [ { "comment_text": "", "digests": { "md5": "8d0c26af8614b376b71ff3cd41caee7b", "sha256": "1fcddfa9a15ec33bde6aa448f8af2376087f6c27752055e741f7c7603c75b267" }, "downloads": -1, "filename": "precis_i18n-0.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "8d0c26af8614b376b71ff3cd41caee7b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 17517, "upload_time": "2016-10-05T23:57:06", "url": "https://files.pythonhosted.org/packages/66/1d/8d3565a261e549082da3ae3e0e9b24bf196f1c6a7ec0adb6f33195c5b392/precis_i18n-0.2.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "aaa686dd8e78f1c221f2acbf1ae918b2", "sha256": "d9c986b42e1cfbed6a560a540bcdb60aef19e2fafde881ee1f9c930964cf0d1b" }, "downloads": -1, "filename": "precis_i18n-0.2.0.tar.gz", "has_sig": false, "md5_digest": "aaa686dd8e78f1c221f2acbf1ae918b2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19426, "upload_time": "2016-10-05T23:57:09", "url": "https://files.pythonhosted.org/packages/a8/e4/38d274ee4fd44067c50235bc48e85fdc2d38a4f6c47f89cf9838bd32d84c/precis_i18n-0.2.0.tar.gz" } ], "0.2.2": [ { "comment_text": "", "digests": { "md5": "4121b8aa938ac26c37d1ae7d784234e4", "sha256": "5820f011bea99709dcaeb5d23560f14bb484bdce69c5bf91e55e34002d8bd72c" }, "downloads": -1, "filename": "precis_i18n-0.2.2-py3-none-any.whl", "has_sig": false, "md5_digest": "4121b8aa938ac26c37d1ae7d784234e4", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 17602, "upload_time": "2016-10-06T21:20:48", "url": "https://files.pythonhosted.org/packages/8a/97/963fea291acac14f4f61ecea4a220f2fab28db081dd7d327976a9d45e163/precis_i18n-0.2.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "65033ba933c14811dcfd078a7ea8c513", "sha256": "5f2368bb134ef95f9f39e2dcadb671ec4783b264f7b58721825aabca3839f6eb" }, "downloads": -1, "filename": "precis_i18n-0.2.2.tar.gz", "has_sig": false, "md5_digest": "65033ba933c14811dcfd078a7ea8c513", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22347, "upload_time": "2016-10-06T21:20:51", "url": "https://files.pythonhosted.org/packages/66/26/c1f625340e68e281a539b316a8f6c8274c87a3b793e6ede1502d365b3b71/precis_i18n-0.2.2.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "44298219c85aef96f79d786bb9982437", "sha256": "99ff71682e1096378f13811fada498ab3748c2b02cedda955d25ea00cae72a23" }, "downloads": -1, "filename": "precis_i18n-0.3.0-py3-none-any.whl", "has_sig": false, "md5_digest": "44298219c85aef96f79d786bb9982437", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 18430, "upload_time": "2016-10-13T20:00:26", "url": "https://files.pythonhosted.org/packages/28/93/6267499f349b5179ed867ad3b352d3e16e110ca53d4c6d83ea7606039973/precis_i18n-0.3.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "3e73c7f8565fb1ccb35fc924fe3d71de", "sha256": "92e2e34422e395caaac8a30c71ce43bb95ea34fa481757834a4df8f72aeb5b25" }, "downloads": -1, "filename": "precis_i18n-0.3.0.tar.gz", "has_sig": false, "md5_digest": "3e73c7f8565fb1ccb35fc924fe3d71de", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23849, "upload_time": "2016-10-13T20:00:29", "url": "https://files.pythonhosted.org/packages/9a/ee/0e4c14e3676548c27f46ba17e5dfe278b2bd22c8a0442cd264ac9743db8f/precis_i18n-0.3.0.tar.gz" } ], "0.4.0": [ { "comment_text": "", "digests": { "md5": "813633233c43c6e2584b0fcad2c3bb44", "sha256": "26664ec9c9891f85a93244944ebcd13140b4c89ede3d43d2be3a055be65123d4" }, "downloads": -1, "filename": "precis_i18n-0.4.0-py3-none-any.whl", "has_sig": false, "md5_digest": "813633233c43c6e2584b0fcad2c3bb44", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 20213, "upload_time": "2016-11-28T03:54:49", "url": "https://files.pythonhosted.org/packages/3d/4b/232de13d71fe386c7c89b554f5fa3e66304ad6bd65b420010aac2b44091d/precis_i18n-0.4.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "747b504e82e366a587d1058ac1ef521d", "sha256": "7b4724466b6ca25e20c3caacccf74618d6e70a8681f8039077278b2e566694b2" }, "downloads": -1, "filename": "precis_i18n-0.4.0.tar.gz", "has_sig": false, "md5_digest": "747b504e82e366a587d1058ac1ef521d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 47705, "upload_time": "2016-11-28T03:54:51", "url": "https://files.pythonhosted.org/packages/39/d6/58ed08c920395b90aff6e593a0d79701315eaccdd2f62c1d6a03175b47b3/precis_i18n-0.4.0.tar.gz" } ], "0.4.1": [ { "comment_text": "", "digests": { "md5": "295a2ebdc6b9e9260d6aa0b472357011", "sha256": "ee072d7f93c2fb07cb6d6c6f1965a74a98c7196eb03db6099909ceec6e30579a" }, "downloads": -1, "filename": "precis_i18n-0.4.1-py3-none-any.whl", "has_sig": false, "md5_digest": "295a2ebdc6b9e9260d6aa0b472357011", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 21587, "upload_time": "2017-02-10T22:10:15", "url": "https://files.pythonhosted.org/packages/00/97/286941a67ecc2ed80413b901ea0405ba4c82c432b3928d345ae9e2092e3f/precis_i18n-0.4.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2c94464d0891866d99fe9d5a468956a4", "sha256": "7e429e0a3de7347e6e3b7f1de06474aafd113edb5b56607f54739b4678269863" }, "downloads": -1, "filename": "precis_i18n-0.4.1.tar.gz", "has_sig": false, "md5_digest": "2c94464d0891866d99fe9d5a468956a4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 49935, "upload_time": "2017-02-10T22:10:17", "url": "https://files.pythonhosted.org/packages/ec/32/7f2b4d88a2696f75d14ee7741d4b97e4d87aba01bda0026a5f8c008da7f4/precis_i18n-0.4.1.tar.gz" } ], "0.5.0": [ { "comment_text": "", "digests": { "md5": "bf38db9cf65947af8ada72d1e4f1af28", "sha256": "c2578fae3e0cefa5becf160800546cd26b02a5916acfe7cbedb9139e453fc805" }, "downloads": -1, "filename": "precis_i18n-0.5.0-py3-none-any.whl", "has_sig": false, "md5_digest": "bf38db9cf65947af8ada72d1e4f1af28", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 21742, "upload_time": "2017-02-14T18:42:56", "url": "https://files.pythonhosted.org/packages/9d/79/c7f0274767a47edbc03915f39c5e22e7e41bd7d33e1f3d64f0d250a59f45/precis_i18n-0.5.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8016db4f0ba2d7cc274c5c1b50ed0ce1", "sha256": "177dec8682c303c06a6029e00b1b918553a60874fb69410aa58050b447093be1" }, "downloads": -1, "filename": "precis_i18n-0.5.0.tar.gz", "has_sig": false, "md5_digest": "8016db4f0ba2d7cc274c5c1b50ed0ce1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 50606, "upload_time": "2017-02-14T18:42:58", "url": "https://files.pythonhosted.org/packages/e1/1d/6dce519ee25cff596bb21f69a56b74f42cae91520970f771fca217e47cda/precis_i18n-0.5.0.tar.gz" } ], "0.6.0": [ { "comment_text": "", "digests": { "md5": "80c7c80d2bc37466d91e8e8cf4d9db41", "sha256": "5354d86cd0e23c100aebad5cb3cdc50415f3308f3153cbd16ac38a94d2bef5a3" }, "downloads": -1, "filename": "precis_i18n-0.6.0-py3-none-any.whl", "has_sig": true, "md5_digest": "80c7c80d2bc37466d91e8e8cf4d9db41", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 24084, "upload_time": "2017-09-17T01:53:10", "url": "https://files.pythonhosted.org/packages/ea/ce/12e471b49ce3275a0f2c4ffeabee11f469be3d7cf006bf6b9a79530ca47a/precis_i18n-0.6.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5ec2e9266ccad13be29a98220f7446a5", "sha256": "d6ea94db10f4114d671b52b568bd0b968700d39baabe754d49f85f73b38baa95" }, "downloads": -1, "filename": "precis_i18n-0.6.0.tar.gz", "has_sig": true, "md5_digest": "5ec2e9266ccad13be29a98220f7446a5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 54487, "upload_time": "2017-09-17T01:53:12", "url": "https://files.pythonhosted.org/packages/a8/eb/553a6147af21a691428398324ac7ae44306f525a15dcc453893eaeb8bcda/precis_i18n-0.6.0.tar.gz" } ], "0.7.0": [ { "comment_text": "", "digests": { "md5": "4134a1129ad2d6e8076b185a67a1de2b", "sha256": "0b92a72cc70338f5b0a567c61cc847d49836f1c8106db8f2cead54ccc5615891" }, "downloads": -1, "filename": "precis_i18n-0.7.0-py3-none-any.whl", "has_sig": true, "md5_digest": "4134a1129ad2d6e8076b185a67a1de2b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 24145, "upload_time": "2017-11-08T00:24:59", "url": "https://files.pythonhosted.org/packages/35/30/1cf88c2993cee4ae52f24d2adbffe6ac0b364c98069736e247f900326c24/precis_i18n-0.7.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "43eabf6f511878cc67b3eab39b0dc1c6", "sha256": "72eacefaa52b743f961896f24b03bf073bf0a7c06bac9a189843f97d5817a129" }, "downloads": -1, "filename": "precis_i18n-0.7.0.tar.gz", "has_sig": true, "md5_digest": "43eabf6f511878cc67b3eab39b0dc1c6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 60680, "upload_time": "2017-11-08T00:25:00", "url": "https://files.pythonhosted.org/packages/13/cf/0f96c12bb5cbf2fee7ac3b9982170fae5649d81d237331e2a7620d08d42c/precis_i18n-0.7.0.tar.gz" } ], "1.0.0": [ { "comment_text": "", "digests": { "md5": "faf7f108ccf96a62037992862aaccb9e", "sha256": "f6942bbffec698d0d7e30c42f589f3f6da13e723d047997d0761a41facf2986f" }, "downloads": -1, "filename": "precis_i18n-1.0.0-py3-none-any.whl", "has_sig": true, "md5_digest": "faf7f108ccf96a62037992862aaccb9e", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 24181, "upload_time": "2018-02-03T20:47:12", "url": "https://files.pythonhosted.org/packages/08/9d/d32f1b7c6d280c82a786b629ba89bd9e3e8409b9e23a7309f76a78e46971/precis_i18n-1.0.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "518c3183339687589993f450a81aa3c0", "sha256": "227ac196b8a31b1209030bfbe90616dd375be946e0a9403349dd45851adf503e" }, "downloads": -1, "filename": "precis_i18n-1.0.0.tar.gz", "has_sig": true, "md5_digest": "518c3183339687589993f450a81aa3c0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 61251, "upload_time": "2018-02-03T20:47:14", "url": "https://files.pythonhosted.org/packages/1f/05/799c3c2c22b9c80f67a8cd4bd772804c6242ab4319974aff2b8d689755f8/precis_i18n-1.0.0.tar.gz" } ], "1.0.1": [ { "comment_text": "", "digests": { "md5": "2e95328abff85afc140b178f1a7ee707", "sha256": "dc9f9fb0c080af9454adce9cc1ddcd718309f3a99ca05186f65e9f6b0654dcd9" }, "downloads": -1, "filename": "precis_i18n-1.0.1-py3-none-any.whl", "has_sig": true, "md5_digest": "2e95328abff85afc140b178f1a7ee707", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 21998, "upload_time": "2019-07-13T20:51:32", "url": "https://files.pythonhosted.org/packages/b6/ec/9abe8377d9819fc0383992aaa1b8ce263b45a2371f9f30204abf61029937/precis_i18n-1.0.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8e702da3beca6271acdf91e2243c9422", "sha256": "5abd7c06e5247fb519089c7649c9b775f934f0d1cc0a680b44fbeb2d5403aed8" }, "downloads": -1, "filename": "precis_i18n-1.0.1.tar.gz", "has_sig": true, "md5_digest": "8e702da3beca6271acdf91e2243c9422", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 63941, "upload_time": "2019-07-13T20:51:33", "url": "https://files.pythonhosted.org/packages/b6/ed/c6e68eefdf7ace7a4bc16eadb9bb3ea57f912bfc437f8d3054ef69239880/precis_i18n-1.0.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "2e95328abff85afc140b178f1a7ee707", "sha256": "dc9f9fb0c080af9454adce9cc1ddcd718309f3a99ca05186f65e9f6b0654dcd9" }, "downloads": -1, "filename": "precis_i18n-1.0.1-py3-none-any.whl", "has_sig": true, "md5_digest": "2e95328abff85afc140b178f1a7ee707", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 21998, "upload_time": "2019-07-13T20:51:32", "url": "https://files.pythonhosted.org/packages/b6/ec/9abe8377d9819fc0383992aaa1b8ce263b45a2371f9f30204abf61029937/precis_i18n-1.0.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8e702da3beca6271acdf91e2243c9422", "sha256": "5abd7c06e5247fb519089c7649c9b775f934f0d1cc0a680b44fbeb2d5403aed8" }, "downloads": -1, "filename": "precis_i18n-1.0.1.tar.gz", "has_sig": true, "md5_digest": "8e702da3beca6271acdf91e2243c9422", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 63941, "upload_time": "2019-07-13T20:51:33", "url": "https://files.pythonhosted.org/packages/b6/ed/c6e68eefdf7ace7a4bc16eadb9bb3ea57f912bfc437f8d3054ef69239880/precis_i18n-1.0.1.tar.gz" } ] }