This is an automated email from the ASF dual-hosted git repository.

sbp pushed a commit to branch sbp
in repository https://gitbox.apache.org/repos/asf/tooling-trusted-releases.git


The following commit(s) were added to refs/heads/sbp by this push:
     new d2664b5  Update dependencies and fix lint errors
d2664b5 is described below

commit d2664b596126b443e17a5bfe9e537ffbfd0420a4
Author: Sean B. Palmer <[email protected]>
AuthorDate: Wed Feb 4 17:09:49 2026 +0000

    Update dependencies and fix lint errors
---
 .pre-commit-config.yaml     |  4 +--
 atr/get/finish.py           |  4 +--
 atr/get/ref.py              | 13 ++++---
 atr/get/vote.py             |  2 +-
 atr/models/sql.py           | 16 ++++-----
 atr/storage/writers/sbom.py | 11 ++++--
 atr/tasks/sbom.py           | 70 ++++++++++++++++++++----------------
 uv.lock                     | 87 ++++++++++++++++++++++-----------------------
 8 files changed, 113 insertions(+), 94 deletions(-)

diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index f247f81..343b599 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -84,7 +84,7 @@ repos:
 #        - --profile=jinja
 #        - --reformat
 - repo: https://github.com/thibaudcolas/pre-commit-stylelint
-  rev: v17.0.0
+  rev: v17.1.0
   hooks:
     - id: stylelint
       additional_dependencies: ['[email protected]', 
'[email protected]']
@@ -103,7 +103,7 @@ repos:
       # TODO: remove when GitHub Actions has pip 26.0+
       args: ["--ignore-vuln", "CVE-2026-1703"]
 - repo: https://github.com/oxc-project/mirrors-oxlint
-  rev: v1.42.0
+  rev: v1.43.0
   hooks:
     - id: oxlint
       name: lint JS files with Oxlint
diff --git a/atr/get/finish.py b/atr/get/finish.py
index 723a8e7..a209e18 100644
--- a/atr/get/finish.py
+++ b/atr/get/finish.py
@@ -112,7 +112,7 @@ async def _analyse_rc_tags(latest_revision_dir: 
pathlib.Path) -> RCTagAnalysisRe
         total_paths=0,
     )
 
-    if not latest_revision_dir.exists():
+    if not await aiofiles.os.path.exists(latest_revision_dir):
         return r
 
     async for p_rel in util.paths_recursive_all(latest_revision_dir):
@@ -134,7 +134,7 @@ async def _deletable_choices(
     latest_revision_dir: pathlib.Path, target_dirs: set[pathlib.Path]
 ) -> list[tuple[str, str]]:
     empty_deletable_dirs: list[pathlib.Path] = []
-    if latest_revision_dir.exists():
+    if await aiofiles.os.path.exists(latest_revision_dir):
         for d_rel in target_dirs:
             if d_rel == pathlib.Path("."):
                 # Disallow deletion of the root directory
diff --git a/atr/get/ref.py b/atr/get/ref.py
index 527c6b7..fab3e89 100644
--- a/atr/get/ref.py
+++ b/atr/get/ref.py
@@ -18,6 +18,8 @@
 import ast
 import pathlib
 
+import aiofiles
+import aiofiles.os
 import quart
 
 import atr.blueprints.get as get
@@ -38,7 +40,7 @@ async def resolve(session: web.Committer | None, ref_path: 
str) -> web.WerkzeugR
         file_path_str, symbol = ref_path.rsplit(":", 1)
         resolved_file, validated_path_str = 
_validate_and_resolve_path(file_path_str, project_root)
 
-        if (not resolved_file.exists()) or (not resolved_file.is_file()):
+        if (not await aiofiles.os.path.exists(resolved_file)) or (not await 
aiofiles.os.path.isfile(resolved_file)):
             quart.abort(404)
 
         line_number = await _resolve_symbol_to_line(resolved_file, symbol)
@@ -53,15 +55,15 @@ async def resolve(session: web.Committer | None, ref_path: 
str) -> web.WerkzeugR
     path_str = ref_path.rstrip("/")
     resolved_path, validated_path_str = _validate_and_resolve_path(path_str, 
project_root)
 
-    if not resolved_path.exists():
+    if not await aiofiles.os.path.exists(resolved_path):
         quart.abort(404)
 
     if is_directory:
-        if not resolved_path.is_dir():
+        if not await aiofiles.os.path.isdir(resolved_path):
             quart.abort(404)
         github_url = 
f"https://github.com/apache/tooling-trusted-releases/tree/main/{validated_path_str}";
     else:
-        if not resolved_path.is_file():
+        if not await aiofiles.os.path.isfile(resolved_path):
             quart.abort(404)
         github_url = 
f"https://github.com/apache/tooling-trusted-releases/blob/main/{validated_path_str}";
 
@@ -70,7 +72,8 @@ async def resolve(session: web.Committer | None, ref_path: 
str) -> web.WerkzeugR
 
 async def _resolve_symbol_to_line(file_path: pathlib.Path, symbol: str) -> int 
| None:
     try:
-        source = file_path.read_text(encoding="utf-8")
+        async with aiofiles.open(file_path, encoding="utf-8") as f:
+            source = await f.read()
         tree = ast.parse(source, filename=str(file_path))
     except Exception:
         return None
diff --git a/atr/get/vote.py b/atr/get/vote.py
index 925724e..4fa1df2 100644
--- a/atr/get/vote.py
+++ b/atr/get/vote.py
@@ -49,7 +49,7 @@ if TYPE_CHECKING:
     import atr.get.checks as checks
 
 
-class UserCategory(str, enum.Enum):
+class UserCategory(enum.StrEnum):
     COMMITTER = "Committer"
     COMMITTER_RM = "Committer (Release Manager)"
     PMC_MEMBER = "PMC Member"
diff --git a/atr/models/sql.py b/atr/models/sql.py
index affd557..f2b4272 100644
--- a/atr/models/sql.py
+++ b/atr/models/sql.py
@@ -64,14 +64,14 @@ class DistributionPlatformValue:
 # Enumerations
 
 
-class CheckResultStatus(str, enum.Enum):
+class CheckResultStatus(enum.StrEnum):
     EXCEPTION = "exception"
     FAILURE = "failure"
     SUCCESS = "success"
     WARNING = "warning"
 
 
-class CheckResultStatusIgnore(str, enum.Enum):
+class CheckResultStatusIgnore(enum.StrEnum):
     EXCEPTION = "exception"
     FAILURE = "failure"
     WARNING = "warning"
@@ -150,20 +150,20 @@ class DistributionPlatform(enum.Enum):
     )
 
 
