# python-usernames
[![Build
Status](https://travis-ci.org/theskumar/python-usernames.svg?branch=v0.1.0)](https://travis-ci.org/theskumar/python-usernames)
[![Coverage
Status](https://coveralls.io/repos/theskumar/python-usernames/badge.svg?branch=master&service=github)](https://coveralls.io/github/theskumar/python-usernames?branch=master)
[![PyPI
version](https://badge.fury.io/py/python-usernames.svg)](http://badge.fury.io/py/python-usernames)
Python library to validate usernames suitable for use in public facing
applications where use can choose login names and sub-domains.
## Features
- Provides a default regex validator
- Validates against list of [banned
words](https://github.com/theskumar/python-usernames/blob/master/usernames/reserved_words.py)
that should not be used as username.
- Python 3.8+
## Installation
pip install python-usernames
## Usages
```python
from python_usernames import is_safe_username
>>> is_safe_username("jerk")
False # contains one of the banned words
>>> is_safe_username("handsome!")
False # contains non-url friendly `!`
```
**is\_safe\_username** takes the following optional arguments:
- `whitelist`: a case insensitive list of words that should be
considered as always safe. Default: `[]`
- `blacklist`: a case insensitive list of words that should be
considered as unsafe. Default: `[]`
- `max_length`: specify the maximun character a username can have.
Default: `None`
- `regex`: regular expression string that must pass before the banned
: words is checked.
The default regular expression is as follows:
^ # beginning of string
(?!_$) # no only _
(?![-.]) # no - or . at the beginning
(?!.*[_.-]{2}) # no __ or _. or ._ or .. or -- inside
[a-zA-Z0-9_.-]+ # allowed characters, atleast one must be present
(?<![.-]) # no - or . at the end
$ # end of string
## Further Reading
- [Let’s talk about
usernames](https://www.b-list.org/weblog/2018/feb/11/usernames/)
## Gotchas
Words like `bigcock12` will validated just fine, only equality against
the [banned word
lists](https://github.com/theskumar/python-usernames/blob/master/usernames/reserved_words.py)
is checked. We don't try to be smart to avoid [Scunthorpe
problem](https://en.wikipedia.org/wiki/Scunthorpe_problem). If you can
come up with a algorithm/solution, please create an issue/pr :).
## License
MIT
Raw data
{
"_id": null,
"home_page": "",
"name": "python-usernames",
"maintainer": "",
"docs_url": null,
"requires_python": ">=3.8",
"maintainer_email": "",
"keywords": "regex,safe,security,signup,user registration,username,validation",
"author": "",
"author_email": "Saurabh Kumar <python-usernames@saurabh-kumar.com>",
"download_url": "https://files.pythonhosted.org/packages/e4/0d/aad0e8609ad208f3972d9032266f452e04ef9919f8db7f9dab06f49782c7/python_usernames-1.0.0.tar.gz",
"platform": null,
"description": "# python-usernames\n\n[![Build\nStatus](https://travis-ci.org/theskumar/python-usernames.svg?branch=v0.1.0)](https://travis-ci.org/theskumar/python-usernames)\n[![Coverage\nStatus](https://coveralls.io/repos/theskumar/python-usernames/badge.svg?branch=master&service=github)](https://coveralls.io/github/theskumar/python-usernames?branch=master)\n[![PyPI\nversion](https://badge.fury.io/py/python-usernames.svg)](http://badge.fury.io/py/python-usernames)\n\nPython library to validate usernames suitable for use in public facing\napplications where use can choose login names and sub-domains.\n\n## Features\n\n- Provides a default regex validator\n- Validates against list of [banned\n words](https://github.com/theskumar/python-usernames/blob/master/usernames/reserved_words.py)\n that should not be used as username.\n- Python 3.8+\n\n## Installation\n\n pip install python-usernames\n\n## Usages\n\n```python\nfrom python_usernames import is_safe_username\n\n>>> is_safe_username(\"jerk\")\nFalse # contains one of the banned words\n\n>>> is_safe_username(\"handsome!\")\nFalse # contains non-url friendly `!`\n```\n\n**is\\_safe\\_username** takes the following optional arguments:\n\n- `whitelist`: a case insensitive list of words that should be\n considered as always safe. Default: `[]`\n- `blacklist`: a case insensitive list of words that should be\n considered as unsafe. Default: `[]`\n- `max_length`: specify the maximun character a username can have.\n Default: `None`\n\n- `regex`: regular expression string that must pass before the banned\n: words is checked.\n\nThe default regular expression is as follows:\n\n ^ # beginning of string\n (?!_$) # no only _\n (?![-.]) # no - or . at the beginning\n (?!.*[_.-]{2}) # no __ or _. or ._ or .. or -- inside\n [a-zA-Z0-9_.-]+ # allowed characters, atleast one must be present\n (?<![.-]) # no - or . at the end\n $ # end of string\n\n## Further Reading\n\n- [Let\u2019s talk about\n usernames](https://www.b-list.org/weblog/2018/feb/11/usernames/)\n\n## Gotchas\n\nWords like `bigcock12` will validated just fine, only equality against\nthe [banned word\nlists](https://github.com/theskumar/python-usernames/blob/master/usernames/reserved_words.py)\nis checked. We don't try to be smart to avoid [Scunthorpe\nproblem](https://en.wikipedia.org/wiki/Scunthorpe_problem). If you can\ncome up with a algorithm/solution, please create an issue/pr :).\n\n## License\n\nMIT\n",
"bugtrack_url": null,
"license": "",
"summary": "Python library to validate usernames suitable for use in public facing applications.",
"version": "1.0.0",
"project_urls": {
"Documentation": "https://github.com/theskumar/python-usernames/tree/main#readme",
"Source": "https://github.com/theskumar/python-usernames",
"Tracker": "https://github.com/theskumar/python-usernames/issues"
},
"split_keywords": [
"regex",
"safe",
"security",
"signup",
"user registration",
"username",
"validation"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "5f4fd0f708985dceefcb8e9cb1eefe2b5f3d88b624ec927bb85fa69f89de8f50",
"md5": "64ac70942f76381c0e46d4b1167631fb",
"sha256": "59fd41670d8ee550f93be1db25fb0112591b0566c44069d6d42ad26a5c71b474"
},
"downloads": -1,
"filename": "python_usernames-1.0.0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "64ac70942f76381c0e46d4b1167631fb",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.8",
"size": 5882,
"upload_time": "2023-06-17T13:56:58",
"upload_time_iso_8601": "2023-06-17T13:56:58.532227Z",
"url": "https://files.pythonhosted.org/packages/5f/4f/d0f708985dceefcb8e9cb1eefe2b5f3d88b624ec927bb85fa69f89de8f50/python_usernames-1.0.0-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "e40daad0e8609ad208f3972d9032266f452e04ef9919f8db7f9dab06f49782c7",
"md5": "c5a8f98aaf89254491f288c7e96fd7d8",
"sha256": "82c68b9dccb6d0571eded31fe47b91ebca4b25e530a8703e8c06ebd9198f3f4f"
},
"downloads": -1,
"filename": "python_usernames-1.0.0.tar.gz",
"has_sig": false,
"md5_digest": "c5a8f98aaf89254491f288c7e96fd7d8",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.8",
"size": 4993,
"upload_time": "2023-06-17T13:56:59",
"upload_time_iso_8601": "2023-06-17T13:56:59.427774Z",
"url": "https://files.pythonhosted.org/packages/e4/0d/aad0e8609ad208f3972d9032266f452e04ef9919f8db7f9dab06f49782c7/python_usernames-1.0.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2023-06-17 13:56:59",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "theskumar",
"github_project": "python-usernames",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "python-usernames"
}