# StrEnum
[![Build Status](https://github.com/irgeek/StrEnum/workflows/Python%20package/badge.svg)](https://github.com/irgeek/StrEnum/actions)
StrEnum is a Python `enum.Enum` that inherits from `str` to complement
`enum.IntEnum` in the standard library. Supports python 3.7+.
## Installation
You can use [pip](https://pip.pypa.io/en/stable/) to install.
```bash
pip install StrEnum
```
## Usage
```python
from enum import auto
from strenum import StrEnum
class HttpMethod(StrEnum):
GET = auto()
HEAD = auto()
POST = auto()
PUT = auto()
DELETE = auto()
CONNECT = auto()
OPTIONS = auto()
TRACE = auto()
PATCH = auto()
assert HttpMethod.GET == "GET"
# You can use StrEnum values just like strings:
import urllib.request
req = urllib.request.Request('https://www.python.org/', method=HttpMethod.HEAD)
with urllib.request.urlopen(req) as response:
html = response.read()
assert len(html) == 0 # HEAD requests do not (usually) include a body
```
There are classes whose `auto()` value folds each member name to upper or lower
case:
```python
from enum import auto
from strenum import LowercaseStrEnum, UppercaseStrEnum
class Tag(LowercaseStrEnum):
Head = auto()
Body = auto()
Div = auto()
assert Tag.Head == "head"
assert Tag.Body == "body"
assert Tag.Div == "div"
class HttpMethod(UppercaseStrEnum):
Get = auto()
Head = auto()
Post = auto()
assert HttpMethod.Get == "GET"
assert HttpMethod.Head == "HEAD"
assert HttpMethod.Post == "POST"
```
As well as classes whose `auto()` value converts each member name to camelCase,
PascalCase, kebab-case, snake_case and MACRO_CASE:
```python
from enum import auto
from strenum import CamelCaseStrEnum, PascalCaseStrEnum
from strenum import KebabCaseStrEnum, SnakeCaseStrEnum
from strenum import MacroCaseStrEnum
class CamelTestEnum(CamelCaseStrEnum):
OneTwoThree = auto()
class PascalTestEnum(PascalCaseStrEnum):
OneTwoThree = auto()
class KebabTestEnum(KebabCaseStrEnum):
OneTwoThree = auto()
class SnakeTestEnum(SnakeCaseStrEnum):
OneTwoThree = auto()
class MacroTestEnum(MacroCaseStrEnum):
OneTwoThree = auto()
assert CamelTestEnum.OneTwoThree == "oneTwoThree"
assert PascalTestEnum.OneTwoThree == "OneTwoThree"
assert KebabTestEnum.OneTwoThree == "one-two-three"
assert SnakeTestEnum.OneTwoThree == "one_two_three"
assert MacroTestEnum.OneTwoThree == "ONE_TWO_THREE"
```
As with any Enum you can, of course, manually assign values.
```python
from strenum import StrEnum
class Shape(StrEnum):
CIRCLE = "Circle"
assert Shape.CIRCLE == "Circle"
```
Doing this with the case-changing classes, though, won't manipulate
values--whatever you assign is the value they end up with.
```python
from strenum import KebabCaseStrEnum
class Shape(KebabCaseStrEnum):
CIRCLE = "Circle"
# This will raise an AssertionError because the value wasn't converted to kebab-case.
assert Shape.CIRCLE == "circle"
```
## Contributing
Pull requests are welcome. For major changes, please open an issue first to
discuss what you would like to change.
Please ensure tests pass before submitting a PR. This repository uses
[Black](https://black.readthedocs.io/en/stable/) and
[Pylint](https://www.pylint.org/) for consistency. Both are run automatically
as part of the test suite.
## Running the tests
Tests can be run using `make`:
```
make test
```
This will create a virutal environment, install the module and its test
dependencies and run the tests. Alternatively you can do the same thing
manually:
```
python3 -m venv .venv
.venv/bin/pip install .[test]
.venv/bin/pytest
```
## License
[MIT](https://choosealicense.com/licenses/mit/)
**N.B. Starting with Python 3.11, `enum.StrEnum` is available in the standard
library. This implementation is _not_ a drop-in replacement for the standard
library implementation. Specifically, the Python devs have decided to case fold
name to lowercase by default when `auto()` is used which I think violates the
principle of least surprise.**
Raw data
{
"_id": null,
"home_page": "https://github.com/irgeek/StrEnum",
"name": "StrEnum",
"maintainer": "",
"docs_url": null,
"requires_python": "",
"maintainer_email": "",
"keywords": "",
"author": "James Sinclair",
"author_email": "james@nurfherder.com",
"download_url": "https://files.pythonhosted.org/packages/85/ad/430fb60d90e1d112a62ff57bdd1f286ec73a2a0331272febfddd21f330e1/StrEnum-0.4.15.tar.gz",
"platform": null,
"description": "# StrEnum\n\n[![Build Status](https://github.com/irgeek/StrEnum/workflows/Python%20package/badge.svg)](https://github.com/irgeek/StrEnum/actions)\n\nStrEnum is a Python `enum.Enum` that inherits from `str` to complement\n`enum.IntEnum` in the standard library. Supports python 3.7+.\n\n## Installation\n\nYou can use [pip](https://pip.pypa.io/en/stable/) to install.\n\n```bash\npip install StrEnum\n```\n\n## Usage\n\n```python\nfrom enum import auto\nfrom strenum import StrEnum\n\n\nclass HttpMethod(StrEnum):\n GET = auto()\n HEAD = auto()\n POST = auto()\n PUT = auto()\n DELETE = auto()\n CONNECT = auto()\n OPTIONS = auto()\n TRACE = auto()\n PATCH = auto()\n\n\nassert HttpMethod.GET == \"GET\"\n\n# You can use StrEnum values just like strings:\n\nimport urllib.request\n\nreq = urllib.request.Request('https://www.python.org/', method=HttpMethod.HEAD)\nwith urllib.request.urlopen(req) as response:\n html = response.read()\n\nassert len(html) == 0 # HEAD requests do not (usually) include a body\n```\n\nThere are classes whose `auto()` value folds each member name to upper or lower\ncase:\n\n```python\nfrom enum import auto\nfrom strenum import LowercaseStrEnum, UppercaseStrEnum\n\n\nclass Tag(LowercaseStrEnum):\n Head = auto()\n Body = auto()\n Div = auto()\n\n\nassert Tag.Head == \"head\"\nassert Tag.Body == \"body\"\nassert Tag.Div == \"div\"\n\n\nclass HttpMethod(UppercaseStrEnum):\n Get = auto()\n Head = auto()\n Post = auto()\n\n\nassert HttpMethod.Get == \"GET\"\nassert HttpMethod.Head == \"HEAD\"\nassert HttpMethod.Post == \"POST\"\n```\n\nAs well as classes whose `auto()` value converts each member name to camelCase,\nPascalCase, kebab-case, snake_case and MACRO_CASE:\n\n```python\nfrom enum import auto\nfrom strenum import CamelCaseStrEnum, PascalCaseStrEnum\nfrom strenum import KebabCaseStrEnum, SnakeCaseStrEnum\nfrom strenum import MacroCaseStrEnum\n\n\nclass CamelTestEnum(CamelCaseStrEnum):\n OneTwoThree = auto()\n\n\nclass PascalTestEnum(PascalCaseStrEnum):\n OneTwoThree = auto()\n\n\nclass KebabTestEnum(KebabCaseStrEnum):\n OneTwoThree = auto()\n\n\nclass SnakeTestEnum(SnakeCaseStrEnum):\n OneTwoThree = auto()\n\n\nclass MacroTestEnum(MacroCaseStrEnum):\n OneTwoThree = auto()\n\n\nassert CamelTestEnum.OneTwoThree == \"oneTwoThree\"\nassert PascalTestEnum.OneTwoThree == \"OneTwoThree\"\nassert KebabTestEnum.OneTwoThree == \"one-two-three\"\nassert SnakeTestEnum.OneTwoThree == \"one_two_three\"\nassert MacroTestEnum.OneTwoThree == \"ONE_TWO_THREE\"\n```\n\nAs with any Enum you can, of course, manually assign values.\n\n```python\nfrom strenum import StrEnum\n\n\nclass Shape(StrEnum):\n CIRCLE = \"Circle\"\n\n\nassert Shape.CIRCLE == \"Circle\"\n```\n\nDoing this with the case-changing classes, though, won't manipulate\nvalues--whatever you assign is the value they end up with.\n\n```python\nfrom strenum import KebabCaseStrEnum\n\n\nclass Shape(KebabCaseStrEnum):\n CIRCLE = \"Circle\"\n\n\n# This will raise an AssertionError because the value wasn't converted to kebab-case.\nassert Shape.CIRCLE == \"circle\"\n```\n\n## Contributing\n\nPull requests are welcome. For major changes, please open an issue first to\ndiscuss what you would like to change.\n\nPlease ensure tests pass before submitting a PR. This repository uses\n[Black](https://black.readthedocs.io/en/stable/) and\n[Pylint](https://www.pylint.org/) for consistency. Both are run automatically\nas part of the test suite.\n\n## Running the tests\n\nTests can be run using `make`:\n\n```\nmake test\n```\n\nThis will create a virutal environment, install the module and its test\ndependencies and run the tests. Alternatively you can do the same thing\nmanually:\n\n```\npython3 -m venv .venv\n.venv/bin/pip install .[test]\n.venv/bin/pytest\n```\n\n## License\n\n[MIT](https://choosealicense.com/licenses/mit/)\n\n**N.B. Starting with Python 3.11, `enum.StrEnum` is available in the standard\nlibrary. This implementation is _not_ a drop-in replacement for the standard\nlibrary implementation. Specifically, the Python devs have decided to case fold\nname to lowercase by default when `auto()` is used which I think violates the\nprinciple of least surprise.**\n",
"bugtrack_url": null,
"license": "",
"summary": "An Enum that inherits from str.",
"version": "0.4.15",
"project_urls": {
"Homepage": "https://github.com/irgeek/StrEnum"
},
"split_keywords": [],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "8169297302c5f5f59c862faa31e6cb9a4cd74721cd1e052b38e464c5b402df8b",
"md5": "47a901c7ac420ca5c0524f1dd3b8ec35",
"sha256": "a30cda4af7cc6b5bf52c8055bc4bf4b2b6b14a93b574626da33df53cf7740659"
},
"downloads": -1,
"filename": "StrEnum-0.4.15-py3-none-any.whl",
"has_sig": false,
"md5_digest": "47a901c7ac420ca5c0524f1dd3b8ec35",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": null,
"size": 8851,
"upload_time": "2023-06-29T22:02:56",
"upload_time_iso_8601": "2023-06-29T22:02:56.947495Z",
"url": "https://files.pythonhosted.org/packages/81/69/297302c5f5f59c862faa31e6cb9a4cd74721cd1e052b38e464c5b402df8b/StrEnum-0.4.15-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "85ad430fb60d90e1d112a62ff57bdd1f286ec73a2a0331272febfddd21f330e1",
"md5": "aa5e934c299dac8731c6db4008deab4d",
"sha256": "878fb5ab705442070e4dd1929bb5e2249511c0bcf2b0eeacf3bcd80875c82eff"
},
"downloads": -1,
"filename": "StrEnum-0.4.15.tar.gz",
"has_sig": false,
"md5_digest": "aa5e934c299dac8731c6db4008deab4d",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 23384,
"upload_time": "2023-06-29T22:02:58",
"upload_time_iso_8601": "2023-06-29T22:02:58.399318Z",
"url": "https://files.pythonhosted.org/packages/85/ad/430fb60d90e1d112a62ff57bdd1f286ec73a2a0331272febfddd21f330e1/StrEnum-0.4.15.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2023-06-29 22:02:58",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "irgeek",
"github_project": "StrEnum",
"travis_ci": false,
"coveralls": true,
"github_actions": true,
"lcname": "strenum"
}