-class LicenseCheckMode(str, enum.Enum):
+class LicenseCheckMode(enum.StrEnum):
     BOTH = "Both"
     LIGHTWEIGHT = "Lightweight"
     RAT = "RAT"
 
 
-class ProjectStatus(str, enum.Enum):
+class ProjectStatus(enum.StrEnum):
     ACTIVE = "active"
     DORMANT = "dormant"
     RETIRED = "retired"
     STANDING = "standing"
 
 
-class ReleasePhase(str, enum.Enum):
+class ReleasePhase(enum.StrEnum):
     # TODO: Rename these to the UI names?
     # COMPOSE, VOTE, FINISH, "DISTRIBUTE"
     # Compose a draft
@@ -180,7 +180,7 @@ class ReleasePhase(str, enum.Enum):
     RELEASE = "release"
 
 
-class TaskStatus(str, enum.Enum):
+class TaskStatus(enum.StrEnum):
     """Status of a task in the task queue."""
 
     QUEUED = "queued"
@@ -189,7 +189,7 @@ class TaskStatus(str, enum.Enum):
     FAILED = "failed"
 
 
-class TaskType(str, enum.Enum):
+class TaskType(enum.StrEnum):
     COMPARE_SOURCE_TREES = "compare_source_trees"
     DISTRIBUTION_STATUS = "distribution_status"
     DISTRIBUTION_WORKFLOW = "distribution_workflow"
@@ -216,7 +216,7 @@ class TaskType(str, enum.Enum):
     ZIPFORMAT_STRUCTURE = "zipformat_structure"
 
 
-class UserRole(str, enum.Enum):
+class UserRole(enum.StrEnum):
     COMMITTEE_MEMBER = "committee_member"
     RELEASE_MANAGER = "release_manager"
     COMMITTER = "committer"
diff --git a/atr/storage/writers/sbom.py b/atr/storage/writers/sbom.py
index 4e89d61..b68a6cc 100644
--- a/atr/storage/writers/sbom.py
+++ b/atr/storage/writers/sbom.py
@@ -18,6 +18,7 @@
 # Removing this will cause circular imports
 from __future__ import annotations
 
+import asyncio
 import datetime
 from typing import TYPE_CHECKING
 
@@ -113,11 +114,13 @@ class CommitteeParticipant(FoundationCommitter):
     ) -> sql.Task:
         # Create and queue the task, using paths within the new revision
         # We still need release.name for the task metadata
+        artifact_path = await asyncio.to_thread(_resolved_path_str, 
path_in_new_revision)
+        output_path = await asyncio.to_thread(_resolved_path_str, 
sbom_path_in_new_revision)
         sbom_task = sql.Task(
             task_type=sql.TaskType.SBOM_GENERATE_CYCLONEDX,
             task_args=sbom.GenerateCycloneDX(
-                artifact_path=str(path_in_new_revision.resolve()),
-                output_path=str(sbom_path_in_new_revision.resolve()),
+                artifact_path=artifact_path,
+                output_path=output_path,
             ).model_dump(),
             asf_uid=util.unwrap(self.__asf_uid),
             added=datetime.datetime.now(datetime.UTC),
@@ -178,3 +181,7 @@ class CommitteeMember(CommitteeParticipant):
             raise storage.AccessError("Not authorized")
         self.__asf_uid = asf_uid
         self.__committee_name = committee_name
+
+
+def _resolved_path_str(path: pathlib.Path) -> str:
+    return str(path.resolve())
diff --git a/atr/tasks/sbom.py b/atr/tasks/sbom.py
index a9544a5..0ed004a 100644
--- a/atr/tasks/sbom.py
+++ b/atr/tasks/sbom.py
@@ -18,8 +18,7 @@
 import asyncio
 import json
 import os
-import pathlib
-from typing import Any, Final
+from typing import TYPE_CHECKING, Any, Final
 
 import aiofiles
 import aiofiles.os
@@ -34,6 +33,9 @@ import atr.storage as storage
 import atr.tasks.checks as checks
 import atr.util as util
 
+if TYPE_CHECKING:
+    import pathlib
+
 _CONFIG: Final = config.get()
 
 
@@ -81,15 +83,17 @@ class ScoreArgs(FileArgs):
 @checks.with_model(FileArgs)
 async def augment(args: FileArgs) -> results.Results | None:
     base_dir = util.get_unfinished_dir() / args.project_name / 
args.version_name / args.revision_number
-    if not os.path.isdir(base_dir):
+    if not await aiofiles.os.path.isdir(base_dir):
         raise SBOMScoringError("Revision directory does not exist", 
{"base_dir": str(base_dir)})
-    full_path = os.path.join(base_dir, args.file_path)
-    if not (full_path.endswith(".cdx.json") and os.path.isfile(full_path)):
+    full_path = base_dir / args.file_path
+    full_path_str = str(full_path)
+    if not (full_path_str.endswith(".cdx.json") and await 
aiofiles.os.path.isfile(full_path)):
         raise SBOMScoringError("SBOM file does not exist", {"file_path": 
args.file_path})
     # Read from the old revision
-    bundle = sbom.utilities.path_to_bundle(pathlib.Path(full_path))
+    bundle = sbom.utilities.path_to_bundle(full_path)
     patch_ops = await sbom.utilities.bundle_to_ntia_patch(bundle)
-    new_full_path: str | None = None
+    new_full_path: pathlib.Path | None = None
+    new_full_path_str: str | None = None
     new_version = None
     if patch_ops:
         new_version, merged = sbom.utilities.apply_patch("augment", 
args.revision_number, bundle, patch_ops)
@@ -99,9 +103,10 @@ async def augment(args: FileArgs) -> results.Results | None:
             async with wacp.revision.create_and_manage(
                 args.project_name, args.version_name, args.asf_uid or 
"unknown", description=description
             ) as creating:
-                new_full_path = os.path.join(str(creating.interim_path), 
args.file_path)
+                new_full_path = creating.interim_path / args.file_path
+                new_full_path_str = str(new_full_path)
                 # Write to the new revision
-                log.info(f"Writing augmented SBOM to {new_full_path}")
+                log.info(f"Writing augmented SBOM to {new_full_path_str}")
                 await aiofiles.os.remove(new_full_path)
                 async with aiofiles.open(new_full_path, "w", encoding="utf-8") 
as f:
                     await f.write(merged.dumps())
@@ -111,7 +116,7 @@ async def augment(args: FileArgs) -> results.Results | None:
 
     return results.SBOMAugment(
         kind="sbom_augment",
-        path=(new_full_path if (new_full_path is not None) else full_path),
+        path=(new_full_path_str if (new_full_path_str is not None) else 
full_path_str),
         bom_version=new_version,
     )
 
@@ -137,12 +142,13 @@ async def generate_cyclonedx(args: GenerateCycloneDX) -> 
results.Results | None:
 @checks.with_model(FileArgs)
 async def osv_scan(args: FileArgs) -> results.Results | None:
     base_dir = util.get_unfinished_dir() / args.project_name / 
args.version_name / args.revision_number
-    if not os.path.isdir(base_dir):
+    if not await aiofiles.os.path.isdir(base_dir):
         raise SBOMScanningError("Revision directory does not exist", 
{"base_dir": str(base_dir)})
-    full_path = os.path.join(base_dir, args.file_path)
-    if not (full_path.endswith(".cdx.json") and os.path.isfile(full_path)):
+    full_path = base_dir / args.file_path
+    full_path_str = str(full_path)
+    if not (full_path_str.endswith(".cdx.json") and await 
aiofiles.os.path.isfile(full_path)):
         raise SBOMScanningError("SBOM file does not exist", {"file_path": 
args.file_path})
-    bundle = sbom.utilities.path_to_bundle(pathlib.Path(full_path))
+    bundle = sbom.utilities.path_to_bundle(full_path)
     vulnerabilities, ignored = await sbom.osv.scan_bundle(bundle)
     patch_ops = await sbom.utilities.bundle_to_vuln_patch(bundle, 
vulnerabilities)
     components = []
@@ -156,7 +162,8 @@ async def osv_scan(args: FileArgs) -> results.Results | 
None:
             )
         )
 
