From e207b8971e6579b38880112dd339f04c82cf0716 Mon Sep 17 00:00:00 2001 From: DoDiODev Date: Mon, 9 Nov 2026 13:42:49 +0100 Subject: [PATCH] build(python): migrate pydevlake and plugins to Pydantic 2 Move pydevlake from Pydantic 1.10 / SQLModel 0.0.8 / SQLAlchemy 1.4 to Pydantic 2.14 / SQLModel 0.0.38 / SQLAlchemy 2.0 and port azuredevops, glpi, redmine, zephyr and the e2e fakeplugin. - Optional fields get explicit None defaults (required in Pydantic 2). - Config classes, validators and __fields__ use the Pydantic 2 APIs. - ToolTable keeps v1 behavior for numbers in str fields (coerce_numbers_to_str). - autoextract validates the extracted values so they are coerced. - glpi reduces expanded dropdown values ('Name (id)') to the id before extraction; the names are still read from the raw data. - Regenerate the Poetry locks; Dependabot no longer ignores Pydantic majors, SQLModel stays ignored (0.0.48 rejects naive datetimes). Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .github/dependabot.yml | 14 +- .../azuredevops/azuredevops/migrations.py | 46 +- .../plugins/azuredevops/azuredevops/models.py | 62 +-- .../python/plugins/azuredevops/poetry.lock | 409 ++++++++++++------ .../python/plugins/glpi/glpi/migrations.py | 182 ++++---- backend/python/plugins/glpi/glpi/models.py | 179 ++++---- .../plugins/glpi/glpi/streams/tickets.py | 18 +- .../plugins/glpi/tests/collection_test.py | 2 +- .../python/plugins/glpi/tests/streams_test.py | 8 +- .../plugins/redmine/redmine/migrations.py | 92 ++-- .../python/plugins/redmine/redmine/models.py | 96 ++-- .../plugins/zephyr/zephyr/migrations.py | 136 +++--- .../python/plugins/zephyr/zephyr/models.py | 135 +++--- backend/python/pydevlake/poetry.lock | 399 +++++++++++------ .../python/pydevlake/pydevlake/__init__.py | 16 +- .../pydevlake/pydevlake/domain_layer/code.py | 22 +- .../pydevlake/domain_layer/devops.py | 64 +-- .../pydevlake/pydevlake/domain_layer/qa.py | 18 +- .../pydevlake/domain_layer/ticket.py | 116 ++--- .../python/pydevlake/pydevlake/extractor.py | 46 +- backend/python/pydevlake/pydevlake/ipc.py | 2 +- backend/python/pydevlake/pydevlake/message.py | 24 +- backend/python/pydevlake/pydevlake/model.py | 78 ++-- .../python/pydevlake/pydevlake/model_info.py | 25 +- backend/python/pydevlake/pydevlake/plugin.py | 2 +- .../pydevlake/pydevlake/testing/testing.py | 18 +- backend/python/pydevlake/pyproject.toml | 4 +- .../python/pydevlake/tests/migration_test.py | 2 +- backend/python/pydevlake/tests/stream_test.py | 2 +- .../python/test/fakeplugin/fakeplugin/main.py | 6 +- .../test/fakeplugin/fakeplugin/models.py | 4 +- backend/python/test/fakeplugin/poetry.lock | 409 ++++++++++++------ 32 files changed, 1587 insertions(+), 1049 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 0ae6cb5502b..eec992f541c 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -138,17 +138,11 @@ updates: - minor - patch ignore: - # pydevlake is written against Pydantic 1 and SQLModel 0.0.8. SQLModel is - # still pre-1.0, so SemVer treats even 0.0.8 -> 0.0.30 as a patch, yet that - # release pulls in SQLAlchemy 2 and Pydantic 2 and breaks - # `pydevlake/model.py` with "Passing primary_key is not supported when also - # passing a sa_column". Verified on a fork: the bump landed in the group - # and turned unit-test and test-e2e red. - # Drop both entries once pydevlake has been migrated to Pydantic 2. + # SQLModel is still pre-1.0, so SemVer treats every 0.0.x release as a + # patch, yet they change behavior: 0.0.48 rejects naive datetimes (which + # pydevlake stores) and pulls in SQLAlchemy 2.1. Bump it by hand and run + # the Python unit tests plus test-e2e (fakeplugin). - dependency-name: sqlmodel - - dependency-name: pydantic - update-types: - - version-update:semver-major # ------------------------------------------------------------- Docker ---- # diff --git a/backend/python/plugins/azuredevops/azuredevops/migrations.py b/backend/python/plugins/azuredevops/azuredevops/migrations.py index e12dc76e56b..1c71756d8a5 100644 --- a/backend/python/plugins/azuredevops/azuredevops/migrations.py +++ b/backend/python/plugins/azuredevops/azuredevops/migrations.py @@ -30,24 +30,24 @@ def init_schemas(b: MigrationScriptBuilder): class AzureDevOpsConnection(Connection): token: SecretStr - organization: Optional[str] + organization: Optional[str] = None class AzureDevopsTransformationRule(ToolTable, Model): name: str = Field(default="default") - refdiff: Optional[RefDiffOptions] - deployment_pattern: Optional[re.Pattern] - production_pattern: Optional[re.Pattern] + refdiff: Optional[RefDiffOptions] = None + deployment_pattern: Optional[re.Pattern] = None + production_pattern: Optional[re.Pattern] = None class GitRepository(ToolModel): id: str = Field(primary_key=True) name: str url: str - remote_url: Optional[str] - default_branch: Optional[str] + remote_url: Optional[str] = None + default_branch: Optional[str] = None project_id: str org_id: str - parent_repository_url: Optional[str] - provider: Optional[str] + parent_repository_url: Optional[str] = None + provider: Optional[str] = None class GitPullRequest(ToolModel): class PRStatus(Enum): @@ -56,21 +56,21 @@ class PRStatus(Enum): Completed = "completed" pull_request_id: int = Field(primary_key=True) - description: Optional[str] + description: Optional[str] = None status: PRStatus created_by_id: str created_by_name: str creation_date: datetime.datetime - closed_date: Optional[datetime.datetime] + closed_date: Optional[datetime.datetime] = None source_commit_sha: str target_commit_sha: str - merge_commit_sha: Optional[str] - url: Optional[str] - type: Optional[str] - title: Optional[str] - target_ref_name: Optional[str] - source_ref_name: Optional[str] - fork_repo_id: Optional[str] + merge_commit_sha: Optional[str] = None + url: Optional[str] = None + type: Optional[str] = None + title: Optional[str] = None + target_ref_name: Optional[str] = None + source_ref_name: Optional[str] = None + fork_repo_id: Optional[str] = None class GitPullRequestCommit(ToolModel): commit_id: str = Field(primary_key=True) @@ -96,10 +96,10 @@ class BuildResult(Enum): id: int = Field(primary_key=True, auto_increment=False) name: str - start_time: Optional[datetime.datetime] - finish_time: Optional[datetime.datetime] + start_time: Optional[datetime.datetime] = None + finish_time: Optional[datetime.datetime] = None status: BuildStatus - result: Optional[BuildResult] + result: Optional[BuildResult] = None source_branch: str source_version: str @@ -120,10 +120,10 @@ class JobResult(Enum): id: str = Field(primary_key=True) build_id: str name: str - startTime: Optional[datetime.datetime] - finishTime: Optional[datetime.datetime] + startTime: Optional[datetime.datetime] = None + finishTime: Optional[datetime.datetime] = None state: JobState - result: Optional[JobResult] + result: Optional[JobResult] = None b.create_tables( AzureDevOpsConnection, diff --git a/backend/python/plugins/azuredevops/azuredevops/models.py b/backend/python/plugins/azuredevops/azuredevops/models.py index 73f4d0764a8..fabf8978200 100644 --- a/backend/python/plugins/azuredevops/azuredevops/models.py +++ b/backend/python/plugins/azuredevops/azuredevops/models.py @@ -30,26 +30,26 @@ class AzureDevOpsConnection(Connection): token: SecretStr - organization: Optional[str] + organization: Optional[str] = None class GitRepositoryConfig(ScopeConfig): - refdiff: Optional[RefDiffOptions] - deployment_pattern: Optional[re.Pattern] - production_pattern: Optional[re.Pattern] + refdiff: Optional[RefDiffOptions] = None + deployment_pattern: Optional[re.Pattern] = None + production_pattern: Optional[re.Pattern] = None # Optional pattern with capture group to extract environment name from job/stage names # Example: r'(?:deploy|predeploy)[_-](.+?)(?:[_-](?:helm|terraform))?$' extracts 'xxxx-prod' from 'deploy_xxxx-prod_helm' - environment_pattern: Optional[re.Pattern] + environment_pattern: Optional[re.Pattern] = None class GitRepository(ToolScope, table=True): url: str - remote_url: Optional[str] - default_branch: Optional[str] + remote_url: Optional[str] = None + default_branch: Optional[str] = None project_id: str org_id: str - parent_repository_url: Optional[str] = Field(source='/parentRepository/url') - provider: Optional[str] + parent_repository_url: Optional[str] = Field(default=None, source='/parentRepository/url') + provider: Optional[str] = None updated_date: datetime.datetime = Field(source='/project/lastUpdateTime') def is_external(self): @@ -63,28 +63,28 @@ class PRStatus(Enum): Completed = "completed" pull_request_id: int = Field(primary_key=True) - description: Optional[str] + description: Optional[str] = None status: PRStatus created_by_id: str = Field(source='/createdBy/id') created_by_name: str = Field(source='/createdBy/displayName') creation_date: datetime.datetime - closed_date: Optional[datetime.datetime] + closed_date: Optional[datetime.datetime] = None source_commit_sha: str = Field(source='/lastMergeSourceCommit/commitId') target_commit_sha: str = Field(source='/lastMergeTargetCommit/commitId') - merge_commit_sha: Optional[str] = Field(source='/lastMergeCommit/commitId') - url: Optional[str] - type: Optional[str] = Field(source='/labels/0/name') # TODO: Add regex to scope config - title: Optional[str] - target_ref_name: Optional[str] - source_ref_name: Optional[str] - fork_repo_id: Optional[str] = Field(source='/forkSource/repository/id') + merge_commit_sha: Optional[str] = Field(default=None, source='/lastMergeCommit/commitId') + url: Optional[str] = None + type: Optional[str] = Field(default=None, source='/labels/0/name') # TODO: Add regex to scope config + title: Optional[str] = None + target_ref_name: Optional[str] = None + source_ref_name: Optional[str] = None + fork_repo_id: Optional[str] = Field(default=None, source='/forkSource/repository/id') class GitPullRequestCommit(ToolModel, table=True): commit_id: str = Field(primary_key=True) pull_request_id: str author_name: str = Field(source='/author/name') - author_email: Optional[str] = Field(source='/author/email') + author_email: Optional[str] = Field(default=None, source='/author/email') author_date: datetime.datetime = Field(source='/author/date') @@ -111,15 +111,15 @@ def __str__(self) -> str: id: int = Field(primary_key=True) name: str = Field(source='/definition/name') - queue_time: Optional[datetime.datetime] = Field(source='/queueTime') - start_time: Optional[datetime.datetime] - finish_time: Optional[datetime.datetime] + queue_time: Optional[datetime.datetime] = Field(default=None, source='/queueTime') + start_time: Optional[datetime.datetime] = None + finish_time: Optional[datetime.datetime] = None status: BuildStatus - result: Optional[BuildResult] + result: Optional[BuildResult] = None source_branch: str source_version: str - display_title: Optional[str] = Field(source='/triggerInfo/ci.message') - url: Optional[str] = Field(source='/_links/web/href') + display_title: Optional[str] = Field(default=None, source='/triggerInfo/ci.message') + url: Optional[str] = Field(default=None, source='/_links/web/href') class Job(ToolModel, table=True): @@ -145,10 +145,10 @@ def __str__(self) -> str: id: str = Field(primary_key=True) build_id: str = Field(primary_key=True) name: str - start_time: Optional[datetime.datetime] - finish_time: Optional[datetime.datetime] + start_time: Optional[datetime.datetime] = None + finish_time: Optional[datetime.datetime] = None state: JobState - result: Optional[JobResult] - identifier: Optional[str] - type: Optional[str] - parent_id: Optional[str] = Field(source='/parentId') + result: Optional[JobResult] = None + identifier: Optional[str] = None + type: Optional[str] = None + parent_id: Optional[str] = Field(default=None, source='/parentId') diff --git a/backend/python/plugins/azuredevops/poetry.lock b/backend/python/plugins/azuredevops/poetry.lock index c06b62b19e4..c105463bae2 100644 --- a/backend/python/plugins/azuredevops/poetry.lock +++ b/backend/python/plugins/azuredevops/poetry.lock @@ -1,5 +1,17 @@ # This file is automatically @generated by Poetry 2.5.1 and should not be changed by hand. +[[package]] +name = "annotated-types" +version = "0.8.0" +description = "Reusable constraint types to use with typing.Annotated" +optional = false +python-versions = ">=3.10" +groups = ["main"] +files = [ + {file = "annotated_types-0.8.0-py3-none-any.whl", hash = "sha256:f072f4d804ea359e4eaf198b1af7a8b0943881a87f31bb764f8bf219bb9419e0"}, + {file = "annotated_types-0.8.0.tar.gz", hash = "sha256:13b2beaad985e05e2d6407ee4c4f35590b11f8d693a258a561055cac8f64cab7"}, +] + [[package]] name = "certifi" version = "2026.10.23" @@ -461,57 +473,178 @@ files = [ [[package]] name = "pydantic" -version = "1.10.27" -description = "Data validation and settings management using python type hints" +version = "2.14.3" +description = "Data validation using Python type hints" optional = false -python-versions = ">=3.7" +python-versions = ">=3.10" groups = ["main"] files = [ - {file = "pydantic-1.10.27-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eae28e29ca3eff84c9dc74a93c1c855fc8a85ca8ff07dc59f85c7946ad82558d"}, - {file = "pydantic-1.10.27-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cc24e078b473fdc83ee1429ad48602d10a524e83e5109a39b96702df5471b2ea"}, - {file = "pydantic-1.10.27-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ca03f9faadded650da853023f46744ec7a5a5e7b19f22bf03892d005b22a0a36"}, - {file = "pydantic-1.10.27-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e95e77e46e4ba81ca198ab0c442ac92091b31025a8b887ef0a8b56455affb0e6"}, - {file = "pydantic-1.10.27-cp310-cp310-win_amd64.whl", hash = "sha256:eb7eac10d751991e208a3d76c19ab97bb8d478d7ba400ac48310b85af8638a2f"}, - {file = "pydantic-1.10.27-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c140c225280c949a72c8d36966b994b3739cf80640642971cc80c5f679ada94f"}, - {file = "pydantic-1.10.27-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:79a9d28e3de0dbea101c43f4361345859c169d9c8cd63d41af3b42ecb1e7fa9b"}, - {file = "pydantic-1.10.27-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:76b9dee80c3c3406fadd3a704166caee782e9dd6582d5a0cbc63df1003dfe102"}, - {file = "pydantic-1.10.27-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e6e4694479a27f50d90d1f6e1606d87692282624c2fa0ef70b2512e447c3fc91"}, - {file = "pydantic-1.10.27-cp311-cp311-win_amd64.whl", hash = "sha256:23c20016fc9386a666233b603c8ed72d6950139dc86c8ecdf8f9f4cc59737380"}, - {file = "pydantic-1.10.27-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b3134bb69d4f792f2e8d91822d413c2a65640534111a7bb5ad0dba7dddc84ba2"}, - {file = "pydantic-1.10.27-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7c0aec4fb3a905791791a181d960a6ba39e431b70d0efee53fd0702c5586f185"}, - {file = "pydantic-1.10.27-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:75b333b79e8651199a77d7d2e113595ed1c0922d3739208397190f0debff5627"}, - {file = "pydantic-1.10.27-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:712c696c21df56f42ed1659ca67a7ac7177961f5ec4f8daf3bdc51c94ecbeee3"}, - {file = "pydantic-1.10.27-cp312-cp312-win_amd64.whl", hash = "sha256:45fa35a6c596607d22e485521b222c871e8994df0951eaaf7d99c40738179c55"}, - {file = "pydantic-1.10.27-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:04e1816ffb3e95626fcdea60652475f62290fc8abccffd09506e04641d9ae84b"}, - {file = "pydantic-1.10.27-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ad8f316e7cc228ca083ec0ee46a6fa0a1462825fb0b5ee77a4e305ac2a3c4c69"}, - {file = "pydantic-1.10.27-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e2882264f36d8c9e33e28c246a1fb5ac72b1a3807aa8a56a0391496485643da2"}, - {file = "pydantic-1.10.27-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f4df9b90d62e4ef2baeab9ead89666355ffaece715cdbd422840a9fcf093b1b9"}, - {file = "pydantic-1.10.27-cp313-cp313-win_amd64.whl", hash = "sha256:55e59df95f80a2df7105760d032809b68b4197fc6be55fff4c2bed183e72ea53"}, - {file = "pydantic-1.10.27-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:a32f08d7c0761b37e83fccb872b8e0a5f3c239f7163efebcbb423e16fbbc8719"}, - {file = "pydantic-1.10.27-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:de052982b7ff0decccfd34ceb7ac3eccd7a4488c7f80357b79d4464b4cbec3f2"}, - {file = "pydantic-1.10.27-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:aafb6196650480014d02bb908a71d11f8d1281937c4fed2ababdf6f911bb2c46"}, - {file = "pydantic-1.10.27-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6f3ca6cc8e3a66dc84586c838605b241c8fec71d81e1533e1a4f1795286e10cb"}, - {file = "pydantic-1.10.27-cp314-cp314-win_amd64.whl", hash = "sha256:8dba906c8981a5b2d4489f394236496077eb0b5468614e2aa089d3e7f2e5792a"}, - {file = "pydantic-1.10.27-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e538d73928ff07da7655fc0f9b2695e5094746a5eaca5560707149c3d969ee55"}, - {file = "pydantic-1.10.27-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2d55abdaa56e5421da4c991398a808338a052839562d795439f2492c0d8bc274"}, - {file = "pydantic-1.10.27-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:25d6cb1e1911240721e9932c2da814585566f99056e2fb09ca329b0310d4853e"}, - {file = "pydantic-1.10.27-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:fff314506136b4c0b786405772aef88b8b01f6863c13303b5c934912c7ead1ad"}, - {file = "pydantic-1.10.27-cp38-cp38-win_amd64.whl", hash = "sha256:5972ec9abf2cbf017090c811310d520b552c2ac57663968e02307a161c4067f9"}, - {file = "pydantic-1.10.27-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:89079afb6aa3dfcb4785fa5f74463233c9fef460e54f59473393d4ca44ff105d"}, - {file = "pydantic-1.10.27-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5a8f34e9dbd87d143421b6af8ab7e9cb612856221a648a1b8c30f21e7ddb0007"}, - {file = "pydantic-1.10.27-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:216fdb8c0a97e0b0e9472538359f2d2ffd3d4554073a095bec8c0a28d7d9a3a9"}, - {file = "pydantic-1.10.27-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:01cff2fabf4f4d618d629201e27799cba4b5aefdce6c3db06b34e8ff48461e36"}, - {file = "pydantic-1.10.27-cp39-cp39-win_amd64.whl", hash = "sha256:301e615e7d9f9995e98e7fca916f3e4b4bc66ba1f98e596fe1e5af3ac5db0024"}, - {file = "pydantic-1.10.27-py3-none-any.whl", hash = "sha256:d714c3df0db634a6720abdc204d7b3bfc6c62d4ef7b4f9dcd64b37c29187a058"}, - {file = "pydantic-1.10.27.tar.gz", hash = "sha256:62906b7ca1237ceefb3db38276417286ee0cd2c81720a6b8932cc57bfeba496a"}, + {file = "pydantic-2.14.3-py3-none-any.whl", hash = "sha256:3f7b347782ab7e4cf4c798496ae3a82787d9f21ec12676a9c564355eeef8daa8"}, + {file = "pydantic-2.14.3.tar.gz", hash = "sha256:1054f237f4d4733e5a30e1e2333bd33a2004ab9ab1510bd053a9a31bb48e232d"}, ] [package.dependencies] -typing-extensions = ">=4.2.0" +annotated-types = ">=0.6.0" +pydantic-core = "2.50.4" +typing-extensions = ">=4.16.0" +typing-inspection = ">=0.4.4" [package.extras] -dotenv = ["python-dotenv (>=0.10.4)"] -email = ["email-validator (>=1.0.3)"] +email = ["email-validator (>=2.0.0)"] +timezone = ["tzdata ; platform_system == \"Windows\""] + +[[package]] +name = "pydantic-core" +version = "2.50.4" +description = "Core functionality for Pydantic validation and serialization" +optional = false +python-versions = ">=3.10" +groups = ["main"] +files = [ + {file = "pydantic_core-2.50.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:83d2beac85b757bfc404c5c0612df51c4ef33bbb7be65cf4a96b4da7cbc4ff4f"}, + {file = "pydantic_core-2.50.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:76e0065998159244ff4c097a6c05ff08019c6fbb6e597a85846e73044f0215b3"}, + {file = "pydantic_core-2.50.4-cp310-cp310-manylinux1_i686.manylinux_2_5_i686.whl", hash = "sha256:25e7e1080f9f7ce7cd9d114b31470ce912771bd02f38c824721d3c35d312abff"}, + {file = "pydantic_core-2.50.4-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c4c5a1770ecfe8bdb6c6f09f8d81ea4de04f7efb012fac1efa4ad315dccc1fd1"}, + {file = "pydantic_core-2.50.4-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.whl", hash = "sha256:2f6767122b37c780bb756a720a4eef2bc6a050a0a1143428834b3cbc89448bd2"}, + {file = "pydantic_core-2.50.4-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:86c7c4615634b5c57a79770f5b738354e45ae219a89949aeae84f19169a05283"}, + {file = "pydantic_core-2.50.4-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:6c7d7b0b596319e9ce79ef96ce57a14054a2eac629c0588a0539187a218be799"}, + {file = "pydantic_core-2.50.4-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ed9c0b6f236648dbf30d57e9f57e1f74878caafa04833a19f529b5ba5164b7a8"}, + {file = "pydantic_core-2.50.4-cp310-cp310-manylinux_2_31_riscv64.whl", hash = "sha256:dfcf6e51000b34f7026322cd9ea9bc340d745637e27e0bbc22f504b4f6b967ee"}, + {file = "pydantic_core-2.50.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:bd46bcc28ed85d3cf71581b42d90b4ebd1f2062f81879519fed209f8a4d1cfc6"}, + {file = "pydantic_core-2.50.4-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:696613a0c0e7b2b35356e389ba4195ce20cfe7a2fc2e992c87d974d973eabec7"}, + {file = "pydantic_core-2.50.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2980a701be88f9128a7470189fa3bcda5387f76c298a6f8e000fc29eb2a6f4e7"}, + {file = "pydantic_core-2.50.4-cp310-cp310-win32.whl", hash = "sha256:dd8bed00731a21e3106e5dd6bbffb6c775a2c0bbc7c0c9face534d830057bdc9"}, + {file = "pydantic_core-2.50.4-cp310-cp310-win_amd64.whl", hash = "sha256:e512c75ec5cf4475c1aa50ad975ecdf253f4963b06e152e1a11edd6de4010753"}, + {file = "pydantic_core-2.50.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:3e547ceec1da7382f01f9e13963023e53367a71802c88778b21b9645a077cbdf"}, + {file = "pydantic_core-2.50.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c813ada7a651193acda85b6bc1cf12abd4b37cd25c7c6a75d7183512cc374969"}, + {file = "pydantic_core-2.50.4-cp311-cp311-manylinux1_i686.manylinux_2_5_i686.whl", hash = "sha256:57fa0a9490785139f1a4e4f43891830d55dfe4408845c0c9cb5eff4aeaf75f69"}, + {file = "pydantic_core-2.50.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:30d4dc35bc0eea52202a90b3820445ee0072c820241bfa710a623a078c9b267b"}, + {file = "pydantic_core-2.50.4-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.whl", hash = "sha256:789f88dea57841cdebef392b5d6e90444d767117e9ff2e0d9172df5c9de6690c"}, + {file = "pydantic_core-2.50.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:d690121e80ab16e623415351ab24713534d4e500b3cadff216409cb6826063d4"}, + {file = "pydantic_core-2.50.4-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b42f64825f5d750228f08318a9bf4d723b7ecb4c472aedcb3013c3ec2dc1f949"}, + {file = "pydantic_core-2.50.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0574866e05f6adeecc520d87e87dd06210c0a51706341f6ef8421572f5a64444"}, + {file = "pydantic_core-2.50.4-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:dcf2c7eaaa4cafe8e49b017e5bb49e76e084ab6f0cd712ee4019c812b5cf68b8"}, + {file = "pydantic_core-2.50.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3b8ee2589a082739c522c1fe4be227412fcf108b903abb6672ae2f5570558882"}, + {file = "pydantic_core-2.50.4-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:aec3c2d741a8e3ee993de7f95f37afb51e31b169c95dbd29da4cf6688f340914"}, + {file = "pydantic_core-2.50.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8923fcd49f875e8a0448d7223d1fdf1a9973ae2d1f20d4158753ceb8909facd2"}, + {file = "pydantic_core-2.50.4-cp311-cp311-win32.whl", hash = "sha256:fc04affef30be98c1f36f0c422a4061ef618fdc1dde79f5ad5458dd496fecffa"}, + {file = "pydantic_core-2.50.4-cp311-cp311-win_amd64.whl", hash = "sha256:15bece43a02ad543c621c8305e67dedb5f27d378c5ba741e5a2c36523f8ef37f"}, + {file = "pydantic_core-2.50.4-cp311-cp311-win_arm64.whl", hash = "sha256:e498900bfbf7ddddd862f810440c09e9b81674739e8a11d619b40906dccd4a9a"}, + {file = "pydantic_core-2.50.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:32a991aebd165f227b7c7c60bb9d66c2c7de9c24308552da264c9938fde0f8d6"}, + {file = "pydantic_core-2.50.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1e20cbde2b6deb33a51d08cd168454dd9044ec7d4474056f4d98d63f51578783"}, + {file = "pydantic_core-2.50.4-cp312-cp312-manylinux1_i686.manylinux_2_5_i686.whl", hash = "sha256:8cceae48ae7f94990c2f4e36291e9ec9868735e8b0f19e4489a17b0422338466"}, + {file = "pydantic_core-2.50.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:16902a147b3da4840612164a5e67947104d63e978f7a57c395877a5e26690b9c"}, + {file = "pydantic_core-2.50.4-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.whl", hash = "sha256:d6e3485a5e5c01fb5339c1ee3d4b9e21e2135a2a9d44caafb71acd994487ee7c"}, + {file = "pydantic_core-2.50.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:629eae995185540406e3635df5d5cf1d44f19ea240840b835d3f44541ff694d8"}, + {file = "pydantic_core-2.50.4-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:41b2cd8b29dbb5a4c9828a70f50d1abfc92011115c813213d3a91205c6f731b3"}, + {file = "pydantic_core-2.50.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c81d98e27d9d9261909dcccab1ba5d6ea1c98b0bb9470e368604614fd1d36ddd"}, + {file = "pydantic_core-2.50.4-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:ca83a32b2b41653d89f09a3d22b770bca96da72273bef8f7a68136bdd1e8b823"}, + {file = "pydantic_core-2.50.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:817953730e4a73a09008b010c4a42396cefe799616a22df2ac21d3927b3080cf"}, + {file = "pydantic_core-2.50.4-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:664e74848c2f5fc27db8505fe24e1ecd3ac669412913bf73d176916f86cc08e2"}, + {file = "pydantic_core-2.50.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:219114f8dcdcbe4720d82ef016b1287ce5a0a67d7c69ca61524eb72e82aac344"}, + {file = "pydantic_core-2.50.4-cp312-cp312-win32.whl", hash = "sha256:67f7cc397e1d5556a801d1cba74de0d27d827eb242e6c036c0ca273c745414f1"}, + {file = "pydantic_core-2.50.4-cp312-cp312-win_amd64.whl", hash = "sha256:ea2f61b0bc12f3592288503961b764579dea0658852d96a0b3d823614d808821"}, + {file = "pydantic_core-2.50.4-cp312-cp312-win_arm64.whl", hash = "sha256:32d6dda86383645ec428ea64dfc277036f5cbc60a72238eab28b91a3fdb9a113"}, + {file = "pydantic_core-2.50.4-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:0f87ae9db5ba8d8de40dcb93982cf8dd544e6552a80d3345af51941cc2146b80"}, + {file = "pydantic_core-2.50.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1239daaf063e62213ca1f34d96663900bd7510c42a786e843fd328af70e46445"}, + {file = "pydantic_core-2.50.4-cp313-cp313-manylinux1_i686.manylinux_2_5_i686.whl", hash = "sha256:1afefe44ec042fbabfb4483ea258c04cf75ff4ff328d754f09b321fdaa232aca"}, + {file = "pydantic_core-2.50.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a9ee990bf2cfbd81574c5d4f9f6c9d480a14b5b43d2c4f2ca13f4c6f48089394"}, + {file = "pydantic_core-2.50.4-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.whl", hash = "sha256:ab2822bcdcefb54d1e8ca29f5e3ec3afe160fb794bb3a3a73b09d11ed2671104"}, + {file = "pydantic_core-2.50.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:0001d6920e3a5d92758cda460d6dc9f918a78ad6d5d092f1c8b5395e6b775356"}, + {file = "pydantic_core-2.50.4-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:ad92d255a165cde5f9882ff69699eaf5495e0a1f32e97566bbbb80f11e46781f"}, + {file = "pydantic_core-2.50.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fb2bb5b557080da398b866408117d98fe9731a12334afd0cdff221b458cdc5dc"}, + {file = "pydantic_core-2.50.4-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:92f8f63df729061bb14558ed740e7a222f6e2aa6c2e6a5bcfb4e706676562049"}, + {file = "pydantic_core-2.50.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:2a60ec2a57ac3ef3767e526e9bf706ec75aa3d79c4ea134d9d4fcf7c62a297a7"}, + {file = "pydantic_core-2.50.4-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:a2f8716344bbbd10443391be0b1f2003b34949e3c4e6883005c2bc498ab6b64b"}, + {file = "pydantic_core-2.50.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:b300a30304c4c6aeab03ed06809819d9eceacdd58441d3c7dffe41edfd006091"}, + {file = "pydantic_core-2.50.4-cp313-cp313-win32.whl", hash = "sha256:ef8a9ddb2e2a4eae4abb72dc0710eca6c2726779b0664bd10c3ce9fcfaed8c4e"}, + {file = "pydantic_core-2.50.4-cp313-cp313-win_amd64.whl", hash = "sha256:4c29b8f2d6417069bb1f257e6b9113f5d64dc2f554cc200ea90b4fe2c5cdb733"}, + {file = "pydantic_core-2.50.4-cp313-cp313-win_arm64.whl", hash = "sha256:a0c5210d038418a115e7cf8706bfa611bd14add2f5787274dba45aadca3155e0"}, + {file = "pydantic_core-2.50.4-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:5c074454dc6d4f6f4ba6561a56bf33a14db7651d882a5a5321ba3ae8868e082d"}, + {file = "pydantic_core-2.50.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:a4bb174bd65f795c39ad6642d9d5bdc43351b306b7d0a654ab0d0abb38be245f"}, + {file = "pydantic_core-2.50.4-cp314-cp314-manylinux1_i686.manylinux_2_5_i686.whl", hash = "sha256:0ec20aca2b067369913716847f7dfe5f4dddf16a46965b7a70bbad5defaaba86"}, + {file = "pydantic_core-2.50.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:70dbc9f83c41f37a4faa62dae5203853847223a891da446f48ef2efcfd5df806"}, + {file = "pydantic_core-2.50.4-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.whl", hash = "sha256:3de6c2a4df2af0ac9ab4dc1488746fe8b1a90e27955d870d9edda3187d20092b"}, + {file = "pydantic_core-2.50.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:3a48a5254d15a0ad050318bfc7a9566d4ec740118187e8f303e47a6840287eb7"}, + {file = "pydantic_core-2.50.4-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:0af56dbf8822ba9f4efcbbfdc15478f8b6fb08f1609860cb50aa2cc8476b3c34"}, + {file = "pydantic_core-2.50.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f1d62fb172db35c6478c9323da34ff37d1f3d37d7d44337a9d94ba8c583e5730"}, + {file = "pydantic_core-2.50.4-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:5c1013647be741647895c102831dcf79c34209662dbb683df9efb864417ed7d5"}, + {file = "pydantic_core-2.50.4-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:aeb2e123cbf978a905e9f55155c1b8316fbbfa7cf64d04521fe174bab302d100"}, + {file = "pydantic_core-2.50.4-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:523466eba8ee10f7480f3c2057563145978011c583130d2cc01fb1e7af808e25"}, + {file = "pydantic_core-2.50.4-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:c9e70012926e97069cdd09221861aff412aa94e4cac2e019055cdb79485b150c"}, + {file = "pydantic_core-2.50.4-cp314-cp314-pyemscripten_2026_0_wasm32.whl", hash = "sha256:e6da138a1ecc1341c8b788a5ee822670b03788e1f5decf7af9d461de6e508b8e"}, + {file = "pydantic_core-2.50.4-cp314-cp314-win32.whl", hash = "sha256:13b6dd62b5279f5b9d72f3bf918a35443ee8bd549241d9dc52d79a2c3b6d7016"}, + {file = "pydantic_core-2.50.4-cp314-cp314-win_amd64.whl", hash = "sha256:b0cdb655fbd1562c2dfc9986f9103a106f7058cd0915afc6e656d4b1d73f3387"}, + {file = "pydantic_core-2.50.4-cp314-cp314-win_arm64.whl", hash = "sha256:df1c174796cd63eb6b139f7daf783affe1f3ed659605850e843b24764c21bfc5"}, + {file = "pydantic_core-2.50.4-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:edbca8789fd10f0de534b660a6b4c71f1fd18039679c918dad392ab044bb37e4"}, + {file = "pydantic_core-2.50.4-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:33b21f69540a12c2053cd1d95766d8bd9667a3897f7c712a642de8aa37eb0865"}, + {file = "pydantic_core-2.50.4-cp314-cp314t-manylinux1_i686.manylinux_2_5_i686.whl", hash = "sha256:ffb616d8d55965839670301dc3bae3abacff560a7e137a89056058a8a9da4d96"}, + {file = "pydantic_core-2.50.4-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:6c5687b59b6ba0f663c4f2f15470f68507d6b45ccd3a19ee6d224f95cbee70d8"}, + {file = "pydantic_core-2.50.4-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.whl", hash = "sha256:c733087ecf7dde06b1d071679bfd5f3ba03266ba77814c1c7253bc48c9adedd9"}, + {file = "pydantic_core-2.50.4-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:94733cb447c37b0ce6f71b39ca1288d5f966a084023a5617b4cc35a852586859"}, + {file = "pydantic_core-2.50.4-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b26f39a5be3cd91a2035818be3d0ffdf5282c3e1f5f53d3b80b7024021acee52"}, + {file = "pydantic_core-2.50.4-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c856e439a9d54d514e81a7131229ba151cdf81df7c408e0f6c89340e5003dfe2"}, + {file = "pydantic_core-2.50.4-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:cbf0777d54672990b10cb8ca9b0523499e182d7e2ea39f86b138519a902aa601"}, + {file = "pydantic_core-2.50.4-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:edc17549ab592e33cfcaf285f047bb75fcd98f608aa9309af1187fd736ce9641"}, + {file = "pydantic_core-2.50.4-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:23a9ba564b2db709ff16eca990992ba95a19069972b34bff87c81d4b473cd755"}, + {file = "pydantic_core-2.50.4-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:41f4f8ae714e4fea1d635880f8a1af715ecf080eed4d13c5b04a0f3210f9c61a"}, + {file = "pydantic_core-2.50.4-cp314-cp314t-win32.whl", hash = "sha256:601fce6cea9ddeaa85329e12e7f351def38d233075f42a3012b9c48071b02941"}, + {file = "pydantic_core-2.50.4-cp314-cp314t-win_amd64.whl", hash = "sha256:22e874666bdbd96d6bf629d32cd8ab376fedf1fd62585b52a42b9fa9fa6c20b6"}, + {file = "pydantic_core-2.50.4-cp314-cp314t-win_arm64.whl", hash = "sha256:71395a43da5584bb70556f380387e15f845c0dcf76373c1afbfa0025737576ac"}, + {file = "pydantic_core-2.50.4-cp315-cp315-macosx_10_12_x86_64.whl", hash = "sha256:7ac2769a7ddd661e07e26c12220adc31b17014c48234b2a5a88993b8d4109e09"}, + {file = "pydantic_core-2.50.4-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:930ad463d3fb7a340d323bcc496ec32dae469ec9974c29ff569f19806b6b03b4"}, + {file = "pydantic_core-2.50.4-cp315-cp315-manylinux1_i686.manylinux_2_5_i686.whl", hash = "sha256:b867f9fd183d76977f810c626d539265183c25b2284762893a31e8d6cacc81c0"}, + {file = "pydantic_core-2.50.4-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:49eb1241a969a5994db6880c18c012b6cbe2340343d8f529721571806583e500"}, + {file = "pydantic_core-2.50.4-cp315-cp315-manylinux2014_armv7l.manylinux_2_17_armv7l.whl", hash = "sha256:477af785d1846e4e96bf56983b92ea7553aaeccdeb8acdaa55c7cee9eda0ae32"}, + {file = "pydantic_core-2.50.4-cp315-cp315-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:29358a8ca74e7d81158d14e2b10c904bd18773293ae3788716c0626fe0342347"}, + {file = "pydantic_core-2.50.4-cp315-cp315-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:300753f71c73302e218124baf995f00058e085cd01869bd9610bcbd0bd4500c1"}, + {file = "pydantic_core-2.50.4-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:26cb012c4b8ca9f847bd0ac15978bd3d0f55b050bfbe6c47355edfc7e945029b"}, + {file = "pydantic_core-2.50.4-cp315-cp315-manylinux_2_31_riscv64.whl", hash = "sha256:9be1cfe715ecaa060ffd5d599ef410b94ef2697a0eed4cee562f788a2aa2175b"}, + {file = "pydantic_core-2.50.4-cp315-cp315-musllinux_1_1_aarch64.whl", hash = "sha256:c81e35862aced259177a537ce1a6264c3a97bae1ced184ca9dc10ea754563688"}, + {file = "pydantic_core-2.50.4-cp315-cp315-musllinux_1_1_armv7l.whl", hash = "sha256:b2f2d13239487cecaae98c9f4d5904ad0737643cdf8873c88ec6a78b12214f20"}, + {file = "pydantic_core-2.50.4-cp315-cp315-musllinux_1_1_x86_64.whl", hash = "sha256:e6b4b08d09054310a4dc389fa61ee22a7a5a292cb23ab8a985136ca8828bf924"}, + {file = "pydantic_core-2.50.4-cp315-cp315-win32.whl", hash = "sha256:6619d49a89a15cd04334f76fec530c155923bfc60da74ff5d815a52629e1aa6c"}, + {file = "pydantic_core-2.50.4-cp315-cp315-win_amd64.whl", hash = "sha256:e5bd109d095aaae989a0463d5ef0fcc43e9ddd5de125e656d3c119a79e466380"}, + {file = "pydantic_core-2.50.4-cp315-cp315-win_arm64.whl", hash = "sha256:6118e5a5550e36582e19bac1a403711a748f9f18251b054c326d3db02aaa7a18"}, + {file = "pydantic_core-2.50.4-cp315-cp315t-macosx_10_12_x86_64.whl", hash = "sha256:d8201c9f9035520cdcc7dcad383b039ec8123969b87e01cf27c3dd883c02313b"}, + {file = "pydantic_core-2.50.4-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:1de7be9a66fc8536770481ab64a05aae5067c725f2b29a09543af00e6a417b97"}, + {file = "pydantic_core-2.50.4-cp315-cp315t-manylinux1_i686.manylinux_2_5_i686.whl", hash = "sha256:789a6453e5ffd18a7ab6b8c3a0dd8403053829197ec258ecb90c604c21ffcc99"}, + {file = "pydantic_core-2.50.4-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:6348ad12fa741bcc9c2f173e99fbf27cbc038826d8c31a4a7d836eca27878ba2"}, + {file = "pydantic_core-2.50.4-cp315-cp315t-manylinux2014_armv7l.manylinux_2_17_armv7l.whl", hash = "sha256:d49127f137f871cde3c5650af33bbbdcee02679dae76e020902fa106f522b8ae"}, + {file = "pydantic_core-2.50.4-cp315-cp315t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:2f5cc5bcb94063fbbdfd285a2b302da34af07491337c10bb35de1d5220fa1583"}, + {file = "pydantic_core-2.50.4-cp315-cp315t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b99bed995ed7c41515c11fe2beb86f8a6cc298e5537cae2f736de2f982f74ef0"}, + {file = "pydantic_core-2.50.4-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:faa4e96385c820ce9d7f7a623486e23d4134ae3c9ba2071e44e0ab5a5a5002c4"}, + {file = "pydantic_core-2.50.4-cp315-cp315t-manylinux_2_31_riscv64.whl", hash = "sha256:d6a166978f22f10cb91413f70519861605219346decf65bc79008f9257c94afe"}, + {file = "pydantic_core-2.50.4-cp315-cp315t-musllinux_1_1_aarch64.whl", hash = "sha256:a70d5effebd81ebd8e15a8aabdc7980832367b2b00c36543bac378977004cc80"}, + {file = "pydantic_core-2.50.4-cp315-cp315t-musllinux_1_1_armv7l.whl", hash = "sha256:f8fd23653a252cefabea11cd041efd7b80bdf403e43a36dea53f9cb0aaa21f0f"}, + {file = "pydantic_core-2.50.4-cp315-cp315t-musllinux_1_1_x86_64.whl", hash = "sha256:7646353a5a7c553c04167aca628e2550b538f492765b03ccf34321a560acc43c"}, + {file = "pydantic_core-2.50.4-cp315-cp315t-win32.whl", hash = "sha256:65376dbe1ab4dbc768ca2b72b7c13993562c035f5925fd3bc7ff9c8c585c515d"}, + {file = "pydantic_core-2.50.4-cp315-cp315t-win_amd64.whl", hash = "sha256:f08ee8248aad2d054e5bc4c73554d4505464698f6d754f16198dbc5764e9821d"}, + {file = "pydantic_core-2.50.4-cp315-cp315t-win_arm64.whl", hash = "sha256:da779ae50b46f3f7d1e1b5f362fdc0ad376a49fd55f6f3122dc2b6149936cdf7"}, + {file = "pydantic_core-2.50.4-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:c04e9d920e2674f54651fd260a15c5d2843526c73d5242ee4311325ddc9573b3"}, + {file = "pydantic_core-2.50.4-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:5bc1811ef2b4d4ba63e8e452f6e332b6374bd1d2cbbfdf66826c8cb1f71dd10d"}, + {file = "pydantic_core-2.50.4-graalpy312-graalpy250_312_native-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0b059a7968b1911be5a2d9a8234827ab0bef9d1e465d4b42da525894143550e8"}, + {file = "pydantic_core-2.50.4-graalpy312-graalpy250_312_native-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bee28aab5a580eec673f7b68dfa8dece3dd37bd207ef8d22fafe23a8e9837296"}, + {file = "pydantic_core-2.50.4-graalpy313-graalpy253_313_native-macosx_11_0_arm64.whl", hash = "sha256:71e03d2ea1a221d020cfc5b6cc8bbbedef23a06704c70fcf4d0afb42965b22d1"}, + {file = "pydantic_core-2.50.4-graalpy313-graalpy253_313_native-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:09450778e3ab58d3f565899fcfbf6c82926e31af29e28e799d1d50941316e0cb"}, + {file = "pydantic_core-2.50.4-graalpy313-graalpy253_313_native-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4eb15be588407148ef5937dc8d9256a71f6b115e6cddadb7aa20b6ee384680dc"}, + {file = "pydantic_core-2.50.4-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:39f489ce31272073e6e146f6781690f9c1ee8c126836e6403361ef91154d89fe"}, + {file = "pydantic_core-2.50.4-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:5b26e5f1793b96cdc60242bf38da86ff24a27a708aa396214cac9b534bf571c7"}, + {file = "pydantic_core-2.50.4-pp311-pypy311_pp73-manylinux1_i686.manylinux_2_5_i686.whl", hash = "sha256:7210398a1607ad607dc73196e575b3148b00a333cbb602ddbe1b60ba54554f43"}, + {file = "pydantic_core-2.50.4-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2f42584e5785385f681163a42506cab0d51295e17599a648396c52a7046c1372"}, + {file = "pydantic_core-2.50.4-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:2039e323acee9abfec1fb5f661776e8965fe5928f3b7f8431900a774cba5c317"}, + {file = "pydantic_core-2.50.4-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:71ade6d2e445839350d589ff99bbddfde16f3f32db28da5c894a09f99c8b2a03"}, + {file = "pydantic_core-2.50.4-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:d7d406709ae924cf0b08b8282ca2f0e1c90526911d93bc040557cbc83b74c55f"}, + {file = "pydantic_core-2.50.4-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:7472c39480ccc11dda69a196d1b7c7a6b48eb6594b77f05d945599d3e47f731c"}, + {file = "pydantic_core-2.50.4-pp311-pypy311_pp80-macosx_10_12_x86_64.whl", hash = "sha256:b67d38e8bb0ade7e6e84575e4bb153fab35b122458077273aeb08fdf12be9d2c"}, + {file = "pydantic_core-2.50.4-pp311-pypy311_pp80-macosx_11_0_arm64.whl", hash = "sha256:4eda7e3fdef382b7d4492745988a5baaf6953923a337f8b9dde5f76fa8afde20"}, + {file = "pydantic_core-2.50.4-pp311-pypy311_pp80-manylinux_2_28_x86_64.whl", hash = "sha256:474f7e598c7902165662a5d5160d3fce31037890a2975a9871ebf7c05862300b"}, + {file = "pydantic_core-2.50.4-pp311-pypy311_pp80-win_amd64.whl", hash = "sha256:3e0b395648c6cb871bceb2906907f255dc876ec425f2d5b024e129985cea8519"}, + {file = "pydantic_core-2.50.4.tar.gz", hash = "sha256:aead3b74b68396bf0feab5d57e050b730ded7df55853c1e048a87e00aaf033c6"}, +] + +[package.dependencies] +typing-extensions = ">=4.16.0" [[package]] name = "pydevd-pycharm" @@ -536,17 +669,17 @@ develop = true [package.dependencies] certifi = "^2026.7.22" -fire = "^0.4.0" -inflect = "^6.0.2" -jsonpointer = "^2.3" +fire = ">=0.4,<0.8" +inflect = ">=6.0.2,<8.0.0" +jsonpointer = ">=2.3,<4.0" jsonref = "^1.1.0" mysqlclient = "^2.1.1" psycopg2 = "^2.9.5" -pydantic = "^1.10.2" -pydevd-pycharm = "^231.6471.3" +pydantic = "^2.14" +pydevd-pycharm = ">=231.6471.3,<264.0.0" pytest = "^9.1.1" requests = "^2.28.1" -sqlmodel = "^0.0.8" +sqlmodel = "^0.0.38" [package.source] type = "directory" @@ -625,110 +758,117 @@ files = [ [[package]] name = "sqlalchemy" -version = "1.4.41" +version = "2.0.57" description = "Database Abstraction Library" optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +python-versions = ">=3.7" groups = ["main"] files = [ - {file = "SQLAlchemy-1.4.41-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:13e397a9371ecd25573a7b90bd037db604331cf403f5318038c46ee44908c44d"}, - {file = "SQLAlchemy-1.4.41-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:2d6495f84c4fd11584f34e62f9feec81bf373787b3942270487074e35cbe5330"}, - {file = "SQLAlchemy-1.4.41-cp27-cp27m-win32.whl", hash = "sha256:e570cfc40a29d6ad46c9aeaddbdcee687880940a3a327f2c668dd0e4ef0a441d"}, - {file = "SQLAlchemy-1.4.41-cp27-cp27m-win_amd64.whl", hash = "sha256:5facb7fd6fa8a7353bbe88b95695e555338fb038ad19ceb29c82d94f62775a05"}, - {file = "SQLAlchemy-1.4.41-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:f37fa70d95658763254941ddd30ecb23fc4ec0c5a788a7c21034fc2305dab7cc"}, - {file = "SQLAlchemy-1.4.41-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:361f6b5e3f659e3c56ea3518cf85fbdae1b9e788ade0219a67eeaaea8a4e4d2a"}, - {file = "SQLAlchemy-1.4.41-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0990932f7cca97fece8017414f57fdd80db506a045869d7ddf2dda1d7cf69ecc"}, - {file = "SQLAlchemy-1.4.41-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cd767cf5d7252b1c88fcfb58426a32d7bd14a7e4942497e15b68ff5d822b41ad"}, - {file = "SQLAlchemy-1.4.41-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5102fb9ee2c258a2218281adcb3e1918b793c51d6c2b4666ce38c35101bb940e"}, - {file = "SQLAlchemy-1.4.41-cp310-cp310-win32.whl", hash = "sha256:2082a2d2fca363a3ce21cfa3d068c5a1ce4bf720cf6497fb3a9fc643a8ee4ddd"}, - {file = "SQLAlchemy-1.4.41-cp310-cp310-win_amd64.whl", hash = "sha256:e4b12e3d88a8fffd0b4ca559f6d4957ed91bd4c0613a4e13846ab8729dc5c251"}, - {file = "SQLAlchemy-1.4.41-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:90484a2b00baedad361402c257895b13faa3f01780f18f4a104a2f5c413e4536"}, - {file = "SQLAlchemy-1.4.41-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b67fc780cfe2b306180e56daaa411dd3186bf979d50a6a7c2a5b5036575cbdbb"}, - {file = "SQLAlchemy-1.4.41-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ad2b727fc41c7f8757098903f85fafb4bf587ca6605f82d9bf5604bd9c7cded"}, - {file = "SQLAlchemy-1.4.41-cp311-cp311-win32.whl", hash = "sha256:59bdc291165b6119fc6cdbc287c36f7f2859e6051dd923bdf47b4c55fd2f8bd0"}, - {file = "SQLAlchemy-1.4.41-cp311-cp311-win_amd64.whl", hash = "sha256:d2e054aed4645f9b755db85bc69fc4ed2c9020c19c8027976f66576b906a74f1"}, - {file = "SQLAlchemy-1.4.41-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:4ba7e122510bbc07258dc42be6ed45997efdf38129bde3e3f12649be70683546"}, - {file = "SQLAlchemy-1.4.41-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c0dcf127bb99458a9d211e6e1f0f3edb96c874dd12f2503d4d8e4f1fd103790b"}, - {file = "SQLAlchemy-1.4.41-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e16c2be5cb19e2c08da7bd3a87fed2a0d4e90065ee553a940c4fc1a0fb1ab72b"}, - {file = "SQLAlchemy-1.4.41-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5ebeeec5c14533221eb30bad716bc1fd32f509196318fb9caa7002c4a364e4c"}, - {file = "SQLAlchemy-1.4.41-cp36-cp36m-win32.whl", hash = "sha256:3e2ef592ac3693c65210f8b53d0edcf9f4405925adcfc031ff495e8d18169682"}, - {file = "SQLAlchemy-1.4.41-cp36-cp36m-win_amd64.whl", hash = "sha256:eb30cf008850c0a26b72bd1b9be6730830165ce049d239cfdccd906f2685f892"}, - {file = "SQLAlchemy-1.4.41-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:c23d64a0b28fc78c96289ffbd0d9d1abd48d267269b27f2d34e430ea73ce4b26"}, - {file = "SQLAlchemy-1.4.41-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8eb8897367a21b578b26f5713833836f886817ee2ffba1177d446fa3f77e67c8"}, - {file = "SQLAlchemy-1.4.41-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:14576238a5f89bcf504c5f0a388d0ca78df61fb42cb2af0efe239dc965d4f5c9"}, - {file = "SQLAlchemy-1.4.41-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:639e1ae8d48b3c86ffe59c0daa9a02e2bfe17ca3d2b41611b30a0073937d4497"}, - {file = "SQLAlchemy-1.4.41-cp37-cp37m-win32.whl", hash = "sha256:0005bd73026cd239fc1e8ccdf54db58b6193be9a02b3f0c5983808f84862c767"}, - {file = "SQLAlchemy-1.4.41-cp37-cp37m-win_amd64.whl", hash = "sha256:5323252be2bd261e0aa3f33cb3a64c45d76829989fa3ce90652838397d84197d"}, - {file = "SQLAlchemy-1.4.41-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:05f0de3a1dc3810a776275763764bb0015a02ae0f698a794646ebc5fb06fad33"}, - {file = "SQLAlchemy-1.4.41-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0002e829142b2af00b4eaa26c51728f3ea68235f232a2e72a9508a3116bd6ed0"}, - {file = "SQLAlchemy-1.4.41-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:22ff16cedab5b16a0db79f1bc99e46a6ddececb60c396562e50aab58ddb2871c"}, - {file = "SQLAlchemy-1.4.41-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ccfd238f766a5bb5ee5545a62dd03f316ac67966a6a658efb63eeff8158a4bbf"}, - {file = "SQLAlchemy-1.4.41-cp38-cp38-win32.whl", hash = "sha256:58bb65b3274b0c8a02cea9f91d6f44d0da79abc993b33bdedbfec98c8440175a"}, - {file = "SQLAlchemy-1.4.41-cp38-cp38-win_amd64.whl", hash = "sha256:ce8feaa52c1640de9541eeaaa8b5fb632d9d66249c947bb0d89dd01f87c7c288"}, - {file = "SQLAlchemy-1.4.41-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:199a73c31ac8ea59937cc0bf3dfc04392e81afe2ec8a74f26f489d268867846c"}, - {file = "SQLAlchemy-1.4.41-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4676d51c9f6f6226ae8f26dc83ec291c088fe7633269757d333978df78d931ab"}, - {file = "SQLAlchemy-1.4.41-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:036d8472356e1d5f096c5e0e1a7e0f9182140ada3602f8fff6b7329e9e7cfbcd"}, - {file = "SQLAlchemy-1.4.41-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2307495d9e0ea00d0c726be97a5b96615035854972cc538f6e7eaed23a35886c"}, - {file = "SQLAlchemy-1.4.41-cp39-cp39-win32.whl", hash = "sha256:9c56e19780cd1344fcd362fd6265a15f48aa8d365996a37fab1495cae8fcd97d"}, - {file = "SQLAlchemy-1.4.41-cp39-cp39-win_amd64.whl", hash = "sha256:f5fa526d027d804b1f85cdda1eb091f70bde6fb7d87892f6dd5a48925bc88898"}, - {file = "SQLAlchemy-1.4.41.tar.gz", hash = "sha256:0292f70d1797e3c54e862e6f30ae474014648bc9c723e14a2fda730adb0a9791"}, + {file = "sqlalchemy-2.0.57-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b1ead374d6ba8d5cb516f48de33ef1d6dca635a69abe7c7a344ae4bb00e7bd40"}, + {file = "sqlalchemy-2.0.57-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8e0bde66dd5384e6cd9842e119197c02280bc3b85697995d2dc2106714ab9742"}, + {file = "sqlalchemy-2.0.57-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5108313e44bc1e08a857d36f7f7f7f5eae23687153c5ad21cb6800ac6cb67510"}, + {file = "sqlalchemy-2.0.57-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b0cf6c9dc732258a18ad3a8bd8af5440553fe98192bf49788021dc1ddcb388d5"}, + {file = "sqlalchemy-2.0.57-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:03d147ff68e787833d60b732238f3440031fbc45d4629edf8bcd073e89a461c3"}, + {file = "sqlalchemy-2.0.57-cp310-cp310-win32.whl", hash = "sha256:fb53faa9f2dedd2560d82712f6ae6533bc4eb3de9c0122d85cd29d752e5cd6ac"}, + {file = "sqlalchemy-2.0.57-cp310-cp310-win_amd64.whl", hash = "sha256:88007e8f5f263ca7c8adfef6425037e134ddb6a67a99e07cbd304a208a8a4938"}, + {file = "sqlalchemy-2.0.57-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:396b8e25a81fac14f5ff9e2b66baffe228a43f1fcd1916f329fce2ea8643eba1"}, + {file = "sqlalchemy-2.0.57-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c688e2ef8121479e0e25972a942dd0c056f3ba59a22175523e35106c2e3fb72d"}, + {file = "sqlalchemy-2.0.57-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:21ad7dc7ed00a05bd3d179cb9bba85dc4181b04342052d9ce81d9305bfdbf9c6"}, + {file = "sqlalchemy-2.0.57-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:206cbb334df6038f049a11b05b8cb4a4dc13577a46464e01de080d1c3e4493c4"}, + {file = "sqlalchemy-2.0.57-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4e2275e8601de7d8a79bf97bb4cec32b116b4715ec8585ee8a629d2cf2512176"}, + {file = "sqlalchemy-2.0.57-cp311-cp311-win32.whl", hash = "sha256:6fae1e630982481e705dcab2442c8135e5287a2290e23fd51fbb031c67a8b7fd"}, + {file = "sqlalchemy-2.0.57-cp311-cp311-win_amd64.whl", hash = "sha256:0e5a8cc2e70f868e579e083818d9bfc7ccc722e588ff22bcfa5cf5da2d571967"}, + {file = "sqlalchemy-2.0.57-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e33889a6f292db9ed2278d5562717c96432651ec558417a7acf17d9549fd6935"}, + {file = "sqlalchemy-2.0.57-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:75135c4c54be953730e41203f38ced685b60dfb16d61a7d4d9a7ab8d87ced6f1"}, + {file = "sqlalchemy-2.0.57-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4ff9f7dda4d136bfd7fab44384ef7e3135c9826da815d6248f713d0035a6274b"}, + {file = "sqlalchemy-2.0.57-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e8d67fa9935021bdccd02d313a1b5ce92531f679b0e70ea7b9f5d651fab7f742"}, + {file = "sqlalchemy-2.0.57-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d55ea24654f8d982c5aabd6e6779eac3ed15f420f629761c4eb627399e9d8cec"}, + {file = "sqlalchemy-2.0.57-cp312-cp312-win32.whl", hash = "sha256:ffaedafb38901bc72efcaf9fdf57bc363be24bd67a8bce8e3afe4ec75bc82833"}, + {file = "sqlalchemy-2.0.57-cp312-cp312-win_amd64.whl", hash = "sha256:4972e01af81b72b78e335735eddf9d4ef8980eca1e8364552715991a454eea97"}, + {file = "sqlalchemy-2.0.57-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:88837e22b43cf5e22070deb68c5cc77916dd2a231d8b9dc91ac8e5afb96a2c4f"}, + {file = "sqlalchemy-2.0.57-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:351b703ee93952f38f2e51e0781e1d4618602850252e68344b9dd28dccc2bd08"}, + {file = "sqlalchemy-2.0.57-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bc60f5a5f1ec190dcb1f5a9b9cf8f64d13f640ee429ee09fc0939ae9acaa6cc6"}, + {file = "sqlalchemy-2.0.57-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:8c2233997b87eed1f6664b047c6ff95a8a667ac46c053b29ed104d4df6210c1e"}, + {file = "sqlalchemy-2.0.57-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9815b64911596a3bf106b8ef4671a98b461e78cb668b4fa16a52caf44a3011d0"}, + {file = "sqlalchemy-2.0.57-cp313-cp313-win32.whl", hash = "sha256:239bd74da3bd9f5882b90361ff81232b6d8b85d53533da5a75bf54b140a964dc"}, + {file = "sqlalchemy-2.0.57-cp313-cp313-win_amd64.whl", hash = "sha256:1fe4190e1673ff5415c691221864a61ca393653fcbc6f7c55a01b69d5a4c60c3"}, + {file = "sqlalchemy-2.0.57-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:cae8591e095d25c2b83bd0bb2a9c973e493378267fd6116af91d8bb8d0c1016c"}, + {file = "sqlalchemy-2.0.57-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:060e698953af83dab5aeecc09d14122857c6dc69e288a8fc93c4487529b056cb"}, + {file = "sqlalchemy-2.0.57-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:23af494d0e22c51185d2d93b9a98666042d17a518df2731787dff7f20ee438e4"}, + {file = "sqlalchemy-2.0.57-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:794c5fa765363ce59f1e081fdab87ed7b30a0d775f7f7d379422bc2f53818bcb"}, + {file = "sqlalchemy-2.0.57-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:294f6cf8465e0c5f1a00d6d3cb1a265737f3321811d12a57f4bfb66886e78662"}, + {file = "sqlalchemy-2.0.57-cp314-cp314-win32.whl", hash = "sha256:adc6b7fc740593137b3b00c3f8c5330e891c11f40df7a3aecf942ad90c4b808f"}, + {file = "sqlalchemy-2.0.57-cp314-cp314-win_amd64.whl", hash = "sha256:88eed162ae664cc09808241dff304bc3ac5f57e2cf7a3cb9e6165df1ec243544"}, + {file = "sqlalchemy-2.0.57-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0ce98756f4079d5c5dfab7adb690a654cdadb1d1208024f239338627cfc44f31"}, + {file = "sqlalchemy-2.0.57-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a24a5c21c4263e7dafc1652d98d46375d7b38c490ccab41cf00d995ec9fa02b3"}, + {file = "sqlalchemy-2.0.57-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e15997df22f3581ff38744afc39d024784eb90bd6c2c41c4387b116663021e87"}, + {file = "sqlalchemy-2.0.57-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:f90a5194a25c9b611d871df770802b1b6e4915bef16cfdd398ce13bd0379a266"}, + {file = "sqlalchemy-2.0.57-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:71e53d9c6ea15c4dc435d936a0f72eeba218dc378c28d863cc6619b9a3ab8042"}, + {file = "sqlalchemy-2.0.57-cp314-cp314t-win32.whl", hash = "sha256:0e45c61722b17b41f6890d7c17a33b11270e2c334f4e7593774b0a5092fa08a8"}, + {file = "sqlalchemy-2.0.57-cp314-cp314t-win_amd64.whl", hash = "sha256:8ecb63bdacc0f0b1e7cd37959b174c775a3d0f68bc6ad91702fe375c0c24d013"}, + {file = "sqlalchemy-2.0.57-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b4533e2d4782ae2383b4d61fcdbe5b3747b25056c95de2d128ea23245f205786"}, + {file = "sqlalchemy-2.0.57-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97739bda3f8733c99f434615a9ec3b73e0511b6b3d91465f816cc484000f8027"}, + {file = "sqlalchemy-2.0.57-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a67fad945dbae5137bae74bae4d98ed7f9bb989ae7ce247a83728854a45f5554"}, + {file = "sqlalchemy-2.0.57-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:f512eff7a6dde0d569ec41212422ed2749ea6ca88d1f5275d73dbc16e696ed66"}, + {file = "sqlalchemy-2.0.57-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:660de7c826c5ce3b745a7179d4e0ad391dcda61e64e8697021e18be5ee05c436"}, + {file = "sqlalchemy-2.0.57-cp38-cp38-win32.whl", hash = "sha256:a1c23bbaa9fe9ac43971d2fdc0531cfe7affac9735d7926fbf8c555f255f78d8"}, + {file = "sqlalchemy-2.0.57-cp38-cp38-win_amd64.whl", hash = "sha256:1b260c745aa801557a0aeb4b2e729a4f0c5e171140db6c2be1e2b9316d15e821"}, + {file = "sqlalchemy-2.0.57-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:38eaae2db34b1f865cab99a40eca2e901a8979128b0ba5bee804b189cb71d03a"}, + {file = "sqlalchemy-2.0.57-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:444b6f14e65ff76e411d59dd16e2aef646d2c957afc24a49510149a28fc9dc33"}, + {file = "sqlalchemy-2.0.57-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a8bac610e7dcc1a5969b82f0788bab5c5653dd08c5229247a14bf0de5cd20b4f"}, + {file = "sqlalchemy-2.0.57-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0a00cd2d0378f8951e1c147b3bd5a45538e9bff6ebe9bd08295808755dbd9a2b"}, + {file = "sqlalchemy-2.0.57-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:bbfac8d64ebdf30b1912d8f1f9f96fe99bef10669f2533ecac1a0f585e956ff4"}, + {file = "sqlalchemy-2.0.57-cp39-cp39-win32.whl", hash = "sha256:35713e7ab2f7e85bfee59bda25bc483597600a5756e6367918ebb5e63a39ee0b"}, + {file = "sqlalchemy-2.0.57-cp39-cp39-win_amd64.whl", hash = "sha256:7215ab39053d065b589ab7f78c84226fae57b76d28e832be2e8435c416c1c2d0"}, + {file = "sqlalchemy-2.0.57-py3-none-any.whl", hash = "sha256:e31639a78045134a39e14f287b647fd9537cdd71978ea9c11bf7d905d70e473d"}, + {file = "sqlalchemy-2.0.57.tar.gz", hash = "sha256:892e0edd06b8ca2a8a3f9107611047914fd82ccd03735efd706d12aa4da1b773"}, ] [package.dependencies] -greenlet = {version = "!=0.4.17", markers = "python_version >= \"3\" and (platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\")"} +greenlet = {version = ">=1", markers = "platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\""} +typing-extensions = ">=4.6.0" [package.extras] -aiomysql = ["aiomysql ; python_version >= \"3\"", "greenlet (!=0.4.17) ; python_version >= \"3\""] -aiosqlite = ["aiosqlite ; python_version >= \"3\"", "greenlet (!=0.4.17) ; python_version >= \"3\"", "typing-extensions (!=3.10.0.1)"] -asyncio = ["greenlet (!=0.4.17) ; python_version >= \"3\""] -asyncmy = ["asyncmy (>=0.2.3,!=0.2.4) ; python_version >= \"3\"", "greenlet (!=0.4.17) ; python_version >= \"3\""] -mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2) ; python_version >= \"3\""] +aiomysql = ["aiomysql (>=0.2.0)", "greenlet (>=1)"] +aioodbc = ["aioodbc", "greenlet (>=1)"] +aiosqlite = ["aiosqlite", "greenlet (>=1)", "typing_extensions (!=3.10.0.1)"] +asyncio = ["greenlet (>=1)"] +asyncmy = ["asyncmy (>=0.2.12)", "greenlet (>=1)"] +mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2,!=1.1.5,!=1.1.10)"] mssql = ["pyodbc"] mssql-pymssql = ["pymssql"] mssql-pyodbc = ["pyodbc"] -mypy = ["mypy (>=0.910) ; python_version >= \"3\"", "sqlalchemy2-stubs"] -mysql = ["mysqlclient (>=1.4.0) ; python_version >= \"3\"", "mysqlclient (>=1.4.0,<2) ; python_version < \"3\""] +mypy = ["mypy (>=0.910)"] +mysql = ["mysqlclient (>=1.4.0)"] mysql-connector = ["mysql-connector-python"] -oracle = ["cx-oracle (>=7) ; python_version >= \"3\"", "cx-oracle (>=7,<8) ; python_version < \"3\""] +oracle = ["cx_oracle (>=8)"] +oracle-oracledb = ["oracledb (>=1.0.1)"] postgresql = ["psycopg2 (>=2.7)"] -postgresql-asyncpg = ["asyncpg ; python_version >= \"3\"", "greenlet (!=0.4.17) ; python_version >= \"3\""] -postgresql-pg8000 = ["pg8000 (>=1.16.6,!=1.29.0)"] +postgresql-asyncpg = ["asyncpg", "greenlet (>=1)"] +postgresql-pg8000 = ["pg8000 (>=1.29.1)"] +postgresql-psycopg = ["psycopg (>=3.0.7)"] postgresql-psycopg2binary = ["psycopg2-binary"] postgresql-psycopg2cffi = ["psycopg2cffi"] -pymysql = ["pymysql (<1) ; python_version < \"3\"", "pymysql ; python_version >= \"3\""] -sqlcipher = ["sqlcipher3-binary ; python_version >= \"3\""] - -[[package]] -name = "sqlalchemy2-stubs" -version = "0.0.2a38" -description = "Typing Stubs for SQLAlchemy 1.4" -optional = false -python-versions = ">=3.6" -groups = ["main"] -files = [ - {file = "sqlalchemy2-stubs-0.0.2a38.tar.gz", hash = "sha256:861d722abeb12f13eacd775a9f09379b11a5a9076f469ccd4099961b95800f9e"}, - {file = "sqlalchemy2_stubs-0.0.2a38-py3-none-any.whl", hash = "sha256:b62aa46943807287550e2033dafe07564b33b6a815fbaa3c144e396f9cc53bcb"}, -] - -[package.dependencies] -typing-extensions = ">=3.7.4" +postgresql-psycopgbinary = ["psycopg[binary] (>=3.0.7)"] +pymysql = ["pymysql"] +sqlcipher = ["sqlcipher3_binary"] [[package]] name = "sqlmodel" -version = "0.0.8" +version = "0.0.38" description = "SQLModel, SQL databases in Python, designed for simplicity, compatibility, and robustness." optional = false -python-versions = ">=3.6.1,<4.0.0" +python-versions = ">=3.10" groups = ["main"] files = [ - {file = "sqlmodel-0.0.8-py3-none-any.whl", hash = "sha256:0fd805719e0c5d4f22be32eb3ffc856eca3f7f20e8c7aa3e117ad91684b518ee"}, - {file = "sqlmodel-0.0.8.tar.gz", hash = "sha256:3371b4d1ad59d2ffd0c530582c2140b6c06b090b32af9b9c6412986d7b117036"}, + {file = "sqlmodel-0.0.38-py3-none-any.whl", hash = "sha256:84e3fa990a77395461ded72a6c73173438ce8449d5c1c4d97fbff1b1df692649"}, + {file = "sqlmodel-0.0.38.tar.gz", hash = "sha256:d583ec237b14103809f74e8630032bc40ab68cd6b754a610f0813c56911a547b"}, ] [package.dependencies] -pydantic = ">=1.8.2,<2.0.0" -SQLAlchemy = ">=1.4.17,<=1.4.41" -sqlalchemy2-stubs = "*" +pydantic = ">=2.11.0" +SQLAlchemy = ">=2.0.14,<2.1.0" +typing-extensions = ">=4.5.0" [[package]] name = "termcolor" @@ -757,6 +897,21 @@ files = [ {file = "typing_extensions-4.16.0.tar.gz", hash = "sha256:dc983d19a509c94dba722ee6abd33940f7c05a89e243c47e907eb4db6f1a43e5"}, ] +[[package]] +name = "typing-inspection" +version = "0.4.5" +description = "Runtime typing introspection tools" +optional = false +python-versions = ">=3.10" +groups = ["main"] +files = [ + {file = "typing_inspection-0.4.5-py3-none-any.whl", hash = "sha256:bc210535442b39e1bf2805e0c7a17dfd6a4ace760c84c7f7d16245d23a6b1c39"}, + {file = "typing_inspection-0.4.5.tar.gz", hash = "sha256:7f16c411e7930dc79596d42ab44672a3fe5f60eb34b781a1647e7872363120c7"}, +] + +[package.dependencies] +typing-extensions = ">=4.15.0" + [[package]] name = "urllib3" version = "2.8.0" diff --git a/backend/python/plugins/glpi/glpi/migrations.py b/backend/python/plugins/glpi/glpi/migrations.py index 5313b4f30e5..50b9f714336 100644 --- a/backend/python/plugins/glpi/glpi/migrations.py +++ b/backend/python/plugins/glpi/glpi/migrations.py @@ -32,12 +32,12 @@ class Connection(BaseConnection): timezone: str class Entity(ToolScope): - completename: Optional[str] + completename: Optional[str] = None class ScopeConfig(ToolTable, Model): name: str = Field(default="default") - entities: Optional[str] - connection_id: Optional[int] + entities: Optional[str] = None + connection_id: Optional[int] = None collect_assignees: bool = True collect_followups: bool = False collect_ticket_links: bool = False @@ -48,139 +48,139 @@ class ScopeConfig(ToolTable, Model): class Ticket(ToolModel): id: int = Field(primary_key=True, auto_increment=False) - name: Optional[str] - content: Optional[str] - date: Optional[datetime.datetime] - closedate: Optional[datetime.datetime] - solvedate: Optional[datetime.datetime] - date_mod: Optional[datetime.datetime] - date_creation: Optional[datetime.datetime] - status: Optional[int] - type: Optional[int] - urgency: Optional[int] - impact: Optional[int] - priority: Optional[int] - entities_id: Optional[str] - itilcategories_id: Optional[int] - category_name: Optional[str] - locations_id: Optional[int] - location_name: Optional[str] - suppliers_id: Optional[int] - supplier_name: Optional[str] - requesttypes_id: Optional[int] - requesttype_name: Optional[str] - users_id_recipient: Optional[int] - users_id_lastupdater: Optional[int] - time_to_resolve: Optional[datetime.datetime] - time_to_own: Optional[datetime.datetime] - internal_time_to_resolve: Optional[datetime.datetime] - internal_time_to_own: Optional[datetime.datetime] - actiontime: Optional[int] - solve_delay_stat: Optional[int] - takeintoaccount_delay_stat: Optional[int] - requester_name: Optional[str] - assignee_id: Optional[int] - assignee_name: Optional[str] - parent_ticket_id: Optional[int] - solution_content: Optional[str] - plugin_fields_json: Optional[str] + name: Optional[str] = None + content: Optional[str] = None + date: Optional[datetime.datetime] = None + closedate: Optional[datetime.datetime] = None + solvedate: Optional[datetime.datetime] = None + date_mod: Optional[datetime.datetime] = None + date_creation: Optional[datetime.datetime] = None + status: Optional[int] = None + type: Optional[int] = None + urgency: Optional[int] = None + impact: Optional[int] = None + priority: Optional[int] = None + entities_id: Optional[str] = None + itilcategories_id: Optional[int] = None + category_name: Optional[str] = None + locations_id: Optional[int] = None + location_name: Optional[str] = None + suppliers_id: Optional[int] = None + supplier_name: Optional[str] = None + requesttypes_id: Optional[int] = None + requesttype_name: Optional[str] = None + users_id_recipient: Optional[int] = None + users_id_lastupdater: Optional[int] = None + time_to_resolve: Optional[datetime.datetime] = None + time_to_own: Optional[datetime.datetime] = None + internal_time_to_resolve: Optional[datetime.datetime] = None + internal_time_to_own: Optional[datetime.datetime] = None + actiontime: Optional[int] = None + solve_delay_stat: Optional[int] = None + takeintoaccount_delay_stat: Optional[int] = None + requester_name: Optional[str] = None + assignee_id: Optional[int] = None + assignee_name: Optional[str] = None + parent_ticket_id: Optional[int] = None + solution_content: Optional[str] = None + plugin_fields_json: Optional[str] = None class TicketUser(ToolModel): id: int = Field(primary_key=True, auto_increment=False) - tickets_id: Optional[int] - users_id: Optional[int] - user_name: Optional[str] - type: Optional[int] + tickets_id: Optional[int] = None + users_id: Optional[int] = None + user_name: Optional[str] = None + type: Optional[int] = None class TicketGroup(ToolModel): id: int = Field(primary_key=True, auto_increment=False) - tickets_id: Optional[int] - groups_id: Optional[int] - group_name: Optional[str] - type: Optional[int] + tickets_id: Optional[int] = None + groups_id: Optional[int] = None + group_name: Optional[str] = None + type: Optional[int] = None class Followup(ToolModel): id: int = Field(primary_key=True, auto_increment=False) - items_id: Optional[int] - users_id: Optional[int] - content: Optional[str] - date: Optional[datetime.datetime] - date_mod: Optional[datetime.datetime] - is_private: Optional[int] + items_id: Optional[int] = None + users_id: Optional[int] = None + content: Optional[str] = None + date: Optional[datetime.datetime] = None + date_mod: Optional[datetime.datetime] = None + is_private: Optional[int] = None class TicketTask(ToolModel): id: int = Field(primary_key=True, auto_increment=False) - tickets_id: Optional[int] - users_id: Optional[int] - content: Optional[str] - begin: Optional[datetime.datetime] - end: Optional[datetime.datetime] - actiontime: Optional[int] + tickets_id: Optional[int] = None + users_id: Optional[int] = None + content: Optional[str] = None + begin: Optional[datetime.datetime] = None + end: Optional[datetime.datetime] = None + actiontime: Optional[int] = None class TicketLog(ToolModel): id: int = Field(primary_key=True, auto_increment=False) - tickets_id: Optional[int] - items_id: Optional[int] - itemtype: Optional[str] - itemtype_link: Optional[str] - linked_action: Optional[int] - user_name: Optional[str] - date_mod: Optional[datetime.datetime] - id_search_option: Optional[int] - old_value: Optional[str] - new_value: Optional[str] + tickets_id: Optional[int] = None + items_id: Optional[int] = None + itemtype: Optional[str] = None + itemtype_link: Optional[str] = None + linked_action: Optional[int] = None + user_name: Optional[str] = None + date_mod: Optional[datetime.datetime] = None + id_search_option: Optional[int] = None + old_value: Optional[str] = None + new_value: Optional[str] = None class User(ToolModel): id: int = Field(primary_key=True, auto_increment=False) - name: Optional[str] - realname: Optional[str] - firstname: Optional[str] - email: Optional[str] + name: Optional[str] = None + realname: Optional[str] = None + firstname: Optional[str] = None + email: Optional[str] = None class Group(ToolModel): id: int = Field(primary_key=True, auto_increment=False) - name: Optional[str] - completename: Optional[str] + name: Optional[str] = None + completename: Optional[str] = None class ITILCategory(ToolModel): id: int = Field(primary_key=True, auto_increment=False) - name: Optional[str] - completename: Optional[str] + name: Optional[str] = None + completename: Optional[str] = None class Location(ToolModel): id: int = Field(primary_key=True, auto_increment=False) - name: Optional[str] - completename: Optional[str] + name: Optional[str] = None + completename: Optional[str] = None class Supplier(ToolModel): id: int = Field(primary_key=True, auto_increment=False) - name: Optional[str] + name: Optional[str] = None class RequestType(ToolModel): id: int = Field(primary_key=True, auto_increment=False) - name: Optional[str] + name: Optional[str] = None class TicketLabelRecord(ToolModel): id: int = Field(primary_key=True, auto_increment=False) - label_name: Optional[str] + label_name: Optional[str] = None class TicketCustomField(ToolModel): id: int = Field(primary_key=True, auto_increment=False) - tickets_id: Optional[int] - field_id: Optional[str] - field_value: Optional[str] + tickets_id: Optional[int] = None + field_id: Optional[str] = None + field_value: Optional[str] = None class TicketLink(ToolModel): id: int = Field(primary_key=True, auto_increment=False) - tickets_id: Optional[int] - tickets_id_1: Optional[int] - tickets_id_2: Optional[int] - link: Optional[int] + tickets_id: Optional[int] = None + tickets_id_1: Optional[int] = None + tickets_id_2: Optional[int] = None + link: Optional[int] = None class ITILSolution(ToolModel): id: int = Field(primary_key=True, auto_increment=False) - tickets_id: Optional[int] - content: Optional[str] + tickets_id: Optional[int] = None + content: Optional[str] = None b.create_tables( Connection, diff --git a/backend/python/plugins/glpi/glpi/models.py b/backend/python/plugins/glpi/glpi/models.py index 8b949090282..a53769a91e0 100644 --- a/backend/python/plugins/glpi/glpi/models.py +++ b/backend/python/plugins/glpi/glpi/models.py @@ -16,7 +16,7 @@ import datetime from typing import Optional -from pydantic import AnyUrl, SecretStr, validator +from pydantic import AnyUrl, SecretStr, field_validator from sqlalchemy import BigInteger, Column from pydevlake import Field, ScopeConfig as BaseScopeConfig @@ -32,7 +32,8 @@ class Connection(BaseConnection): secret_key: SecretStr timezone: str - @validator('timezone') + @field_validator('timezone') + @classmethod def validate_timezone(cls, timezone: str) -> str: return validate_timezone_name(timezone) @@ -47,7 +48,7 @@ class ScopeConfig(BaseScopeConfig): class Entity(ToolScope, table=True): - completename: Optional[str] + completename: Optional[str] = None GLPI_TICKET_STATUS = { @@ -92,151 +93,151 @@ class Entity(ToolScope, table=True): class User(ToolModel, table=True): id: int = Field(primary_key=True, auto_increment=False) - name: Optional[str] - realname: Optional[str] - firstname: Optional[str] - email: Optional[str] + name: Optional[str] = None + realname: Optional[str] = None + firstname: Optional[str] = None + email: Optional[str] = None class Ticket(ToolModel, table=True): id: int = Field(primary_key=True, auto_increment=False) - name: Optional[str] - content: Optional[str] - date: Optional[datetime.datetime] - closedate: Optional[datetime.datetime] - solvedate: Optional[datetime.datetime] - date_mod: Optional[datetime.datetime] - date_creation: Optional[datetime.datetime] - status: Optional[int] - type: Optional[int] - urgency: Optional[int] - impact: Optional[int] - priority: Optional[int] - entities_id: Optional[str] - itilcategories_id: Optional[int] - category_name: Optional[str] - locations_id: Optional[int] - location_name: Optional[str] - suppliers_id: Optional[int] - supplier_name: Optional[str] - requesttypes_id: Optional[int] - requesttype_name: Optional[str] - users_id_recipient: Optional[int] - users_id_lastupdater: Optional[int] - time_to_resolve: Optional[datetime.datetime] - time_to_own: Optional[datetime.datetime] - internal_time_to_resolve: Optional[datetime.datetime] - internal_time_to_own: Optional[datetime.datetime] - actiontime: Optional[int] - solve_delay_stat: Optional[int] - takeintoaccount_delay_stat: Optional[int] - requester_name: Optional[str] - assignee_id: Optional[int] - assignee_name: Optional[str] - parent_ticket_id: Optional[int] - solution_content: Optional[str] - plugin_fields_json: Optional[str] + name: Optional[str] = None + content: Optional[str] = None + date: Optional[datetime.datetime] = None + closedate: Optional[datetime.datetime] = None + solvedate: Optional[datetime.datetime] = None + date_mod: Optional[datetime.datetime] = None + date_creation: Optional[datetime.datetime] = None + status: Optional[int] = None + type: Optional[int] = None + urgency: Optional[int] = None + impact: Optional[int] = None + priority: Optional[int] = None + entities_id: Optional[str] = None + itilcategories_id: Optional[int] = None + category_name: Optional[str] = None + locations_id: Optional[int] = None + location_name: Optional[str] = None + suppliers_id: Optional[int] = None + supplier_name: Optional[str] = None + requesttypes_id: Optional[int] = None + requesttype_name: Optional[str] = None + users_id_recipient: Optional[int] = None + users_id_lastupdater: Optional[int] = None + time_to_resolve: Optional[datetime.datetime] = None + time_to_own: Optional[datetime.datetime] = None + internal_time_to_resolve: Optional[datetime.datetime] = None + internal_time_to_own: Optional[datetime.datetime] = None + actiontime: Optional[int] = None + solve_delay_stat: Optional[int] = None + takeintoaccount_delay_stat: Optional[int] = None + requester_name: Optional[str] = None + assignee_id: Optional[int] = None + assignee_name: Optional[str] = None + parent_ticket_id: Optional[int] = None + solution_content: Optional[str] = None + plugin_fields_json: Optional[str] = None class ITILCategory(ToolModel, table=True): id: int = Field(primary_key=True, auto_increment=False) - name: Optional[str] - completename: Optional[str] + name: Optional[str] = None + completename: Optional[str] = None class Location(ToolModel, table=True): id: int = Field(primary_key=True, auto_increment=False) - name: Optional[str] - completename: Optional[str] + name: Optional[str] = None + completename: Optional[str] = None class Supplier(ToolModel, table=True): id: int = Field(primary_key=True, auto_increment=False) - name: Optional[str] + name: Optional[str] = None class RequestType(ToolModel, table=True): id: int = Field(primary_key=True, auto_increment=False) - name: Optional[str] + name: Optional[str] = None class TicketLabelRecord(ToolModel, table=True): id: int = Field(primary_key=True, auto_increment=False) - label_name: Optional[str] + label_name: Optional[str] = None class TicketCustomField(ToolModel, table=True): id: int = Field(primary_key=True, auto_increment=False) - tickets_id: Optional[int] - field_id: Optional[str] - field_value: Optional[str] + tickets_id: Optional[int] = None + field_id: Optional[str] = None + field_value: Optional[str] = None class TicketUser(ToolModel, table=True): id: int = Field(primary_key=True, auto_increment=False) - tickets_id: Optional[int] - users_id: Optional[int] - user_name: Optional[str] - type: Optional[int] + tickets_id: Optional[int] = None + users_id: Optional[int] = None + user_name: Optional[str] = None + type: Optional[int] = None class TicketGroup(ToolModel, table=True): id: int = Field(primary_key=True, auto_increment=False) - tickets_id: Optional[int] - groups_id: Optional[int] - group_name: Optional[str] - type: Optional[int] + tickets_id: Optional[int] = None + groups_id: Optional[int] = None + group_name: Optional[str] = None + type: Optional[int] = None class Followup(ToolModel, table=True): id: int = Field(primary_key=True, auto_increment=False) - items_id: Optional[int] - users_id: Optional[int] - content: Optional[str] - date: Optional[datetime.datetime] - date_mod: Optional[datetime.datetime] - is_private: Optional[int] + items_id: Optional[int] = None + users_id: Optional[int] = None + content: Optional[str] = None + date: Optional[datetime.datetime] = None + date_mod: Optional[datetime.datetime] = None + is_private: Optional[int] = None class TicketTask(ToolModel, table=True): id: int = Field(primary_key=True, auto_increment=False) - tickets_id: Optional[int] - users_id: Optional[int] - content: Optional[str] - begin: Optional[datetime.datetime] - end: Optional[datetime.datetime] - actiontime: Optional[int] + tickets_id: Optional[int] = None + users_id: Optional[int] = None + content: Optional[str] = None + begin: Optional[datetime.datetime] = None + end: Optional[datetime.datetime] = None + actiontime: Optional[int] = None class TicketLog(ToolModel, table=True): id: int = Field(primary_key=True, auto_increment=False) - tickets_id: Optional[int] - items_id: Optional[int] - itemtype: Optional[str] - itemtype_link: Optional[str] - linked_action: Optional[int] - user_name: Optional[str] - date_mod: Optional[datetime.datetime] - id_search_option: Optional[int] - old_value: Optional[str] - new_value: Optional[str] + tickets_id: Optional[int] = None + items_id: Optional[int] = None + itemtype: Optional[str] = None + itemtype_link: Optional[str] = None + linked_action: Optional[int] = None + user_name: Optional[str] = None + date_mod: Optional[datetime.datetime] = None + id_search_option: Optional[int] = None + old_value: Optional[str] = None + new_value: Optional[str] = None class Group(ToolModel, table=True): id: int = Field(primary_key=True, auto_increment=False) - name: Optional[str] - completename: Optional[str] + name: Optional[str] = None + completename: Optional[str] = None class TicketLink(ToolModel, table=True): id: int = Field(primary_key=True, auto_increment=False) - tickets_id: Optional[int] + tickets_id: Optional[int] = None tickets_id_1: Optional[int] = Field(default=None, sa_column=Column('tickets_id1', BigInteger)) tickets_id_2: Optional[int] = Field(default=None, sa_column=Column('tickets_id2', BigInteger)) - link: Optional[int] + link: Optional[int] = None class ITILSolution(ToolModel, table=True): id: int = Field(primary_key=True, auto_increment=False) - tickets_id: Optional[int] - content: Optional[str] + tickets_id: Optional[int] = None + content: Optional[str] = None diff --git a/backend/python/plugins/glpi/glpi/streams/tickets.py b/backend/python/plugins/glpi/glpi/streams/tickets.py index d830ca610fd..95845fe85f5 100644 --- a/backend/python/plugins/glpi/glpi/streams/tickets.py +++ b/backend/python/plugins/glpi/glpi/streams/tickets.py @@ -96,9 +96,9 @@ def _glpi_native_ticket_keys() -> set[str]: } glpi_ticket_ignored_keys = {'links'} return { - name for name, field_info in Ticket.__fields__.items() + name for name, field_info in Ticket.model_fields.items() if name not in ticket_enrichment_fields - and not field_info.field_info.extra.get('source') + and not (field_info.json_schema_extra or {}).get('source') } | glpi_ticket_ignored_keys @@ -209,8 +209,20 @@ def _user_display_name(user_raw: dict) -> str: return text return str(user_raw.get('id', '')) + @staticmethod + def _dropdown_ids_only(raw: dict) -> dict: + # GLPI expands dropdowns to 'Name (id)'; reduce them to the id for the + # integer columns so the model validates. The enrichment below still + # reads the names from the original raw data. + cleaned = dict(raw) + for name, field_info in Ticket.model_fields.items(): + value = cleaned.get(name) + if isinstance(value, str) and int in getattr(field_info.annotation, '__args__', (field_info.annotation,)): + cleaned[name] = parse_glpi_dropdown(value)[1] + return cleaned + def extract(self, raw: dict, ctx: Optional[Context] = None) -> Ticket: - ticket_model = autoextract(raw, self.tool_model) + ticket_model = autoextract(self._dropdown_ids_only(raw), self.tool_model) if ctx is not None: self._apply_ticket_enrichment(ticket_model, raw, ctx) return ticket_model diff --git a/backend/python/plugins/glpi/tests/collection_test.py b/backend/python/plugins/glpi/tests/collection_test.py index e6294cce83f..1177e1723d9 100644 --- a/backend/python/plugins/glpi/tests/collection_test.py +++ b/backend/python/plugins/glpi/tests/collection_test.py @@ -108,7 +108,7 @@ def _seed_raw(session, plugin, ctx, rows_by_stream): for stream_name, rows in rows_by_stream.items(): raw_model = plugin.get_stream(stream_name).raw_model(session) for row in rows: - session.add(raw_model(params=params, data=json.dumps(row))) + session.add(raw_model(params=params, data=json.dumps(row).encode('utf8'))) session.commit() diff --git a/backend/python/plugins/glpi/tests/streams_test.py b/backend/python/plugins/glpi/tests/streams_test.py index db94ab65f8b..cbd4638cd8c 100644 --- a/backend/python/plugins/glpi/tests/streams_test.py +++ b/backend/python/plugins/glpi/tests/streams_test.py @@ -82,10 +82,10 @@ def test_tickets_stream(context): original_type='Incident', status='DONE', original_status='Solved', - created_date='2024-01-15 08:00:00', - updated_date='2024-01-16 12:00:00', - resolution_date='2024-01-17 09:00:00', - due_date='2024-01-20 17:00:00', + created_date=datetime.datetime(2024, 1, 15, 8, 0, 0), + updated_date=datetime.datetime(2024, 1, 16, 12, 0, 0), + resolution_date=datetime.datetime(2024, 1, 17, 9, 0, 0), + due_date=datetime.datetime(2024, 1, 20, 17, 0, 0), creator_id=domain_id(User, context.connection.id, 101), creator_name='Requester User', assignee_id=domain_id(User, context.connection.id, 101), diff --git a/backend/python/plugins/redmine/redmine/migrations.py b/backend/python/plugins/redmine/redmine/migrations.py index 604cb870330..3a8d825d021 100644 --- a/backend/python/plugins/redmine/redmine/migrations.py +++ b/backend/python/plugins/redmine/redmine/migrations.py @@ -30,13 +30,13 @@ class Connection(BaseConnection): token: SecretStr class Project(ToolScope): - identifier: Optional[str] - description: Optional[str] + identifier: Optional[str] = None + description: Optional[str] = None class ScopeConfig(ToolTable, Model): name: str = Field(default="default") - entities: Optional[str] - connection_id: Optional[int] + entities: Optional[str] = None + connection_id: Optional[int] = None collect_journals: bool = False collect_time_entries: bool = False tickets_created_after: Optional[datetime.datetime] = None @@ -45,54 +45,54 @@ class ScopeConfig(ToolTable, Model): class Issue(ToolModel): id: int = Field(primary_key=True, auto_increment=False) - project_id: Optional[int] - tracker_name: Optional[str] - status_name: Optional[str] - priority_name: Optional[str] - author_id: Optional[int] - author_name: Optional[str] - assigned_to_id: Optional[int] - assigned_to_name: Optional[str] - parent_id: Optional[int] - category_id: Optional[int] - category_name: Optional[str] - fixed_version_id: Optional[int] - fixed_version_name: Optional[str] - subject: Optional[str] - description: Optional[str] - start_date: Optional[datetime.date] - due_date: Optional[datetime.date] - done_ratio: Optional[int] - estimated_hours: Optional[float] - spent_hours: Optional[float] - total_spent_hours: Optional[float] - custom_fields_json: Optional[str] - relations_json: Optional[str] - created_on: Optional[datetime.datetime] - updated_on: Optional[datetime.datetime] - closed_on: Optional[datetime.datetime] + project_id: Optional[int] = None + tracker_name: Optional[str] = None + status_name: Optional[str] = None + priority_name: Optional[str] = None + author_id: Optional[int] = None + author_name: Optional[str] = None + assigned_to_id: Optional[int] = None + assigned_to_name: Optional[str] = None + parent_id: Optional[int] = None + category_id: Optional[int] = None + category_name: Optional[str] = None + fixed_version_id: Optional[int] = None + fixed_version_name: Optional[str] = None + subject: Optional[str] = None + description: Optional[str] = None + start_date: Optional[datetime.date] = None + due_date: Optional[datetime.date] = None + done_ratio: Optional[int] = None + estimated_hours: Optional[float] = None + spent_hours: Optional[float] = None + total_spent_hours: Optional[float] = None + custom_fields_json: Optional[str] = None + relations_json: Optional[str] = None + created_on: Optional[datetime.datetime] = None + updated_on: Optional[datetime.datetime] = None + closed_on: Optional[datetime.datetime] = None class Journal(ToolModel): id: int = Field(primary_key=True, auto_increment=False) - issue_id: Optional[int] - user_id: Optional[int] - user_name: Optional[str] - notes: Optional[str] - details_json: Optional[str] - created_on: Optional[datetime.datetime] - private_notes: Optional[bool] + issue_id: Optional[int] = None + user_id: Optional[int] = None + user_name: Optional[str] = None + notes: Optional[str] = None + details_json: Optional[str] = None + created_on: Optional[datetime.datetime] = None + private_notes: Optional[bool] = None class TimeEntry(ToolModel): id: int = Field(primary_key=True, auto_increment=False) - project_id: Optional[int] - issue_id: Optional[int] - user_id: Optional[int] - user_name: Optional[str] - hours: Optional[float] - comments: Optional[str] - spent_on: Optional[datetime.date] - created_on: Optional[datetime.datetime] - updated_on: Optional[datetime.datetime] + project_id: Optional[int] = None + issue_id: Optional[int] = None + user_id: Optional[int] = None + user_name: Optional[str] = None + hours: Optional[float] = None + comments: Optional[str] = None + spent_on: Optional[datetime.date] = None + created_on: Optional[datetime.datetime] = None + updated_on: Optional[datetime.datetime] = None b.create_tables( Connection, diff --git a/backend/python/plugins/redmine/redmine/models.py b/backend/python/plugins/redmine/redmine/models.py index 2c81a4b3f0d..3fa2ebb1311 100644 --- a/backend/python/plugins/redmine/redmine/models.py +++ b/backend/python/plugins/redmine/redmine/models.py @@ -16,7 +16,7 @@ import datetime from typing import Dict, Optional -from pydantic import AnyUrl, BaseModel, SecretStr +from pydantic import AnyUrl, BaseModel, ConfigDict, SecretStr from pydevlake import Field, ScopeConfig as BaseScopeConfig from pydevlake.model import Connection as BaseConnection, ToolModel, ToolScope @@ -27,15 +27,13 @@ class StatusMapping(BaseModel): standard_status: str = Field(alias='standardStatus') - class Config: - allow_population_by_field_name = True + model_config = ConfigDict(populate_by_name=True) class TypeMapping(BaseModel): standard_type: str = Field(alias='standardType') - class Config: - allow_population_by_field_name = True + model_config = ConfigDict(populate_by_name=True) class Connection(BaseConnection): @@ -51,59 +49,59 @@ class ScopeConfig(BaseScopeConfig): class Project(ToolScope, table=True): - identifier: Optional[str] - description: Optional[str] + identifier: Optional[str] = None + description: Optional[str] = None class Issue(ToolModel, table=True): id: int = Field(primary_key=True, auto_increment=False) - project_id: Optional[int] - tracker_name: Optional[str] - status_name: Optional[str] - priority_name: Optional[str] - author_id: Optional[int] - author_name: Optional[str] - assigned_to_id: Optional[int] - assigned_to_name: Optional[str] - parent_id: Optional[int] - category_id: Optional[int] - category_name: Optional[str] - fixed_version_id: Optional[int] - fixed_version_name: Optional[str] - subject: Optional[str] - description: Optional[str] - start_date: Optional[datetime.date] - due_date: Optional[datetime.date] - done_ratio: Optional[int] - estimated_hours: Optional[float] - spent_hours: Optional[float] - total_spent_hours: Optional[float] - custom_fields_json: Optional[str] - relations_json: Optional[str] - created_on: Optional[datetime.datetime] - updated_on: Optional[datetime.datetime] - closed_on: Optional[datetime.datetime] + project_id: Optional[int] = None + tracker_name: Optional[str] = None + status_name: Optional[str] = None + priority_name: Optional[str] = None + author_id: Optional[int] = None + author_name: Optional[str] = None + assigned_to_id: Optional[int] = None + assigned_to_name: Optional[str] = None + parent_id: Optional[int] = None + category_id: Optional[int] = None + category_name: Optional[str] = None + fixed_version_id: Optional[int] = None + fixed_version_name: Optional[str] = None + subject: Optional[str] = None + description: Optional[str] = None + start_date: Optional[datetime.date] = None + due_date: Optional[datetime.date] = None + done_ratio: Optional[int] = None + estimated_hours: Optional[float] = None + spent_hours: Optional[float] = None + total_spent_hours: Optional[float] = None + custom_fields_json: Optional[str] = None + relations_json: Optional[str] = None + created_on: Optional[datetime.datetime] = None + updated_on: Optional[datetime.datetime] = None + closed_on: Optional[datetime.datetime] = None class Journal(ToolModel, table=True): id: int = Field(primary_key=True, auto_increment=False) - issue_id: Optional[int] - user_id: Optional[int] - user_name: Optional[str] - notes: Optional[str] - details_json: Optional[str] - created_on: Optional[datetime.datetime] - private_notes: Optional[bool] + issue_id: Optional[int] = None + user_id: Optional[int] = None + user_name: Optional[str] = None + notes: Optional[str] = None + details_json: Optional[str] = None + created_on: Optional[datetime.datetime] = None + private_notes: Optional[bool] = None class TimeEntry(ToolModel, table=True): id: int = Field(primary_key=True, auto_increment=False) - project_id: Optional[int] - issue_id: Optional[int] - user_id: Optional[int] - user_name: Optional[str] - hours: Optional[float] - comments: Optional[str] - spent_on: Optional[datetime.date] - created_on: Optional[datetime.datetime] - updated_on: Optional[datetime.datetime] + project_id: Optional[int] = None + issue_id: Optional[int] = None + user_id: Optional[int] = None + user_name: Optional[str] = None + hours: Optional[float] = None + comments: Optional[str] = None + spent_on: Optional[datetime.date] = None + created_on: Optional[datetime.datetime] = None + updated_on: Optional[datetime.datetime] = None diff --git a/backend/python/plugins/zephyr/zephyr/migrations.py b/backend/python/plugins/zephyr/zephyr/migrations.py index 2ac06394520..e8062168f48 100644 --- a/backend/python/plugins/zephyr/zephyr/migrations.py +++ b/backend/python/plugins/zephyr/zephyr/migrations.py @@ -30,99 +30,99 @@ class Connection(BaseConnection): token: SecretStr class Project(ToolScope): - jira_project_id: Optional[int] - project_key: Optional[str] + jira_project_id: Optional[int] = None + project_key: Optional[str] = None class ScopeConfig(ToolTable, Model): name: str = Field(default='default') - entities: Optional[str] - connection_id: Optional[int] + entities: Optional[str] = None + connection_id: Optional[int] = None test_type_custom_field: str = Field(default='Test Type') class Folder(ToolModel): id: int = Field(primary_key=True, auto_increment=False) - project_key: Optional[str] - name: Optional[str] - parent_id: Optional[int] - folder_type: Optional[str] - index: Optional[int] + project_key: Optional[str] = None + name: Optional[str] = None + parent_id: Optional[int] = None + folder_type: Optional[str] = None + index: Optional[int] = None class TestCase(ToolModel): id: int = Field(primary_key=True, auto_increment=False) - key: Optional[str] - project_key: Optional[str] - name: Optional[str] - objective: Optional[str] - precondition: Optional[str] - created_on: Optional[datetime.datetime] - folder_id: Optional[int] - folder_name: Optional[str] - component_id: Optional[int] - component_name: Optional[str] - priority_id: Optional[int] - priority_name: Optional[str] - status_id: Optional[int] - status_name: Optional[str] - owner_account_id: Optional[str] - estimated_time: Optional[int] - labels_json: Optional[str] - custom_fields_json: Optional[str] - issue_links_json: Optional[str] + key: Optional[str] = None + project_key: Optional[str] = None + name: Optional[str] = None + objective: Optional[str] = None + precondition: Optional[str] = None + created_on: Optional[datetime.datetime] = None + folder_id: Optional[int] = None + folder_name: Optional[str] = None + component_id: Optional[int] = None + component_name: Optional[str] = None + priority_id: Optional[int] = None + priority_name: Optional[str] = None + status_id: Optional[int] = None + status_name: Optional[str] = None + owner_account_id: Optional[str] = None + estimated_time: Optional[int] = None + labels_json: Optional[str] = None + custom_fields_json: Optional[str] = None + issue_links_json: Optional[str] = None class TestCaseLabel(ToolModel): id: str = Field(primary_key=True, auto_increment=False) - test_case_id: Optional[int] - test_case_key: Optional[str] - label_name: Optional[str] + test_case_id: Optional[int] = None + test_case_key: Optional[str] = None + label_name: Optional[str] = None class TestCaseIssueLink(ToolModel): id: int = Field(primary_key=True, auto_increment=False) - test_case_id: Optional[int] - test_case_key: Optional[str] - issue_id: Optional[int] - link_type: Optional[str] + test_case_id: Optional[int] = None + test_case_key: Optional[str] = None + issue_id: Optional[int] = None + link_type: Optional[str] = None class TestCycle(ToolModel): id: int = Field(primary_key=True, auto_increment=False) - key: Optional[str] - project_key: Optional[str] - name: Optional[str] - description: Optional[str] - folder_id: Optional[int] - folder_name: Optional[str] - status_id: Optional[int] - status_name: Optional[str] - jira_project_version_id: Optional[int] - jira_project_version_name: Optional[str] - planned_start_date: Optional[datetime.datetime] - planned_end_date: Optional[datetime.datetime] + key: Optional[str] = None + project_key: Optional[str] = None + name: Optional[str] = None + description: Optional[str] = None + folder_id: Optional[int] = None + folder_name: Optional[str] = None + status_id: Optional[int] = None + status_name: Optional[str] = None + jira_project_version_id: Optional[int] = None + jira_project_version_name: Optional[str] = None + planned_start_date: Optional[datetime.datetime] = None + planned_end_date: Optional[datetime.datetime] = None class TestExecution(ToolModel): id: int = Field(primary_key=True, auto_increment=False) - key: Optional[str] - project_key: Optional[str] - test_case_id: Optional[int] - test_cycle_id: Optional[int] - test_execution_status_id: Optional[int] - test_execution_status_name: Optional[str] - jira_project_version_id: Optional[int] - jira_project_version_name: Optional[str] - actual_end_date: Optional[datetime.datetime] - execution_time: Optional[int] - estimated_time: Optional[int] - executed_by_id: Optional[str] - assigned_to_id: Optional[str] - comment: Optional[str] - automated: Optional[bool] - custom_fields_json: Optional[str] - issue_links_json: Optional[str] + key: Optional[str] = None + project_key: Optional[str] = None + test_case_id: Optional[int] = None + test_cycle_id: Optional[int] = None + test_execution_status_id: Optional[int] = None + test_execution_status_name: Optional[str] = None + jira_project_version_id: Optional[int] = None + jira_project_version_name: Optional[str] = None + actual_end_date: Optional[datetime.datetime] = None + execution_time: Optional[int] = None + estimated_time: Optional[int] = None + executed_by_id: Optional[str] = None + assigned_to_id: Optional[str] = None + comment: Optional[str] = None + automated: Optional[bool] = None + custom_fields_json: Optional[str] = None + issue_links_json: Optional[str] = None class TestExecutionIssueLink(ToolModel): id: int = Field(primary_key=True, auto_increment=False) - test_execution_id: Optional[int] - test_execution_key: Optional[str] - issue_id: Optional[int] - link_type: Optional[str] + test_execution_id: Optional[int] = None + test_execution_key: Optional[str] = None + issue_id: Optional[int] = None + link_type: Optional[str] = None b.create_tables( Connection, diff --git a/backend/python/plugins/zephyr/zephyr/models.py b/backend/python/plugins/zephyr/zephyr/models.py index 2fbb20ff3d0..2856ef8fdb8 100644 --- a/backend/python/plugins/zephyr/zephyr/models.py +++ b/backend/python/plugins/zephyr/zephyr/models.py @@ -34,102 +34,99 @@ class Connection(BaseConnection): class ScopeConfig(BaseScopeConfig): test_type_custom_field: str = Field(default='Test Type', alias='testTypeCustomField') - class Config: - allow_population_by_field_name = True - class Project(ToolScope, table=True): - jira_project_id: Optional[int] - project_key: Optional[str] + jira_project_id: Optional[int] = None + project_key: Optional[str] = None class Folder(ToolModel, table=True): id: int = Field(primary_key=True, auto_increment=False) - project_key: Optional[str] - name: Optional[str] - parent_id: Optional[int] - folder_type: Optional[str] - index: Optional[int] + project_key: Optional[str] = None + name: Optional[str] = None + parent_id: Optional[int] = None + folder_type: Optional[str] = None + index: Optional[int] = None class TestCase(ToolModel, table=True): id: int = Field(primary_key=True, auto_increment=False) - key: Optional[str] - project_key: Optional[str] - name: Optional[str] - objective: Optional[str] - precondition: Optional[str] - created_on: Optional[datetime.datetime] - folder_id: Optional[int] - folder_name: Optional[str] - component_id: Optional[int] - component_name: Optional[str] - priority_id: Optional[int] - priority_name: Optional[str] - status_id: Optional[int] - status_name: Optional[str] - owner_account_id: Optional[str] - estimated_time: Optional[int] - labels_json: Optional[str] - custom_fields_json: Optional[str] - issue_links_json: Optional[str] + key: Optional[str] = None + project_key: Optional[str] = None + name: Optional[str] = None + objective: Optional[str] = None + precondition: Optional[str] = None + created_on: Optional[datetime.datetime] = None + folder_id: Optional[int] = None + folder_name: Optional[str] = None + component_id: Optional[int] = None + component_name: Optional[str] = None + priority_id: Optional[int] = None + priority_name: Optional[str] = None + status_id: Optional[int] = None + status_name: Optional[str] = None + owner_account_id: Optional[str] = None + estimated_time: Optional[int] = None + labels_json: Optional[str] = None + custom_fields_json: Optional[str] = None + issue_links_json: Optional[str] = None class TestCaseLabel(ToolModel, table=True): id: str = Field(primary_key=True, auto_increment=False) - test_case_id: Optional[int] - test_case_key: Optional[str] - label_name: Optional[str] + test_case_id: Optional[int] = None + test_case_key: Optional[str] = None + label_name: Optional[str] = None class TestCaseIssueLink(ToolModel, table=True): id: int = Field(primary_key=True, auto_increment=False) - test_case_id: Optional[int] - test_case_key: Optional[str] - issue_id: Optional[int] - link_type: Optional[str] + test_case_id: Optional[int] = None + test_case_key: Optional[str] = None + issue_id: Optional[int] = None + link_type: Optional[str] = None class TestCycle(ToolModel, table=True): id: int = Field(primary_key=True, auto_increment=False) - key: Optional[str] - project_key: Optional[str] - name: Optional[str] - description: Optional[str] - folder_id: Optional[int] - folder_name: Optional[str] - status_id: Optional[int] - status_name: Optional[str] - jira_project_version_id: Optional[int] - jira_project_version_name: Optional[str] - planned_start_date: Optional[datetime.datetime] - planned_end_date: Optional[datetime.datetime] + key: Optional[str] = None + project_key: Optional[str] = None + name: Optional[str] = None + description: Optional[str] = None + folder_id: Optional[int] = None + folder_name: Optional[str] = None + status_id: Optional[int] = None + status_name: Optional[str] = None + jira_project_version_id: Optional[int] = None + jira_project_version_name: Optional[str] = None + planned_start_date: Optional[datetime.datetime] = None + planned_end_date: Optional[datetime.datetime] = None class TestExecution(ToolModel, table=True): id: int = Field(primary_key=True, auto_increment=False) - key: Optional[str] - project_key: Optional[str] - test_case_id: Optional[int] - test_cycle_id: Optional[int] - test_execution_status_id: Optional[int] - test_execution_status_name: Optional[str] - jira_project_version_id: Optional[int] - jira_project_version_name: Optional[str] - actual_end_date: Optional[datetime.datetime] - execution_time: Optional[int] - estimated_time: Optional[int] - executed_by_id: Optional[str] - assigned_to_id: Optional[str] - comment: Optional[str] - automated: Optional[bool] - custom_fields_json: Optional[str] - issue_links_json: Optional[str] + key: Optional[str] = None + project_key: Optional[str] = None + test_case_id: Optional[int] = None + test_cycle_id: Optional[int] = None + test_execution_status_id: Optional[int] = None + test_execution_status_name: Optional[str] = None + jira_project_version_id: Optional[int] = None + jira_project_version_name: Optional[str] = None + actual_end_date: Optional[datetime.datetime] = None + execution_time: Optional[int] = None + estimated_time: Optional[int] = None + executed_by_id: Optional[str] = None + assigned_to_id: Optional[str] = None + comment: Optional[str] = None + automated: Optional[bool] = None + custom_fields_json: Optional[str] = None + issue_links_json: Optional[str] = None class TestExecutionIssueLink(ToolModel, table=True): id: int = Field(primary_key=True, auto_increment=False) - test_execution_id: Optional[int] - test_execution_key: Optional[str] - issue_id: Optional[int] - link_type: Optional[str] + test_execution_id: Optional[int] = None + test_execution_key: Optional[str] = None + issue_id: Optional[int] = None + link_type: Optional[str] = None diff --git a/backend/python/pydevlake/poetry.lock b/backend/python/pydevlake/poetry.lock index 0df8d2a326a..4789cd65b42 100644 --- a/backend/python/pydevlake/poetry.lock +++ b/backend/python/pydevlake/poetry.lock @@ -1,5 +1,17 @@ # This file is automatically @generated by Poetry 2.5.1 and should not be changed by hand. +[[package]] +name = "annotated-types" +version = "0.8.0" +description = "Reusable constraint types to use with typing.Annotated" +optional = false +python-versions = ">=3.10" +groups = ["main"] +files = [ + {file = "annotated_types-0.8.0-py3-none-any.whl", hash = "sha256:f072f4d804ea359e4eaf198b1af7a8b0943881a87f31bb764f8bf219bb9419e0"}, + {file = "annotated_types-0.8.0.tar.gz", hash = "sha256:13b2beaad985e05e2d6407ee4c4f35590b11f8d693a258a561055cac8f64cab7"}, +] + [[package]] name = "certifi" version = "2026.10.23" @@ -504,57 +516,178 @@ files = [ [[package]] name = "pydantic" -version = "1.10.27" -description = "Data validation and settings management using python type hints" +version = "2.14.3" +description = "Data validation using Python type hints" optional = false -python-versions = ">=3.7" +python-versions = ">=3.10" groups = ["main"] files = [ - {file = "pydantic-1.10.27-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eae28e29ca3eff84c9dc74a93c1c855fc8a85ca8ff07dc59f85c7946ad82558d"}, - {file = "pydantic-1.10.27-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cc24e078b473fdc83ee1429ad48602d10a524e83e5109a39b96702df5471b2ea"}, - {file = "pydantic-1.10.27-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ca03f9faadded650da853023f46744ec7a5a5e7b19f22bf03892d005b22a0a36"}, - {file = "pydantic-1.10.27-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e95e77e46e4ba81ca198ab0c442ac92091b31025a8b887ef0a8b56455affb0e6"}, - {file = "pydantic-1.10.27-cp310-cp310-win_amd64.whl", hash = "sha256:eb7eac10d751991e208a3d76c19ab97bb8d478d7ba400ac48310b85af8638a2f"}, - {file = "pydantic-1.10.27-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c140c225280c949a72c8d36966b994b3739cf80640642971cc80c5f679ada94f"}, - {file = "pydantic-1.10.27-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:79a9d28e3de0dbea101c43f4361345859c169d9c8cd63d41af3b42ecb1e7fa9b"}, - {file = "pydantic-1.10.27-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:76b9dee80c3c3406fadd3a704166caee782e9dd6582d5a0cbc63df1003dfe102"}, - {file = "pydantic-1.10.27-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e6e4694479a27f50d90d1f6e1606d87692282624c2fa0ef70b2512e447c3fc91"}, - {file = "pydantic-1.10.27-cp311-cp311-win_amd64.whl", hash = "sha256:23c20016fc9386a666233b603c8ed72d6950139dc86c8ecdf8f9f4cc59737380"}, - {file = "pydantic-1.10.27-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b3134bb69d4f792f2e8d91822d413c2a65640534111a7bb5ad0dba7dddc84ba2"}, - {file = "pydantic-1.10.27-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7c0aec4fb3a905791791a181d960a6ba39e431b70d0efee53fd0702c5586f185"}, - {file = "pydantic-1.10.27-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:75b333b79e8651199a77d7d2e113595ed1c0922d3739208397190f0debff5627"}, - {file = "pydantic-1.10.27-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:712c696c21df56f42ed1659ca67a7ac7177961f5ec4f8daf3bdc51c94ecbeee3"}, - {file = "pydantic-1.10.27-cp312-cp312-win_amd64.whl", hash = "sha256:45fa35a6c596607d22e485521b222c871e8994df0951eaaf7d99c40738179c55"}, - {file = "pydantic-1.10.27-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:04e1816ffb3e95626fcdea60652475f62290fc8abccffd09506e04641d9ae84b"}, - {file = "pydantic-1.10.27-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ad8f316e7cc228ca083ec0ee46a6fa0a1462825fb0b5ee77a4e305ac2a3c4c69"}, - {file = "pydantic-1.10.27-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e2882264f36d8c9e33e28c246a1fb5ac72b1a3807aa8a56a0391496485643da2"}, - {file = "pydantic-1.10.27-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f4df9b90d62e4ef2baeab9ead89666355ffaece715cdbd422840a9fcf093b1b9"}, - {file = "pydantic-1.10.27-cp313-cp313-win_amd64.whl", hash = "sha256:55e59df95f80a2df7105760d032809b68b4197fc6be55fff4c2bed183e72ea53"}, - {file = "pydantic-1.10.27-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:a32f08d7c0761b37e83fccb872b8e0a5f3c239f7163efebcbb423e16fbbc8719"}, - {file = "pydantic-1.10.27-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:de052982b7ff0decccfd34ceb7ac3eccd7a4488c7f80357b79d4464b4cbec3f2"}, - {file = "pydantic-1.10.27-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:aafb6196650480014d02bb908a71d11f8d1281937c4fed2ababdf6f911bb2c46"}, - {file = "pydantic-1.10.27-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6f3ca6cc8e3a66dc84586c838605b241c8fec71d81e1533e1a4f1795286e10cb"}, - {file = "pydantic-1.10.27-cp314-cp314-win_amd64.whl", hash = "sha256:8dba906c8981a5b2d4489f394236496077eb0b5468614e2aa089d3e7f2e5792a"}, - {file = "pydantic-1.10.27-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e538d73928ff07da7655fc0f9b2695e5094746a5eaca5560707149c3d969ee55"}, - {file = "pydantic-1.10.27-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2d55abdaa56e5421da4c991398a808338a052839562d795439f2492c0d8bc274"}, - {file = "pydantic-1.10.27-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:25d6cb1e1911240721e9932c2da814585566f99056e2fb09ca329b0310d4853e"}, - {file = "pydantic-1.10.27-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:fff314506136b4c0b786405772aef88b8b01f6863c13303b5c934912c7ead1ad"}, - {file = "pydantic-1.10.27-cp38-cp38-win_amd64.whl", hash = "sha256:5972ec9abf2cbf017090c811310d520b552c2ac57663968e02307a161c4067f9"}, - {file = "pydantic-1.10.27-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:89079afb6aa3dfcb4785fa5f74463233c9fef460e54f59473393d4ca44ff105d"}, - {file = "pydantic-1.10.27-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5a8f34e9dbd87d143421b6af8ab7e9cb612856221a648a1b8c30f21e7ddb0007"}, - {file = "pydantic-1.10.27-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:216fdb8c0a97e0b0e9472538359f2d2ffd3d4554073a095bec8c0a28d7d9a3a9"}, - {file = "pydantic-1.10.27-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:01cff2fabf4f4d618d629201e27799cba4b5aefdce6c3db06b34e8ff48461e36"}, - {file = "pydantic-1.10.27-cp39-cp39-win_amd64.whl", hash = "sha256:301e615e7d9f9995e98e7fca916f3e4b4bc66ba1f98e596fe1e5af3ac5db0024"}, - {file = "pydantic-1.10.27-py3-none-any.whl", hash = "sha256:d714c3df0db634a6720abdc204d7b3bfc6c62d4ef7b4f9dcd64b37c29187a058"}, - {file = "pydantic-1.10.27.tar.gz", hash = "sha256:62906b7ca1237ceefb3db38276417286ee0cd2c81720a6b8932cc57bfeba496a"}, + {file = "pydantic-2.14.3-py3-none-any.whl", hash = "sha256:3f7b347782ab7e4cf4c798496ae3a82787d9f21ec12676a9c564355eeef8daa8"}, + {file = "pydantic-2.14.3.tar.gz", hash = "sha256:1054f237f4d4733e5a30e1e2333bd33a2004ab9ab1510bd053a9a31bb48e232d"}, ] [package.dependencies] -typing-extensions = ">=4.2.0" +annotated-types = ">=0.6.0" +pydantic-core = "2.50.4" +typing-extensions = ">=4.16.0" +typing-inspection = ">=0.4.4" [package.extras] -dotenv = ["python-dotenv (>=0.10.4)"] -email = ["email-validator (>=1.0.3)"] +email = ["email-validator (>=2.0.0)"] +timezone = ["tzdata ; platform_system == \"Windows\""] + +[[package]] +name = "pydantic-core" +version = "2.50.4" +description = "Core functionality for Pydantic validation and serialization" +optional = false +python-versions = ">=3.10" +groups = ["main"] +files = [ + {file = "pydantic_core-2.50.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:83d2beac85b757bfc404c5c0612df51c4ef33bbb7be65cf4a96b4da7cbc4ff4f"}, + {file = "pydantic_core-2.50.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:76e0065998159244ff4c097a6c05ff08019c6fbb6e597a85846e73044f0215b3"}, + {file = "pydantic_core-2.50.4-cp310-cp310-manylinux1_i686.manylinux_2_5_i686.whl", hash = "sha256:25e7e1080f9f7ce7cd9d114b31470ce912771bd02f38c824721d3c35d312abff"}, + {file = "pydantic_core-2.50.4-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c4c5a1770ecfe8bdb6c6f09f8d81ea4de04f7efb012fac1efa4ad315dccc1fd1"}, + {file = "pydantic_core-2.50.4-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.whl", hash = "sha256:2f6767122b37c780bb756a720a4eef2bc6a050a0a1143428834b3cbc89448bd2"}, + {file = "pydantic_core-2.50.4-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:86c7c4615634b5c57a79770f5b738354e45ae219a89949aeae84f19169a05283"}, + {file = "pydantic_core-2.50.4-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:6c7d7b0b596319e9ce79ef96ce57a14054a2eac629c0588a0539187a218be799"}, + {file = "pydantic_core-2.50.4-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ed9c0b6f236648dbf30d57e9f57e1f74878caafa04833a19f529b5ba5164b7a8"}, + {file = "pydantic_core-2.50.4-cp310-cp310-manylinux_2_31_riscv64.whl", hash = "sha256:dfcf6e51000b34f7026322cd9ea9bc340d745637e27e0bbc22f504b4f6b967ee"}, + {file = "pydantic_core-2.50.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:bd46bcc28ed85d3cf71581b42d90b4ebd1f2062f81879519fed209f8a4d1cfc6"}, + {file = "pydantic_core-2.50.4-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:696613a0c0e7b2b35356e389ba4195ce20cfe7a2fc2e992c87d974d973eabec7"}, + {file = "pydantic_core-2.50.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2980a701be88f9128a7470189fa3bcda5387f76c298a6f8e000fc29eb2a6f4e7"}, + {file = "pydantic_core-2.50.4-cp310-cp310-win32.whl", hash = "sha256:dd8bed00731a21e3106e5dd6bbffb6c775a2c0bbc7c0c9face534d830057bdc9"}, + {file = "pydantic_core-2.50.4-cp310-cp310-win_amd64.whl", hash = "sha256:e512c75ec5cf4475c1aa50ad975ecdf253f4963b06e152e1a11edd6de4010753"}, + {file = "pydantic_core-2.50.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:3e547ceec1da7382f01f9e13963023e53367a71802c88778b21b9645a077cbdf"}, + {file = "pydantic_core-2.50.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c813ada7a651193acda85b6bc1cf12abd4b37cd25c7c6a75d7183512cc374969"}, + {file = "pydantic_core-2.50.4-cp311-cp311-manylinux1_i686.manylinux_2_5_i686.whl", hash = "sha256:57fa0a9490785139f1a4e4f43891830d55dfe4408845c0c9cb5eff4aeaf75f69"}, + {file = "pydantic_core-2.50.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:30d4dc35bc0eea52202a90b3820445ee0072c820241bfa710a623a078c9b267b"}, + {file = "pydantic_core-2.50.4-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.whl", hash = "sha256:789f88dea57841cdebef392b5d6e90444d767117e9ff2e0d9172df5c9de6690c"}, + {file = "pydantic_core-2.50.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:d690121e80ab16e623415351ab24713534d4e500b3cadff216409cb6826063d4"}, + {file = "pydantic_core-2.50.4-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b42f64825f5d750228f08318a9bf4d723b7ecb4c472aedcb3013c3ec2dc1f949"}, + {file = "pydantic_core-2.50.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0574866e05f6adeecc520d87e87dd06210c0a51706341f6ef8421572f5a64444"}, + {file = "pydantic_core-2.50.4-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:dcf2c7eaaa4cafe8e49b017e5bb49e76e084ab6f0cd712ee4019c812b5cf68b8"}, + {file = "pydantic_core-2.50.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3b8ee2589a082739c522c1fe4be227412fcf108b903abb6672ae2f5570558882"}, + {file = "pydantic_core-2.50.4-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:aec3c2d741a8e3ee993de7f95f37afb51e31b169c95dbd29da4cf6688f340914"}, + {file = "pydantic_core-2.50.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8923fcd49f875e8a0448d7223d1fdf1a9973ae2d1f20d4158753ceb8909facd2"}, + {file = "pydantic_core-2.50.4-cp311-cp311-win32.whl", hash = "sha256:fc04affef30be98c1f36f0c422a4061ef618fdc1dde79f5ad5458dd496fecffa"}, + {file = "pydantic_core-2.50.4-cp311-cp311-win_amd64.whl", hash = "sha256:15bece43a02ad543c621c8305e67dedb5f27d378c5ba741e5a2c36523f8ef37f"}, + {file = "pydantic_core-2.50.4-cp311-cp311-win_arm64.whl", hash = "sha256:e498900bfbf7ddddd862f810440c09e9b81674739e8a11d619b40906dccd4a9a"}, + {file = "pydantic_core-2.50.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:32a991aebd165f227b7c7c60bb9d66c2c7de9c24308552da264c9938fde0f8d6"}, + {file = "pydantic_core-2.50.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1e20cbde2b6deb33a51d08cd168454dd9044ec7d4474056f4d98d63f51578783"}, + {file = "pydantic_core-2.50.4-cp312-cp312-manylinux1_i686.manylinux_2_5_i686.whl", hash = "sha256:8cceae48ae7f94990c2f4e36291e9ec9868735e8b0f19e4489a17b0422338466"}, + {file = "pydantic_core-2.50.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:16902a147b3da4840612164a5e67947104d63e978f7a57c395877a5e26690b9c"}, + {file = "pydantic_core-2.50.4-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.whl", hash = "sha256:d6e3485a5e5c01fb5339c1ee3d4b9e21e2135a2a9d44caafb71acd994487ee7c"}, + {file = "pydantic_core-2.50.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:629eae995185540406e3635df5d5cf1d44f19ea240840b835d3f44541ff694d8"}, + {file = "pydantic_core-2.50.4-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:41b2cd8b29dbb5a4c9828a70f50d1abfc92011115c813213d3a91205c6f731b3"}, + {file = "pydantic_core-2.50.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c81d98e27d9d9261909dcccab1ba5d6ea1c98b0bb9470e368604614fd1d36ddd"}, + {file = "pydantic_core-2.50.4-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:ca83a32b2b41653d89f09a3d22b770bca96da72273bef8f7a68136bdd1e8b823"}, + {file = "pydantic_core-2.50.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:817953730e4a73a09008b010c4a42396cefe799616a22df2ac21d3927b3080cf"}, + {file = "pydantic_core-2.50.4-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:664e74848c2f5fc27db8505fe24e1ecd3ac669412913bf73d176916f86cc08e2"}, + {file = "pydantic_core-2.50.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:219114f8dcdcbe4720d82ef016b1287ce5a0a67d7c69ca61524eb72e82aac344"}, + {file = "pydantic_core-2.50.4-cp312-cp312-win32.whl", hash = "sha256:67f7cc397e1d5556a801d1cba74de0d27d827eb242e6c036c0ca273c745414f1"}, + {file = "pydantic_core-2.50.4-cp312-cp312-win_amd64.whl", hash = "sha256:ea2f61b0bc12f3592288503961b764579dea0658852d96a0b3d823614d808821"}, + {file = "pydantic_core-2.50.4-cp312-cp312-win_arm64.whl", hash = "sha256:32d6dda86383645ec428ea64dfc277036f5cbc60a72238eab28b91a3fdb9a113"}, + {file = "pydantic_core-2.50.4-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:0f87ae9db5ba8d8de40dcb93982cf8dd544e6552a80d3345af51941cc2146b80"}, + {file = "pydantic_core-2.50.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1239daaf063e62213ca1f34d96663900bd7510c42a786e843fd328af70e46445"}, + {file = "pydantic_core-2.50.4-cp313-cp313-manylinux1_i686.manylinux_2_5_i686.whl", hash = "sha256:1afefe44ec042fbabfb4483ea258c04cf75ff4ff328d754f09b321fdaa232aca"}, + {file = "pydantic_core-2.50.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a9ee990bf2cfbd81574c5d4f9f6c9d480a14b5b43d2c4f2ca13f4c6f48089394"}, + {file = "pydantic_core-2.50.4-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.whl", hash = "sha256:ab2822bcdcefb54d1e8ca29f5e3ec3afe160fb794bb3a3a73b09d11ed2671104"}, + {file = "pydantic_core-2.50.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:0001d6920e3a5d92758cda460d6dc9f918a78ad6d5d092f1c8b5395e6b775356"}, + {file = "pydantic_core-2.50.4-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:ad92d255a165cde5f9882ff69699eaf5495e0a1f32e97566bbbb80f11e46781f"}, + {file = "pydantic_core-2.50.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fb2bb5b557080da398b866408117d98fe9731a12334afd0cdff221b458cdc5dc"}, + {file = "pydantic_core-2.50.4-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:92f8f63df729061bb14558ed740e7a222f6e2aa6c2e6a5bcfb4e706676562049"}, + {file = "pydantic_core-2.50.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:2a60ec2a57ac3ef3767e526e9bf706ec75aa3d79c4ea134d9d4fcf7c62a297a7"}, + {file = "pydantic_core-2.50.4-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:a2f8716344bbbd10443391be0b1f2003b34949e3c4e6883005c2bc498ab6b64b"}, + {file = "pydantic_core-2.50.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:b300a30304c4c6aeab03ed06809819d9eceacdd58441d3c7dffe41edfd006091"}, + {file = "pydantic_core-2.50.4-cp313-cp313-win32.whl", hash = "sha256:ef8a9ddb2e2a4eae4abb72dc0710eca6c2726779b0664bd10c3ce9fcfaed8c4e"}, + {file = "pydantic_core-2.50.4-cp313-cp313-win_amd64.whl", hash = "sha256:4c29b8f2d6417069bb1f257e6b9113f5d64dc2f554cc200ea90b4fe2c5cdb733"}, + {file = "pydantic_core-2.50.4-cp313-cp313-win_arm64.whl", hash = "sha256:a0c5210d038418a115e7cf8706bfa611bd14add2f5787274dba45aadca3155e0"}, + {file = "pydantic_core-2.50.4-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:5c074454dc6d4f6f4ba6561a56bf33a14db7651d882a5a5321ba3ae8868e082d"}, + {file = "pydantic_core-2.50.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:a4bb174bd65f795c39ad6642d9d5bdc43351b306b7d0a654ab0d0abb38be245f"}, + {file = "pydantic_core-2.50.4-cp314-cp314-manylinux1_i686.manylinux_2_5_i686.whl", hash = "sha256:0ec20aca2b067369913716847f7dfe5f4dddf16a46965b7a70bbad5defaaba86"}, + {file = "pydantic_core-2.50.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:70dbc9f83c41f37a4faa62dae5203853847223a891da446f48ef2efcfd5df806"}, + {file = "pydantic_core-2.50.4-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.whl", hash = "sha256:3de6c2a4df2af0ac9ab4dc1488746fe8b1a90e27955d870d9edda3187d20092b"}, + {file = "pydantic_core-2.50.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:3a48a5254d15a0ad050318bfc7a9566d4ec740118187e8f303e47a6840287eb7"}, + {file = "pydantic_core-2.50.4-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:0af56dbf8822ba9f4efcbbfdc15478f8b6fb08f1609860cb50aa2cc8476b3c34"}, + {file = "pydantic_core-2.50.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f1d62fb172db35c6478c9323da34ff37d1f3d37d7d44337a9d94ba8c583e5730"}, + {file = "pydantic_core-2.50.4-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:5c1013647be741647895c102831dcf79c34209662dbb683df9efb864417ed7d5"}, + {file = "pydantic_core-2.50.4-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:aeb2e123cbf978a905e9f55155c1b8316fbbfa7cf64d04521fe174bab302d100"}, + {file = "pydantic_core-2.50.4-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:523466eba8ee10f7480f3c2057563145978011c583130d2cc01fb1e7af808e25"}, + {file = "pydantic_core-2.50.4-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:c9e70012926e97069cdd09221861aff412aa94e4cac2e019055cdb79485b150c"}, + {file = "pydantic_core-2.50.4-cp314-cp314-pyemscripten_2026_0_wasm32.whl", hash = "sha256:e6da138a1ecc1341c8b788a5ee822670b03788e1f5decf7af9d461de6e508b8e"}, + {file = "pydantic_core-2.50.4-cp314-cp314-win32.whl", hash = "sha256:13b6dd62b5279f5b9d72f3bf918a35443ee8bd549241d9dc52d79a2c3b6d7016"}, + {file = "pydantic_core-2.50.4-cp314-cp314-win_amd64.whl", hash = "sha256:b0cdb655fbd1562c2dfc9986f9103a106f7058cd0915afc6e656d4b1d73f3387"}, + {file = "pydantic_core-2.50.4-cp314-cp314-win_arm64.whl", hash = "sha256:df1c174796cd63eb6b139f7daf783affe1f3ed659605850e843b24764c21bfc5"}, + {file = "pydantic_core-2.50.4-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:edbca8789fd10f0de534b660a6b4c71f1fd18039679c918dad392ab044bb37e4"}, + {file = "pydantic_core-2.50.4-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:33b21f69540a12c2053cd1d95766d8bd9667a3897f7c712a642de8aa37eb0865"}, + {file = "pydantic_core-2.50.4-cp314-cp314t-manylinux1_i686.manylinux_2_5_i686.whl", hash = "sha256:ffb616d8d55965839670301dc3bae3abacff560a7e137a89056058a8a9da4d96"}, + {file = "pydantic_core-2.50.4-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:6c5687b59b6ba0f663c4f2f15470f68507d6b45ccd3a19ee6d224f95cbee70d8"}, + {file = "pydantic_core-2.50.4-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.whl", hash = "sha256:c733087ecf7dde06b1d071679bfd5f3ba03266ba77814c1c7253bc48c9adedd9"}, + {file = "pydantic_core-2.50.4-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:94733cb447c37b0ce6f71b39ca1288d5f966a084023a5617b4cc35a852586859"}, + {file = "pydantic_core-2.50.4-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b26f39a5be3cd91a2035818be3d0ffdf5282c3e1f5f53d3b80b7024021acee52"}, + {file = "pydantic_core-2.50.4-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c856e439a9d54d514e81a7131229ba151cdf81df7c408e0f6c89340e5003dfe2"}, + {file = "pydantic_core-2.50.4-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:cbf0777d54672990b10cb8ca9b0523499e182d7e2ea39f86b138519a902aa601"}, + {file = "pydantic_core-2.50.4-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:edc17549ab592e33cfcaf285f047bb75fcd98f608aa9309af1187fd736ce9641"}, + {file = "pydantic_core-2.50.4-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:23a9ba564b2db709ff16eca990992ba95a19069972b34bff87c81d4b473cd755"}, + {file = "pydantic_core-2.50.4-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:41f4f8ae714e4fea1d635880f8a1af715ecf080eed4d13c5b04a0f3210f9c61a"}, + {file = "pydantic_core-2.50.4-cp314-cp314t-win32.whl", hash = "sha256:601fce6cea9ddeaa85329e12e7f351def38d233075f42a3012b9c48071b02941"}, + {file = "pydantic_core-2.50.4-cp314-cp314t-win_amd64.whl", hash = "sha256:22e874666bdbd96d6bf629d32cd8ab376fedf1fd62585b52a42b9fa9fa6c20b6"}, + {file = "pydantic_core-2.50.4-cp314-cp314t-win_arm64.whl", hash = "sha256:71395a43da5584bb70556f380387e15f845c0dcf76373c1afbfa0025737576ac"}, + {file = "pydantic_core-2.50.4-cp315-cp315-macosx_10_12_x86_64.whl", hash = "sha256:7ac2769a7ddd661e07e26c12220adc31b17014c48234b2a5a88993b8d4109e09"}, + {file = "pydantic_core-2.50.4-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:930ad463d3fb7a340d323bcc496ec32dae469ec9974c29ff569f19806b6b03b4"}, + {file = "pydantic_core-2.50.4-cp315-cp315-manylinux1_i686.manylinux_2_5_i686.whl", hash = "sha256:b867f9fd183d76977f810c626d539265183c25b2284762893a31e8d6cacc81c0"}, + {file = "pydantic_core-2.50.4-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:49eb1241a969a5994db6880c18c012b6cbe2340343d8f529721571806583e500"}, + {file = "pydantic_core-2.50.4-cp315-cp315-manylinux2014_armv7l.manylinux_2_17_armv7l.whl", hash = "sha256:477af785d1846e4e96bf56983b92ea7553aaeccdeb8acdaa55c7cee9eda0ae32"}, + {file = "pydantic_core-2.50.4-cp315-cp315-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:29358a8ca74e7d81158d14e2b10c904bd18773293ae3788716c0626fe0342347"}, + {file = "pydantic_core-2.50.4-cp315-cp315-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:300753f71c73302e218124baf995f00058e085cd01869bd9610bcbd0bd4500c1"}, + {file = "pydantic_core-2.50.4-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:26cb012c4b8ca9f847bd0ac15978bd3d0f55b050bfbe6c47355edfc7e945029b"}, + {file = "pydantic_core-2.50.4-cp315-cp315-manylinux_2_31_riscv64.whl", hash = "sha256:9be1cfe715ecaa060ffd5d599ef410b94ef2697a0eed4cee562f788a2aa2175b"}, + {file = "pydantic_core-2.50.4-cp315-cp315-musllinux_1_1_aarch64.whl", hash = "sha256:c81e35862aced259177a537ce1a6264c3a97bae1ced184ca9dc10ea754563688"}, + {file = "pydantic_core-2.50.4-cp315-cp315-musllinux_1_1_armv7l.whl", hash = "sha256:b2f2d13239487cecaae98c9f4d5904ad0737643cdf8873c88ec6a78b12214f20"}, + {file = "pydantic_core-2.50.4-cp315-cp315-musllinux_1_1_x86_64.whl", hash = "sha256:e6b4b08d09054310a4dc389fa61ee22a7a5a292cb23ab8a985136ca8828bf924"}, + {file = "pydantic_core-2.50.4-cp315-cp315-win32.whl", hash = "sha256:6619d49a89a15cd04334f76fec530c155923bfc60da74ff5d815a52629e1aa6c"}, + {file = "pydantic_core-2.50.4-cp315-cp315-win_amd64.whl", hash = "sha256:e5bd109d095aaae989a0463d5ef0fcc43e9ddd5de125e656d3c119a79e466380"}, + {file = "pydantic_core-2.50.4-cp315-cp315-win_arm64.whl", hash = "sha256:6118e5a5550e36582e19bac1a403711a748f9f18251b054c326d3db02aaa7a18"}, + {file = "pydantic_core-2.50.4-cp315-cp315t-macosx_10_12_x86_64.whl", hash = "sha256:d8201c9f9035520cdcc7dcad383b039ec8123969b87e01cf27c3dd883c02313b"}, + {file = "pydantic_core-2.50.4-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:1de7be9a66fc8536770481ab64a05aae5067c725f2b29a09543af00e6a417b97"}, + {file = "pydantic_core-2.50.4-cp315-cp315t-manylinux1_i686.manylinux_2_5_i686.whl", hash = "sha256:789a6453e5ffd18a7ab6b8c3a0dd8403053829197ec258ecb90c604c21ffcc99"}, + {file = "pydantic_core-2.50.4-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:6348ad12fa741bcc9c2f173e99fbf27cbc038826d8c31a4a7d836eca27878ba2"}, + {file = "pydantic_core-2.50.4-cp315-cp315t-manylinux2014_armv7l.manylinux_2_17_armv7l.whl", hash = "sha256:d49127f137f871cde3c5650af33bbbdcee02679dae76e020902fa106f522b8ae"}, + {file = "pydantic_core-2.50.4-cp315-cp315t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:2f5cc5bcb94063fbbdfd285a2b302da34af07491337c10bb35de1d5220fa1583"}, + {file = "pydantic_core-2.50.4-cp315-cp315t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b99bed995ed7c41515c11fe2beb86f8a6cc298e5537cae2f736de2f982f74ef0"}, + {file = "pydantic_core-2.50.4-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:faa4e96385c820ce9d7f7a623486e23d4134ae3c9ba2071e44e0ab5a5a5002c4"}, + {file = "pydantic_core-2.50.4-cp315-cp315t-manylinux_2_31_riscv64.whl", hash = "sha256:d6a166978f22f10cb91413f70519861605219346decf65bc79008f9257c94afe"}, + {file = "pydantic_core-2.50.4-cp315-cp315t-musllinux_1_1_aarch64.whl", hash = "sha256:a70d5effebd81ebd8e15a8aabdc7980832367b2b00c36543bac378977004cc80"}, + {file = "pydantic_core-2.50.4-cp315-cp315t-musllinux_1_1_armv7l.whl", hash = "sha256:f8fd23653a252cefabea11cd041efd7b80bdf403e43a36dea53f9cb0aaa21f0f"}, + {file = "pydantic_core-2.50.4-cp315-cp315t-musllinux_1_1_x86_64.whl", hash = "sha256:7646353a5a7c553c04167aca628e2550b538f492765b03ccf34321a560acc43c"}, + {file = "pydantic_core-2.50.4-cp315-cp315t-win32.whl", hash = "sha256:65376dbe1ab4dbc768ca2b72b7c13993562c035f5925fd3bc7ff9c8c585c515d"}, + {file = "pydantic_core-2.50.4-cp315-cp315t-win_amd64.whl", hash = "sha256:f08ee8248aad2d054e5bc4c73554d4505464698f6d754f16198dbc5764e9821d"}, + {file = "pydantic_core-2.50.4-cp315-cp315t-win_arm64.whl", hash = "sha256:da779ae50b46f3f7d1e1b5f362fdc0ad376a49fd55f6f3122dc2b6149936cdf7"}, + {file = "pydantic_core-2.50.4-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:c04e9d920e2674f54651fd260a15c5d2843526c73d5242ee4311325ddc9573b3"}, + {file = "pydantic_core-2.50.4-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:5bc1811ef2b4d4ba63e8e452f6e332b6374bd1d2cbbfdf66826c8cb1f71dd10d"}, + {file = "pydantic_core-2.50.4-graalpy312-graalpy250_312_native-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0b059a7968b1911be5a2d9a8234827ab0bef9d1e465d4b42da525894143550e8"}, + {file = "pydantic_core-2.50.4-graalpy312-graalpy250_312_native-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bee28aab5a580eec673f7b68dfa8dece3dd37bd207ef8d22fafe23a8e9837296"}, + {file = "pydantic_core-2.50.4-graalpy313-graalpy253_313_native-macosx_11_0_arm64.whl", hash = "sha256:71e03d2ea1a221d020cfc5b6cc8bbbedef23a06704c70fcf4d0afb42965b22d1"}, + {file = "pydantic_core-2.50.4-graalpy313-graalpy253_313_native-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:09450778e3ab58d3f565899fcfbf6c82926e31af29e28e799d1d50941316e0cb"}, + {file = "pydantic_core-2.50.4-graalpy313-graalpy253_313_native-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4eb15be588407148ef5937dc8d9256a71f6b115e6cddadb7aa20b6ee384680dc"}, + {file = "pydantic_core-2.50.4-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:39f489ce31272073e6e146f6781690f9c1ee8c126836e6403361ef91154d89fe"}, + {file = "pydantic_core-2.50.4-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:5b26e5f1793b96cdc60242bf38da86ff24a27a708aa396214cac9b534bf571c7"}, + {file = "pydantic_core-2.50.4-pp311-pypy311_pp73-manylinux1_i686.manylinux_2_5_i686.whl", hash = "sha256:7210398a1607ad607dc73196e575b3148b00a333cbb602ddbe1b60ba54554f43"}, + {file = "pydantic_core-2.50.4-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2f42584e5785385f681163a42506cab0d51295e17599a648396c52a7046c1372"}, + {file = "pydantic_core-2.50.4-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:2039e323acee9abfec1fb5f661776e8965fe5928f3b7f8431900a774cba5c317"}, + {file = "pydantic_core-2.50.4-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:71ade6d2e445839350d589ff99bbddfde16f3f32db28da5c894a09f99c8b2a03"}, + {file = "pydantic_core-2.50.4-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:d7d406709ae924cf0b08b8282ca2f0e1c90526911d93bc040557cbc83b74c55f"}, + {file = "pydantic_core-2.50.4-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:7472c39480ccc11dda69a196d1b7c7a6b48eb6594b77f05d945599d3e47f731c"}, + {file = "pydantic_core-2.50.4-pp311-pypy311_pp80-macosx_10_12_x86_64.whl", hash = "sha256:b67d38e8bb0ade7e6e84575e4bb153fab35b122458077273aeb08fdf12be9d2c"}, + {file = "pydantic_core-2.50.4-pp311-pypy311_pp80-macosx_11_0_arm64.whl", hash = "sha256:4eda7e3fdef382b7d4492745988a5baaf6953923a337f8b9dde5f76fa8afde20"}, + {file = "pydantic_core-2.50.4-pp311-pypy311_pp80-manylinux_2_28_x86_64.whl", hash = "sha256:474f7e598c7902165662a5d5160d3fce31037890a2975a9871ebf7c05862300b"}, + {file = "pydantic_core-2.50.4-pp311-pypy311_pp80-win_amd64.whl", hash = "sha256:3e0b395648c6cb871bceb2906907f255dc876ec425f2d5b024e129985cea8519"}, + {file = "pydantic_core-2.50.4.tar.gz", hash = "sha256:aead3b74b68396bf0feab5d57e050b730ded7df55853c1e048a87e00aaf033c6"}, +] + +[package.dependencies] +typing-extensions = ">=4.16.0" [[package]] name = "pydevd-pycharm" @@ -628,110 +761,117 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<8)"] [[package]] name = "sqlalchemy" -version = "1.4.41" +version = "2.0.57" description = "Database Abstraction Library" optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +python-versions = ">=3.7" groups = ["main"] files = [ - {file = "SQLAlchemy-1.4.41-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:13e397a9371ecd25573a7b90bd037db604331cf403f5318038c46ee44908c44d"}, - {file = "SQLAlchemy-1.4.41-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:2d6495f84c4fd11584f34e62f9feec81bf373787b3942270487074e35cbe5330"}, - {file = "SQLAlchemy-1.4.41-cp27-cp27m-win32.whl", hash = "sha256:e570cfc40a29d6ad46c9aeaddbdcee687880940a3a327f2c668dd0e4ef0a441d"}, - {file = "SQLAlchemy-1.4.41-cp27-cp27m-win_amd64.whl", hash = "sha256:5facb7fd6fa8a7353bbe88b95695e555338fb038ad19ceb29c82d94f62775a05"}, - {file = "SQLAlchemy-1.4.41-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:f37fa70d95658763254941ddd30ecb23fc4ec0c5a788a7c21034fc2305dab7cc"}, - {file = "SQLAlchemy-1.4.41-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:361f6b5e3f659e3c56ea3518cf85fbdae1b9e788ade0219a67eeaaea8a4e4d2a"}, - {file = "SQLAlchemy-1.4.41-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0990932f7cca97fece8017414f57fdd80db506a045869d7ddf2dda1d7cf69ecc"}, - {file = "SQLAlchemy-1.4.41-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cd767cf5d7252b1c88fcfb58426a32d7bd14a7e4942497e15b68ff5d822b41ad"}, - {file = "SQLAlchemy-1.4.41-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5102fb9ee2c258a2218281adcb3e1918b793c51d6c2b4666ce38c35101bb940e"}, - {file = "SQLAlchemy-1.4.41-cp310-cp310-win32.whl", hash = "sha256:2082a2d2fca363a3ce21cfa3d068c5a1ce4bf720cf6497fb3a9fc643a8ee4ddd"}, - {file = "SQLAlchemy-1.4.41-cp310-cp310-win_amd64.whl", hash = "sha256:e4b12e3d88a8fffd0b4ca559f6d4957ed91bd4c0613a4e13846ab8729dc5c251"}, - {file = "SQLAlchemy-1.4.41-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:90484a2b00baedad361402c257895b13faa3f01780f18f4a104a2f5c413e4536"}, - {file = "SQLAlchemy-1.4.41-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b67fc780cfe2b306180e56daaa411dd3186bf979d50a6a7c2a5b5036575cbdbb"}, - {file = "SQLAlchemy-1.4.41-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ad2b727fc41c7f8757098903f85fafb4bf587ca6605f82d9bf5604bd9c7cded"}, - {file = "SQLAlchemy-1.4.41-cp311-cp311-win32.whl", hash = "sha256:59bdc291165b6119fc6cdbc287c36f7f2859e6051dd923bdf47b4c55fd2f8bd0"}, - {file = "SQLAlchemy-1.4.41-cp311-cp311-win_amd64.whl", hash = "sha256:d2e054aed4645f9b755db85bc69fc4ed2c9020c19c8027976f66576b906a74f1"}, - {file = "SQLAlchemy-1.4.41-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:4ba7e122510bbc07258dc42be6ed45997efdf38129bde3e3f12649be70683546"}, - {file = "SQLAlchemy-1.4.41-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c0dcf127bb99458a9d211e6e1f0f3edb96c874dd12f2503d4d8e4f1fd103790b"}, - {file = "SQLAlchemy-1.4.41-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e16c2be5cb19e2c08da7bd3a87fed2a0d4e90065ee553a940c4fc1a0fb1ab72b"}, - {file = "SQLAlchemy-1.4.41-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5ebeeec5c14533221eb30bad716bc1fd32f509196318fb9caa7002c4a364e4c"}, - {file = "SQLAlchemy-1.4.41-cp36-cp36m-win32.whl", hash = "sha256:3e2ef592ac3693c65210f8b53d0edcf9f4405925adcfc031ff495e8d18169682"}, - {file = "SQLAlchemy-1.4.41-cp36-cp36m-win_amd64.whl", hash = "sha256:eb30cf008850c0a26b72bd1b9be6730830165ce049d239cfdccd906f2685f892"}, - {file = "SQLAlchemy-1.4.41-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:c23d64a0b28fc78c96289ffbd0d9d1abd48d267269b27f2d34e430ea73ce4b26"}, - {file = "SQLAlchemy-1.4.41-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8eb8897367a21b578b26f5713833836f886817ee2ffba1177d446fa3f77e67c8"}, - {file = "SQLAlchemy-1.4.41-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:14576238a5f89bcf504c5f0a388d0ca78df61fb42cb2af0efe239dc965d4f5c9"}, - {file = "SQLAlchemy-1.4.41-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:639e1ae8d48b3c86ffe59c0daa9a02e2bfe17ca3d2b41611b30a0073937d4497"}, - {file = "SQLAlchemy-1.4.41-cp37-cp37m-win32.whl", hash = "sha256:0005bd73026cd239fc1e8ccdf54db58b6193be9a02b3f0c5983808f84862c767"}, - {file = "SQLAlchemy-1.4.41-cp37-cp37m-win_amd64.whl", hash = "sha256:5323252be2bd261e0aa3f33cb3a64c45d76829989fa3ce90652838397d84197d"}, - {file = "SQLAlchemy-1.4.41-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:05f0de3a1dc3810a776275763764bb0015a02ae0f698a794646ebc5fb06fad33"}, - {file = "SQLAlchemy-1.4.41-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0002e829142b2af00b4eaa26c51728f3ea68235f232a2e72a9508a3116bd6ed0"}, - {file = "SQLAlchemy-1.4.41-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:22ff16cedab5b16a0db79f1bc99e46a6ddececb60c396562e50aab58ddb2871c"}, - {file = "SQLAlchemy-1.4.41-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ccfd238f766a5bb5ee5545a62dd03f316ac67966a6a658efb63eeff8158a4bbf"}, - {file = "SQLAlchemy-1.4.41-cp38-cp38-win32.whl", hash = "sha256:58bb65b3274b0c8a02cea9f91d6f44d0da79abc993b33bdedbfec98c8440175a"}, - {file = "SQLAlchemy-1.4.41-cp38-cp38-win_amd64.whl", hash = "sha256:ce8feaa52c1640de9541eeaaa8b5fb632d9d66249c947bb0d89dd01f87c7c288"}, - {file = "SQLAlchemy-1.4.41-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:199a73c31ac8ea59937cc0bf3dfc04392e81afe2ec8a74f26f489d268867846c"}, - {file = "SQLAlchemy-1.4.41-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4676d51c9f6f6226ae8f26dc83ec291c088fe7633269757d333978df78d931ab"}, - {file = "SQLAlchemy-1.4.41-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:036d8472356e1d5f096c5e0e1a7e0f9182140ada3602f8fff6b7329e9e7cfbcd"}, - {file = "SQLAlchemy-1.4.41-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2307495d9e0ea00d0c726be97a5b96615035854972cc538f6e7eaed23a35886c"}, - {file = "SQLAlchemy-1.4.41-cp39-cp39-win32.whl", hash = "sha256:9c56e19780cd1344fcd362fd6265a15f48aa8d365996a37fab1495cae8fcd97d"}, - {file = "SQLAlchemy-1.4.41-cp39-cp39-win_amd64.whl", hash = "sha256:f5fa526d027d804b1f85cdda1eb091f70bde6fb7d87892f6dd5a48925bc88898"}, - {file = "SQLAlchemy-1.4.41.tar.gz", hash = "sha256:0292f70d1797e3c54e862e6f30ae474014648bc9c723e14a2fda730adb0a9791"}, + {file = "sqlalchemy-2.0.57-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b1ead374d6ba8d5cb516f48de33ef1d6dca635a69abe7c7a344ae4bb00e7bd40"}, + {file = "sqlalchemy-2.0.57-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8e0bde66dd5384e6cd9842e119197c02280bc3b85697995d2dc2106714ab9742"}, + {file = "sqlalchemy-2.0.57-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5108313e44bc1e08a857d36f7f7f7f5eae23687153c5ad21cb6800ac6cb67510"}, + {file = "sqlalchemy-2.0.57-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b0cf6c9dc732258a18ad3a8bd8af5440553fe98192bf49788021dc1ddcb388d5"}, + {file = "sqlalchemy-2.0.57-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:03d147ff68e787833d60b732238f3440031fbc45d4629edf8bcd073e89a461c3"}, + {file = "sqlalchemy-2.0.57-cp310-cp310-win32.whl", hash = "sha256:fb53faa9f2dedd2560d82712f6ae6533bc4eb3de9c0122d85cd29d752e5cd6ac"}, + {file = "sqlalchemy-2.0.57-cp310-cp310-win_amd64.whl", hash = "sha256:88007e8f5f263ca7c8adfef6425037e134ddb6a67a99e07cbd304a208a8a4938"}, + {file = "sqlalchemy-2.0.57-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:396b8e25a81fac14f5ff9e2b66baffe228a43f1fcd1916f329fce2ea8643eba1"}, + {file = "sqlalchemy-2.0.57-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c688e2ef8121479e0e25972a942dd0c056f3ba59a22175523e35106c2e3fb72d"}, + {file = "sqlalchemy-2.0.57-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:21ad7dc7ed00a05bd3d179cb9bba85dc4181b04342052d9ce81d9305bfdbf9c6"}, + {file = "sqlalchemy-2.0.57-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:206cbb334df6038f049a11b05b8cb4a4dc13577a46464e01de080d1c3e4493c4"}, + {file = "sqlalchemy-2.0.57-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4e2275e8601de7d8a79bf97bb4cec32b116b4715ec8585ee8a629d2cf2512176"}, + {file = "sqlalchemy-2.0.57-cp311-cp311-win32.whl", hash = "sha256:6fae1e630982481e705dcab2442c8135e5287a2290e23fd51fbb031c67a8b7fd"}, + {file = "sqlalchemy-2.0.57-cp311-cp311-win_amd64.whl", hash = "sha256:0e5a8cc2e70f868e579e083818d9bfc7ccc722e588ff22bcfa5cf5da2d571967"}, + {file = "sqlalchemy-2.0.57-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e33889a6f292db9ed2278d5562717c96432651ec558417a7acf17d9549fd6935"}, + {file = "sqlalchemy-2.0.57-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:75135c4c54be953730e41203f38ced685b60dfb16d61a7d4d9a7ab8d87ced6f1"}, + {file = "sqlalchemy-2.0.57-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4ff9f7dda4d136bfd7fab44384ef7e3135c9826da815d6248f713d0035a6274b"}, + {file = "sqlalchemy-2.0.57-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e8d67fa9935021bdccd02d313a1b5ce92531f679b0e70ea7b9f5d651fab7f742"}, + {file = "sqlalchemy-2.0.57-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d55ea24654f8d982c5aabd6e6779eac3ed15f420f629761c4eb627399e9d8cec"}, + {file = "sqlalchemy-2.0.57-cp312-cp312-win32.whl", hash = "sha256:ffaedafb38901bc72efcaf9fdf57bc363be24bd67a8bce8e3afe4ec75bc82833"}, + {file = "sqlalchemy-2.0.57-cp312-cp312-win_amd64.whl", hash = "sha256:4972e01af81b72b78e335735eddf9d4ef8980eca1e8364552715991a454eea97"}, + {file = "sqlalchemy-2.0.57-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:88837e22b43cf5e22070deb68c5cc77916dd2a231d8b9dc91ac8e5afb96a2c4f"}, + {file = "sqlalchemy-2.0.57-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:351b703ee93952f38f2e51e0781e1d4618602850252e68344b9dd28dccc2bd08"}, + {file = "sqlalchemy-2.0.57-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bc60f5a5f1ec190dcb1f5a9b9cf8f64d13f640ee429ee09fc0939ae9acaa6cc6"}, + {file = "sqlalchemy-2.0.57-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:8c2233997b87eed1f6664b047c6ff95a8a667ac46c053b29ed104d4df6210c1e"}, + {file = "sqlalchemy-2.0.57-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9815b64911596a3bf106b8ef4671a98b461e78cb668b4fa16a52caf44a3011d0"}, + {file = "sqlalchemy-2.0.57-cp313-cp313-win32.whl", hash = "sha256:239bd74da3bd9f5882b90361ff81232b6d8b85d53533da5a75bf54b140a964dc"}, + {file = "sqlalchemy-2.0.57-cp313-cp313-win_amd64.whl", hash = "sha256:1fe4190e1673ff5415c691221864a61ca393653fcbc6f7c55a01b69d5a4c60c3"}, + {file = "sqlalchemy-2.0.57-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:cae8591e095d25c2b83bd0bb2a9c973e493378267fd6116af91d8bb8d0c1016c"}, + {file = "sqlalchemy-2.0.57-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:060e698953af83dab5aeecc09d14122857c6dc69e288a8fc93c4487529b056cb"}, + {file = "sqlalchemy-2.0.57-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:23af494d0e22c51185d2d93b9a98666042d17a518df2731787dff7f20ee438e4"}, + {file = "sqlalchemy-2.0.57-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:794c5fa765363ce59f1e081fdab87ed7b30a0d775f7f7d379422bc2f53818bcb"}, + {file = "sqlalchemy-2.0.57-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:294f6cf8465e0c5f1a00d6d3cb1a265737f3321811d12a57f4bfb66886e78662"}, + {file = "sqlalchemy-2.0.57-cp314-cp314-win32.whl", hash = "sha256:adc6b7fc740593137b3b00c3f8c5330e891c11f40df7a3aecf942ad90c4b808f"}, + {file = "sqlalchemy-2.0.57-cp314-cp314-win_amd64.whl", hash = "sha256:88eed162ae664cc09808241dff304bc3ac5f57e2cf7a3cb9e6165df1ec243544"}, + {file = "sqlalchemy-2.0.57-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0ce98756f4079d5c5dfab7adb690a654cdadb1d1208024f239338627cfc44f31"}, + {file = "sqlalchemy-2.0.57-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a24a5c21c4263e7dafc1652d98d46375d7b38c490ccab41cf00d995ec9fa02b3"}, + {file = "sqlalchemy-2.0.57-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e15997df22f3581ff38744afc39d024784eb90bd6c2c41c4387b116663021e87"}, + {file = "sqlalchemy-2.0.57-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:f90a5194a25c9b611d871df770802b1b6e4915bef16cfdd398ce13bd0379a266"}, + {file = "sqlalchemy-2.0.57-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:71e53d9c6ea15c4dc435d936a0f72eeba218dc378c28d863cc6619b9a3ab8042"}, + {file = "sqlalchemy-2.0.57-cp314-cp314t-win32.whl", hash = "sha256:0e45c61722b17b41f6890d7c17a33b11270e2c334f4e7593774b0a5092fa08a8"}, + {file = "sqlalchemy-2.0.57-cp314-cp314t-win_amd64.whl", hash = "sha256:8ecb63bdacc0f0b1e7cd37959b174c775a3d0f68bc6ad91702fe375c0c24d013"}, + {file = "sqlalchemy-2.0.57-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b4533e2d4782ae2383b4d61fcdbe5b3747b25056c95de2d128ea23245f205786"}, + {file = "sqlalchemy-2.0.57-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97739bda3f8733c99f434615a9ec3b73e0511b6b3d91465f816cc484000f8027"}, + {file = "sqlalchemy-2.0.57-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a67fad945dbae5137bae74bae4d98ed7f9bb989ae7ce247a83728854a45f5554"}, + {file = "sqlalchemy-2.0.57-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:f512eff7a6dde0d569ec41212422ed2749ea6ca88d1f5275d73dbc16e696ed66"}, + {file = "sqlalchemy-2.0.57-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:660de7c826c5ce3b745a7179d4e0ad391dcda61e64e8697021e18be5ee05c436"}, + {file = "sqlalchemy-2.0.57-cp38-cp38-win32.whl", hash = "sha256:a1c23bbaa9fe9ac43971d2fdc0531cfe7affac9735d7926fbf8c555f255f78d8"}, + {file = "sqlalchemy-2.0.57-cp38-cp38-win_amd64.whl", hash = "sha256:1b260c745aa801557a0aeb4b2e729a4f0c5e171140db6c2be1e2b9316d15e821"}, + {file = "sqlalchemy-2.0.57-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:38eaae2db34b1f865cab99a40eca2e901a8979128b0ba5bee804b189cb71d03a"}, + {file = "sqlalchemy-2.0.57-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:444b6f14e65ff76e411d59dd16e2aef646d2c957afc24a49510149a28fc9dc33"}, + {file = "sqlalchemy-2.0.57-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a8bac610e7dcc1a5969b82f0788bab5c5653dd08c5229247a14bf0de5cd20b4f"}, + {file = "sqlalchemy-2.0.57-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0a00cd2d0378f8951e1c147b3bd5a45538e9bff6ebe9bd08295808755dbd9a2b"}, + {file = "sqlalchemy-2.0.57-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:bbfac8d64ebdf30b1912d8f1f9f96fe99bef10669f2533ecac1a0f585e956ff4"}, + {file = "sqlalchemy-2.0.57-cp39-cp39-win32.whl", hash = "sha256:35713e7ab2f7e85bfee59bda25bc483597600a5756e6367918ebb5e63a39ee0b"}, + {file = "sqlalchemy-2.0.57-cp39-cp39-win_amd64.whl", hash = "sha256:7215ab39053d065b589ab7f78c84226fae57b76d28e832be2e8435c416c1c2d0"}, + {file = "sqlalchemy-2.0.57-py3-none-any.whl", hash = "sha256:e31639a78045134a39e14f287b647fd9537cdd71978ea9c11bf7d905d70e473d"}, + {file = "sqlalchemy-2.0.57.tar.gz", hash = "sha256:892e0edd06b8ca2a8a3f9107611047914fd82ccd03735efd706d12aa4da1b773"}, ] [package.dependencies] -greenlet = {version = "!=0.4.17", markers = "python_version >= \"3\" and (platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\")"} +greenlet = {version = ">=1", markers = "platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\""} +typing-extensions = ">=4.6.0" [package.extras] -aiomysql = ["aiomysql ; python_version >= \"3\"", "greenlet (!=0.4.17) ; python_version >= \"3\""] -aiosqlite = ["aiosqlite ; python_version >= \"3\"", "greenlet (!=0.4.17) ; python_version >= \"3\"", "typing-extensions (!=3.10.0.1)"] -asyncio = ["greenlet (!=0.4.17) ; python_version >= \"3\""] -asyncmy = ["asyncmy (>=0.2.3,!=0.2.4) ; python_version >= \"3\"", "greenlet (!=0.4.17) ; python_version >= \"3\""] -mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2) ; python_version >= \"3\""] +aiomysql = ["aiomysql (>=0.2.0)", "greenlet (>=1)"] +aioodbc = ["aioodbc", "greenlet (>=1)"] +aiosqlite = ["aiosqlite", "greenlet (>=1)", "typing_extensions (!=3.10.0.1)"] +asyncio = ["greenlet (>=1)"] +asyncmy = ["asyncmy (>=0.2.12)", "greenlet (>=1)"] +mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2,!=1.1.5,!=1.1.10)"] mssql = ["pyodbc"] mssql-pymssql = ["pymssql"] mssql-pyodbc = ["pyodbc"] -mypy = ["mypy (>=0.910) ; python_version >= \"3\"", "sqlalchemy2-stubs"] -mysql = ["mysqlclient (>=1.4.0) ; python_version >= \"3\"", "mysqlclient (>=1.4.0,<2) ; python_version < \"3\""] +mypy = ["mypy (>=0.910)"] +mysql = ["mysqlclient (>=1.4.0)"] mysql-connector = ["mysql-connector-python"] -oracle = ["cx-oracle (>=7) ; python_version >= \"3\"", "cx-oracle (>=7,<8) ; python_version < \"3\""] +oracle = ["cx_oracle (>=8)"] +oracle-oracledb = ["oracledb (>=1.0.1)"] postgresql = ["psycopg2 (>=2.7)"] -postgresql-asyncpg = ["asyncpg ; python_version >= \"3\"", "greenlet (!=0.4.17) ; python_version >= \"3\""] -postgresql-pg8000 = ["pg8000 (>=1.16.6,!=1.29.0)"] +postgresql-asyncpg = ["asyncpg", "greenlet (>=1)"] +postgresql-pg8000 = ["pg8000 (>=1.29.1)"] +postgresql-psycopg = ["psycopg (>=3.0.7)"] postgresql-psycopg2binary = ["psycopg2-binary"] postgresql-psycopg2cffi = ["psycopg2cffi"] -pymysql = ["pymysql (<1) ; python_version < \"3\"", "pymysql ; python_version >= \"3\""] -sqlcipher = ["sqlcipher3-binary ; python_version >= \"3\""] - -[[package]] -name = "sqlalchemy2-stubs" -version = "0.0.2a38" -description = "Typing Stubs for SQLAlchemy 1.4" -optional = false -python-versions = ">=3.6" -groups = ["main"] -files = [ - {file = "sqlalchemy2-stubs-0.0.2a38.tar.gz", hash = "sha256:861d722abeb12f13eacd775a9f09379b11a5a9076f469ccd4099961b95800f9e"}, - {file = "sqlalchemy2_stubs-0.0.2a38-py3-none-any.whl", hash = "sha256:b62aa46943807287550e2033dafe07564b33b6a815fbaa3c144e396f9cc53bcb"}, -] - -[package.dependencies] -typing-extensions = ">=3.7.4" +postgresql-psycopgbinary = ["psycopg[binary] (>=3.0.7)"] +pymysql = ["pymysql"] +sqlcipher = ["sqlcipher3_binary"] [[package]] name = "sqlmodel" -version = "0.0.8" +version = "0.0.38" description = "SQLModel, SQL databases in Python, designed for simplicity, compatibility, and robustness." optional = false -python-versions = ">=3.6.1,<4.0.0" +python-versions = ">=3.10" groups = ["main"] files = [ - {file = "sqlmodel-0.0.8-py3-none-any.whl", hash = "sha256:0fd805719e0c5d4f22be32eb3ffc856eca3f7f20e8c7aa3e117ad91684b518ee"}, - {file = "sqlmodel-0.0.8.tar.gz", hash = "sha256:3371b4d1ad59d2ffd0c530582c2140b6c06b090b32af9b9c6412986d7b117036"}, + {file = "sqlmodel-0.0.38-py3-none-any.whl", hash = "sha256:84e3fa990a77395461ded72a6c73173438ce8449d5c1c4d97fbff1b1df692649"}, + {file = "sqlmodel-0.0.38.tar.gz", hash = "sha256:d583ec237b14103809f74e8630032bc40ab68cd6b754a610f0813c56911a547b"}, ] [package.dependencies] -pydantic = ">=1.8.2,<2.0.0" -SQLAlchemy = ">=1.4.17,<=1.4.41" -sqlalchemy2-stubs = "*" +pydantic = ">=2.11.0" +SQLAlchemy = ">=2.0.14,<2.1.0" +typing-extensions = ">=4.5.0" [[package]] name = "termcolor" @@ -775,6 +915,21 @@ files = [ {file = "typing_extensions-4.16.0.tar.gz", hash = "sha256:dc983d19a509c94dba722ee6abd33940f7c05a89e243c47e907eb4db6f1a43e5"}, ] +[[package]] +name = "typing-inspection" +version = "0.4.5" +description = "Runtime typing introspection tools" +optional = false +python-versions = ">=3.10" +groups = ["main"] +files = [ + {file = "typing_inspection-0.4.5-py3-none-any.whl", hash = "sha256:bc210535442b39e1bf2805e0c7a17dfd6a4ace760c84c7f7d16245d23a6b1c39"}, + {file = "typing_inspection-0.4.5.tar.gz", hash = "sha256:7f16c411e7930dc79596d42ab44672a3fe5f60eb34b781a1647e7872363120c7"}, +] + +[package.dependencies] +typing-extensions = ">=4.15.0" + [[package]] name = "urllib3" version = "2.8.0" @@ -796,4 +951,4 @@ zstd = ["backports-zstd (>=1.0.0) ; python_version < \"3.14\""] [metadata] lock-version = "2.1" python-versions = ">=3.11,<3.12" -content-hash = "ea77c9a40bd643b582d52aa5dbf006d572526469a7781139ef954a35a65f70f9" +content-hash = "ba760004b773bc1f0854c85809c957d1d8ea9cb1eccc901305694c9d7de8417d" diff --git a/backend/python/pydevlake/pydevlake/__init__.py b/backend/python/pydevlake/pydevlake/__init__.py index 73ddeb62021..ab27a5ed381 100644 --- a/backend/python/pydevlake/pydevlake/__init__.py +++ b/backend/python/pydevlake/pydevlake/__init__.py @@ -27,14 +27,26 @@ def Field(*args, primary_key: bool = False, auto_increment: Optional[bool] = Non """ A wrapper around sqlmodel.Field that adds a source parameter. """ - schema_extra = kwargs.get('schema_extra', {}) + schema_extra = kwargs.pop('schema_extra', {}) if source is not None: schema_extra['source'] = source if primary_key: schema_extra['primaryKey'] = True if auto_increment is not None: schema_extra['autoIncrement'] = auto_increment - return _Field(*args, **kwargs, primary_key=primary_key, schema_extra=schema_extra) + # Only pass primary_key if True; SQLModel 0.0.38 rejects it alongside sa_column + if primary_key: + field = _Field(*args, **kwargs, primary_key=True, schema_extra=schema_extra) + elif schema_extra: + field = _Field(*args, **kwargs, schema_extra=schema_extra) + else: + field = _Field(*args, **kwargs) + # SQLModel 0.0.38 doesn't propagate schema_extra to FieldInfo.json_schema_extra, + # so we set it manually for consumers like autoextract and model_json_schema. + if schema_extra: + field.json_schema_extra = schema_extra + return field + from .model import ToolModel, ToolScope, DomainScope, Connection, ScopeConfig, DomainType, domain_id diff --git a/backend/python/pydevlake/pydevlake/domain_layer/code.py b/backend/python/pydevlake/pydevlake/domain_layer/code.py index bd28802c907..355725f8d0b 100644 --- a/backend/python/pydevlake/pydevlake/domain_layer/code.py +++ b/backend/python/pydevlake/pydevlake/domain_layer/code.py @@ -33,11 +33,11 @@ class PullRequest(DomainModel, table=True): url: str author_name: str author_id: str - parent_pr_id: Optional[str] + parent_pr_id: Optional[str] = None pull_request_key: int created_date: datetime - merged_date: Optional[datetime] - closed_date: Optional[datetime] + merged_date: Optional[datetime] = None + closed_date: Optional[datetime] = None type: str component: str merge_commit_sha: str @@ -78,8 +78,8 @@ class Commit(NoPKModel, table=True): __tablename__ = 'commits' sha: str = Field(primary_key=True) additions: str - deletions: Optional[str] - dev_eq: Optional[str] + deletions: Optional[str] = None + dev_eq: Optional[str] = None message: str author_name: str author_email: int @@ -144,12 +144,12 @@ class Repo(DomainScope, table=True): __tablename__ = "repos" name: str url: str - description: Optional[str] - owner_id: Optional[str] - language: Optional[str] - forked_from: Optional[str] - created_date: Optional[datetime] - updated_date: Optional[datetime] + description: Optional[str] = None + owner_id: Optional[str] = None + language: Optional[str] = None + forked_from: Optional[str] = None + created_date: Optional[datetime] = None + updated_date: Optional[datetime] = None deleted: bool diff --git a/backend/python/pydevlake/pydevlake/domain_layer/devops.py b/backend/python/pydevlake/pydevlake/domain_layer/devops.py index c8ef108d474..a70cf5d26db 100644 --- a/backend/python/pydevlake/pydevlake/domain_layer/devops.py +++ b/backend/python/pydevlake/pydevlake/domain_layer/devops.py @@ -51,26 +51,26 @@ class CICDPipeline(DomainModel, table=True): __tablename__ = 'cicd_pipelines' name: str - cicd_scope_id: Optional[str] + cicd_scope_id: Optional[str] = None - status: Optional[CICDStatus] - result: Optional[CICDResult] - original_status: Optional[str] - original_result: Optional[str] + status: Optional[CICDStatus] = None + result: Optional[CICDResult] = None + original_status: Optional[str] = None + original_result: Optional[str] = None - created_date: Optional[datetime] - started_date: Optional[datetime] - queued_date: Optional[datetime] - finished_date: Optional[datetime] + created_date: Optional[datetime] = None + started_date: Optional[datetime] = None + queued_date: Optional[datetime] = None + finished_date: Optional[datetime] = None - duration_sec: Optional[float] - queued_duration_sec: Optional[float] + duration_sec: Optional[float] = None + queued_duration_sec: Optional[float] = None - type: Optional[CICDType] - environment: Optional[CICDEnvironment] + type: Optional[CICDType] = None + environment: Optional[CICDEnvironment] = None - display_title: Optional[str] - url: Optional[str] + display_title: Optional[str] = None + url: Optional[str] = None class CiCDPipelineCommit(NoPKModel, table=True): @@ -80,17 +80,17 @@ class CiCDPipelineCommit(NoPKModel, table=True): branch: str repo_id: str repo_url: str - display_title: Optional[str] - url: Optional[str] + display_title: Optional[str] = None + url: Optional[str] = None class CicdScope(DomainScope): __tablename__ = 'cicd_scopes' name: str - description: Optional[str] - url: Optional[str] - createdDate: Optional[datetime] - updatedDate: Optional[datetime] + description: Optional[str] = None + url: Optional[str] = None + createdDate: Optional[datetime] = None + updatedDate: Optional[datetime] = None class CICDTask(DomainModel, table=True): @@ -100,18 +100,18 @@ class CICDTask(DomainModel, table=True): pipeline_id: str cicd_scope_id: str - result: Optional[CICDResult] - status: Optional[CICDStatus] - original_status: Optional[str] - original_result: Optional[str] + result: Optional[CICDResult] = None + status: Optional[CICDStatus] = None + original_status: Optional[str] = None + original_result: Optional[str] = None - type: Optional[CICDType] - environment: Optional[CICDEnvironment] + type: Optional[CICDType] = None + environment: Optional[CICDEnvironment] = None - created_date: Optional[datetime] - queued_date: Optional[datetime] - started_date: Optional[datetime] - finished_date: Optional[datetime] + created_date: Optional[datetime] = None + queued_date: Optional[datetime] = None + started_date: Optional[datetime] = None + finished_date: Optional[datetime] = None duration_sec: float - queued_duration_sec: Optional[float] + queued_duration_sec: Optional[float] = None diff --git a/backend/python/pydevlake/pydevlake/domain_layer/qa.py b/backend/python/pydevlake/pydevlake/domain_layer/qa.py index 481fbb52542..bc840640b50 100644 --- a/backend/python/pydevlake/pydevlake/domain_layer/qa.py +++ b/backend/python/pydevlake/pydevlake/domain_layer/qa.py @@ -28,10 +28,10 @@ class QaProject(DomainScope, table=True): class QaTestCase(DomainModel, table=True): __tablename__ = 'qa_test_cases' name: str - create_time: Optional[datetime] - creator_id: Optional[str] - type: Optional[str] - qa_api_id: Optional[str] + create_time: Optional[datetime] = None + creator_id: Optional[str] = None + type: Optional[str] = None + qa_api_id: Optional[str] = None qa_project_id: str @@ -39,9 +39,9 @@ class QaTestCaseExecution(DomainModel, table=True): __tablename__ = 'qa_test_case_executions' qa_project_id: str qa_test_case_id: str - create_time: Optional[datetime] - start_time: Optional[datetime] - finish_time: Optional[datetime] - creator_id: Optional[str] - status: Optional[str] + create_time: Optional[datetime] = None + start_time: Optional[datetime] = None + finish_time: Optional[datetime] = None + creator_id: Optional[str] = None + status: Optional[str] = None is_invalid: bool = False diff --git a/backend/python/pydevlake/pydevlake/domain_layer/ticket.py b/backend/python/pydevlake/pydevlake/domain_layer/ticket.py index 2eabf05c030..e594ffa81a9 100644 --- a/backend/python/pydevlake/pydevlake/domain_layer/ticket.py +++ b/backend/python/pydevlake/pydevlake/domain_layer/ticket.py @@ -24,10 +24,10 @@ class Board(DomainScope, table=True): __tablename__ = 'boards' name: str - description: Optional[str] - url: Optional[str] - created_date: Optional[datetime] - type: Optional[str] + description: Optional[str] = None + url: Optional[str] = None + created_date: Optional[datetime] = None + type: Optional[str] = None class BoardIssue(NoPKModel, table=True): @@ -45,12 +45,12 @@ class BoardSprint(NoPKModel, table=True): class Sprint(DomainModel, table=True): __tablename__ = 'sprints' name: str - url: Optional[str] - status: Optional[str] - started_date: Optional[datetime] - ended_date: Optional[datetime] - completed_date: Optional[datetime] - original_board_id: Optional[str] + url: Optional[str] = None + status: Optional[str] = None + started_date: Optional[datetime] = None + ended_date: Optional[datetime] = None + completed_date: Optional[datetime] = None + original_board_id: Optional[str] = None class SprintIssue(NoPKModel, table=True): @@ -61,44 +61,44 @@ class SprintIssue(NoPKModel, table=True): class Issue(DomainModel, table=True): __tablename__ = 'issues' - url: Optional[str] - issue_key: Optional[str] + url: Optional[str] = None + issue_key: Optional[str] = None title: str - description: Optional[str] - epic_key: Optional[str] - type: Optional[str] - original_type: Optional[str] + description: Optional[str] = None + epic_key: Optional[str] = None + type: Optional[str] = None + original_type: Optional[str] = None status: str - original_status: Optional[str] - story_point: Optional[float] - resolution_date: Optional[datetime] - created_date: Optional[datetime] - updated_date: Optional[datetime] - lead_time_minutes: Optional[int] - original_estimate_minutes: Optional[int] - time_spent_minutes: Optional[int] - time_remaining_minutes: Optional[int] - creator_id: Optional[str] - creator_name: Optional[str] - assignee_id: Optional[str] - assignee_name: Optional[str] - parent_issue_id: Optional[str] - priority: Optional[str] - severity: Optional[str] - urgency: Optional[str] - component: Optional[str] - icon_url: Optional[str] - original_project: Optional[str] + original_status: Optional[str] = None + story_point: Optional[float] = None + resolution_date: Optional[datetime] = None + created_date: Optional[datetime] = None + updated_date: Optional[datetime] = None + lead_time_minutes: Optional[int] = None + original_estimate_minutes: Optional[int] = None + time_spent_minutes: Optional[int] = None + time_remaining_minutes: Optional[int] = None + creator_id: Optional[str] = None + creator_name: Optional[str] = None + assignee_id: Optional[str] = None + assignee_name: Optional[str] = None + parent_issue_id: Optional[str] = None + priority: Optional[str] = None + severity: Optional[str] = None + urgency: Optional[str] = None + component: Optional[str] = None + icon_url: Optional[str] = None + original_project: Optional[str] = None is_subtask: bool = False - due_date: Optional[datetime] - fix_versions: Optional[str] + due_date: Optional[datetime] = None + fix_versions: Optional[str] = None class IssueAssignee(NoPKModel, table=True): __tablename__ = 'issue_assignees' issue_id: str = Field(primary_key=True) assignee_id: str = Field(primary_key=True) - assignee_name: Optional[str] + assignee_name: Optional[str] = None class IssueLabel(NoPKModel, table=True): @@ -110,34 +110,34 @@ class IssueLabel(NoPKModel, table=True): class IssueComment(DomainModel, table=True): __tablename__ = 'issue_comments' issue_id: str - body: Optional[str] - account_id: Optional[str] - created_date: Optional[datetime] - updated_date: Optional[datetime] + body: Optional[str] = None + account_id: Optional[str] = None + created_date: Optional[datetime] = None + updated_date: Optional[datetime] = None class IssueChangelogs(DomainModel, table=True): __tablename__ = 'issue_changelogs' issue_id: str - author_id: Optional[str] - author_name: Optional[str] - field_id: Optional[str] - field_name: Optional[str] - original_from_value: Optional[str] - original_to_value: Optional[str] - from_value: Optional[str] - to_value: Optional[str] - created_date: Optional[datetime] + author_id: Optional[str] = None + author_name: Optional[str] = None + field_id: Optional[str] = None + field_name: Optional[str] = None + original_from_value: Optional[str] = None + original_to_value: Optional[str] = None + from_value: Optional[str] = None + to_value: Optional[str] = None + created_date: Optional[datetime] = None class IssueWorklog(DomainModel, table=True): __tablename__ = 'issue_worklogs' - author_id: Optional[str] - comment: Optional[str] - time_spent_minutes: Optional[int] - logged_date: Optional[datetime] - started_date: Optional[datetime] - issue_id: Optional[str] + author_id: Optional[str] = None + comment: Optional[str] = None + time_spent_minutes: Optional[int] = None + logged_date: Optional[datetime] = None + started_date: Optional[datetime] = None + issue_id: Optional[str] = None class IssueRelationship(NoPKModel, table=True): diff --git a/backend/python/pydevlake/pydevlake/extractor.py b/backend/python/pydevlake/pydevlake/extractor.py index 5943e1b869f..f2847a76d0f 100644 --- a/backend/python/pydevlake/pydevlake/extractor.py +++ b/backend/python/pydevlake/pydevlake/extractor.py @@ -14,13 +14,26 @@ # limitations under the License. -from typing import Type +from typing import Type, get_args, get_origin, Union +from types import NoneType +from pydantic_core import PydanticUndefined from jsonpointer import resolve_pointer, JsonPointerException from pydevlake import ToolModel +def _is_optional(field_info) -> bool: + """Check if a field's annotation allows None (is Optional).""" + annotation = field_info.annotation + if annotation is None: + return True + origin = get_origin(annotation) + if origin is Union: + return NoneType in get_args(annotation) + return False + + def autoextract(json: dict, model_cls: Type[ToolModel]) -> ToolModel: """ Automatically extract a tool model from a json object. @@ -42,18 +55,33 @@ class DummyModel(ToolModel): model = autoextract(json, DummyModel) """ attributes = {} - for field in model_cls.__fields__.values(): - pointer = field.field_info.extra.get('source') + for field_name, field_info in model_cls.model_fields.items(): + # In SQLModel 0.0.38, schema_extra is stored in field_info.json_schema_extra + extra = field_info.json_schema_extra or {} + if isinstance(extra, dict): + pointer = extra.get('source') + else: + pointer = None if pointer: - if field.required: + # A field is considered optional if its annotation allows None + is_optional = _is_optional(field_info) + if not is_optional: try: value = resolve_pointer(json, pointer) except JsonPointerException: - raise ValueError(f"Missing required value for field {field.name} at {pointer}") + raise ValueError(f"Missing required value for field {field_name} at {pointer}") else: - value = resolve_pointer(json, pointer, field.default) + default = field_info.default if field_info.default is not PydanticUndefined else None + try: + value = resolve_pointer(json, pointer, default) + except JsonPointerException: + value = default else: - value = json.get(field.name) or json.get(field.alias) - attributes[field.name] = value - return model_cls(**attributes) + alias = field_info.alias + value = json.get(field_name) or json.get(alias) if alias else json.get(field_name) + attributes[field_name] = value + # Use model_validate so values are coerced (e.g. str -> datetime/Enum). + # SQLModel table=True models skip validation on __init__, which would leave + # raw strings uncoerced under Pydantic v2, so validate explicitly here. + return model_cls.model_validate(attributes) diff --git a/backend/python/pydevlake/pydevlake/ipc.py b/backend/python/pydevlake/pydevlake/ipc.py index 12d03fbdf0e..1db0c45cc0d 100644 --- a/backend/python/pydevlake/pydevlake/ipc.py +++ b/backend/python/pydevlake/pydevlake/ipc.py @@ -40,7 +40,7 @@ def open_send_channel() -> TextIO: def send_output(send_ch: TextIO, obj: object): if not isinstance(obj, Message): raise Exception(f"Not a message: {obj}") - send_ch.write(obj.json(exclude_none=True, by_alias=True)) + send_ch.write(obj.model_dump_json(exclude_none=True, by_alias=True)) send_ch.write('\n') send_ch.flush() diff --git a/backend/python/pydevlake/pydevlake/message.py b/backend/python/pydevlake/pydevlake/message.py index 431be5bb4b4..da297776cb7 100644 --- a/backend/python/pydevlake/pydevlake/message.py +++ b/backend/python/pydevlake/pydevlake/message.py @@ -14,9 +14,9 @@ # limitations under the License. -from typing import Optional +from typing import Literal, Optional -from pydantic import BaseModel, Field +from pydantic import BaseModel, ConfigDict, Field, RootModel, SerializeAsAny from pydevlake.model import ToolScope from pydevlake.migration import MigrationScript @@ -25,8 +25,7 @@ class Message(BaseModel): - class Config: - allow_population_by_field_name = True + model_config = ConfigDict(populate_by_name=True) class SubtaskMeta(BaseModel): @@ -36,7 +35,7 @@ class SubtaskMeta(BaseModel): enabled_by_default: bool description: str domain_types: list[str] - arguments: list[str] = None + arguments: Optional[list[str]] = None class PluginInfo(Message): @@ -44,7 +43,7 @@ class PluginInfo(Message): description: str connection_model_info: DynamicModelInfo scope_model_info: DynamicModelInfo - scope_config_model_info: Optional[DynamicModelInfo] + scope_config_model_info: Optional[DynamicModelInfo] = None tool_model_infos: list[DynamicModelInfo] migration_scripts: list[MigrationScript] plugin_path: str @@ -81,17 +80,20 @@ class RemoteScopeTreeNode(Message): class RemoteScopeGroup(RemoteScopeTreeNode): - type: str = Field("group", const=True) + type: Literal["group"] = "group" class RemoteScope(RemoteScopeTreeNode): - type: str = Field("scope", const=True) + type: Literal["scope"] = "scope" parent_id: str = Field(..., alias="parentId") - data: ToolScope + # SerializeAsAny keeps pydantic v2 from serializing this field by its + # declared base type (ToolScope) and dropping subclass-only fields such as + # the concrete scope's `url`; v1 always serialized the runtime type. + data: SerializeAsAny[ToolScope] -class RemoteScopes(Message): - __root__: list[RemoteScopeTreeNode] +class RemoteScopes(RootModel[list[RemoteScopeTreeNode]]): + pass class TestConnectionResult(Message): diff --git a/backend/python/pydevlake/pydevlake/model.py b/backend/python/pydevlake/pydevlake/model.py index 08747ce308e..aa95d657c79 100644 --- a/backend/python/pydevlake/pydevlake/model.py +++ b/backend/python/pydevlake/pydevlake/model.py @@ -22,8 +22,8 @@ from enum import Enum import inflect -from pydantic import AnyUrl, SecretStr, validator -from sqlalchemy import Column, DateTime, Text +from pydantic import AnyUrl, SecretStr, field_validator, ConfigDict +from sqlalchemy import DateTime, Text from sqlalchemy.orm import declared_attr from sqlalchemy.inspection import inspect from sqlmodel import SQLModel @@ -33,12 +33,13 @@ class Model(SQLModel): - id: Optional[int] = Field(primary_key=True) + id: Optional[int] = Field(default=None, primary_key=True) created_at: Optional[datetime] = Field( - sa_column=Column(DateTime(), default=datetime.utcnow) + default=None, sa_type=DateTime(), sa_column_kwargs={'default': datetime.utcnow} ) updated_at: Optional[datetime] = Field( - sa_column=Column(DateTime(), default=datetime.utcnow, onupdate=datetime.utcnow) + default=None, sa_type=DateTime(), + sa_column_kwargs={'default': datetime.utcnow, 'onupdate': datetime.utcnow} ) def set_updated_at(self): @@ -46,32 +47,33 @@ def set_updated_at(self): self.updated_at = datetime.utcnow() +def _to_camel(attr_name: str) -> str: + """Convert snake_case to camelCase for alias generation.""" + parts = attr_name.split('_') + return parts[0] + ''.join(word.capitalize() for word in parts[1:]) + + class ToolTable(SQLModel): + model_config = ConfigDict( + populate_by_name=True, + alias_generator=_to_camel, + # Pydantic v1 accepted numbers for str fields; APIs often return ids as numbers. + coerce_numbers_to_str=True, + ) + @declared_attr def __tablename__(cls) -> str: plugin_name = _get_plugin_name(cls) plural_entity = inflect_engine.plural_noun(cls.__name__.lower()) return f'_tool_{plugin_name}_{plural_entity}' - class Config: - allow_population_by_field_name = True - json_encoders = { - SecretStr: lambda v: v.get_secret_value() if v else None - } - - @classmethod - def alias_generator(cls, attr_name: str) -> str: - # Allow to set snake_cased attributes with camelCased keyword args. - # Useful for extractors dealing with raw data that has camelCased attributes. - parts = attr_name.split('_') - return parts[0] + ''.join(word.capitalize() for word in parts[1:]) - class Connection(ToolTable, Model): name: str = Field(unique=True) - proxy: Optional[AnyUrl] + proxy: Optional[AnyUrl] = None - @validator('proxy', pre=True) + @field_validator('proxy', mode='before') + @classmethod def allow_empty_proxy(cls, proxy): if proxy == "": return None @@ -90,9 +92,10 @@ class DomainType(Enum): class ScopeConfig(ToolTable, Model): name: str = Field(default="default") domain_types: list[DomainType] = Field(default=list(DomainType), alias="entities") - connection_id: Optional[int] + connection_id: Optional[int] = None - @validator('domain_types', pre=True, always=True) + @field_validator('domain_types', mode='before') + @classmethod def set_default_domain_types(cls, v): if v is None: return list(DomainType) @@ -101,9 +104,11 @@ def set_default_domain_types(cls, v): class RawModel(SQLModel): id: int = Field(primary_key=True) - params: str = b'' + # Keep the column types of existing raw tables (they are only created if + # missing): data/input are binary, url is TEXT. + params: str = '' data: bytes - url: str = Field(default=b'', sa_column=Column(Text)) + url: str = Field(default='', sa_type=Text()) input: bytes = b'' created_at: datetime = Field(default_factory=datetime.now) @@ -111,10 +116,10 @@ class RawModel(SQLModel): class RawDataOrigin(SQLModel): # SQLModel doesn't like attributes starting with _ # so we change the names of the columns. - raw_data_params: Optional[str] = Field(sa_column_kwargs={'name': '_raw_data_params'}, alias='_raw_data_params') - raw_data_table: Optional[str] = Field(sa_column_kwargs={'name': '_raw_data_table'}, alias='_raw_data_table') - raw_data_id: Optional[str] = Field(sa_column_kwargs={'name': '_raw_data_id'}, alias='_raw_data_id') - raw_data_remark: Optional[str] = Field(sa_column_kwargs={'name': '_raw_data_remark'}, alias='_raw_data_remark') + raw_data_params: Optional[str] = Field(default=None, sa_column_kwargs={'name': '_raw_data_params'}, alias='_raw_data_params') + raw_data_table: Optional[str] = Field(default=None, sa_column_kwargs={'name': '_raw_data_table'}, alias='_raw_data_table') + raw_data_id: Optional[str] = Field(default=None, sa_column_kwargs={'name': '_raw_data_id'}, alias='_raw_data_id') + raw_data_remark: Optional[str] = Field(default=None, sa_column_kwargs={'name': '_raw_data_remark'}, alias='_raw_data_remark') def set_raw_origin(self, raw: RawModel): self.raw_data_id = raw.id @@ -129,10 +134,11 @@ def set_tool_origin(self, tool_model: 'ToolModel'): class NoPKModel(RawDataOrigin): created_at: Optional[datetime] = Field( - sa_column=Column(DateTime(), default=datetime.utcnow) + default=None, sa_type=DateTime(), sa_column_kwargs={'default': datetime.utcnow} ) updated_at: Optional[datetime] = Field( - sa_column=Column(DateTime(), default=datetime.utcnow, onupdate=datetime.utcnow) + default=None, sa_type=DateTime(), + sa_column_kwargs={'default': datetime.utcnow, 'onupdate': datetime.utcnow} ) def set_updated_at(self): @@ -141,7 +147,7 @@ def set_updated_at(self): class ToolModel(ToolTable, NoPKModel): - connection_id: Optional[int] = Field(primary_key=True, auto_increment=False) + connection_id: Optional[int] = Field(default=None, primary_key=True, auto_increment=False) def domain_id(self): """ @@ -161,13 +167,13 @@ def primary_keys(self) -> Iterable[object]: class DomainModel(NoPKModel): - id: Optional[str] = Field(primary_key=True) + id: Optional[str] = Field(default=None, primary_key=True) class ToolScope(ToolModel): id: str = Field(primary_key=True) name: str - scope_config_id: Optional[int] + scope_config_id: Optional[int] = None class DomainScope(DomainModel): @@ -210,9 +216,9 @@ class SubtaskRun(SQLModel, table=True): """ Table storing information about the execution of subtasks. """ - id: Optional[int] = Field(primary_key=True) + id: Optional[int] = Field(default=None, primary_key=True) subtask_name: str connection_id: int started: datetime - completed: Optional[datetime] - state: str = Field(sa_column=Column(Text)) # JSON encoded dict of atomic values + completed: Optional[datetime] = None + state: str = Field(sa_type=Text()) # JSON encoded dict of atomic values diff --git a/backend/python/pydevlake/pydevlake/model_info.py b/backend/python/pydevlake/pydevlake/model_info.py index dcab6c7d3a0..bed6ace7cb6 100644 --- a/backend/python/pydevlake/pydevlake/model_info.py +++ b/backend/python/pydevlake/pydevlake/model_info.py @@ -14,25 +14,32 @@ # limitations under the License. import jsonref -from pydantic import BaseModel +from pydantic import BaseModel, ConfigDict class DynamicModelInfo(BaseModel): + model_config = ConfigDict(populate_by_name=True) + json_schema: dict table_name: str - class Config: - allow_population_by_field_name = True - @staticmethod def from_model(model_class): - schema = model_class.schema(by_alias=True) - if 'definitions' in schema: + schema = model_class.model_json_schema(by_alias=True) + if '$defs' in schema: # Replace $ref with actual schema schema = jsonref.replace_refs(schema, proxies=False) - del schema['definitions'] - # Pydantic forgets to put type in enums - for prop in schema['properties'].values(): + del schema['$defs'] + for prop in schema.get('properties', {}).values(): + # Pydantic v2 renders Optional[X] as anyOf: [{type: X}, {type: null}] + # The Go backend expects a flat "type" string, so flatten it. + if 'anyOf' in prop and 'type' not in prop: + non_null = [t for t in prop['anyOf'] if t.get('type') != 'null'] + if len(non_null) == 1: + # Merge the non-null variant into the property and drop anyOf + any_of = prop.pop('anyOf') + prop.update(non_null[0]) + # Pydantic forgets to put type in enums if 'type' not in prop and 'enum' in prop: prop['type'] = 'string' return DynamicModelInfo( diff --git a/backend/python/pydevlake/pydevlake/plugin.py b/backend/python/pydevlake/pydevlake/plugin.py index b365bad4a2d..bad631a5908 100644 --- a/backend/python/pydevlake/pydevlake/plugin.py +++ b/backend/python/pydevlake/pydevlake/plugin.py @@ -142,7 +142,7 @@ def make_pipeline(self, scope_config_pairs: list[ScopeConfigPair], domain_scopes.append( msg.DynamicDomainScope( type_name=type(scope).__name__, - data=scope.json(exclude_unset=True, by_alias=True) + data=scope.model_dump_json(exclude_unset=True, by_alias=True) ) ) return msg.PipelineData( diff --git a/backend/python/pydevlake/pydevlake/testing/testing.py b/backend/python/pydevlake/pydevlake/testing/testing.py index 8b9b7b39432..5f08cd100f4 100644 --- a/backend/python/pydevlake/pydevlake/testing/testing.py +++ b/backend/python/pydevlake/pydevlake/testing/testing.py @@ -81,6 +81,22 @@ def make_context(connection, scope, scope_config, options=None, time_after=None) ) +def _revalidate(model): + # Under Pydantic v2, SQLModel table models don't coerce field values on + # construction. Expected models built from raw values (e.g. date strings) + # therefore keep their raw type, while converted results are already + # coerced. Re-validating normalizes the field types on both sides so the + # comparison behaves like it did under Pydantic v1. + # Converters may reference ids that the subtask only assigns while saving + # (e.g. BoardIssue(issue_id=issue.id)); those stay None here and would fail + # validation, so fall back to the plain field values for such models. + data = model.model_dump(warnings=False) + try: + return type(model).model_validate(data) + except ValidationError: + return data + + def assert_stream_convert(plugin: Union[Plugin, Type[Plugin]], stream_name: str, raw: dict, expected: Union[DomainModel, Iterable[DomainModel]], ctx=None): @@ -100,7 +116,7 @@ def assert_stream_convert(plugin: Union[Plugin, Type[Plugin]], stream_name: str, hasattr(exp, "__getitem__") and exp[0] == "updated_at"): pass else: - assert res == exp + assert _revalidate(res) == _revalidate(exp) def assert_stream_run(stream: Stream, connection: Connection, scope: ToolScope, scope_config: ScopeConfig): diff --git a/backend/python/pydevlake/pyproject.toml b/backend/python/pydevlake/pyproject.toml index 0387d002a5e..fa759d94098 100644 --- a/backend/python/pydevlake/pyproject.toml +++ b/backend/python/pydevlake/pyproject.toml @@ -23,12 +23,12 @@ readme = "README.md" [tool.poetry.dependencies] python = ">=3.11,<3.12" -sqlmodel = "^0.0.8" +sqlmodel = "^0.0.38" mysqlclient = "^2.1.1" requests = "^2.28.1" inflect = ">=6.0.2,<8.0.0" fire = ">=0.4,<0.8" -pydantic = "^1.10.2" +pydantic = "^2.14" pydevd-pycharm = ">=231.6471.3,<264.0.0" pytest = "^9.1.1" jsonref = "^1.1.0" diff --git a/backend/python/pydevlake/tests/migration_test.py b/backend/python/pydevlake/tests/migration_test.py index 6e19825f02d..557bc500016 100644 --- a/backend/python/pydevlake/tests/migration_test.py +++ b/backend/python/pydevlake/tests/migration_test.py @@ -45,7 +45,7 @@ def test_registration(): def test_serialization(): - val = my_migration.dict() + val = my_migration.model_dump() assert val["version"] == 20230520174322 assert val["name"] == "my_migration" assert len(val["operations"]) == 3 diff --git a/backend/python/pydevlake/tests/stream_test.py b/backend/python/pydevlake/tests/stream_test.py index f4f48f883cf..2efed194cc1 100644 --- a/backend/python/pydevlake/tests/stream_test.py +++ b/backend/python/pydevlake/tests/stream_test.py @@ -113,7 +113,7 @@ def test_extract_data(stream, raw_data, ctx): for each in raw_data: raw_model = stream.raw_model(session) raw_model.params = raw_data_params(ctx.connection.id, ctx.scope.id) - session.add(raw_model(data=json.dumps(each))) + session.add(raw_model(data=json.dumps(each).encode('utf8'))) session.commit() gen = stream.extractor.run(ctx) diff --git a/backend/python/test/fakeplugin/fakeplugin/main.py b/backend/python/test/fakeplugin/fakeplugin/main.py index 745c66ff21b..2245ac25f36 100644 --- a/backend/python/test/fakeplugin/fakeplugin/main.py +++ b/backend/python/test/fakeplugin/fakeplugin/main.py @@ -29,7 +29,7 @@ class FakePipelineStream(Stream): def collect(self, state, context): for p in self.generate_fake_pipelines(): - yield json.loads(p.json()), {} + yield json.loads(p.model_dump_json()), {} def convert(self, pipeline: FakePipeline, ctx): env = ctx.scope_config.env @@ -68,7 +68,7 @@ def generate_fake_pipelines(cls) -> list[FakePipeline]: fake_pipelines = [] for i in range(250): fake_pipelines.append(FakePipeline( - id=i, + id=str(i), state=states[i % len(states)], started_at=datetime(2023, 1, 10, 11, 0, 0, microsecond=i), finished_at=datetime(2023, 1, 10, 11, 3, 0, microsecond=i), @@ -92,7 +92,7 @@ def scope_config_type(self): def domain_scopes(self, project: FakeProject): project_name = "_".join(project.name.lower().split(" ")) yield CicdScope( - id=1, + id="1", name=project.name, url=f"http://fake.org/api/project/{project_name}" ) diff --git a/backend/python/test/fakeplugin/fakeplugin/models.py b/backend/python/test/fakeplugin/fakeplugin/models.py index 16f543dd83b..9f876591933 100644 --- a/backend/python/test/fakeplugin/fakeplugin/models.py +++ b/backend/python/test/fakeplugin/fakeplugin/models.py @@ -42,6 +42,6 @@ class State(Enum): SUCCESS = "success" id: str = Field(primary_key=True) - started_at: Optional[datetime] - finished_at: Optional[datetime] + started_at: Optional[datetime] = None + finished_at: Optional[datetime] = None state: State diff --git a/backend/python/test/fakeplugin/poetry.lock b/backend/python/test/fakeplugin/poetry.lock index 2fee6353f76..30bef711dd5 100644 --- a/backend/python/test/fakeplugin/poetry.lock +++ b/backend/python/test/fakeplugin/poetry.lock @@ -1,5 +1,17 @@ # This file is automatically @generated by Poetry 2.5.1 and should not be changed by hand. +[[package]] +name = "annotated-types" +version = "0.8.0" +description = "Reusable constraint types to use with typing.Annotated" +optional = false +python-versions = ">=3.10" +groups = ["main"] +files = [ + {file = "annotated_types-0.8.0-py3-none-any.whl", hash = "sha256:f072f4d804ea359e4eaf198b1af7a8b0943881a87f31bb764f8bf219bb9419e0"}, + {file = "annotated_types-0.8.0.tar.gz", hash = "sha256:13b2beaad985e05e2d6407ee4c4f35590b11f8d693a258a561055cac8f64cab7"}, +] + [[package]] name = "certifi" version = "2026.10.23" @@ -461,57 +473,178 @@ files = [ [[package]] name = "pydantic" -version = "1.10.27" -description = "Data validation and settings management using python type hints" +version = "2.14.3" +description = "Data validation using Python type hints" optional = false -python-versions = ">=3.7" +python-versions = ">=3.10" groups = ["main"] files = [ - {file = "pydantic-1.10.27-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eae28e29ca3eff84c9dc74a93c1c855fc8a85ca8ff07dc59f85c7946ad82558d"}, - {file = "pydantic-1.10.27-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cc24e078b473fdc83ee1429ad48602d10a524e83e5109a39b96702df5471b2ea"}, - {file = "pydantic-1.10.27-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ca03f9faadded650da853023f46744ec7a5a5e7b19f22bf03892d005b22a0a36"}, - {file = "pydantic-1.10.27-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e95e77e46e4ba81ca198ab0c442ac92091b31025a8b887ef0a8b56455affb0e6"}, - {file = "pydantic-1.10.27-cp310-cp310-win_amd64.whl", hash = "sha256:eb7eac10d751991e208a3d76c19ab97bb8d478d7ba400ac48310b85af8638a2f"}, - {file = "pydantic-1.10.27-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c140c225280c949a72c8d36966b994b3739cf80640642971cc80c5f679ada94f"}, - {file = "pydantic-1.10.27-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:79a9d28e3de0dbea101c43f4361345859c169d9c8cd63d41af3b42ecb1e7fa9b"}, - {file = "pydantic-1.10.27-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:76b9dee80c3c3406fadd3a704166caee782e9dd6582d5a0cbc63df1003dfe102"}, - {file = "pydantic-1.10.27-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e6e4694479a27f50d90d1f6e1606d87692282624c2fa0ef70b2512e447c3fc91"}, - {file = "pydantic-1.10.27-cp311-cp311-win_amd64.whl", hash = "sha256:23c20016fc9386a666233b603c8ed72d6950139dc86c8ecdf8f9f4cc59737380"}, - {file = "pydantic-1.10.27-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b3134bb69d4f792f2e8d91822d413c2a65640534111a7bb5ad0dba7dddc84ba2"}, - {file = "pydantic-1.10.27-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7c0aec4fb3a905791791a181d960a6ba39e431b70d0efee53fd0702c5586f185"}, - {file = "pydantic-1.10.27-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:75b333b79e8651199a77d7d2e113595ed1c0922d3739208397190f0debff5627"}, - {file = "pydantic-1.10.27-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:712c696c21df56f42ed1659ca67a7ac7177961f5ec4f8daf3bdc51c94ecbeee3"}, - {file = "pydantic-1.10.27-cp312-cp312-win_amd64.whl", hash = "sha256:45fa35a6c596607d22e485521b222c871e8994df0951eaaf7d99c40738179c55"}, - {file = "pydantic-1.10.27-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:04e1816ffb3e95626fcdea60652475f62290fc8abccffd09506e04641d9ae84b"}, - {file = "pydantic-1.10.27-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ad8f316e7cc228ca083ec0ee46a6fa0a1462825fb0b5ee77a4e305ac2a3c4c69"}, - {file = "pydantic-1.10.27-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e2882264f36d8c9e33e28c246a1fb5ac72b1a3807aa8a56a0391496485643da2"}, - {file = "pydantic-1.10.27-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f4df9b90d62e4ef2baeab9ead89666355ffaece715cdbd422840a9fcf093b1b9"}, - {file = "pydantic-1.10.27-cp313-cp313-win_amd64.whl", hash = "sha256:55e59df95f80a2df7105760d032809b68b4197fc6be55fff4c2bed183e72ea53"}, - {file = "pydantic-1.10.27-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:a32f08d7c0761b37e83fccb872b8e0a5f3c239f7163efebcbb423e16fbbc8719"}, - {file = "pydantic-1.10.27-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:de052982b7ff0decccfd34ceb7ac3eccd7a4488c7f80357b79d4464b4cbec3f2"}, - {file = "pydantic-1.10.27-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:aafb6196650480014d02bb908a71d11f8d1281937c4fed2ababdf6f911bb2c46"}, - {file = "pydantic-1.10.27-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6f3ca6cc8e3a66dc84586c838605b241c8fec71d81e1533e1a4f1795286e10cb"}, - {file = "pydantic-1.10.27-cp314-cp314-win_amd64.whl", hash = "sha256:8dba906c8981a5b2d4489f394236496077eb0b5468614e2aa089d3e7f2e5792a"}, - {file = "pydantic-1.10.27-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e538d73928ff07da7655fc0f9b2695e5094746a5eaca5560707149c3d969ee55"}, - {file = "pydantic-1.10.27-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2d55abdaa56e5421da4c991398a808338a052839562d795439f2492c0d8bc274"}, - {file = "pydantic-1.10.27-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:25d6cb1e1911240721e9932c2da814585566f99056e2fb09ca329b0310d4853e"}, - {file = "pydantic-1.10.27-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:fff314506136b4c0b786405772aef88b8b01f6863c13303b5c934912c7ead1ad"}, - {file = "pydantic-1.10.27-cp38-cp38-win_amd64.whl", hash = "sha256:5972ec9abf2cbf017090c811310d520b552c2ac57663968e02307a161c4067f9"}, - {file = "pydantic-1.10.27-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:89079afb6aa3dfcb4785fa5f74463233c9fef460e54f59473393d4ca44ff105d"}, - {file = "pydantic-1.10.27-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5a8f34e9dbd87d143421b6af8ab7e9cb612856221a648a1b8c30f21e7ddb0007"}, - {file = "pydantic-1.10.27-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:216fdb8c0a97e0b0e9472538359f2d2ffd3d4554073a095bec8c0a28d7d9a3a9"}, - {file = "pydantic-1.10.27-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:01cff2fabf4f4d618d629201e27799cba4b5aefdce6c3db06b34e8ff48461e36"}, - {file = "pydantic-1.10.27-cp39-cp39-win_amd64.whl", hash = "sha256:301e615e7d9f9995e98e7fca916f3e4b4bc66ba1f98e596fe1e5af3ac5db0024"}, - {file = "pydantic-1.10.27-py3-none-any.whl", hash = "sha256:d714c3df0db634a6720abdc204d7b3bfc6c62d4ef7b4f9dcd64b37c29187a058"}, - {file = "pydantic-1.10.27.tar.gz", hash = "sha256:62906b7ca1237ceefb3db38276417286ee0cd2c81720a6b8932cc57bfeba496a"}, + {file = "pydantic-2.14.3-py3-none-any.whl", hash = "sha256:3f7b347782ab7e4cf4c798496ae3a82787d9f21ec12676a9c564355eeef8daa8"}, + {file = "pydantic-2.14.3.tar.gz", hash = "sha256:1054f237f4d4733e5a30e1e2333bd33a2004ab9ab1510bd053a9a31bb48e232d"}, ] [package.dependencies] -typing-extensions = ">=4.2.0" +annotated-types = ">=0.6.0" +pydantic-core = "2.50.4" +typing-extensions = ">=4.16.0" +typing-inspection = ">=0.4.4" [package.extras] -dotenv = ["python-dotenv (>=0.10.4)"] -email = ["email-validator (>=1.0.3)"] +email = ["email-validator (>=2.0.0)"] +timezone = ["tzdata ; platform_system == \"Windows\""] + +[[package]] +name = "pydantic-core" +version = "2.50.4" +description = "Core functionality for Pydantic validation and serialization" +optional = false +python-versions = ">=3.10" +groups = ["main"] +files = [ + {file = "pydantic_core-2.50.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:83d2beac85b757bfc404c5c0612df51c4ef33bbb7be65cf4a96b4da7cbc4ff4f"}, + {file = "pydantic_core-2.50.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:76e0065998159244ff4c097a6c05ff08019c6fbb6e597a85846e73044f0215b3"}, + {file = "pydantic_core-2.50.4-cp310-cp310-manylinux1_i686.manylinux_2_5_i686.whl", hash = "sha256:25e7e1080f9f7ce7cd9d114b31470ce912771bd02f38c824721d3c35d312abff"}, + {file = "pydantic_core-2.50.4-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c4c5a1770ecfe8bdb6c6f09f8d81ea4de04f7efb012fac1efa4ad315dccc1fd1"}, + {file = "pydantic_core-2.50.4-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.whl", hash = "sha256:2f6767122b37c780bb756a720a4eef2bc6a050a0a1143428834b3cbc89448bd2"}, + {file = "pydantic_core-2.50.4-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:86c7c4615634b5c57a79770f5b738354e45ae219a89949aeae84f19169a05283"}, + {file = "pydantic_core-2.50.4-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:6c7d7b0b596319e9ce79ef96ce57a14054a2eac629c0588a0539187a218be799"}, + {file = "pydantic_core-2.50.4-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ed9c0b6f236648dbf30d57e9f57e1f74878caafa04833a19f529b5ba5164b7a8"}, + {file = "pydantic_core-2.50.4-cp310-cp310-manylinux_2_31_riscv64.whl", hash = "sha256:dfcf6e51000b34f7026322cd9ea9bc340d745637e27e0bbc22f504b4f6b967ee"}, + {file = "pydantic_core-2.50.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:bd46bcc28ed85d3cf71581b42d90b4ebd1f2062f81879519fed209f8a4d1cfc6"}, + {file = "pydantic_core-2.50.4-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:696613a0c0e7b2b35356e389ba4195ce20cfe7a2fc2e992c87d974d973eabec7"}, + {file = "pydantic_core-2.50.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2980a701be88f9128a7470189fa3bcda5387f76c298a6f8e000fc29eb2a6f4e7"}, + {file = "pydantic_core-2.50.4-cp310-cp310-win32.whl", hash = "sha256:dd8bed00731a21e3106e5dd6bbffb6c775a2c0bbc7c0c9face534d830057bdc9"}, + {file = "pydantic_core-2.50.4-cp310-cp310-win_amd64.whl", hash = "sha256:e512c75ec5cf4475c1aa50ad975ecdf253f4963b06e152e1a11edd6de4010753"}, + {file = "pydantic_core-2.50.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:3e547ceec1da7382f01f9e13963023e53367a71802c88778b21b9645a077cbdf"}, + {file = "pydantic_core-2.50.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c813ada7a651193acda85b6bc1cf12abd4b37cd25c7c6a75d7183512cc374969"}, + {file = "pydantic_core-2.50.4-cp311-cp311-manylinux1_i686.manylinux_2_5_i686.whl", hash = "sha256:57fa0a9490785139f1a4e4f43891830d55dfe4408845c0c9cb5eff4aeaf75f69"}, + {file = "pydantic_core-2.50.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:30d4dc35bc0eea52202a90b3820445ee0072c820241bfa710a623a078c9b267b"}, + {file = "pydantic_core-2.50.4-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.whl", hash = "sha256:789f88dea57841cdebef392b5d6e90444d767117e9ff2e0d9172df5c9de6690c"}, + {file = "pydantic_core-2.50.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:d690121e80ab16e623415351ab24713534d4e500b3cadff216409cb6826063d4"}, + {file = "pydantic_core-2.50.4-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b42f64825f5d750228f08318a9bf4d723b7ecb4c472aedcb3013c3ec2dc1f949"}, + {file = "pydantic_core-2.50.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0574866e05f6adeecc520d87e87dd06210c0a51706341f6ef8421572f5a64444"}, + {file = "pydantic_core-2.50.4-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:dcf2c7eaaa4cafe8e49b017e5bb49e76e084ab6f0cd712ee4019c812b5cf68b8"}, + {file = "pydantic_core-2.50.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3b8ee2589a082739c522c1fe4be227412fcf108b903abb6672ae2f5570558882"}, + {file = "pydantic_core-2.50.4-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:aec3c2d741a8e3ee993de7f95f37afb51e31b169c95dbd29da4cf6688f340914"}, + {file = "pydantic_core-2.50.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8923fcd49f875e8a0448d7223d1fdf1a9973ae2d1f20d4158753ceb8909facd2"}, + {file = "pydantic_core-2.50.4-cp311-cp311-win32.whl", hash = "sha256:fc04affef30be98c1f36f0c422a4061ef618fdc1dde79f5ad5458dd496fecffa"}, + {file = "pydantic_core-2.50.4-cp311-cp311-win_amd64.whl", hash = "sha256:15bece43a02ad543c621c8305e67dedb5f27d378c5ba741e5a2c36523f8ef37f"}, + {file = "pydantic_core-2.50.4-cp311-cp311-win_arm64.whl", hash = "sha256:e498900bfbf7ddddd862f810440c09e9b81674739e8a11d619b40906dccd4a9a"}, + {file = "pydantic_core-2.50.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:32a991aebd165f227b7c7c60bb9d66c2c7de9c24308552da264c9938fde0f8d6"}, + {file = "pydantic_core-2.50.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1e20cbde2b6deb33a51d08cd168454dd9044ec7d4474056f4d98d63f51578783"}, + {file = "pydantic_core-2.50.4-cp312-cp312-manylinux1_i686.manylinux_2_5_i686.whl", hash = "sha256:8cceae48ae7f94990c2f4e36291e9ec9868735e8b0f19e4489a17b0422338466"}, + {file = "pydantic_core-2.50.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:16902a147b3da4840612164a5e67947104d63e978f7a57c395877a5e26690b9c"}, + {file = "pydantic_core-2.50.4-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.whl", hash = "sha256:d6e3485a5e5c01fb5339c1ee3d4b9e21e2135a2a9d44caafb71acd994487ee7c"}, + {file = "pydantic_core-2.50.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:629eae995185540406e3635df5d5cf1d44f19ea240840b835d3f44541ff694d8"}, + {file = "pydantic_core-2.50.4-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:41b2cd8b29dbb5a4c9828a70f50d1abfc92011115c813213d3a91205c6f731b3"}, + {file = "pydantic_core-2.50.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c81d98e27d9d9261909dcccab1ba5d6ea1c98b0bb9470e368604614fd1d36ddd"}, + {file = "pydantic_core-2.50.4-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:ca83a32b2b41653d89f09a3d22b770bca96da72273bef8f7a68136bdd1e8b823"}, + {file = "pydantic_core-2.50.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:817953730e4a73a09008b010c4a42396cefe799616a22df2ac21d3927b3080cf"}, + {file = "pydantic_core-2.50.4-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:664e74848c2f5fc27db8505fe24e1ecd3ac669412913bf73d176916f86cc08e2"}, + {file = "pydantic_core-2.50.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:219114f8dcdcbe4720d82ef016b1287ce5a0a67d7c69ca61524eb72e82aac344"}, + {file = "pydantic_core-2.50.4-cp312-cp312-win32.whl", hash = "sha256:67f7cc397e1d5556a801d1cba74de0d27d827eb242e6c036c0ca273c745414f1"}, + {file = "pydantic_core-2.50.4-cp312-cp312-win_amd64.whl", hash = "sha256:ea2f61b0bc12f3592288503961b764579dea0658852d96a0b3d823614d808821"}, + {file = "pydantic_core-2.50.4-cp312-cp312-win_arm64.whl", hash = "sha256:32d6dda86383645ec428ea64dfc277036f5cbc60a72238eab28b91a3fdb9a113"}, + {file = "pydantic_core-2.50.4-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:0f87ae9db5ba8d8de40dcb93982cf8dd544e6552a80d3345af51941cc2146b80"}, + {file = "pydantic_core-2.50.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1239daaf063e62213ca1f34d96663900bd7510c42a786e843fd328af70e46445"}, + {file = "pydantic_core-2.50.4-cp313-cp313-manylinux1_i686.manylinux_2_5_i686.whl", hash = "sha256:1afefe44ec042fbabfb4483ea258c04cf75ff4ff328d754f09b321fdaa232aca"}, + {file = "pydantic_core-2.50.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a9ee990bf2cfbd81574c5d4f9f6c9d480a14b5b43d2c4f2ca13f4c6f48089394"}, + {file = "pydantic_core-2.50.4-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.whl", hash = "sha256:ab2822bcdcefb54d1e8ca29f5e3ec3afe160fb794bb3a3a73b09d11ed2671104"}, + {file = "pydantic_core-2.50.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:0001d6920e3a5d92758cda460d6dc9f918a78ad6d5d092f1c8b5395e6b775356"}, + {file = "pydantic_core-2.50.4-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:ad92d255a165cde5f9882ff69699eaf5495e0a1f32e97566bbbb80f11e46781f"}, + {file = "pydantic_core-2.50.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fb2bb5b557080da398b866408117d98fe9731a12334afd0cdff221b458cdc5dc"}, + {file = "pydantic_core-2.50.4-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:92f8f63df729061bb14558ed740e7a222f6e2aa6c2e6a5bcfb4e706676562049"}, + {file = "pydantic_core-2.50.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:2a60ec2a57ac3ef3767e526e9bf706ec75aa3d79c4ea134d9d4fcf7c62a297a7"}, + {file = "pydantic_core-2.50.4-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:a2f8716344bbbd10443391be0b1f2003b34949e3c4e6883005c2bc498ab6b64b"}, + {file = "pydantic_core-2.50.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:b300a30304c4c6aeab03ed06809819d9eceacdd58441d3c7dffe41edfd006091"}, + {file = "pydantic_core-2.50.4-cp313-cp313-win32.whl", hash = "sha256:ef8a9ddb2e2a4eae4abb72dc0710eca6c2726779b0664bd10c3ce9fcfaed8c4e"}, + {file = "pydantic_core-2.50.4-cp313-cp313-win_amd64.whl", hash = "sha256:4c29b8f2d6417069bb1f257e6b9113f5d64dc2f554cc200ea90b4fe2c5cdb733"}, + {file = "pydantic_core-2.50.4-cp313-cp313-win_arm64.whl", hash = "sha256:a0c5210d038418a115e7cf8706bfa611bd14add2f5787274dba45aadca3155e0"}, + {file = "pydantic_core-2.50.4-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:5c074454dc6d4f6f4ba6561a56bf33a14db7651d882a5a5321ba3ae8868e082d"}, + {file = "pydantic_core-2.50.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:a4bb174bd65f795c39ad6642d9d5bdc43351b306b7d0a654ab0d0abb38be245f"}, + {file = "pydantic_core-2.50.4-cp314-cp314-manylinux1_i686.manylinux_2_5_i686.whl", hash = "sha256:0ec20aca2b067369913716847f7dfe5f4dddf16a46965b7a70bbad5defaaba86"}, + {file = "pydantic_core-2.50.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:70dbc9f83c41f37a4faa62dae5203853847223a891da446f48ef2efcfd5df806"}, + {file = "pydantic_core-2.50.4-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.whl", hash = "sha256:3de6c2a4df2af0ac9ab4dc1488746fe8b1a90e27955d870d9edda3187d20092b"}, + {file = "pydantic_core-2.50.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:3a48a5254d15a0ad050318bfc7a9566d4ec740118187e8f303e47a6840287eb7"}, + {file = "pydantic_core-2.50.4-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:0af56dbf8822ba9f4efcbbfdc15478f8b6fb08f1609860cb50aa2cc8476b3c34"}, + {file = "pydantic_core-2.50.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f1d62fb172db35c6478c9323da34ff37d1f3d37d7d44337a9d94ba8c583e5730"}, + {file = "pydantic_core-2.50.4-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:5c1013647be741647895c102831dcf79c34209662dbb683df9efb864417ed7d5"}, + {file = "pydantic_core-2.50.4-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:aeb2e123cbf978a905e9f55155c1b8316fbbfa7cf64d04521fe174bab302d100"}, + {file = "pydantic_core-2.50.4-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:523466eba8ee10f7480f3c2057563145978011c583130d2cc01fb1e7af808e25"}, + {file = "pydantic_core-2.50.4-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:c9e70012926e97069cdd09221861aff412aa94e4cac2e019055cdb79485b150c"}, + {file = "pydantic_core-2.50.4-cp314-cp314-pyemscripten_2026_0_wasm32.whl", hash = "sha256:e6da138a1ecc1341c8b788a5ee822670b03788e1f5decf7af9d461de6e508b8e"}, + {file = "pydantic_core-2.50.4-cp314-cp314-win32.whl", hash = "sha256:13b6dd62b5279f5b9d72f3bf918a35443ee8bd549241d9dc52d79a2c3b6d7016"}, + {file = "pydantic_core-2.50.4-cp314-cp314-win_amd64.whl", hash = "sha256:b0cdb655fbd1562c2dfc9986f9103a106f7058cd0915afc6e656d4b1d73f3387"}, + {file = "pydantic_core-2.50.4-cp314-cp314-win_arm64.whl", hash = "sha256:df1c174796cd63eb6b139f7daf783affe1f3ed659605850e843b24764c21bfc5"}, + {file = "pydantic_core-2.50.4-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:edbca8789fd10f0de534b660a6b4c71f1fd18039679c918dad392ab044bb37e4"}, + {file = "pydantic_core-2.50.4-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:33b21f69540a12c2053cd1d95766d8bd9667a3897f7c712a642de8aa37eb0865"}, + {file = "pydantic_core-2.50.4-cp314-cp314t-manylinux1_i686.manylinux_2_5_i686.whl", hash = "sha256:ffb616d8d55965839670301dc3bae3abacff560a7e137a89056058a8a9da4d96"}, + {file = "pydantic_core-2.50.4-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:6c5687b59b6ba0f663c4f2f15470f68507d6b45ccd3a19ee6d224f95cbee70d8"}, + {file = "pydantic_core-2.50.4-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.whl", hash = "sha256:c733087ecf7dde06b1d071679bfd5f3ba03266ba77814c1c7253bc48c9adedd9"}, + {file = "pydantic_core-2.50.4-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:94733cb447c37b0ce6f71b39ca1288d5f966a084023a5617b4cc35a852586859"}, + {file = "pydantic_core-2.50.4-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b26f39a5be3cd91a2035818be3d0ffdf5282c3e1f5f53d3b80b7024021acee52"}, + {file = "pydantic_core-2.50.4-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c856e439a9d54d514e81a7131229ba151cdf81df7c408e0f6c89340e5003dfe2"}, + {file = "pydantic_core-2.50.4-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:cbf0777d54672990b10cb8ca9b0523499e182d7e2ea39f86b138519a902aa601"}, + {file = "pydantic_core-2.50.4-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:edc17549ab592e33cfcaf285f047bb75fcd98f608aa9309af1187fd736ce9641"}, + {file = "pydantic_core-2.50.4-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:23a9ba564b2db709ff16eca990992ba95a19069972b34bff87c81d4b473cd755"}, + {file = "pydantic_core-2.50.4-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:41f4f8ae714e4fea1d635880f8a1af715ecf080eed4d13c5b04a0f3210f9c61a"}, + {file = "pydantic_core-2.50.4-cp314-cp314t-win32.whl", hash = "sha256:601fce6cea9ddeaa85329e12e7f351def38d233075f42a3012b9c48071b02941"}, + {file = "pydantic_core-2.50.4-cp314-cp314t-win_amd64.whl", hash = "sha256:22e874666bdbd96d6bf629d32cd8ab376fedf1fd62585b52a42b9fa9fa6c20b6"}, + {file = "pydantic_core-2.50.4-cp314-cp314t-win_arm64.whl", hash = "sha256:71395a43da5584bb70556f380387e15f845c0dcf76373c1afbfa0025737576ac"}, + {file = "pydantic_core-2.50.4-cp315-cp315-macosx_10_12_x86_64.whl", hash = "sha256:7ac2769a7ddd661e07e26c12220adc31b17014c48234b2a5a88993b8d4109e09"}, + {file = "pydantic_core-2.50.4-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:930ad463d3fb7a340d323bcc496ec32dae469ec9974c29ff569f19806b6b03b4"}, + {file = "pydantic_core-2.50.4-cp315-cp315-manylinux1_i686.manylinux_2_5_i686.whl", hash = "sha256:b867f9fd183d76977f810c626d539265183c25b2284762893a31e8d6cacc81c0"}, + {file = "pydantic_core-2.50.4-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:49eb1241a969a5994db6880c18c012b6cbe2340343d8f529721571806583e500"}, + {file = "pydantic_core-2.50.4-cp315-cp315-manylinux2014_armv7l.manylinux_2_17_armv7l.whl", hash = "sha256:477af785d1846e4e96bf56983b92ea7553aaeccdeb8acdaa55c7cee9eda0ae32"}, + {file = "pydantic_core-2.50.4-cp315-cp315-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:29358a8ca74e7d81158d14e2b10c904bd18773293ae3788716c0626fe0342347"}, + {file = "pydantic_core-2.50.4-cp315-cp315-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:300753f71c73302e218124baf995f00058e085cd01869bd9610bcbd0bd4500c1"}, + {file = "pydantic_core-2.50.4-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:26cb012c4b8ca9f847bd0ac15978bd3d0f55b050bfbe6c47355edfc7e945029b"}, + {file = "pydantic_core-2.50.4-cp315-cp315-manylinux_2_31_riscv64.whl", hash = "sha256:9be1cfe715ecaa060ffd5d599ef410b94ef2697a0eed4cee562f788a2aa2175b"}, + {file = "pydantic_core-2.50.4-cp315-cp315-musllinux_1_1_aarch64.whl", hash = "sha256:c81e35862aced259177a537ce1a6264c3a97bae1ced184ca9dc10ea754563688"}, + {file = "pydantic_core-2.50.4-cp315-cp315-musllinux_1_1_armv7l.whl", hash = "sha256:b2f2d13239487cecaae98c9f4d5904ad0737643cdf8873c88ec6a78b12214f20"}, + {file = "pydantic_core-2.50.4-cp315-cp315-musllinux_1_1_x86_64.whl", hash = "sha256:e6b4b08d09054310a4dc389fa61ee22a7a5a292cb23ab8a985136ca8828bf924"}, + {file = "pydantic_core-2.50.4-cp315-cp315-win32.whl", hash = "sha256:6619d49a89a15cd04334f76fec530c155923bfc60da74ff5d815a52629e1aa6c"}, + {file = "pydantic_core-2.50.4-cp315-cp315-win_amd64.whl", hash = "sha256:e5bd109d095aaae989a0463d5ef0fcc43e9ddd5de125e656d3c119a79e466380"}, + {file = "pydantic_core-2.50.4-cp315-cp315-win_arm64.whl", hash = "sha256:6118e5a5550e36582e19bac1a403711a748f9f18251b054c326d3db02aaa7a18"}, + {file = "pydantic_core-2.50.4-cp315-cp315t-macosx_10_12_x86_64.whl", hash = "sha256:d8201c9f9035520cdcc7dcad383b039ec8123969b87e01cf27c3dd883c02313b"}, + {file = "pydantic_core-2.50.4-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:1de7be9a66fc8536770481ab64a05aae5067c725f2b29a09543af00e6a417b97"}, + {file = "pydantic_core-2.50.4-cp315-cp315t-manylinux1_i686.manylinux_2_5_i686.whl", hash = "sha256:789a6453e5ffd18a7ab6b8c3a0dd8403053829197ec258ecb90c604c21ffcc99"}, + {file = "pydantic_core-2.50.4-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:6348ad12fa741bcc9c2f173e99fbf27cbc038826d8c31a4a7d836eca27878ba2"}, + {file = "pydantic_core-2.50.4-cp315-cp315t-manylinux2014_armv7l.manylinux_2_17_armv7l.whl", hash = "sha256:d49127f137f871cde3c5650af33bbbdcee02679dae76e020902fa106f522b8ae"}, + {file = "pydantic_core-2.50.4-cp315-cp315t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:2f5cc5bcb94063fbbdfd285a2b302da34af07491337c10bb35de1d5220fa1583"}, + {file = "pydantic_core-2.50.4-cp315-cp315t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b99bed995ed7c41515c11fe2beb86f8a6cc298e5537cae2f736de2f982f74ef0"}, + {file = "pydantic_core-2.50.4-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:faa4e96385c820ce9d7f7a623486e23d4134ae3c9ba2071e44e0ab5a5a5002c4"}, + {file = "pydantic_core-2.50.4-cp315-cp315t-manylinux_2_31_riscv64.whl", hash = "sha256:d6a166978f22f10cb91413f70519861605219346decf65bc79008f9257c94afe"}, + {file = "pydantic_core-2.50.4-cp315-cp315t-musllinux_1_1_aarch64.whl", hash = "sha256:a70d5effebd81ebd8e15a8aabdc7980832367b2b00c36543bac378977004cc80"}, + {file = "pydantic_core-2.50.4-cp315-cp315t-musllinux_1_1_armv7l.whl", hash = "sha256:f8fd23653a252cefabea11cd041efd7b80bdf403e43a36dea53f9cb0aaa21f0f"}, + {file = "pydantic_core-2.50.4-cp315-cp315t-musllinux_1_1_x86_64.whl", hash = "sha256:7646353a5a7c553c04167aca628e2550b538f492765b03ccf34321a560acc43c"}, + {file = "pydantic_core-2.50.4-cp315-cp315t-win32.whl", hash = "sha256:65376dbe1ab4dbc768ca2b72b7c13993562c035f5925fd3bc7ff9c8c585c515d"}, + {file = "pydantic_core-2.50.4-cp315-cp315t-win_amd64.whl", hash = "sha256:f08ee8248aad2d054e5bc4c73554d4505464698f6d754f16198dbc5764e9821d"}, + {file = "pydantic_core-2.50.4-cp315-cp315t-win_arm64.whl", hash = "sha256:da779ae50b46f3f7d1e1b5f362fdc0ad376a49fd55f6f3122dc2b6149936cdf7"}, + {file = "pydantic_core-2.50.4-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:c04e9d920e2674f54651fd260a15c5d2843526c73d5242ee4311325ddc9573b3"}, + {file = "pydantic_core-2.50.4-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:5bc1811ef2b4d4ba63e8e452f6e332b6374bd1d2cbbfdf66826c8cb1f71dd10d"}, + {file = "pydantic_core-2.50.4-graalpy312-graalpy250_312_native-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0b059a7968b1911be5a2d9a8234827ab0bef9d1e465d4b42da525894143550e8"}, + {file = "pydantic_core-2.50.4-graalpy312-graalpy250_312_native-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bee28aab5a580eec673f7b68dfa8dece3dd37bd207ef8d22fafe23a8e9837296"}, + {file = "pydantic_core-2.50.4-graalpy313-graalpy253_313_native-macosx_11_0_arm64.whl", hash = "sha256:71e03d2ea1a221d020cfc5b6cc8bbbedef23a06704c70fcf4d0afb42965b22d1"}, + {file = "pydantic_core-2.50.4-graalpy313-graalpy253_313_native-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:09450778e3ab58d3f565899fcfbf6c82926e31af29e28e799d1d50941316e0cb"}, + {file = "pydantic_core-2.50.4-graalpy313-graalpy253_313_native-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4eb15be588407148ef5937dc8d9256a71f6b115e6cddadb7aa20b6ee384680dc"}, + {file = "pydantic_core-2.50.4-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:39f489ce31272073e6e146f6781690f9c1ee8c126836e6403361ef91154d89fe"}, + {file = "pydantic_core-2.50.4-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:5b26e5f1793b96cdc60242bf38da86ff24a27a708aa396214cac9b534bf571c7"}, + {file = "pydantic_core-2.50.4-pp311-pypy311_pp73-manylinux1_i686.manylinux_2_5_i686.whl", hash = "sha256:7210398a1607ad607dc73196e575b3148b00a333cbb602ddbe1b60ba54554f43"}, + {file = "pydantic_core-2.50.4-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2f42584e5785385f681163a42506cab0d51295e17599a648396c52a7046c1372"}, + {file = "pydantic_core-2.50.4-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:2039e323acee9abfec1fb5f661776e8965fe5928f3b7f8431900a774cba5c317"}, + {file = "pydantic_core-2.50.4-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:71ade6d2e445839350d589ff99bbddfde16f3f32db28da5c894a09f99c8b2a03"}, + {file = "pydantic_core-2.50.4-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:d7d406709ae924cf0b08b8282ca2f0e1c90526911d93bc040557cbc83b74c55f"}, + {file = "pydantic_core-2.50.4-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:7472c39480ccc11dda69a196d1b7c7a6b48eb6594b77f05d945599d3e47f731c"}, + {file = "pydantic_core-2.50.4-pp311-pypy311_pp80-macosx_10_12_x86_64.whl", hash = "sha256:b67d38e8bb0ade7e6e84575e4bb153fab35b122458077273aeb08fdf12be9d2c"}, + {file = "pydantic_core-2.50.4-pp311-pypy311_pp80-macosx_11_0_arm64.whl", hash = "sha256:4eda7e3fdef382b7d4492745988a5baaf6953923a337f8b9dde5f76fa8afde20"}, + {file = "pydantic_core-2.50.4-pp311-pypy311_pp80-manylinux_2_28_x86_64.whl", hash = "sha256:474f7e598c7902165662a5d5160d3fce31037890a2975a9871ebf7c05862300b"}, + {file = "pydantic_core-2.50.4-pp311-pypy311_pp80-win_amd64.whl", hash = "sha256:3e0b395648c6cb871bceb2906907f255dc876ec425f2d5b024e129985cea8519"}, + {file = "pydantic_core-2.50.4.tar.gz", hash = "sha256:aead3b74b68396bf0feab5d57e050b730ded7df55853c1e048a87e00aaf033c6"}, +] + +[package.dependencies] +typing-extensions = ">=4.16.0" [[package]] name = "pydevd-pycharm" @@ -536,17 +669,17 @@ develop = true [package.dependencies] certifi = "^2026.7.22" -fire = "^0.4.0" -inflect = "^6.0.2" -jsonpointer = "^2.3" +fire = ">=0.4,<0.8" +inflect = ">=6.0.2,<8.0.0" +jsonpointer = ">=2.3,<4.0" jsonref = "^1.1.0" mysqlclient = "^2.1.1" psycopg2 = "^2.9.5" -pydantic = "^1.10.2" -pydevd-pycharm = "^231.6471.3" +pydantic = "^2.14" +pydevd-pycharm = ">=231.6471.3,<264.0.0" pytest = "^9.1.1" requests = "^2.28.1" -sqlmodel = "^0.0.8" +sqlmodel = "^0.0.38" [package.source] type = "directory" @@ -625,110 +758,117 @@ files = [ [[package]] name = "sqlalchemy" -version = "1.4.41" +version = "2.0.57" description = "Database Abstraction Library" optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +python-versions = ">=3.7" groups = ["main"] files = [ - {file = "SQLAlchemy-1.4.41-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:13e397a9371ecd25573a7b90bd037db604331cf403f5318038c46ee44908c44d"}, - {file = "SQLAlchemy-1.4.41-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:2d6495f84c4fd11584f34e62f9feec81bf373787b3942270487074e35cbe5330"}, - {file = "SQLAlchemy-1.4.41-cp27-cp27m-win32.whl", hash = "sha256:e570cfc40a29d6ad46c9aeaddbdcee687880940a3a327f2c668dd0e4ef0a441d"}, - {file = "SQLAlchemy-1.4.41-cp27-cp27m-win_amd64.whl", hash = "sha256:5facb7fd6fa8a7353bbe88b95695e555338fb038ad19ceb29c82d94f62775a05"}, - {file = "SQLAlchemy-1.4.41-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:f37fa70d95658763254941ddd30ecb23fc4ec0c5a788a7c21034fc2305dab7cc"}, - {file = "SQLAlchemy-1.4.41-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:361f6b5e3f659e3c56ea3518cf85fbdae1b9e788ade0219a67eeaaea8a4e4d2a"}, - {file = "SQLAlchemy-1.4.41-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0990932f7cca97fece8017414f57fdd80db506a045869d7ddf2dda1d7cf69ecc"}, - {file = "SQLAlchemy-1.4.41-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cd767cf5d7252b1c88fcfb58426a32d7bd14a7e4942497e15b68ff5d822b41ad"}, - {file = "SQLAlchemy-1.4.41-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5102fb9ee2c258a2218281adcb3e1918b793c51d6c2b4666ce38c35101bb940e"}, - {file = "SQLAlchemy-1.4.41-cp310-cp310-win32.whl", hash = "sha256:2082a2d2fca363a3ce21cfa3d068c5a1ce4bf720cf6497fb3a9fc643a8ee4ddd"}, - {file = "SQLAlchemy-1.4.41-cp310-cp310-win_amd64.whl", hash = "sha256:e4b12e3d88a8fffd0b4ca559f6d4957ed91bd4c0613a4e13846ab8729dc5c251"}, - {file = "SQLAlchemy-1.4.41-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:90484a2b00baedad361402c257895b13faa3f01780f18f4a104a2f5c413e4536"}, - {file = "SQLAlchemy-1.4.41-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b67fc780cfe2b306180e56daaa411dd3186bf979d50a6a7c2a5b5036575cbdbb"}, - {file = "SQLAlchemy-1.4.41-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ad2b727fc41c7f8757098903f85fafb4bf587ca6605f82d9bf5604bd9c7cded"}, - {file = "SQLAlchemy-1.4.41-cp311-cp311-win32.whl", hash = "sha256:59bdc291165b6119fc6cdbc287c36f7f2859e6051dd923bdf47b4c55fd2f8bd0"}, - {file = "SQLAlchemy-1.4.41-cp311-cp311-win_amd64.whl", hash = "sha256:d2e054aed4645f9b755db85bc69fc4ed2c9020c19c8027976f66576b906a74f1"}, - {file = "SQLAlchemy-1.4.41-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:4ba7e122510bbc07258dc42be6ed45997efdf38129bde3e3f12649be70683546"}, - {file = "SQLAlchemy-1.4.41-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c0dcf127bb99458a9d211e6e1f0f3edb96c874dd12f2503d4d8e4f1fd103790b"}, - {file = "SQLAlchemy-1.4.41-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e16c2be5cb19e2c08da7bd3a87fed2a0d4e90065ee553a940c4fc1a0fb1ab72b"}, - {file = "SQLAlchemy-1.4.41-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5ebeeec5c14533221eb30bad716bc1fd32f509196318fb9caa7002c4a364e4c"}, - {file = "SQLAlchemy-1.4.41-cp36-cp36m-win32.whl", hash = "sha256:3e2ef592ac3693c65210f8b53d0edcf9f4405925adcfc031ff495e8d18169682"}, - {file = "SQLAlchemy-1.4.41-cp36-cp36m-win_amd64.whl", hash = "sha256:eb30cf008850c0a26b72bd1b9be6730830165ce049d239cfdccd906f2685f892"}, - {file = "SQLAlchemy-1.4.41-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:c23d64a0b28fc78c96289ffbd0d9d1abd48d267269b27f2d34e430ea73ce4b26"}, - {file = "SQLAlchemy-1.4.41-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8eb8897367a21b578b26f5713833836f886817ee2ffba1177d446fa3f77e67c8"}, - {file = "SQLAlchemy-1.4.41-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:14576238a5f89bcf504c5f0a388d0ca78df61fb42cb2af0efe239dc965d4f5c9"}, - {file = "SQLAlchemy-1.4.41-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:639e1ae8d48b3c86ffe59c0daa9a02e2bfe17ca3d2b41611b30a0073937d4497"}, - {file = "SQLAlchemy-1.4.41-cp37-cp37m-win32.whl", hash = "sha256:0005bd73026cd239fc1e8ccdf54db58b6193be9a02b3f0c5983808f84862c767"}, - {file = "SQLAlchemy-1.4.41-cp37-cp37m-win_amd64.whl", hash = "sha256:5323252be2bd261e0aa3f33cb3a64c45d76829989fa3ce90652838397d84197d"}, - {file = "SQLAlchemy-1.4.41-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:05f0de3a1dc3810a776275763764bb0015a02ae0f698a794646ebc5fb06fad33"}, - {file = "SQLAlchemy-1.4.41-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0002e829142b2af00b4eaa26c51728f3ea68235f232a2e72a9508a3116bd6ed0"}, - {file = "SQLAlchemy-1.4.41-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:22ff16cedab5b16a0db79f1bc99e46a6ddececb60c396562e50aab58ddb2871c"}, - {file = "SQLAlchemy-1.4.41-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ccfd238f766a5bb5ee5545a62dd03f316ac67966a6a658efb63eeff8158a4bbf"}, - {file = "SQLAlchemy-1.4.41-cp38-cp38-win32.whl", hash = "sha256:58bb65b3274b0c8a02cea9f91d6f44d0da79abc993b33bdedbfec98c8440175a"}, - {file = "SQLAlchemy-1.4.41-cp38-cp38-win_amd64.whl", hash = "sha256:ce8feaa52c1640de9541eeaaa8b5fb632d9d66249c947bb0d89dd01f87c7c288"}, - {file = "SQLAlchemy-1.4.41-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:199a73c31ac8ea59937cc0bf3dfc04392e81afe2ec8a74f26f489d268867846c"}, - {file = "SQLAlchemy-1.4.41-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4676d51c9f6f6226ae8f26dc83ec291c088fe7633269757d333978df78d931ab"}, - {file = "SQLAlchemy-1.4.41-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:036d8472356e1d5f096c5e0e1a7e0f9182140ada3602f8fff6b7329e9e7cfbcd"}, - {file = "SQLAlchemy-1.4.41-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2307495d9e0ea00d0c726be97a5b96615035854972cc538f6e7eaed23a35886c"}, - {file = "SQLAlchemy-1.4.41-cp39-cp39-win32.whl", hash = "sha256:9c56e19780cd1344fcd362fd6265a15f48aa8d365996a37fab1495cae8fcd97d"}, - {file = "SQLAlchemy-1.4.41-cp39-cp39-win_amd64.whl", hash = "sha256:f5fa526d027d804b1f85cdda1eb091f70bde6fb7d87892f6dd5a48925bc88898"}, - {file = "SQLAlchemy-1.4.41.tar.gz", hash = "sha256:0292f70d1797e3c54e862e6f30ae474014648bc9c723e14a2fda730adb0a9791"}, + {file = "sqlalchemy-2.0.57-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b1ead374d6ba8d5cb516f48de33ef1d6dca635a69abe7c7a344ae4bb00e7bd40"}, + {file = "sqlalchemy-2.0.57-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8e0bde66dd5384e6cd9842e119197c02280bc3b85697995d2dc2106714ab9742"}, + {file = "sqlalchemy-2.0.57-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5108313e44bc1e08a857d36f7f7f7f5eae23687153c5ad21cb6800ac6cb67510"}, + {file = "sqlalchemy-2.0.57-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b0cf6c9dc732258a18ad3a8bd8af5440553fe98192bf49788021dc1ddcb388d5"}, + {file = "sqlalchemy-2.0.57-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:03d147ff68e787833d60b732238f3440031fbc45d4629edf8bcd073e89a461c3"}, + {file = "sqlalchemy-2.0.57-cp310-cp310-win32.whl", hash = "sha256:fb53faa9f2dedd2560d82712f6ae6533bc4eb3de9c0122d85cd29d752e5cd6ac"}, + {file = "sqlalchemy-2.0.57-cp310-cp310-win_amd64.whl", hash = "sha256:88007e8f5f263ca7c8adfef6425037e134ddb6a67a99e07cbd304a208a8a4938"}, + {file = "sqlalchemy-2.0.57-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:396b8e25a81fac14f5ff9e2b66baffe228a43f1fcd1916f329fce2ea8643eba1"}, + {file = "sqlalchemy-2.0.57-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c688e2ef8121479e0e25972a942dd0c056f3ba59a22175523e35106c2e3fb72d"}, + {file = "sqlalchemy-2.0.57-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:21ad7dc7ed00a05bd3d179cb9bba85dc4181b04342052d9ce81d9305bfdbf9c6"}, + {file = "sqlalchemy-2.0.57-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:206cbb334df6038f049a11b05b8cb4a4dc13577a46464e01de080d1c3e4493c4"}, + {file = "sqlalchemy-2.0.57-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4e2275e8601de7d8a79bf97bb4cec32b116b4715ec8585ee8a629d2cf2512176"}, + {file = "sqlalchemy-2.0.57-cp311-cp311-win32.whl", hash = "sha256:6fae1e630982481e705dcab2442c8135e5287a2290e23fd51fbb031c67a8b7fd"}, + {file = "sqlalchemy-2.0.57-cp311-cp311-win_amd64.whl", hash = "sha256:0e5a8cc2e70f868e579e083818d9bfc7ccc722e588ff22bcfa5cf5da2d571967"}, + {file = "sqlalchemy-2.0.57-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e33889a6f292db9ed2278d5562717c96432651ec558417a7acf17d9549fd6935"}, + {file = "sqlalchemy-2.0.57-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:75135c4c54be953730e41203f38ced685b60dfb16d61a7d4d9a7ab8d87ced6f1"}, + {file = "sqlalchemy-2.0.57-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4ff9f7dda4d136bfd7fab44384ef7e3135c9826da815d6248f713d0035a6274b"}, + {file = "sqlalchemy-2.0.57-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e8d67fa9935021bdccd02d313a1b5ce92531f679b0e70ea7b9f5d651fab7f742"}, + {file = "sqlalchemy-2.0.57-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d55ea24654f8d982c5aabd6e6779eac3ed15f420f629761c4eb627399e9d8cec"}, + {file = "sqlalchemy-2.0.57-cp312-cp312-win32.whl", hash = "sha256:ffaedafb38901bc72efcaf9fdf57bc363be24bd67a8bce8e3afe4ec75bc82833"}, + {file = "sqlalchemy-2.0.57-cp312-cp312-win_amd64.whl", hash = "sha256:4972e01af81b72b78e335735eddf9d4ef8980eca1e8364552715991a454eea97"}, + {file = "sqlalchemy-2.0.57-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:88837e22b43cf5e22070deb68c5cc77916dd2a231d8b9dc91ac8e5afb96a2c4f"}, + {file = "sqlalchemy-2.0.57-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:351b703ee93952f38f2e51e0781e1d4618602850252e68344b9dd28dccc2bd08"}, + {file = "sqlalchemy-2.0.57-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bc60f5a5f1ec190dcb1f5a9b9cf8f64d13f640ee429ee09fc0939ae9acaa6cc6"}, + {file = "sqlalchemy-2.0.57-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:8c2233997b87eed1f6664b047c6ff95a8a667ac46c053b29ed104d4df6210c1e"}, + {file = "sqlalchemy-2.0.57-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9815b64911596a3bf106b8ef4671a98b461e78cb668b4fa16a52caf44a3011d0"}, + {file = "sqlalchemy-2.0.57-cp313-cp313-win32.whl", hash = "sha256:239bd74da3bd9f5882b90361ff81232b6d8b85d53533da5a75bf54b140a964dc"}, + {file = "sqlalchemy-2.0.57-cp313-cp313-win_amd64.whl", hash = "sha256:1fe4190e1673ff5415c691221864a61ca393653fcbc6f7c55a01b69d5a4c60c3"}, + {file = "sqlalchemy-2.0.57-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:cae8591e095d25c2b83bd0bb2a9c973e493378267fd6116af91d8bb8d0c1016c"}, + {file = "sqlalchemy-2.0.57-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:060e698953af83dab5aeecc09d14122857c6dc69e288a8fc93c4487529b056cb"}, + {file = "sqlalchemy-2.0.57-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:23af494d0e22c51185d2d93b9a98666042d17a518df2731787dff7f20ee438e4"}, + {file = "sqlalchemy-2.0.57-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:794c5fa765363ce59f1e081fdab87ed7b30a0d775f7f7d379422bc2f53818bcb"}, + {file = "sqlalchemy-2.0.57-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:294f6cf8465e0c5f1a00d6d3cb1a265737f3321811d12a57f4bfb66886e78662"}, + {file = "sqlalchemy-2.0.57-cp314-cp314-win32.whl", hash = "sha256:adc6b7fc740593137b3b00c3f8c5330e891c11f40df7a3aecf942ad90c4b808f"}, + {file = "sqlalchemy-2.0.57-cp314-cp314-win_amd64.whl", hash = "sha256:88eed162ae664cc09808241dff304bc3ac5f57e2cf7a3cb9e6165df1ec243544"}, + {file = "sqlalchemy-2.0.57-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0ce98756f4079d5c5dfab7adb690a654cdadb1d1208024f239338627cfc44f31"}, + {file = "sqlalchemy-2.0.57-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a24a5c21c4263e7dafc1652d98d46375d7b38c490ccab41cf00d995ec9fa02b3"}, + {file = "sqlalchemy-2.0.57-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e15997df22f3581ff38744afc39d024784eb90bd6c2c41c4387b116663021e87"}, + {file = "sqlalchemy-2.0.57-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:f90a5194a25c9b611d871df770802b1b6e4915bef16cfdd398ce13bd0379a266"}, + {file = "sqlalchemy-2.0.57-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:71e53d9c6ea15c4dc435d936a0f72eeba218dc378c28d863cc6619b9a3ab8042"}, + {file = "sqlalchemy-2.0.57-cp314-cp314t-win32.whl", hash = "sha256:0e45c61722b17b41f6890d7c17a33b11270e2c334f4e7593774b0a5092fa08a8"}, + {file = "sqlalchemy-2.0.57-cp314-cp314t-win_amd64.whl", hash = "sha256:8ecb63bdacc0f0b1e7cd37959b174c775a3d0f68bc6ad91702fe375c0c24d013"}, + {file = "sqlalchemy-2.0.57-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b4533e2d4782ae2383b4d61fcdbe5b3747b25056c95de2d128ea23245f205786"}, + {file = "sqlalchemy-2.0.57-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97739bda3f8733c99f434615a9ec3b73e0511b6b3d91465f816cc484000f8027"}, + {file = "sqlalchemy-2.0.57-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a67fad945dbae5137bae74bae4d98ed7f9bb989ae7ce247a83728854a45f5554"}, + {file = "sqlalchemy-2.0.57-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:f512eff7a6dde0d569ec41212422ed2749ea6ca88d1f5275d73dbc16e696ed66"}, + {file = "sqlalchemy-2.0.57-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:660de7c826c5ce3b745a7179d4e0ad391dcda61e64e8697021e18be5ee05c436"}, + {file = "sqlalchemy-2.0.57-cp38-cp38-win32.whl", hash = "sha256:a1c23bbaa9fe9ac43971d2fdc0531cfe7affac9735d7926fbf8c555f255f78d8"}, + {file = "sqlalchemy-2.0.57-cp38-cp38-win_amd64.whl", hash = "sha256:1b260c745aa801557a0aeb4b2e729a4f0c5e171140db6c2be1e2b9316d15e821"}, + {file = "sqlalchemy-2.0.57-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:38eaae2db34b1f865cab99a40eca2e901a8979128b0ba5bee804b189cb71d03a"}, + {file = "sqlalchemy-2.0.57-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:444b6f14e65ff76e411d59dd16e2aef646d2c957afc24a49510149a28fc9dc33"}, + {file = "sqlalchemy-2.0.57-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a8bac610e7dcc1a5969b82f0788bab5c5653dd08c5229247a14bf0de5cd20b4f"}, + {file = "sqlalchemy-2.0.57-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0a00cd2d0378f8951e1c147b3bd5a45538e9bff6ebe9bd08295808755dbd9a2b"}, + {file = "sqlalchemy-2.0.57-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:bbfac8d64ebdf30b1912d8f1f9f96fe99bef10669f2533ecac1a0f585e956ff4"}, + {file = "sqlalchemy-2.0.57-cp39-cp39-win32.whl", hash = "sha256:35713e7ab2f7e85bfee59bda25bc483597600a5756e6367918ebb5e63a39ee0b"}, + {file = "sqlalchemy-2.0.57-cp39-cp39-win_amd64.whl", hash = "sha256:7215ab39053d065b589ab7f78c84226fae57b76d28e832be2e8435c416c1c2d0"}, + {file = "sqlalchemy-2.0.57-py3-none-any.whl", hash = "sha256:e31639a78045134a39e14f287b647fd9537cdd71978ea9c11bf7d905d70e473d"}, + {file = "sqlalchemy-2.0.57.tar.gz", hash = "sha256:892e0edd06b8ca2a8a3f9107611047914fd82ccd03735efd706d12aa4da1b773"}, ] [package.dependencies] -greenlet = {version = "!=0.4.17", markers = "python_version >= \"3\" and (platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\")"} +greenlet = {version = ">=1", markers = "platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\""} +typing-extensions = ">=4.6.0" [package.extras] -aiomysql = ["aiomysql ; python_version >= \"3\"", "greenlet (!=0.4.17) ; python_version >= \"3\""] -aiosqlite = ["aiosqlite ; python_version >= \"3\"", "greenlet (!=0.4.17) ; python_version >= \"3\"", "typing-extensions (!=3.10.0.1)"] -asyncio = ["greenlet (!=0.4.17) ; python_version >= \"3\""] -asyncmy = ["asyncmy (>=0.2.3,!=0.2.4) ; python_version >= \"3\"", "greenlet (!=0.4.17) ; python_version >= \"3\""] -mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2) ; python_version >= \"3\""] +aiomysql = ["aiomysql (>=0.2.0)", "greenlet (>=1)"] +aioodbc = ["aioodbc", "greenlet (>=1)"] +aiosqlite = ["aiosqlite", "greenlet (>=1)", "typing_extensions (!=3.10.0.1)"] +asyncio = ["greenlet (>=1)"] +asyncmy = ["asyncmy (>=0.2.12)", "greenlet (>=1)"] +mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2,!=1.1.5,!=1.1.10)"] mssql = ["pyodbc"] mssql-pymssql = ["pymssql"] mssql-pyodbc = ["pyodbc"] -mypy = ["mypy (>=0.910) ; python_version >= \"3\"", "sqlalchemy2-stubs"] -mysql = ["mysqlclient (>=1.4.0) ; python_version >= \"3\"", "mysqlclient (>=1.4.0,<2) ; python_version < \"3\""] +mypy = ["mypy (>=0.910)"] +mysql = ["mysqlclient (>=1.4.0)"] mysql-connector = ["mysql-connector-python"] -oracle = ["cx-oracle (>=7) ; python_version >= \"3\"", "cx-oracle (>=7,<8) ; python_version < \"3\""] +oracle = ["cx_oracle (>=8)"] +oracle-oracledb = ["oracledb (>=1.0.1)"] postgresql = ["psycopg2 (>=2.7)"] -postgresql-asyncpg = ["asyncpg ; python_version >= \"3\"", "greenlet (!=0.4.17) ; python_version >= \"3\""] -postgresql-pg8000 = ["pg8000 (>=1.16.6,!=1.29.0)"] +postgresql-asyncpg = ["asyncpg", "greenlet (>=1)"] +postgresql-pg8000 = ["pg8000 (>=1.29.1)"] +postgresql-psycopg = ["psycopg (>=3.0.7)"] postgresql-psycopg2binary = ["psycopg2-binary"] postgresql-psycopg2cffi = ["psycopg2cffi"] -pymysql = ["pymysql (<1) ; python_version < \"3\"", "pymysql ; python_version >= \"3\""] -sqlcipher = ["sqlcipher3-binary ; python_version >= \"3\""] - -[[package]] -name = "sqlalchemy2-stubs" -version = "0.0.2a38" -description = "Typing Stubs for SQLAlchemy 1.4" -optional = false -python-versions = ">=3.6" -groups = ["main"] -files = [ - {file = "sqlalchemy2-stubs-0.0.2a38.tar.gz", hash = "sha256:861d722abeb12f13eacd775a9f09379b11a5a9076f469ccd4099961b95800f9e"}, - {file = "sqlalchemy2_stubs-0.0.2a38-py3-none-any.whl", hash = "sha256:b62aa46943807287550e2033dafe07564b33b6a815fbaa3c144e396f9cc53bcb"}, -] - -[package.dependencies] -typing-extensions = ">=3.7.4" +postgresql-psycopgbinary = ["psycopg[binary] (>=3.0.7)"] +pymysql = ["pymysql"] +sqlcipher = ["sqlcipher3_binary"] [[package]] name = "sqlmodel" -version = "0.0.8" +version = "0.0.38" description = "SQLModel, SQL databases in Python, designed for simplicity, compatibility, and robustness." optional = false -python-versions = ">=3.6.1,<4.0.0" +python-versions = ">=3.10" groups = ["main"] files = [ - {file = "sqlmodel-0.0.8-py3-none-any.whl", hash = "sha256:0fd805719e0c5d4f22be32eb3ffc856eca3f7f20e8c7aa3e117ad91684b518ee"}, - {file = "sqlmodel-0.0.8.tar.gz", hash = "sha256:3371b4d1ad59d2ffd0c530582c2140b6c06b090b32af9b9c6412986d7b117036"}, + {file = "sqlmodel-0.0.38-py3-none-any.whl", hash = "sha256:84e3fa990a77395461ded72a6c73173438ce8449d5c1c4d97fbff1b1df692649"}, + {file = "sqlmodel-0.0.38.tar.gz", hash = "sha256:d583ec237b14103809f74e8630032bc40ab68cd6b754a610f0813c56911a547b"}, ] [package.dependencies] -pydantic = ">=1.8.2,<2.0.0" -SQLAlchemy = ">=1.4.17,<=1.4.41" -sqlalchemy2-stubs = "*" +pydantic = ">=2.11.0" +SQLAlchemy = ">=2.0.14,<2.1.0" +typing-extensions = ">=4.5.0" [[package]] name = "termcolor" @@ -757,6 +897,21 @@ files = [ {file = "typing_extensions-4.16.0.tar.gz", hash = "sha256:dc983d19a509c94dba722ee6abd33940f7c05a89e243c47e907eb4db6f1a43e5"}, ] +[[package]] +name = "typing-inspection" +version = "0.4.5" +description = "Runtime typing introspection tools" +optional = false +python-versions = ">=3.10" +groups = ["main"] +files = [ + {file = "typing_inspection-0.4.5-py3-none-any.whl", hash = "sha256:bc210535442b39e1bf2805e0c7a17dfd6a4ace760c84c7f7d16245d23a6b1c39"}, + {file = "typing_inspection-0.4.5.tar.gz", hash = "sha256:7f16c411e7930dc79596d42ab44672a3fe5f60eb34b781a1647e7872363120c7"}, +] + +[package.dependencies] +typing-extensions = ">=4.15.0" + [[package]] name = "urllib3" version = "2.8.0"