{"id":24782088,"url":"https://github.com/rjotanm/enumetyped","last_synced_at":"2025-04-10T04:11:30.267Z","repository":{"id":274763756,"uuid":"924003478","full_name":"rjotanm/enumetyped","owner":"rjotanm","description":"Type-containing enumeration","archived":false,"fork":false,"pushed_at":"2025-02-13T12:20:20.000Z","size":45,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-24T05:31:04.433Z","etag":null,"topics":["enum","enumeration","hints","parsing","pydantic","python","validation"],"latest_commit_sha":null,"homepage":"https://pypi.org/project/enumetyped/","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/rjotanm.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":"2025-01-29T08:34:37.000Z","updated_at":"2025-02-27T14:47:59.000Z","dependencies_parsed_at":null,"dependency_job_id":"8e5ae729-dc9a-408a-908f-096d65bc7483","html_url":"https://github.com/rjotanm/enumetyped","commit_stats":null,"previous_names":["rjotanm/enumetyped"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rjotanm%2Fenumetyped","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rjotanm%2Fenumetyped/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rjotanm%2Fenumetyped/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rjotanm%2Fenumetyped/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rjotanm","download_url":"https://codeload.github.com/rjotanm/enumetyped/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248154992,"owners_count":21056543,"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","enumeration","hints","parsing","pydantic","python","validation"],"created_at":"2025-01-29T11:16:00.970Z","updated_at":"2025-04-10T04:11:30.258Z","avatar_url":"https://github.com/rjotanm.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Enumetyped\n\nThis package provide a way to create typed enumerations.\n\n# Install\n\n- `pip install enumetyped`\n- `pip install enumetyped[pydantic]` - install with pydantic `\u003e=2.9`\n\n# Quickstart\n\n#### Without pydantic\n```python\nfrom enumetyped import TypEnum, TypEnumContent\n\nclass SimpleEnum(TypEnum[TypEnumContent]):\n    A: type[\"SimpleEnum[NoValue]\"]\n    Int: type[\"SimpleEnum[int]\"]\n\n# isinstance checking\nassert isinstance(SimpleEnum.A(...), SimpleEnum)\nassert isinstance(SimpleEnum.Int(123), SimpleEnum.Int)\nassert not isinstance(SimpleEnum.Int(123), SimpleEnum.A)\n\n# fully pattern-matching\nmatch SimpleEnum.Int(1):\n    case SimpleEnum.Int(2):\n        a = False\n    case SimpleEnum.Int(1):\n        a = True\n    case SimpleEnum.Int():\n        a = True\n    case _:\n        a = False\n\nassert a\n```\n\n#### With pydantic\n\n```python\nimport typing\nfrom dataclasses import dataclass\n\nfrom pydantic import BaseModel\n\nfrom enumetyped import TypEnum, TypEnumContent, NoValue\nfrom enumetyped.pydantic import TypEnumPydantic, FieldMetadata, Rename\nfrom typing_extensions import Annotated, TypedDict\n\n\nclass Enum(TypEnum[NoValue]):\n    V1: type[\"Enum\"]\n    V2: type[\"Enum\"]\n\n\n@dataclass\nclass TestDataClass:\n    a: int\n\n\nclass TestModel(BaseModel):\n    b: str\n\n\nclass TestTypedDict(TypedDict):\n    tm: TestModel\n\n\nclass SimpleEnum(TypEnumPydantic[NoValue]):\n    V1: type[\"SimpleEnum\"]\n    V2: type[\"SimpleEnum\"]\n\n\nclass OtherEnum(TypEnumPydantic[TypEnumContent]):\n    Int: type[\"OtherEnum[int]\"]\n    Int: type[\"OtherEnum[str]\"]\n\n\n# class MyEnum(TypEnumPydantic[TypEnumContent], variant=\"key\", content=\"value\"): \u003c- adjacently\n# class MyEnum(TypEnumPydantic[TypEnumContent], variant=\"key\"): \u003c- internally\nclass MyEnum(TypEnumPydantic[TypEnumContent]):  # \u003c- externally, default\n    # MyEnum.Int(123)\n    Int: type[\"MyEnum[int]\"]\n\n    # MyEnum.Str(123)\n    Str: type[\"MyEnum[str]\"]\n\n    # MyEnum.Str(OtherEnum.Int(1))\n    Other: type[\"MyEnum[OtherEnum[Any]]\"]  # any from OtherEnum variants\n\n    # MyEnum.Str(MyEnum.Int(1)) | MyEnum.Str(MyEnum.Str(1))\n    Self: type[\"MyEnum[MyEnum[Any]]\"]  # any from self variants\n\n    # MyEnum.OnlySelf(...) - any parameters skipped, serialized just by name\n    NoValue: type[\"MyEnum[NoValue]\"]\n\n    # MyEnum.OnlySelf2(None)\n    Optional: type[\"MyEnum[Optional[bool]]\"]\n\n    # MyEnum.List([\"1\", \"2\", \"3\"])\n    List: type[\"MyEnum[list[str]]\"]\n\n    # MyEnum.Dict({\"key\": \"value\"})\n    Dict: type[\"MyEnum[dict[str, str]]\"]\n    # TypedDict: type[\"MyEnum[{\"b\": str}]\"]\n    TypedDict: type[\"MyEnum[TestD]\"]  # python doesn`t have inline TypedDict now\n\n    # MyEnum.DC(TestDataClass(a=1))\n    DataClass: type[\"MyEnum[TestDataClass]\"]\n\n    # MyEnum.Model(TestModel(b=\"2\"))\n    Model: type[\"MyEnum[TestModel]\"]\n\n    # MyEnum.StrTuple((\"1\", \"2\")))\n    StringTuple: Annotated[type[\"MyEnum[tuple[str, str]]\"], FieldMetadata(rename=\"just_str_tuple\")]\n    # or use enumetyped.pydantic.Rename\n    # StrTuple: Annotated[type[\"MyEnum[tuple[str, str]]\"], Rename(\"some_other_name\")]\n\n\nclass FinModel(BaseModel):\n    enum: MyEnum\n\n\ndef dump_and_load(e: MyEnum):\n    model = FinModel(enum=e)\n    json_ = model.model_dump_json()\n    print(json_)\n    restored = FinModel.model_validate_json(json_)\n    assert model == restored\n\n\n# externally -\u003e {\"enum\":{\"Int\":1}} \n# adjacently -\u003e {\"enum\":{\"key\":\"Int\",\"value\":1}}\n# internally -\u003e not supported\ndump_and_load(MyEnum.Int(1))\n\n# externally -\u003e {\"enum\":{\"Str\":\"str\"}}\n# adjacently -\u003e {\"enum\":{\"key\":\"Str\",\"value\":\"str\"}}\n# internally -\u003e not supported\ndump_and_load(MyEnum.Str(\"str\"))\n\n# externally -\u003e {\"enum\":{\"List\":[\"list\"]}}\n# adjacently -\u003e {\"enum\":{\"key\":\"List\",\"value\":[\"list\"]}}\n# internally -\u003e not supported\ndump_and_load(MyEnum.List([\"list\"]))\n\n# externally -\u003e {\"enum\":{\"just_str_tuple\":[\"str\",\"str2\"]}} \n# adjacently -\u003e {\"enum\":{\"key\":\"just_str_tuple\",\"value\":[\"str\",\"str2\"]}}\n# internally -\u003e not supported\ndump_and_load(MyEnum.StringTuple((\"str\", \"str2\")))\n\n# externally -\u003e {\"enum\":{\"Self\":{\"Int\":1}}} \n# adjacently -\u003e {\"enum\":{\"key\":\"Self\",\"value\":{\"key\":\"Int\",\"value\":1}}}\n# internally -\u003e not supported\ndump_and_load(MyEnum.Self(MyEnum.Int(1)))\n\n# externally -\u003e {\"enum\":{\"DC\":{\"a\":1}}} \n# adjacently -\u003e {\"enum\":{\"key\":\"DC\",\"value\":{\"a\":1}}}\n# internally -\u003e {\"enum\":{\"key\":\"DC\",\"a\":1}}}\ndump_and_load(MyEnum.DataClass(TestDataClass(a=1)))\n\n# externally -\u003e {\"enum\":{\"Model\":{\"b\":\"test_model\"}}} \n# adjacently -\u003e {\"enum\":{\"key\":\"Model\",\"value\":{\"b\":\"test_model\"}}}\n# internally -\u003e {\"enum\":{\"key\":\"Model\", \"b\":\"test_model\"}}\ndump_and_load(MyEnum.Model(TestModel(b=\"test_model\")))\n\n# externally -\u003e {\"enum\":{\"TypedDict\":{\"tm\":{\"b\":\"test_model\"}}}} \n# adjacently -\u003e {\"enum\":{\"key\":\"TypedDict\",\"value\":{\"tm\":{\"b\":\"test_model\"}}}}\n# internally -\u003e {\"enum\":{\"key\":\"TypedDict\",\"tm\":{\"b\":\"test_model\"}}}\ndump_and_load(MyEnum.TypedDict(TestTypedDict(tm=TestModel(b=\"test_model\"))))\n\n# externally -\u003e {\"enum\":{\"Dict\":{\"a\":\"1\",\"b\":\"2\"}}} \n# adjacently -\u003e {\"enum\":{\"key\":\"Dict\",\"value\":{\"a\":\"1\",\"b\":\"2\"}}}\n# internally -\u003e not supported\ndump_and_load(MyEnum.Dict({\"a\": \"1\", \"b\": \"2\"}))\n\n# externally -\u003e {\"enum\":\"NoValue\"}\n# adjacently -\u003e {\"enum\":{\"key\":\"NoValue\"}}\n# internally -\u003e {\"enum\":{\"key\":\"NoValue\"}}\ndump_and_load(MyEnum.NoValue(...))\n\n# externally -\u003e {\"enum\":{\"Optional\":null}} \n# adjacently -\u003e {\"enum\":{\"key\":\"Optional\",\"value\":null}}\n# internally -\u003e not supported\ndump_and_load(MyEnum.Optional(None))\n```\n\n#### Other\n\n - [Compatibility](docs/compatibility.md)\n - [Limitations](docs/limitations.md)","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frjotanm%2Fenumetyped","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frjotanm%2Fenumetyped","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frjotanm%2Fenumetyped/lists"}