-    new_full_path: str | None = None
+    new_full_path: pathlib.Path | None = None
+    new_full_path_str: str | None = None
     new_version, merged = sbom.utilities.apply_patch("osv-scan", 
args.revision_number, bundle, patch_ops)
     description = "SBOM vulnerability scan through web interface"
     async with storage.write(args.asf_uid) as write:
@@ -164,9 +171,10 @@ async def osv_scan(args: FileArgs) -> results.Results | 
None:
         async with wacp.revision.create_and_manage(
             args.project_name, args.version_name, args.asf_uid or "unknown", 
description=description
         ) as creating:
-            new_full_path = os.path.join(str(creating.interim_path), 
args.file_path)
+            new_full_path = creating.interim_path / args.file_path
+            new_full_path_str = str(new_full_path)
             # Write to the new revision
-            log.info(f"Writing updated SBOM to {new_full_path}")
+            log.info(f"Writing updated SBOM to {new_full_path_str}")
             await aiofiles.os.remove(new_full_path)
             async with aiofiles.open(new_full_path, "w", encoding="utf-8") as 
f:
                 await f.write(merged.dumps())
@@ -180,8 +188,8 @@ async def osv_scan(args: FileArgs) -> results.Results | 
None:
         version_name=args.version_name,
         revision_number=args.revision_number,
         bom_version=new_version,
-        file_path=full_path,
-        new_file_path=new_full_path or full_path,
+        file_path=full_path_str,
+        new_file_path=new_full_path_str or full_path_str,
         components=components,
         ignored=ignored,
     )
@@ -190,17 +198,18 @@ async def osv_scan(args: FileArgs) -> results.Results | 
None:
 @checks.with_model(FileArgs)
 async def score_qs(args: FileArgs) -> results.Results | None:
     base_dir = util.get_unfinished_dir() / args.project_name / 
args.version_name / args.revision_number
-    if not os.path.isdir(base_dir):
+    if not await aiofiles.os.path.isdir(base_dir):
         raise SBOMScoringError("Revision directory does not exist", 
{"base_dir": str(base_dir)})
-    full_path = os.path.join(base_dir, args.file_path)
-    if not (full_path.endswith(".cdx.json") and os.path.isfile(full_path)):
+    full_path = base_dir / args.file_path
+    full_path_str = str(full_path)
+    if not (full_path_str.endswith(".cdx.json") and await 
aiofiles.os.path.isfile(full_path)):
         raise SBOMScoringError("SBOM file does not exist", {"file_path": 
args.file_path})
     proc = await asyncio.create_subprocess_exec(
         "sbomqs",
         "score",
-        os.path.basename(full_path),
+        full_path.name,
         "--json",
-        cwd=os.path.dirname(full_path),
+        cwd=str(full_path.parent),
         stdout=asyncio.subprocess.PIPE,
         stderr=asyncio.subprocess.PIPE,
     )
@@ -228,12 +237,13 @@ async def score_tool(args: ScoreArgs) -> results.Results 
| None:
     previous_base_dir = None
     if args.previous_release_version is not None:
         previous_base_dir = util.get_finished_dir() / args.project_name / 
args.previous_release_version
-    if not os.path.isdir(base_dir):
+    if not await aiofiles.os.path.isdir(base_dir):
         raise SBOMScoringError("Revision directory does not exist", 
{"base_dir": str(base_dir)})
-    full_path = os.path.join(base_dir, args.file_path)
-    if not (full_path.endswith(".cdx.json") and os.path.isfile(full_path)):
+    full_path = base_dir / args.file_path
+    full_path_str = str(full_path)
+    if not (full_path_str.endswith(".cdx.json") and await 
aiofiles.os.path.isfile(full_path)):
         raise SBOMScoringError("SBOM file does not exist", {"file_path": 
args.file_path})
-    bundle = sbom.utilities.path_to_bundle(pathlib.Path(full_path))
+    bundle = sbom.utilities.path_to_bundle(full_path)
     version, properties = sbom.utilities.get_props_from_bundle(bundle)
     warnings, errors = sbom.conformance.ntia_2021_issues(bundle.bom)
     # TODO: Could update the ATR version with a constant showing last change 
to the augment/scan
@@ -247,9 +257,9 @@ async def score_tool(args: ScoreArgs) -> results.Results | 
None:
     prev_licenses = None
     prev_vulnerabilities = None
     if previous_base_dir is not None:
-        previous_full_path = os.path.join(previous_base_dir, args.file_path)
+        previous_full_path = previous_base_dir / args.file_path
         try:
-            previous_bundle = 
sbom.utilities.path_to_bundle(pathlib.Path(previous_full_path))
+            previous_bundle = sbom.utilities.path_to_bundle(previous_full_path)
         except FileNotFoundError:
             # Previous release didn't include this file
             previous_bundle = None
diff --git a/uv.lock b/uv.lock
index 645b8fb..7cfd9dc 100644
--- a/uv.lock
+++ b/uv.lock
@@ -3,7 +3,7 @@ revision = 3
 requires-python = "==3.13.*"
 
 [options]
