{"id":24501851,"url":"https://github.com/ravencentric/stringenum","last_synced_at":"2025-04-14T06:10:22.945Z","repository":{"id":263693644,"uuid":"891201781","full_name":"Ravencentric/stringenum","owner":"Ravencentric","description":"A small, dependency-free library offering additional enum.StrEnum subclasses and a backport for older Python versions.","archived":false,"fork":false,"pushed_at":"2025-01-01T09:30:18.000Z","size":113,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-24T20:38:29.792Z","etag":null,"topics":["enum","strenum"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Ravencentric.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-11-19T22:56:02.000Z","updated_at":"2025-01-01T09:30:15.000Z","dependencies_parsed_at":"2024-12-15T20:18:12.346Z","dependency_job_id":"61d1a8df-d868-488a-a3c5-08eaa3f31b87","html_url":"https://github.com/Ravencentric/stringenum","commit_stats":null,"previous_names":["ravencentric/stringenum"],"tags_count":6,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Ravencentric%2Fstringenum","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Ravencentric%2Fstringenum/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Ravencentric%2Fstringenum/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Ravencentric%2Fstringenum/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Ravencentric","download_url":"https://codeload.github.com/Ravencentric/stringenum/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248830395,"owners_count":21168272,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["enum","strenum"],"created_at":"2025-01-21T22:46:03.803Z","updated_at":"2025-04-14T06:10:22.912Z","avatar_url":"https://github.com/Ravencentric.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# stringenum\n\n\u003cdiv align=\"center\"\u003e\n\n[![PyPI - Version](https://img.shields.io/pypi/v/stringenum?link=https%3A%2F%2Fpypi.org%2Fproject%2Fstringenum%2F)](https://pypi.org/project/stringenum/)\n![PyPI - Python Version](https://img.shields.io/pypi/pyversions/stringenum)\n![License](https://img.shields.io/github/license/Ravencentric/stringenum)\n![Checked with mypy](https://www.mypy-lang.org/static/mypy_badge.svg)\n![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)\n\n![GitHub Workflow Status (with event)](https://img.shields.io/github/actions/workflow/status/Ravencentric/stringenum/release.yml)\n![GitHub Actions Workflow Status](https://img.shields.io/github/actions/workflow/status/ravencentric/stringenum/tests.yml?label=tests)\n[![codecov](https://codecov.io/gh/Ravencentric/stringenum/graph/badge.svg?token=812Q3UZG7O)](https://codecov.io/gh/Ravencentric/stringenum)\n\n\u003c/div\u003e\n\n## Table Of Contents\n\n* [About](#about)\n* [Installation](#installation)\n* [Usage](#usage)\n* [License](#license)\n\n# About\n\nA small, dependency-free library offering additional [enum.StrEnum](https://docs.python.org/3/library/enum.html#enum.StrEnum) subclasses and a backport for older Python versions.\n\n## Installation\n\n`stringenum` is available on [PyPI](https://pypi.org/project/stringenum/), so you can simply use [pip](https://github.com/pypa/pip) to install it.\n\n```sh\npip install stringenum\n```\n\n# Usage\n\n- `stringenum.StrEnum` - A backport of [`enum.StrEnum`](https://docs.python.org/3/library/enum.html#enum.StrEnum). While `StrEnum` was added in Python 3.11, version 3.12 brought changes to the `__contains__` method in `EnumType`, which also impacts `StrEnum`. `stringenum.StrEnum` includes this `__contains__` update from Python 3.12.\n\n  - `enum.StrEnum` on Python \u003c=3.11\n    ```py\n    \u003e\u003e\u003e class Color(enum.StrEnum):\n    ...     RED = \"RED\"\n    ...     GREEN = \"GREEN\"\n\n    \u003e\u003e\u003e Color.RED in Color\n    True\n    \u003e\u003e\u003e \"RED\" in Color\n    Traceback (most recent call last):\n      ...\n    TypeError: unsupported operand type(s) for 'in': 'str' and 'EnumType'\n    ```\n\n  - `enum.StrEnum` on Python \u003e=3.12\n    ```py\n    \u003e\u003e\u003e class Color(enum.StrEnum):\n    ...     RED = \"RED\"\n    ...     GREEN = \"GREEN\"\n\n    \u003e\u003e\u003e Color.RED in Color\n    True\n    \u003e\u003e\u003e \"RED\" in Color\n    True\n    \u003e\u003e\u003e 12 in Color\n    False\n    ```\n\n  - `stringenum.StrEnum` on Python \u003e=3.9\n    ```py\n    \u003e\u003e\u003e class Color(stringenum.StrEnum):\n    ...     RED = \"RED\"\n    ...     GREEN = \"GREEN\"\n\n    \u003e\u003e\u003e Color.RED in Color\n    True\n    \u003e\u003e\u003e \"RED\" in Color\n    True\n    \u003e\u003e\u003e 12 in Color\n    False\n    ```\n\n- `stringenum.DuplicateFreeStrEnum` - A subclass of `StrEnum` that ensures all members have unique values and names, raising a `ValueError` if duplicates are found.\n\n    ```py\n    \u003e\u003e\u003e class Fruits(DuplicateFreeStrEnum):\n    ...     APPLE = \"apple\"\n    ...     BANANA = \"banana\"\n    ...     ORANGE = \"apple\"\n    ...\n    Traceback (most recent call last):\n      ...\n    ValueError: Duplicate values are not allowed in Fruits: \u003cFruits.ORANGE: 'apple'\u003e\n    ```\n\n- `stringenum.CaseInsensitiveStrEnum` - A subclass of `DuplicateFreeStrEnum` that supports case-insensitive lookup.\n\n    ```py\n    \u003e\u003e\u003e class Pet(CaseInsensitiveStrEnum):\n    ...     CAT = \"meow\"\n    ...     DOG = \"bark\"\n\n    \u003e\u003e\u003e Pet(\"Meow\")\n    \u003cPet.CAT: 'meow'\u003e\n\n    \u003e\u003e\u003e Pet(\"BARK\")     \n    \u003cPet.DOG: 'bark'\u003e\n\n    \u003e\u003e\u003e Pet[\"Cat\"]\n    \u003cPet.CAT: 'meow'\u003e\n\n    \u003e\u003e\u003e Pet[\"dog\"] \n    \u003cPet.DOG: 'bark'\u003e\n    ```\n\n- `stringenum.DoubleSidedStrEnum` - A subclass of `DuplicateFreeStrEnum` that supports double-sided lookup, allowing both member values and member names to be used for lookups.\n\n    ```py\n    \u003e\u003e\u003e class Status(DoubleSidedStrEnum):\n    ...     PENDING = \"waiting\"\n    ...     REJECTED = \"denied\"\n\n    \u003e\u003e\u003e Status(\"PENDING\")\n    \u003cStatus.PENDING: 'waiting'\u003e\n\n    \u003e\u003e\u003e Status(\"waiting\")\n    \u003cStatus.PENDING: 'waiting'\u003e\n\n    \u003e\u003e\u003e Status[\"REJECTED\"]\n    \u003cStatus.REJECTED: 'denied'\u003e\n\n    \u003e\u003e\u003e Status[\"denied\"]\n    \u003cStatus.REJECTED: 'denied'\u003e\n    ```\n\n- `stringenum.DoubleSidedCaseInsensitiveStrEnum` - A subclass of `DuplicateFreeStrEnum` that supports case-insenitive double-sided lookup, allowing both member values and member names to be used for lookups.\n\n    ```py\n    \u003e\u003e\u003e class Status(DoubleSidedCaseInsensitiveStrEnum):\n    ...     PENDING = \"waiting\"\n    ...     REJECTED = \"denied\"\n\n    \u003e\u003e\u003e Status(\"pending\")\n    \u003cStatus.PENDING: 'waiting'\u003e\n\n    \u003e\u003e\u003e Status(\"Waiting\")\n    \u003cStatus.PENDING: 'waiting'\u003e\n\n    \u003e\u003e\u003e Status[\"Rejected\"]\n    \u003cStatus.REJECTED: 'denied'\u003e\n\n    \u003e\u003e\u003e Status[\"DenieD\"]\n    \u003cStatus.REJECTED: 'denied'\u003e\n    ```\n\n## License\n\nDistributed under the [MIT](https://choosealicense.com/licenses/mit/) License. See [LICENSE](https://github.com/Ravencentric/stringenum/blob/main/LICENSE) for more information.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fravencentric%2Fstringenum","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fravencentric%2Fstringenum","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fravencentric%2Fstringenum/lists"}