-exclude-newer = "2026-01-28T19:01:47Z"
+exclude-newer = "2026-02-04T16:49:21Z"
 
 [[package]]
 name = "aiofiles"
@@ -110,16 +110,16 @@ wheels = [
 
 [[package]]
 name = "alembic"
-version = "1.18.1"
+version = "1.18.3"
 source = { registry = "https://pypi.org/simple"; }
 dependencies = [
     { name = "mako" },
     { name = "sqlalchemy" },
     { name = "typing-extensions" },
 ]
-sdist = { url = 
"https://files.pythonhosted.org/packages/49/cc/aca263693b2ece99fa99a09b6d092acb89973eb2bb575faef1777e04f8b4/alembic-1.18.1.tar.gz";,
 hash = 
"sha256:83ac6b81359596816fb3b893099841a0862f2117b2963258e965d70dc62fb866", size 
= 2044319, upload-time = "2026-01-14T18:53:14.907Z" }
+sdist = { url = 
"https://files.pythonhosted.org/packages/79/41/ab8f624929847b49f84955c594b165855efd829b0c271e1a8cac694138e5/alembic-1.18.3.tar.gz";,
 hash = 
"sha256:1212aa3778626f2b0f0aa6dd4e99a5f99b94bd25a0c1ac0bba3be65e081e50b0", size 
= 2052564, upload-time = "2026-01-29T20:24:15.124Z" }
 wheels = [
-    { url = 
"https://files.pythonhosted.org/packages/83/36/cd9cb6101e81e39076b2fbe303bfa3c85ca34e55142b0324fcbf22c5c6e2/alembic-1.18.1-py3-none-any.whl";,
 hash = 
"sha256:f1c3b0920b87134e851c25f1f7f236d8a332c34b75416802d06971df5d1b7810", size 
= 260973, upload-time = "2026-01-14T18:53:17.533Z" },
+    { url = 
"https://files.pythonhosted.org/packages/45/8e/d79281f323e7469b060f15bd229e48d7cdd219559e67e71c013720a88340/alembic-1.18.3-py3-none-any.whl";,
 hash = 
"sha256:12a0359bfc068a4ecbb9b3b02cf77856033abfdb59e4a5aca08b7eacd7b74ddd", size 
= 262282, upload-time = "2026-01-29T20:24:17.488Z" },
 ]
 
 [[package]]
@@ -1094,21 +1094,21 @@ wheels = [
 
 [[package]]
 name = "playwright"
-version = "1.57.0"
+version = "1.58.0"
 source = { registry = "https://pypi.org/simple"; }
 dependencies = [
     { name = "greenlet" },
     { name = "pyee" },
 ]
 wheels = [
-    { url = 
"https://files.pythonhosted.org/packages/ed/b6/e17543cea8290ae4dced10be21d5a43c360096aa2cce0aa7039e60c50df3/playwright-1.57.0-py3-none-macosx_10_13_x86_64.whl";,
 hash = 
"sha256:9351c1ac3dfd9b3820fe7fc4340d96c0d3736bb68097b9b7a69bd45d25e9370c", size 
= 41985039, upload-time = "2025-12-09T08:06:18.408Z" },
-    { url = 
"https://files.pythonhosted.org/packages/8b/04/ef95b67e1ff59c080b2effd1a9a96984d6953f667c91dfe9d77c838fc956/playwright-1.57.0-py3-none-macosx_11_0_arm64.whl";,
 hash = 
"sha256:a4a9d65027bce48eeba842408bcc1421502dfd7e41e28d207e94260fa93ca67e", size 
= 40775575, upload-time = "2025-12-09T08:06:22.105Z" },
-    { url = 
"https://files.pythonhosted.org/packages/60/bd/5563850322a663956c927eefcf1457d12917e8f118c214410e815f2147d1/playwright-1.57.0-py3-none-macosx_11_0_universal2.whl";,
 hash = 
"sha256:99104771abc4eafee48f47dac2369e0015516dc1ce8c409807d2dd440828b9a4", size 
= 41985042, upload-time = "2025-12-09T08:06:25.357Z" },
-    { url = 
"https://files.pythonhosted.org/packages/56/61/3a803cb5ae0321715bfd5247ea871d25b32c8f372aeb70550a90c5f586df/playwright-1.57.0-py3-none-manylinux1_x86_64.whl";,
 hash = 
"sha256:284ed5a706b7c389a06caa431b2f0ba9ac4130113c3a779767dda758c2497bb1", size 
= 45975252, upload-time = "2025-12-09T08:06:29.186Z" },
-    { url = 
"https://files.pythonhosted.org/packages/83/d7/b72eb59dfbea0013a7f9731878df8c670f5f35318cedb010c8a30292c118/playwright-1.57.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl";,
 hash = 
"sha256:38a1bae6c0a07839cdeaddbc0756b3b2b85e476c07945f64ece08f1f956a86f1", size 
= 45706917, upload-time = "2025-12-09T08:06:32.549Z" },
-    { url = 
"https://files.pythonhosted.org/packages/e4/09/3fc9ebd7c95ee54ba6a68d5c0bc23e449f7235f4603fc60534a364934c16/playwright-1.57.0-py3-none-win32.whl";,
 hash = 
"sha256:1dd93b265688da46e91ecb0606d36f777f8eadcf7fbef12f6426b20bf0c9137c", size 
= 36553860, upload-time = "2025-12-09T08:06:35.864Z" },
-    { url = 
"https://files.pythonhosted.org/packages/58/d4/dcdfd2a33096aeda6ca0d15584800443dd2be64becca8f315634044b135b/playwright-1.57.0-py3-none-win_amd64.whl";,
 hash = 
"sha256:6caefb08ed2c6f29d33b8088d05d09376946e49a73be19271c8cd5384b82b14c", size 
= 36553864, upload-time = "2025-12-09T08:06:38.915Z" },
-    { url = 
"https://files.pythonhosted.org/packages/6a/60/fe31d7e6b8907789dcb0584f88be741ba388413e4fbce35f1eba4e3073de/playwright-1.57.0-py3-none-win_arm64.whl";,
 hash = 
"sha256:5f065f5a133dbc15e6e7c71e7bc04f258195755b1c32a432b792e28338c8335e", size 
= 32837940, upload-time = "2025-12-09T08:06:42.268Z" },
+    { url = 
"https://files.pythonhosted.org/packages/f8/c9/9c6061d5703267f1baae6a4647bfd1862e386fbfdb97d889f6f6ae9e3f64/playwright-1.58.0-py3-none-macosx_10_13_x86_64.whl";,
 hash = 
"sha256:96e3204aac292ee639edbfdef6298b4be2ea0a55a16b7068df91adac077cc606", size 
= 42251098, upload-time = "2026-01-30T15:09:24.028Z" },
+    { url = 
"https://files.pythonhosted.org/packages/e0/40/59d34a756e02f8c670f0fee987d46f7ee53d05447d43cd114ca015cb168c/playwright-1.58.0-py3-none-macosx_11_0_arm64.whl";,
 hash = 
"sha256:70c763694739d28df71ed578b9c8202bb83e8fe8fb9268c04dd13afe36301f71", size 
= 41039625, upload-time = "2026-01-30T15:09:27.558Z" },
+    { url = 
"https://files.pythonhosted.org/packages/e1/ee/3ce6209c9c74a650aac9028c621f357a34ea5cd4d950700f8e2c4b7fe2c4/playwright-1.58.0-py3-none-macosx_11_0_universal2.whl";,
 hash = 
"sha256:185e0132578733d02802dfddfbbc35f42be23a45ff49ccae5081f25952238117", size 
= 42251098, upload-time = "2026-01-30T15:09:30.461Z" },
+    { url = 
"https://files.pythonhosted.org/packages/f1/af/009958cbf23fac551a940d34e3206e6c7eed2b8c940d0c3afd1feb0b0589/playwright-1.58.0-py3-none-manylinux1_x86_64.whl";,
 hash = 
"sha256:c95568ba1eda83812598c1dc9be60b4406dffd60b149bc1536180ad108723d6b", size 
= 46235268, upload-time = "2026-01-30T15:09:33.787Z" },
+    { url = 
"https://files.pythonhosted.org/packages/d9/a6/0e66ad04b6d3440dae73efb39540c5685c5fc95b17c8b29340b62abbd952/playwright-1.58.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl";,
 hash = 
"sha256:8f9999948f1ab541d98812de25e3a8c410776aa516d948807140aff797b4bffa", size 
= 45964214, upload-time = "2026-01-30T15:09:36.751Z" },
+    { url = 
"https://files.pythonhosted.org/packages/0e/4b/236e60ab9f6d62ed0fd32150d61f1f494cefbf02304c0061e78ed80c1c32/playwright-1.58.0-py3-none-win32.whl";,
 hash = 
"sha256:1e03be090e75a0fabbdaeab65ce17c308c425d879fa48bb1d7986f96bfad0b99", size 
= 36815998, upload-time = "2026-01-30T15:09:39.627Z" },
+    { url = 
"https://files.pythonhosted.org/packages/41/f8/5ec599c5e59d2f2f336a05b4f318e733077cd5044f24adb6f86900c3e6a7/playwright-1.58.0-py3-none-win_amd64.whl";,
 hash = 
"sha256:a2bf639d0ce33b3ba38de777e08697b0d8f3dc07ab6802e4ac53fb65e3907af8", size 
= 36816005, upload-time = "2026-01-30T15:09:42.449Z" },
+    { url = 
"https://files.pythonhosted.org/packages/c8/c4/cc0229fea55c87d6c9c67fe44a21e2cd28d1d558a5478ed4d617e9fb0c93/playwright-1.58.0-py3-none-win_arm64.whl";,
 hash = 
"sha256:32ffe5c303901a13a0ecab91d1c3f74baf73b84f4bedbb6b935f5bc11cc98e1b", size 
= 33085919, upload-time = "2026-01-30T15:09:45.71Z" },
 ]
 
 [[package]]
@@ -1360,11 +1360,11 @@ wheels = [
 
 [[package]]
 name = "pyjwt"
-version = "2.10.1"
+version = "2.11.0"
 source = { registry = "https://pypi.org/simple"; }
-sdist = { url = 
"https://files.pythonhosted.org/packages/e7/46/bd74733ff231675599650d3e47f361794b22ef3e3770998dda30d3b63726/pyjwt-2.10.1.tar.gz";,
 hash = 
"sha256:3cc5772eb20009233caf06e9d8a0577824723b44e6648ee0a2aedb6cf9381953", size 
= 87785, upload-time = "2024-11-28T03:43:29.933Z" }
+sdist = { url = 
"https://files.pythonhosted.org/packages/5c/5a/b46fa56bf322901eee5b0454a34343cdbdae202cd421775a8ee4e42fd519/pyjwt-2.11.0.tar.gz";,
 hash = 
"sha256:35f95c1f0fbe5d5ba6e43f00271c275f7a1a4db1dab27bf708073b75318ea623", size 
= 98019, upload-time = "2026-01-30T19:59:55.694Z" }
 wheels = [
-    { url = 
"https://files.pythonhosted.org/packages/61/ad/689f02752eeec26aed679477e80e632ef1b682313be70793d798c1d5fc8f/PyJWT-2.10.1-py3-none-any.whl";,
 hash = 
"sha256:dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb", size 
= 22997, upload-time = "2024-11-28T03:43:27.893Z" },
+    { url = 
"https://files.pythonhosted.org/packages/6f/01/c26ce75ba460d5cd503da9e13b21a33804d38c2165dec7b716d06b13010c/pyjwt-2.11.0-py3-none-any.whl";,
 hash = 
"sha256:94a6bde30eb5c8e04fee991062b534071fd1439ef58d2adc9ccb823e7bcd0469", size 
= 28224, upload-time = "2026-01-30T19:59:54.539Z" },
 ]
 
 [[package]]
@@ -1727,28 +1727,27 @@ wheels = [
 
 [[package]]
 name = "ruff"
-version = "0.14.14"
-source = { registry = "https://pypi.org/simple"; }
-sdist = { url = 
"https://files.pythonhosted.org/packages/2e/06/f71e3a86b2df0dfa2d2f72195941cd09b44f87711cb7fa5193732cb9a5fc/ruff-0.14.14.tar.gz";,
 hash = 
"sha256:2d0f819c9a90205f3a867dbbd0be083bee9912e170fd7d9704cc8ae45824896b", size 
= 4515732, upload-time = "2026-01-22T22:30:17.527Z" }
-wheels = [
-    { url = 
"https://files.pythonhosted.org/packages/d2/89/20a12e97bc6b9f9f68343952da08a8099c57237aef953a56b82711d55edd/ruff-0.14.14-py3-none-linux_armv6l.whl";,
 hash = 
"sha256:7cfe36b56e8489dee8fbc777c61959f60ec0f1f11817e8f2415f429552846aed", size 
= 10467650, upload-time = "2026-01-22T22:30:08.578Z" },
-    { url = 
"https://files.pythonhosted.org/packages/a3/b1/c5de3fd2d5a831fcae21beda5e3589c0ba67eec8202e992388e4b17a6040/ruff-0.14.14-py3-none-macosx_10_12_x86_64.whl";,
 hash = 
"sha256:6006a0082336e7920b9573ef8a7f52eec837add1265cc74e04ea8a4368cd704c", size 
= 10883245, upload-time = "2026-01-22T22:30:04.155Z" },
-    { url = 
"https://files.pythonhosted.org/packages/b8/7c/3c1db59a10e7490f8f6f8559d1db8636cbb13dccebf18686f4e3c9d7c772/ruff-0.14.14-py3-none-macosx_11_0_arm64.whl";,
 hash = 
"sha256:026c1d25996818f0bf498636686199d9bd0d9d6341c9c2c3b62e2a0198b758de", size 
= 10231273, upload-time = "2026-01-22T22:30:34.642Z" },
-    { url = 
"https://files.pythonhosted.org/packages/a1/6e/5e0e0d9674be0f8581d1f5e0f0a04761203affce3232c1a1189d0e3b4dad/ruff-0.14.14-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl";,
 hash = 
"sha256:f666445819d31210b71e0a6d1c01e24447a20b85458eea25a25fe8142210ae0e", size 
= 10585753, upload-time = "2026-01-22T22:30:31.781Z" },
-    { url = 
"https://files.pythonhosted.org/packages/23/09/754ab09f46ff1884d422dc26d59ba18b4e5d355be147721bb2518aa2a014/ruff-0.14.14-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl";,
 hash = 
"sha256:3c0f18b922c6d2ff9a5e6c3ee16259adc513ca775bcf82c67ebab7cbd9da5bc8", size 
= 10286052, upload-time = "2026-01-22T22:30:24.827Z" },
-    { url = 
"https://files.pythonhosted.org/packages/c8/cc/e71f88dd2a12afb5f50733851729d6b571a7c3a35bfdb16c3035132675a0/ruff-0.14.14-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl";,
 hash = 
"sha256:1629e67489c2dea43e8658c3dba659edbfd87361624b4040d1df04c9740ae906", size 
= 11043637, upload-time = "2026-01-22T22:30:13.239Z" },
-    { url = 
"https://files.pythonhosted.org/packages/67/b2/397245026352494497dac935d7f00f1468c03a23a0c5db6ad8fc49ca3fb2/ruff-0.14.14-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl";,
 hash = 
"sha256:27493a2131ea0f899057d49d303e4292b2cae2bb57253c1ed1f256fbcd1da480", size 
= 12194761, upload-time = "2026-01-22T22:30:22.542Z" },
-    { url = 
"https://files.pythonhosted.org/packages/5b/06/06ef271459f778323112c51b7587ce85230785cd64e91772034ddb88f200/ruff-0.14.14-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl";,
 hash = 
"sha256:01ff589aab3f5b539e35db38425da31a57521efd1e4ad1ae08fc34dbe30bd7df", size 
= 12005701, upload-time = "2026-01-22T22:30:20.499Z" },
-    { url = 
"https://files.pythonhosted.org/packages/41/d6/99364514541cf811ccc5ac44362f88df66373e9fec1b9d1c4cc830593fe7/ruff-0.14.14-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl";,
 hash = 
"sha256:1cc12d74eef0f29f51775f5b755913eb523546b88e2d733e1d701fe65144e89b", size 
= 11282455, upload-time = "2026-01-22T22:29:59.679Z" },
-    { url = 
"https://files.pythonhosted.org/packages/ca/71/37daa46f89475f8582b7762ecd2722492df26421714a33e72ccc9a84d7a5/ruff-0.14.14-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl";,
 hash = 
"sha256:bb8481604b7a9e75eff53772496201690ce2687067e038b3cc31aaf16aa0b974", size 
= 11215882, upload-time = "2026-01-22T22:29:57.032Z" },
-    { url = 
"https://files.pythonhosted.org/packages/2c/10/a31f86169ec91c0705e618443ee74ede0bdd94da0a57b28e72db68b2dbac/ruff-0.14.14-py3-none-manylinux_2_31_riscv64.whl";,
 hash = 
"sha256:14649acb1cf7b5d2d283ebd2f58d56b75836ed8c6f329664fa91cdea19e76e66", size 
= 11180549, upload-time = "2026-01-22T22:30:27.175Z" },
-    { url = 
"https://files.pythonhosted.org/packages/fd/1e/c723f20536b5163adf79bdd10c5f093414293cdf567eed9bdb7b83940f3f/ruff-0.14.14-py3-none-musllinux_1_2_aarch64.whl";,
 hash = 
"sha256:e8058d2145566510790eab4e2fad186002e288dec5e0d343a92fe7b0bc1b3e13", size 
= 10543416, upload-time = "2026-01-22T22:30:01.964Z" },
-    { url = 
"https://files.pythonhosted.org/packages/3e/34/8a84cea7e42c2d94ba5bde1d7a4fae164d6318f13f933d92da6d7c2041ff/ruff-0.14.14-py3-none-musllinux_1_2_armv7l.whl";,
 hash = 
"sha256:e651e977a79e4c758eb807f0481d673a67ffe53cfa92209781dfa3a996cf8412", size 
= 10285491, upload-time = "2026-01-22T22:30:29.51Z" },
-    { url = 
"https://files.pythonhosted.org/packages/55/ef/b7c5ea0be82518906c978e365e56a77f8de7678c8bb6651ccfbdc178c29f/ruff-0.14.14-py3-none-musllinux_1_2_i686.whl";,
 hash = 
"sha256:cc8b22da8d9d6fdd844a68ae937e2a0adf9b16514e9a97cc60355e2d4b219fc3", size 
= 10733525, upload-time = "2026-01-22T22:30:06.499Z" },
-    { url = 
"https://files.pythonhosted.org/packages/6a/5b/aaf1dfbcc53a2811f6cc0a1759de24e4b03e02ba8762daabd9b6bd8c59e3/ruff-0.14.14-py3-none-musllinux_1_2_x86_64.whl";,
 hash = 
"sha256:16bc890fb4cc9781bb05beb5ab4cd51be9e7cb376bf1dd3580512b24eb3fda2b", size 
= 11315626, upload-time = "2026-01-22T22:30:36.848Z" },
-    { url = 
"https://files.pythonhosted.org/packages/2c/aa/9f89c719c467dfaf8ad799b9bae0df494513fb21d31a6059cb5870e57e74/ruff-0.14.14-py3-none-win32.whl";,
 hash = 
"sha256:b530c191970b143375b6a68e6f743800b2b786bbcf03a7965b06c4bf04568167", size 
= 10502442, upload-time = "2026-01-22T22:30:38.93Z" },
-    { url = 
"https://files.pythonhosted.org/packages/87/44/90fa543014c45560cae1fffc63ea059fb3575ee6e1cb654562197e5d16fb/ruff-0.14.14-py3-none-win_amd64.whl";,
 hash = 
"sha256:3dde1435e6b6fe5b66506c1dff67a421d0b7f6488d466f651c07f4cab3bf20fd", size 
= 11630486, upload-time = "2026-01-22T22:30:10.852Z" },
-    { url = 
"https://files.pythonhosted.org/packages/9e/6a/40fee331a52339926a92e17ae748827270b288a35ef4a15c9c8f2ec54715/ruff-0.14.14-py3-none-win_arm64.whl";,
 hash = 
"sha256:56e6981a98b13a32236a72a8da421d7839221fa308b223b9283312312e5ac76c", size 
= 10920448, upload-time = "2026-01-22T22:30:15.417Z" },
+version = "0.15.0"
+source = { registry = "https://pypi.org/simple"; }
+sdist = { url = 
"https://files.pythonhosted.org/packages/c8/39/5cee96809fbca590abea6b46c6d1c586b49663d1d2830a751cc8fc42c666/ruff-0.15.0.tar.gz";,
 hash = 
"sha256:6bdea47cdbea30d40f8f8d7d69c0854ba7c15420ec75a26f463290949d7f7e9a", size 
= 4524893, upload-time = "2026-02-03T17:53:35.357Z" }
+wheels = [
+    { url = 
"https://files.pythonhosted.org/packages/bc/88/3fd1b0aa4b6330d6aaa63a285bc96c9f71970351579152d231ed90914586/ruff-0.15.0-py3-none-linux_armv6l.whl";,
 hash = 
"sha256:aac4ebaa612a82b23d45964586f24ae9bc23ca101919f5590bdb368d74ad5455", size 
= 10354332, upload-time = "2026-02-03T17:52:54.892Z" },
+    { url = 
"https://files.pythonhosted.org/packages/72/f6/62e173fbb7eb75cc29fe2576a1e20f0a46f671a2587b5f604bfb0eaf5f6f/ruff-0.15.0-py3-none-macosx_10_12_x86_64.whl";,
 hash = 
"sha256:dcd4be7cc75cfbbca24a98d04d0b9b36a270d0833241f776b788d59f4142b14d", size 
= 10767189, upload-time = "2026-02-03T17:53:19.778Z" },
+    { url = 
"https://files.pythonhosted.org/packages/99/e4/968ae17b676d1d2ff101d56dc69cf333e3a4c985e1ec23803df84fc7bf9e/ruff-0.15.0-py3-none-macosx_11_0_arm64.whl";,
 hash = 
"sha256:d747e3319b2bce179c7c1eaad3d884dc0a199b5f4d5187620530adf9105268ce", size 
= 10075384, upload-time = "2026-02-03T17:53:29.241Z" },
+    { url = 
"https://files.pythonhosted.org/packages/a2/bf/9843c6044ab9e20af879c751487e61333ca79a2c8c3058b15722386b8cae/ruff-0.15.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl";,
 hash = 
"sha256:650bd9c56ae03102c51a5e4b554d74d825ff3abe4db22b90fd32d816c2e90621", size 
= 10481363, upload-time = "2026-02-03T17:52:43.332Z" },
+    { url = 
"https://files.pythonhosted.org/packages/55/d9/4ada5ccf4cd1f532db1c8d44b6f664f2208d3d93acbeec18f82315e15193/ruff-0.15.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl";,
 hash = 
"sha256:a6664b7eac559e3048223a2da77769c2f92b43a6dfd4720cef42654299a599c9", size 
= 10187736, upload-time = "2026-02-03T17:53:00.522Z" },
+    { url = 
"https://files.pythonhosted.org/packages/86/e2/f25eaecd446af7bb132af0a1d5b135a62971a41f5366ff41d06d25e77a91/ruff-0.15.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl";,
 hash = 
"sha256:6f811f97b0f092b35320d1556f3353bf238763420ade5d9e62ebd2b73f2ff179", size 
= 10968415, upload-time = "2026-02-03T17:53:15.705Z" },
+    { url = 
"https://files.pythonhosted.org/packages/e7/dc/f06a8558d06333bf79b497d29a50c3a673d9251214e0d7ec78f90b30aa79/ruff-0.15.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl";,
 hash = 
"sha256:761ec0a66680fab6454236635a39abaf14198818c8cdf691e036f4bc0f406b2d", size 
= 11809643, upload-time = "2026-02-03T17:53:23.031Z" },
+    { url = 
"https://files.pythonhosted.org/packages/dd/45/0ece8db2c474ad7df13af3a6d50f76e22a09d078af63078f005057ca59eb/ruff-0.15.0-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl";,
 hash = 
"sha256:940f11c2604d317e797b289f4f9f3fa5555ffe4fb574b55ed006c3d9b6f0eb78", size 
= 11234787, upload-time = "2026-02-03T17:52:46.432Z" },
+    { url = 
"https://files.pythonhosted.org/packages/8a/d9/0e3a81467a120fd265658d127db648e4d3acfe3e4f6f5d4ea79fac47e587/ruff-0.15.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl";,
 hash = 
"sha256:bcbca3d40558789126da91d7ef9a7c87772ee107033db7191edefa34e2c7f1b4", size 
= 11112797, upload-time = "2026-02-03T17:52:49.274Z" },
+    { url = 
"https://files.pythonhosted.org/packages/b2/cb/8c0b3b0c692683f8ff31351dfb6241047fa873a4481a76df4335a8bff716/ruff-0.15.0-py3-none-manylinux_2_31_riscv64.whl";,
 hash = 
"sha256:9a121a96db1d75fa3eb39c4539e607f628920dd72ff1f7c5ee4f1b768ac62d6e", size 
= 11033133, upload-time = "2026-02-03T17:53:33.105Z" },
+    { url = 
"https://files.pythonhosted.org/packages/f8/5e/23b87370cf0f9081a8c89a753e69a4e8778805b8802ccfe175cc410e50b9/ruff-0.15.0-py3-none-musllinux_1_2_aarch64.whl";,
 hash = 
"sha256:5298d518e493061f2eabd4abd067c7e4fb89e2f63291c94332e35631c07c3662", size 
= 10442646, upload-time = "2026-02-03T17:53:06.278Z" },
+    { url = 
"https://files.pythonhosted.org/packages/e1/9a/3c94de5ce642830167e6d00b5c75aacd73e6347b4c7fc6828699b150a5ee/ruff-0.15.0-py3-none-musllinux_1_2_armv7l.whl";,
 hash = 
"sha256:afb6e603d6375ff0d6b0cee563fa21ab570fd15e65c852cb24922cef25050cf1", size 
= 10195750, upload-time = "2026-02-03T17:53:26.084Z" },
+    { url = 
"https://files.pythonhosted.org/packages/30/15/e396325080d600b436acc970848d69df9c13977942fb62bb8722d729bee8/ruff-0.15.0-py3-none-musllinux_1_2_i686.whl";,
 hash = 
"sha256:77e515f6b15f828b94dc17d2b4ace334c9ddb7d9468c54b2f9ed2b9c1593ef16", size 
= 10676120, upload-time = "2026-02-03T17:53:09.363Z" },
+    { url = 
"https://files.pythonhosted.org/packages/8d/c9/229a23d52a2983de1ad0fb0ee37d36e0257e6f28bfd6b498ee2c76361874/ruff-0.15.0-py3-none-musllinux_1_2_x86_64.whl";,
 hash = 
"sha256:6f6e80850a01eb13b3e42ee0ebdf6e4497151b48c35051aab51c101266d187a3", size 
= 11201636, upload-time = "2026-02-03T17:52:57.281Z" },
+    { url = 
"https://files.pythonhosted.org/packages/6f/b0/69adf22f4e24f3677208adb715c578266842e6e6a3cc77483f48dd999ede/ruff-0.15.0-py3-none-win32.whl";,
 hash = 
"sha256:238a717ef803e501b6d51e0bdd0d2c6e8513fe9eec14002445134d3907cd46c3", size 
= 10465945, upload-time = "2026-02-03T17:53:12.591Z" },
+    { url = 
"https://files.pythonhosted.org/packages/51/ad/f813b6e2c97e9b4598be25e94a9147b9af7e60523b0cb5d94d307c15229d/ruff-0.15.0-py3-none-win_amd64.whl";,
 hash = 
"sha256:dd5e4d3301dc01de614da3cdffc33d4b1b96fb89e45721f1598e5532ccf78b18", size 
= 11564657, upload-time = "2026-02-03T17:52:51.893Z" },
+    { url = 
"https://files.pythonhosted.org/packages/f6/b0/2d823f6e77ebe560f4e397d078487e8d52c1516b331e3521bc75db4272ca/ruff-0.15.0-py3-none-win_arm64.whl";,
 hash = 
"sha256:c480d632cc0ca3f0727acac8b7d053542d9e114a462a145d0b00e7cd658c515a", size 
= 10865753, upload-time = "2026-02-03T17:53:03.014Z" },
 ]
 
 [[package]]
@@ -1804,15 +1803,15 @@ wheels = [
 
 [[package]]
 name = "sqlmodel"
-version = "0.0.31"
+version = "0.0.32"
 source = { registry = "https://pypi.org/simple"; }
 dependencies = [
     { name = "pydantic" },
     { name = "sqlalchemy" },
 ]
-sdist = { url = 
"https://files.pythonhosted.org/packages/56/b8/e7cd6def4a773f25d6e29ffce63ccbfd6cf9488b804ab6fb9b80d334b39d/sqlmodel-0.0.31.tar.gz";,
 hash = 
"sha256:2d41a8a9ee05e40736e2f9db8ea28cbfe9b5d4e5a18dd139e80605025e0c516c", size 
= 94952, upload-time = "2025-12-28T12:35:01.436Z" }
+sdist = { url = 
"https://files.pythonhosted.org/packages/d1/89/67f8964f3b2ed073fa4e95201e708291935d00e3600f36f09c1be3e279fe/sqlmodel-0.0.32.tar.gz";,
 hash = 
"sha256:48e8fe4c8c3d7d8bf8468db17fa92ca680421e86cfec8b352217ef40736767be", size 
= 94140, upload-time = "2026-02-01T18:19:14.752Z" }
 wheels = [
-    { url = 
"https://files.pythonhosted.org/packages/6c/72/5aa5be921800f6418a949a73c9bb7054890881143e6bc604a93d228a95a3/sqlmodel-0.0.31-py3-none-any.whl";,
 hash = 
"sha256:6d946d56cac4c2db296ba1541357cee2e795d68174e2043cd138b916794b1513", size 
= 27093, upload-time = "2025-12-28T12:35:00.108Z" },
+    { url = 
"https://files.pythonhosted.org/packages/ed/de/d9b40ed2c570fd612c2abd57e4d9084a9d8eb1797447e2ce897b77b1c4b2/sqlmodel-0.0.32-py3-none-any.whl";,
 hash = 
"sha256:d62f0702599592046c1a136d3512feab3d5a80e2988642ef0ed2c89b9b8b297b", size 
= 27416, upload-time = "2026-02-01T18:19:15.992Z" },
 ]
 
 [[package]]
@@ -1985,14 +1984,14 @@ test = [
 
 [[package]]
 name = "tqdm"
-version = "4.67.1"
+version = "4.67.3"
 source = { registry = "https://pypi.org/simple"; }
 dependencies = [
     { name = "colorama", marker = "sys_platform == 'win32'" },
 ]
-sdist = { url = 
"https://files.pythonhosted.org/packages/a8/4b/29b4ef32e036bb34e4ab51796dd745cdba7ed47ad142a9f4a1eb8e0c744d/tqdm-4.67.1.tar.gz";,
 hash = 
"sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2", size 
= 169737, upload-time = "2024-11-24T20:12:22.481Z" }
+sdist = { url = 
"https://files.pythonhosted.org/packages/09/a9/6ba95a270c6f1fbcd8dac228323f2777d886cb206987444e4bce66338dd4/tqdm-4.67.3.tar.gz";,
 hash = 
"sha256:7d825f03f89244ef73f1d4ce193cb1774a8179fd96f31d7e1dcde62092b960bb", size 
= 169598, upload-time = "2026-02-03T17:35:53.048Z" }
 wheels = [
-    { url = 
"https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl";,
 hash = 
"sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2", size 
= 78540, upload-time = "2024-11-24T20:12:19.698Z" },
+    { url = 
"https://files.pythonhosted.org/packages/16/e1/3079a9ff9b8e11b846c6ac5c8b5bfb7ff225eee721825310c91b3b50304f/tqdm-4.67.3-py3-none-any.whl";,
 hash = 
"sha256:ee1e4c0e59148062281c49d80b25b67771a127c85fc9676d3be5f243206826bf", size 
= 78374, upload-time = "2026-02-03T17:35:50.982Z" },
 ]
 
 [[package]]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]


Reply via email to