From e99e54eb1473db489cf2f05a55d6f96b88a4e881 Mon Sep 17 00:00:00 2001 From: Dozgulbas Date: Wed, 4 Feb 2026 13:39:34 -0800 Subject: [PATCH 01/21] Bug fix for rotations with pick plate --- .gitignore | 1 + src/pf400_interface/pf400.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index a36e236..e13defb 100644 --- a/.gitignore +++ b/.gitignore @@ -161,3 +161,4 @@ cython_debug/ #.idea/ .vscode +.DS_Store diff --git a/src/pf400_interface/pf400.py b/src/pf400_interface/pf400.py index 3e2e4ec..69437ac 100644 --- a/src/pf400_interface/pf400.py +++ b/src/pf400_interface/pf400.py @@ -565,7 +565,7 @@ def check_incorrect_plate_orientation( ) # Checking yaw angle if goal_rotation != 0 and cartesian_goal[3] > -10 and cartesian_goal[3] < 10: - goal_location = self.set_plate_rotation(goal_location, -goal_rotation) + goal_location = self.set_plate_rotation(goal_location, goal_rotation) return goal_location From a9131edc79201c347c9db6293d7fa8cd26bb3a28 Mon Sep 17 00:00:00 2001 From: Dozgulbas Date: Wed, 4 Feb 2026 15:37:43 -0600 Subject: [PATCH 02/21] Local changes --- pyproject.toml | 6 +++--- tests/test_pf400_node.ipynb | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 1a1aeba..feaa8ce 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -9,10 +9,10 @@ authors = [ {name = "Tobias Ginsburg", email = "tginsburg@anl.gov"}, ] dependencies = [ - "madsci-node-module~=0.5.0", + "madsci-node-module~=0.6.0", "pynput>=1.8.1", - "madsci-client~=0.5.0", - "madsci-common~=0.5.0", + "madsci-client~=0.6.0", + "madsci-common~=0.6.0", ] requires-python = ">=3.9.1,<3.13" readme = "README.md" diff --git a/tests/test_pf400_node.ipynb b/tests/test_pf400_node.ipynb index 22f83aa..cf87b71 100644 --- a/tests/test_pf400_node.ipynb +++ b/tests/test_pf400_node.ipynb @@ -144,7 +144,7 @@ ], "metadata": { "kernelspec": { - "display_name": ".venv", + "display_name": "pf400_module-3.12", "language": "python", "name": "python3" }, From 0aecc127a35300c98b58157152eef725d7e0236a Mon Sep 17 00:00:00 2001 From: Dozgulbas Date: Mon, 2 Mar 2026 12:37:13 -0600 Subject: [PATCH 03/21] Initial migration to madsci v0.7 for testing in the RPL --- .envrc | 9 + .gitignore | 1 + .pre-commit-config.yaml | 4 +- AGENTS.md | 106 +++ CLAUDE.md | 1 + Dockerfile | 14 +- README.md | 20 +- compose.yaml | 9 +- definitions/pf400.info.yaml | 303 -------- definitions/pf400.node.yaml | 7 - devbox.json | 24 + devbox.lock | 374 ++++++++++ pdm.lock | 1296 +++++++++++------------------------ pyproject.toml | 8 +- settings.yaml | 3 + src/pf400_rest_node.py | 19 +- 16 files changed, 954 insertions(+), 1244 deletions(-) create mode 100644 .envrc create mode 100644 AGENTS.md create mode 120000 CLAUDE.md delete mode 100644 definitions/pf400.info.yaml delete mode 100644 definitions/pf400.node.yaml create mode 100644 devbox.json create mode 100644 devbox.lock create mode 100644 settings.yaml diff --git a/.envrc b/.envrc new file mode 100644 index 0000000..eff60eb --- /dev/null +++ b/.envrc @@ -0,0 +1,9 @@ +#!/bin/bash + +# Automatically sets up your devbox environment whenever you cd into this +# directory via our direnv integration: + +eval "$(devbox generate direnv --print-envrc)" + +# check out https://www.jetify.com/docs/devbox/ide_configuration/direnv/ +# for more details diff --git a/.gitignore b/.gitignore index e13defb..98dc9f5 100644 --- a/.gitignore +++ b/.gitignore @@ -162,3 +162,4 @@ cython_debug/ .vscode .DS_Store +.madsci/ diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 3e2d661..4724a70 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -12,12 +12,12 @@ repos: - id: end-of-file-fixer - id: trailing-whitespace - repo: https://github.com/kynan/nbstripout - rev: 0.8.1 + rev: 0.9.1 hooks: - id: nbstripout - repo: https://github.com/astral-sh/ruff-pre-commit # Ruff version. - rev: v0.14.5 + rev: v0.15.4 hooks: # Run the linter. - id: ruff diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..dc6bd7c --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,106 @@ +# AGENTS.md/CLAUDE.md + +This file provides guidance to AI Agents. Note that CLAUDE.md and AGENTS.md are symlinked together. + +## Overview + +MADSci node module for the Brooks Automation PreciseFlex 400 (PF400) robot arm. Exposes a FastAPI REST server that translates MADSci actions into telnet commands sent to the physical robot. + +## Installation and Running + +```bash +# Install (use pip, not PDM) +pip install . + +# Configure (see Configuration section below), then run +python -m pf400_rest_node + +# Run via Docker +docker compose up +``` + +Configuration is loaded automatically via MADSci's walk-up settings discovery. The Docker `compose.yaml` sets `PF400_IP` via environment variable. + +## Linting + +```bash +# Lint +ruff check src/ + +# Format +ruff format src/ + +# Fix auto-fixable issues +ruff check --fix src/ +``` + +No pytest test suite — tests are Jupyter notebooks in `tests/` (`test_pf400_interface.ipynb`, `test_pf400_node.ipynb`) and require a live robot connection. + +## Code Architecture + +Three layers, each building on the previous: + +### 1. `src/pf400_rest_node.py` — MADSci REST Node +`PF400Node(RestNode)` implements the MADSci node interface: +- `startup_handler`: initializes MADSci resource templates (gripper slot, lid slot, plate lid asset) and instantiates `PF400` +- `state_handler`: polls `movement_state` (0=power off, 1=ready, >1=busy) +- Actions decorated with `@action`: `transfer`, `pick_plate`, `place_plate`, `remove_lid`, `replace_lid` +- Config via `PF400NodeConfig(RestNodeConfig)` — adds `pf400_ip`, `pf400_port` (10100), `pf400_status_port` (10000) + +### 2. `src/pf400_interface/pf400.py` — Robot Driver +`PF400(KINEMATICS)` communicates with the robot via **two telnet connections**: +- Command connection: port 10100 — sends GPL (robot programming language) commands +- Status connection: port 10000 — reads robot state + +Key driver concepts: +- Locations are represented as 6-element joint-angle arrays: `[z_mm, shoulder_deg, elbow_deg, wrist_deg, gripper_mm, rail_mm]` +- Motion profiles (from `pf400_constants.py`): profile 1 (slow), profile 2 (fast, 120 speed), profile 3 (straight-line) +- `grip_wide=True` → gripper opens to 130mm / closes to 127mm; `False` → 90mm / 85mm +- Plate rotation: `""` or `"narrow"` → 0° wrist offset; `"wide"` → 90° wrist offset +- `default_approach_height = 15.0` steps above/below the target position for approach moves + +Key methods: +- `transfer(source, target, ...)` — full pick+place with optional approach waypoints and plate rotation +- `pick_plate(source, ...)` / `place_plate(target, ...)` — individual pick/place +- `remove_lid(source, target, lid_height=7.0, ...)` / `replace_lid(...)` — lid handling +- `check_incorrect_plate_orientation(representation, rotation)` — corrects joint angles when orientation mismatches + +### 3. `src/pf400_interface/pf400_kinematics.py` — Kinematics +`KINEMATICS` base class with forward/inverse kinematics: +- Arm segments: shoulder=302mm, elbow=289mm, end-effector=162mm +- Joint coordinate order: `[z, shoulder, elbow, wrist, gripper, rail]` +- Cartesian coordinate order: `[X, Y, Z, yaw, pitch=90, roll=180]` +- Rail (joint[5]) is the horizontal position and must be subtracted from X before calling `inverse_kinematics` + +### Supporting files +- `pf400_constants.py` — `ERROR_CODES`, `MOTION_PROFILES`, `OUTPUT_CODES` dicts +- `pf400_errors.py` — `Pf400ConnectionError`, `Pf400CommandError`, `Pf400ResponseError` +- `src/keyboard_control.py` — interactive keyboard teleoperation utility (arrow keys = XY, W/S = Z, N = neutral) + +## Configuration + +Configuration uses MADSci's Pydantic Settings system. Settings are loaded via walk-up file discovery (searching from CWD up to the `.madsci/` sentinel directory), with this priority order: CLI args → environment variables → `node.settings.yaml` → `settings.yaml`. + +Example `node.settings.yaml`: + +```yaml +node_name: pf400 +node_url: http://0.0.0.0:2000 +pf400_ip: 192.168.1.100 +pf400_port: 10100 +pf400_status_port: 10000 +``` + +All settings can also be set via environment variables (e.g. `PF400_IP`, `NODE_URL`). + +The node's stable identity (ID) is persisted in the `.madsci/registry.json` file found by the same walk-up discovery. The node registers itself under its `node_name` on first startup and reuses the same ULID on subsequent restarts. + +`definitions/pf400.info.yaml` is auto-generated from the node's declared actions and capabilities — do not edit it manually. + +| Parameter | Default | Description | +|---|---|---| +| `pf400_ip` | None (required) | Robot IP address | +| `pf400_port` | 10100 | Command telnet port | +| `pf400_status_port` | 10000 | Status telnet port | +| `node_url` | `http://127.0.0.1:2000/` | REST API base URL | +| `status_update_interval` | 2.0s | State polling interval | diff --git a/CLAUDE.md b/CLAUDE.md new file mode 120000 index 0000000..47dc3e3 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1 @@ +AGENTS.md \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index be3a32b..c9d46e6 100644 --- a/Dockerfile +++ b/Dockerfile @@ -8,15 +8,17 @@ LABEL org.opencontainers.image.licenses=MIT # Module specific logic goes below here # ######################################### -RUN mkdir -p pf400_module +ARG USER_ID=9999 +ARG GROUP_ID=9999 -COPY ./src pf400_module/src -COPY ./README.md pf400_module/README.md -COPY ./pyproject.toml pf400_module/pyproject.toml +COPY ./src /home/madsci/pf400_module/src +COPY ./README.md /home/madsci/pf400_module/README.md +COPY ./pyproject.toml /home/madsci/pf400_module/pyproject.toml RUN --mount=type=cache,target=/root/.cache \ - pip install -e ./pf400_module + uv pip install --python ${MADSCI_VENV}/bin/python -e /home/madsci/pf400_module && \ + chown -R ${USER_ID}:${GROUP_ID} /home/madsci/pf400_module -CMD ["python", "pf400_module/scripts/pf400_rest_node.py"] +CMD ["python", "-m", "pf400_rest_node", "--node_definition", "definitions/pf400.node.yaml"] ######################################### diff --git a/README.md b/README.md index 44325dd..b5abe6d 100644 --- a/README.md +++ b/README.md @@ -2,8 +2,6 @@ Implementation of a MADSci Node Module for integrating a Brooks Automation PreciseFlex 400 (PF400). -See `definitions/pf400.node.yaml` for an example node definition file, and `definitions/pf400.node.info.yaml` for a description of the capabilities of the node. - ## Installation and Usage ### Python @@ -17,11 +15,23 @@ source .venv/bin/activate # .venv\Scripts\activate # Install the module and dependencies in the venv pip install . -# Start the node -python -m pf400_rest_node --host= --port --pf400_ip --pf400_port +# Create a settings file (see Configuration below), then start the node +python -m pf400_rest_node +``` + +### Configuration + +Settings are loaded automatically via MADSci's walk-up file discovery. Create a `node.settings.yaml` in your working directory (or any parent up to the `.madsci/` sentinel): + +```yaml +node_name: pf400 +node_url: http://0.0.0.0:2000 +pf400_ip: 192.168.1.100 +pf400_port: 10100 +pf400_status_port: 10000 ``` -You can use `0.0.0.0` as the hostname to connect from any device on the local network, or `127.0.0.1` to limit it only to local connections. +All settings can also be provided as environment variables (e.g. `PF400_IP`, `NODE_URL`). The node's stable ID is stored in `.madsci/registry.json` and reused across restarts. ### Docker diff --git a/compose.yaml b/compose.yaml index 6f92b39..d63ea5a 100644 --- a/compose.yaml +++ b/compose.yaml @@ -7,13 +7,16 @@ services: environment: - USER_ID=${USER_ID:-1000} - GROUP_ID=${GROUP_ID:-1000} - - PF400_IP=146.137.240.35 + env_file: + - path: .env + required: false build: context: . dockerfile: Dockerfile tags: - ghcr.io/ad-sdl/pf400_module:latest - ghcr.io/ad-sdl/pf400_module:dev - command: python -m pf400_rest_node --node_definition definitions/pf400.node.yaml + command: python -m pf400_rest_node volumes: - - ./definitions:/home/madsci/definitions/ + - ./settings.yaml:/home/madsci/settings.yaml + - ./.madsci:/home/madsci/.madsci diff --git a/definitions/pf400.info.yaml b/definitions/pf400.info.yaml deleted file mode 100644 index d0ac954..0000000 --- a/definitions/pf400.info.yaml +++ /dev/null @@ -1,303 +0,0 @@ -node_name: pf400 -node_id: 01JPR0HZX0WJT1X9EHZ611SGP6 -node_description: MADSci node for controlling PF400, plate handler robot -node_type: device -module_name: pf400 -module_version: 2.1.0 -capabilities: - get_info: true - get_state: true - get_status: true - send_action: true - get_action_result: true - get_action_history: true - action_files: true - send_admin_commands: true - set_config: true - get_resources: false - get_log: true - admin_commands: - - cancel - - lock - - pause - - reset - - resume - - safety_stop - - shutdown - - unlock -node_url: null -actions: - transfer: - name: transfer - description: Transfer a plate from one location to another - args: - source_plate_rotation: - name: source_plate_rotation - description: Orientation of the plate at the source, wide or narrow - argument_type: str - required: false - default: '' - target_plate_rotation: - name: target_plate_rotation - description: Final orientation of the plate at the target, wide or narrow - argument_type: str - required: false - default: '' - locations: - source: - name: source - description: Location to pick a plate from - argument_type: location - required: true - default: null - target: - name: target - description: Location to place a plate to - argument_type: location - required: true - default: null - source_approach: - name: source_approach - description: Location to approach from - argument_type: location - required: false - default: null - target_approach: - name: target_approach - description: Location to approach from - argument_type: location - required: false - default: null - files: {} - results: {} - blocking: false - asynchronous: true - pick_plate: - name: pick_plate - description: Pick a plate from a source location - args: {} - locations: - source: - name: source - description: Location to pick a plate from - argument_type: location - required: true - default: null - source_approach: - name: source_approach - description: Location to approach from - argument_type: location - required: false - default: null - files: {} - results: {} - blocking: false - asynchronous: true - place_plate: - name: place_plate - description: Place a plate in a target location, optionally moving first to target_approach - args: {} - locations: - target: - name: target - description: Location to place a plate to - argument_type: location - required: true - default: null - target_approach: - name: target_approach - description: Location to approach from - argument_type: location - required: false - default: null - files: {} - results: {} - blocking: false - asynchronous: true - remove_lid: - name: remove_lid - description: Remove a lid from a plate - args: - source_plate_rotation: - name: source_plate_rotation - description: Orientation of the plate at the source, wide or narrow - argument_type: str - required: false - default: '' - target_plate_rotation: - name: target_plate_rotation - description: Final orientation of the plate at the target, wide or narrow - argument_type: str - required: false - default: '' - lid_height: - name: lid_height - description: height of the lid, in steps - argument_type: float - required: false - default: 7.0 - locations: - source: - name: source - description: Location to pick a plate from - argument_type: location - required: true - default: null - target: - name: target - description: Location to place a plate to - argument_type: location - required: true - default: null - source_approach: - name: source_approach - description: Location to approach from - argument_type: location - required: false - default: null - target_approach: - name: target_approach - description: Location to approach from - argument_type: location - required: false - default: null - files: {} - results: {} - blocking: false - asynchronous: true - replace_lid: - name: replace_lid - description: Replace a lid on a plate - args: - source_plate_rotation: - name: source_plate_rotation - description: Orientation of the plate at the source, wide or narrow - argument_type: str - required: false - default: '' - target_plate_rotation: - name: target_plate_rotation - description: Final orientation of the plate at the target, wide or narrow - argument_type: str - required: false - default: '' - lid_height: - name: lid_height - description: height of the lid, in steps - argument_type: float - required: false - default: 7.0 - locations: - source: - name: source - description: Location to pick a plate from - argument_type: location - required: true - default: null - target: - name: target - description: Location to place a plate to - argument_type: location - required: true - default: null - source_approach: - name: source_approach - description: Location to approach from - argument_type: location - required: false - default: null - target_approach: - name: target_approach - description: Location to approach from - argument_type: location - required: false - default: null - files: {} - results: {} - blocking: false - asynchronous: true -config: - node_definition: definitions/pf400.node.yaml - node_info_path: null - update_node_files: true - status_update_interval: 2.0 - state_update_interval: 2.0 - node_url: http://127.0.0.1:2000/ - uvicorn_kwargs: {} - pf400_ip: null - pf400_port: 10100 - pf400_status_port: 10000 -config_schema: - description: Configuration for the pf400 node module. - properties: - node_definition: - anyOf: - - type: string - - format: path - type: string - - type: 'null' - default: default.node.yaml - description: Path to the node definition file to use. If set, the node will - load the definition from this file on startup. Otherwise, a default configuration - will be created. - title: Node Definition File - node_info_path: - anyOf: - - type: string - - format: path - type: string - - type: 'null' - default: null - description: Path to export the generated node info file. If not set, will use - the node name and the node_definition's path. - title: Node Info Path - update_node_files: - default: true - description: Whether to update the node definition and info files on startup. - If set to False, the node will not update the files even if they are out of - date. - title: Update Node Files - type: boolean - status_update_interval: - anyOf: - - type: number - - type: 'null' - default: 2.0 - description: The interval in seconds at which the node should update its status. - title: Status Update Interval - state_update_interval: - anyOf: - - type: number - - type: 'null' - default: 2.0 - description: The interval in seconds at which the node should update its state. - title: State Update Interval - node_url: - default: http://127.0.0.1:2000/ - description: The URL used to communicate with the node. This is the base URL - for the REST API. - format: uri - minLength: 1 - title: Node URL - type: string - uvicorn_kwargs: - additionalProperties: true - description: Configuration for the Uvicorn server that runs the REST API. - title: Uvicorn Configuration - type: object - pf400_ip: - anyOf: - - type: string - - type: 'null' - default: null - title: Pf400 Ip - pf400_port: - default: 10100 - title: Pf400 Port - type: integer - pf400_status_port: - default: 10000 - title: Pf400 Status Port - type: integer - title: PF400NodeConfig - type: object diff --git a/definitions/pf400.node.yaml b/definitions/pf400.node.yaml deleted file mode 100644 index 4d35c78..0000000 --- a/definitions/pf400.node.yaml +++ /dev/null @@ -1,7 +0,0 @@ -node_name: pf400 -node_id: 01JPR0HZX0WJT1X9EHZ611SGP6 -node_description: MADSci node for controlling PF400, plate handler robot -node_type: device -module_name: pf400 -module_version: 2.1.0 -capabilities: null diff --git a/devbox.json b/devbox.json new file mode 100644 index 0000000..fbd43f0 --- /dev/null +++ b/devbox.json @@ -0,0 +1,24 @@ +{ + "$schema": "https://raw.githubusercontent.com/jetify-com/devbox/0.16.0/.schema/devbox.schema.json", + "packages": [ + "pdm@latest", + "just@latest", + "uv@latest", + "ruff@latest", + "pre-commit@latest", + "python@3.12" + ], + "env": { + "PDM_USE_UV": "True" + }, + "shell": { + "init_hook": [ + ". $VENV_DIR/bin/activate" + ], + "scripts": { + "test": [ + "echo \"Error: no test specified\" && exit 1" + ] + } + } +} diff --git a/devbox.lock b/devbox.lock new file mode 100644 index 0000000..266e806 --- /dev/null +++ b/devbox.lock @@ -0,0 +1,374 @@ +{ + "lockfile_version": "1", + "packages": { + "github:NixOS/nixpkgs/nixpkgs-unstable": { + "last_modified": "2026-02-26T05:06:13Z", + "resolved": "github:NixOS/nixpkgs/26eaeac4e409d7b5a6bf6f90a2a2dc223c78d915?lastModified=1772082373" + }, + "just@latest": { + "last_modified": "2026-02-23T15:40:43Z", + "resolved": "github:NixOS/nixpkgs/80d901ec0377e19ac3f7bb8c035201e2e098cc97#just", + "source": "devbox-search", + "version": "1.46.0", + "systems": { + "aarch64-darwin": { + "outputs": [ + { + "name": "out", + "path": "/nix/store/70xj73qsinvmbc3rn1rch3k0bk2ric41-just-1.46.0", + "default": true + }, + { + "name": "man", + "path": "/nix/store/0rf7kvb3b5pz82rwadn4xm8y77x2iy4q-just-1.46.0-man", + "default": true + }, + { + "name": "doc", + "path": "/nix/store/z9xkrp3wmnlhf9h9s1jsh4r23w9jnjj1-just-1.46.0-doc" + } + ], + "store_path": "/nix/store/70xj73qsinvmbc3rn1rch3k0bk2ric41-just-1.46.0" + }, + "aarch64-linux": { + "outputs": [ + { + "name": "out", + "path": "/nix/store/429xi40vq2by0f8qibrj8w45n92mkhzf-just-1.46.0", + "default": true + }, + { + "name": "man", + "path": "/nix/store/sykdbhkkadkdgx0psdm3q1j2zpcqm7nn-just-1.46.0-man", + "default": true + }, + { + "name": "doc", + "path": "/nix/store/4qwqc5rhwj795kqk6385l97paqpvhlaf-just-1.46.0-doc" + } + ], + "store_path": "/nix/store/429xi40vq2by0f8qibrj8w45n92mkhzf-just-1.46.0" + }, + "x86_64-darwin": { + "outputs": [ + { + "name": "out", + "path": "/nix/store/2ai2169px8hbs6ap7srh9240v7qarjrl-just-1.46.0", + "default": true + }, + { + "name": "man", + "path": "/nix/store/ii6487zmcpc6qf5v95pfw646f8smkf87-just-1.46.0-man", + "default": true + }, + { + "name": "doc", + "path": "/nix/store/7hjj4qlvv9kk7rwj3gwz7pyxy6sc8p74-just-1.46.0-doc" + } + ], + "store_path": "/nix/store/2ai2169px8hbs6ap7srh9240v7qarjrl-just-1.46.0" + }, + "x86_64-linux": { + "outputs": [ + { + "name": "out", + "path": "/nix/store/x6bvf2yyik9jlp2bdsdh8hbzg4l9sd49-just-1.46.0", + "default": true + }, + { + "name": "man", + "path": "/nix/store/n15hvaaz1fmrl0fgypqr04yj6mj825rw-just-1.46.0-man", + "default": true + }, + { + "name": "doc", + "path": "/nix/store/hd32nmf13rby52cd7g5gw6f3p2ghnrhl-just-1.46.0-doc" + } + ], + "store_path": "/nix/store/x6bvf2yyik9jlp2bdsdh8hbzg4l9sd49-just-1.46.0" + } + } + }, + "pdm@latest": { + "last_modified": "2026-02-23T15:40:43Z", + "resolved": "github:NixOS/nixpkgs/80d901ec0377e19ac3f7bb8c035201e2e098cc97#pdm", + "source": "devbox-search", + "version": "2.26.6", + "systems": { + "aarch64-darwin": { + "outputs": [ + { + "name": "out", + "path": "/nix/store/y730lpwsb6fi7c4gj75rfm68dc39glvl-pdm-2.26.6", + "default": true + }, + { + "name": "dist", + "path": "/nix/store/g8ppkqdl6d0q4l8s5q85dqyfdj3pql1j-pdm-2.26.6-dist" + } + ], + "store_path": "/nix/store/y730lpwsb6fi7c4gj75rfm68dc39glvl-pdm-2.26.6" + }, + "aarch64-linux": { + "outputs": [ + { + "name": "out", + "path": "/nix/store/kkpybwbdns1k4zh91riki6ph3kjn5880-pdm-2.26.6", + "default": true + }, + { + "name": "dist", + "path": "/nix/store/6maywzx4cz508360hynbhxp09aish96x-pdm-2.26.6-dist" + } + ], + "store_path": "/nix/store/kkpybwbdns1k4zh91riki6ph3kjn5880-pdm-2.26.6" + }, + "x86_64-darwin": { + "outputs": [ + { + "name": "out", + "path": "/nix/store/yw9jlcrajy1m7n7z9anvnmdpw1d3agbq-pdm-2.26.6", + "default": true + }, + { + "name": "dist", + "path": "/nix/store/mr7j2z2q31x8l6z3bl9mz2h3hidb48fz-pdm-2.26.6-dist" + } + ], + "store_path": "/nix/store/yw9jlcrajy1m7n7z9anvnmdpw1d3agbq-pdm-2.26.6" + }, + "x86_64-linux": { + "outputs": [ + { + "name": "out", + "path": "/nix/store/0iv0f8r0lpmnnjxklx7kiivdaxc6x9nm-pdm-2.26.6", + "default": true + }, + { + "name": "dist", + "path": "/nix/store/xldnwp9d766k156iw7s403hpy4q2xdgg-pdm-2.26.6-dist" + } + ], + "store_path": "/nix/store/0iv0f8r0lpmnnjxklx7kiivdaxc6x9nm-pdm-2.26.6" + } + } + }, + "pre-commit@latest": { + "last_modified": "2026-02-23T15:40:43Z", + "resolved": "github:NixOS/nixpkgs/80d901ec0377e19ac3f7bb8c035201e2e098cc97#pre-commit", + "source": "devbox-search", + "version": "4.5.1", + "systems": { + "aarch64-darwin": { + "outputs": [ + { + "name": "out", + "path": "/nix/store/l55n4b26170g382dxchwchs5bb2mm816-pre-commit-4.5.1", + "default": true + }, + { + "name": "dist", + "path": "/nix/store/vx8bcz0p4c4nr57i0kszdnfk3vrxhc4n-pre-commit-4.5.1-dist" + } + ], + "store_path": "/nix/store/l55n4b26170g382dxchwchs5bb2mm816-pre-commit-4.5.1" + }, + "aarch64-linux": { + "outputs": [ + { + "name": "out", + "path": "/nix/store/vry6jkxxy96b4vv8sr2yw2p2llangkd5-pre-commit-4.5.1", + "default": true + }, + { + "name": "dist", + "path": "/nix/store/l94g308gxsvwzil56ssvg0nb55gkjxfj-pre-commit-4.5.1-dist" + } + ], + "store_path": "/nix/store/vry6jkxxy96b4vv8sr2yw2p2llangkd5-pre-commit-4.5.1" + }, + "x86_64-darwin": { + "outputs": [ + { + "name": "out", + "path": "/nix/store/h3g711srm8fn3c12xs638bhrgs7vqml4-pre-commit-4.5.1", + "default": true + }, + { + "name": "dist", + "path": "/nix/store/grbm0lk0i1fqliqj6lhgvymnr2kggvaj-pre-commit-4.5.1-dist" + } + ], + "store_path": "/nix/store/h3g711srm8fn3c12xs638bhrgs7vqml4-pre-commit-4.5.1" + }, + "x86_64-linux": { + "outputs": [ + { + "name": "out", + "path": "/nix/store/j3m430mdag04c150qlr72zbvhmpkb1cz-pre-commit-4.5.1", + "default": true + }, + { + "name": "dist", + "path": "/nix/store/l3z236pck7hx6lz5x4s46xa0vkmjmvsh-pre-commit-4.5.1-dist" + } + ], + "store_path": "/nix/store/j3m430mdag04c150qlr72zbvhmpkb1cz-pre-commit-4.5.1" + } + } + }, + "python@3.12": { + "last_modified": "2026-02-23T15:40:43Z", + "plugin_version": "0.0.4", + "resolved": "github:NixOS/nixpkgs/80d901ec0377e19ac3f7bb8c035201e2e098cc97#python312", + "source": "devbox-search", + "version": "3.12.12", + "systems": { + "aarch64-darwin": { + "outputs": [ + { + "name": "out", + "path": "/nix/store/6m0sga6inpabxm4nh7ab8zvychy66d48-python3-3.12.12", + "default": true + } + ], + "store_path": "/nix/store/6m0sga6inpabxm4nh7ab8zvychy66d48-python3-3.12.12" + }, + "aarch64-linux": { + "outputs": [ + { + "name": "out", + "path": "/nix/store/p3dgpm3z2s0k2sf6838ybrqvz6r89ry2-python3-3.12.12", + "default": true + }, + { + "name": "debug", + "path": "/nix/store/xcz6h6sqxbhg07ccjh2qr2xxrnh4mc70-python3-3.12.12-debug" + } + ], + "store_path": "/nix/store/p3dgpm3z2s0k2sf6838ybrqvz6r89ry2-python3-3.12.12" + }, + "x86_64-darwin": { + "outputs": [ + { + "name": "out", + "path": "/nix/store/ll4yja86q574m1gp3bzzk9wshcbl332k-python3-3.12.12", + "default": true + } + ], + "store_path": "/nix/store/ll4yja86q574m1gp3bzzk9wshcbl332k-python3-3.12.12" + }, + "x86_64-linux": { + "outputs": [ + { + "name": "out", + "path": "/nix/store/flbw79qdmvzbdrafd93avy5a7d29m2vb-python3-3.12.12", + "default": true + }, + { + "name": "debug", + "path": "/nix/store/pwz8rx97fb0laq9scg8zycmyh5xixa4a-python3-3.12.12-debug" + } + ], + "store_path": "/nix/store/flbw79qdmvzbdrafd93avy5a7d29m2vb-python3-3.12.12" + } + } + }, + "ruff@latest": { + "last_modified": "2026-02-23T15:40:43Z", + "resolved": "github:NixOS/nixpkgs/80d901ec0377e19ac3f7bb8c035201e2e098cc97#ruff", + "source": "devbox-search", + "version": "0.15.1", + "systems": { + "aarch64-darwin": { + "outputs": [ + { + "name": "out", + "path": "/nix/store/z4qndhvs1avahvnalx2d7lpld1xn15sd-ruff-0.15.1", + "default": true + } + ], + "store_path": "/nix/store/z4qndhvs1avahvnalx2d7lpld1xn15sd-ruff-0.15.1" + }, + "aarch64-linux": { + "outputs": [ + { + "name": "out", + "path": "/nix/store/g78xly6975js6w0k12ksxfg72i4z9f07-ruff-0.15.1", + "default": true + } + ], + "store_path": "/nix/store/g78xly6975js6w0k12ksxfg72i4z9f07-ruff-0.15.1" + }, + "x86_64-darwin": { + "outputs": [ + { + "name": "out", + "path": "/nix/store/g9cv6b067gzx7swniwahv1wi551mslq1-ruff-0.15.1", + "default": true + } + ], + "store_path": "/nix/store/g9cv6b067gzx7swniwahv1wi551mslq1-ruff-0.15.1" + }, + "x86_64-linux": { + "outputs": [ + { + "name": "out", + "path": "/nix/store/w0712ww7bkq6rrf2a9n8wjnvsf37q810-ruff-0.15.1", + "default": true + } + ], + "store_path": "/nix/store/w0712ww7bkq6rrf2a9n8wjnvsf37q810-ruff-0.15.1" + } + } + }, + "uv@latest": { + "last_modified": "2026-02-23T15:40:43Z", + "resolved": "github:NixOS/nixpkgs/80d901ec0377e19ac3f7bb8c035201e2e098cc97#uv", + "source": "devbox-search", + "version": "0.10.4", + "systems": { + "aarch64-darwin": { + "outputs": [ + { + "name": "out", + "path": "/nix/store/iz3bcbs2pa00l0awp05pfb0x8dlx1ljm-uv-0.10.4", + "default": true + } + ], + "store_path": "/nix/store/iz3bcbs2pa00l0awp05pfb0x8dlx1ljm-uv-0.10.4" + }, + "aarch64-linux": { + "outputs": [ + { + "name": "out", + "path": "/nix/store/d3agwkb703z1j2iccs5p0hyf8nva03fy-uv-0.10.4", + "default": true + } + ], + "store_path": "/nix/store/d3agwkb703z1j2iccs5p0hyf8nva03fy-uv-0.10.4" + }, + "x86_64-darwin": { + "outputs": [ + { + "name": "out", + "path": "/nix/store/vrznmkha6ws0574jhhnxf4czsy3igs8s-uv-0.10.4", + "default": true + } + ], + "store_path": "/nix/store/vrznmkha6ws0574jhhnxf4czsy3igs8s-uv-0.10.4" + }, + "x86_64-linux": { + "outputs": [ + { + "name": "out", + "path": "/nix/store/kwxpv3m0wyyzgpqvm805vlkh2as4asy6-uv-0.10.4", + "default": true + } + ], + "store_path": "/nix/store/kwxpv3m0wyyzgpqvm805vlkh2as4asy6-uv-0.10.4" + } + } + } + } +} diff --git a/pdm.lock b/pdm.lock index b8071e7..f9eda1a 100644 --- a/pdm.lock +++ b/pdm.lock @@ -3,31 +3,26 @@ [metadata] groups = ["default", "dev"] -strategy = ["inherit_metadata"] +strategy = [] lock_version = "4.5.0" -content_hash = "sha256:86150d5573b91103df487cf5fd51723bc45344317025162d81e0f2c3923f363a" +content_hash = "sha256:156028279ae891cca591d8596bd7eeec70235c867534527622147bc9fb96df5f" [[metadata.targets]] -requires_python = ">=3.9.1,<3.13" +requires_python = ">=3.10,<3.13" [[package]] name = "aenum" version = "3.1.16" -summary = "Advanced Enumerations (compatible with Python's stdlib Enum), NamedTuples, and NamedConstants" -groups = ["default"] +summary = "" files = [ {file = "aenum-3.1.16-py3-none-any.whl", hash = "sha256:9035092855a98e41b66e3d0998bd7b96280e85ceb3a04cc035636138a1943eaf"}, + {file = "aenum-3.1.16.tar.gz", hash = "sha256:bfaf9589bdb418ee3a986d85750c7318d9d2839c1b1a1d6fe8fc53ec201cf140"}, ] [[package]] name = "annotated-types" version = "0.7.0" -requires_python = ">=3.8" -summary = "Reusable constraint types to use with typing.Annotated" -groups = ["default"] -dependencies = [ - "typing-extensions>=4.0.0; python_version < \"3.9\"", -] +summary = "" files = [ {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, @@ -36,14 +31,12 @@ files = [ [[package]] name = "anyio" version = "4.9.0" -requires_python = ">=3.9" -summary = "High level compatibility layer for multiple asynchronous event loop implementations" -groups = ["default"] +summary = "" dependencies = [ - "exceptiongroup>=1.0.2; python_version < \"3.11\"", - "idna>=2.8", - "sniffio>=1.1", - "typing-extensions>=4.5; python_version < \"3.13\"", + "exceptiongroup; python_full_version < \"3.11\"", + "idna", + "sniffio", + "typing-extensions", ] files = [ {file = "anyio-4.9.0-py3-none-any.whl", hash = "sha256:9f76d541cad6e36af7beb62e978876f3b41e3e04f2c1fbf0884604c0a9c4d93c"}, @@ -53,10 +46,7 @@ files = [ [[package]] name = "appnope" version = "0.1.4" -requires_python = ">=3.6" -summary = "Disable App Nap on macOS >= 10.9" -groups = ["dev"] -marker = "platform_system == \"Darwin\"" +summary = "" files = [ {file = "appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c"}, {file = "appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee"}, @@ -65,9 +55,7 @@ files = [ [[package]] name = "argon2-cffi" version = "25.1.0" -requires_python = ">=3.8" -summary = "Argon2 for Python" -groups = ["default"] +summary = "" dependencies = [ "argon2-cffi-bindings", ] @@ -79,11 +67,9 @@ files = [ [[package]] name = "argon2-cffi-bindings" version = "21.2.0" -requires_python = ">=3.6" -summary = "Low-level CFFI bindings for Argon2" -groups = ["default"] +summary = "" dependencies = [ - "cffi>=1.0.1", + "cffi", ] files = [ {file = "argon2-cffi-bindings-21.2.0.tar.gz", hash = "sha256:bb89ceffa6c791807d1305ceb77dbfacc5aa499891d2c55661c6459651fc39e3"}, @@ -102,9 +88,7 @@ files = [ [[package]] name = "asttokens" version = "3.0.0" -requires_python = ">=3.8" -summary = "Annotate AST trees with source code positions" -groups = ["dev"] +summary = "" files = [ {file = "asttokens-3.0.0-py3-none-any.whl", hash = "sha256:e3078351a059199dd5138cb1c706e6430c05eff2ff136af5eb4790f9d28932e2"}, {file = "asttokens-3.0.0.tar.gz", hash = "sha256:0dcd8baa8d62b0c1d118b399b2ddba3c4aff271d0d7a9e0d4c1681c79035bbc7"}, @@ -113,9 +97,7 @@ files = [ [[package]] name = "certifi" version = "2025.6.15" -requires_python = ">=3.7" -summary = "Python package for providing Mozilla's CA Bundle." -groups = ["default"] +summary = "" files = [ {file = "certifi-2025.6.15-py3-none-any.whl", hash = "sha256:2e0c7ce7cb5d8f8634ca55d2ba7e6ec2689a2fd6537d8dec1296a477a4910057"}, {file = "certifi-2025.6.15.tar.gz", hash = "sha256:d747aa5a8b9bbbb1bb8c22bb13e22bd1f18e9796defa16bab421f7f7a317323b"}, @@ -124,9 +106,7 @@ files = [ [[package]] name = "cffi" version = "1.17.1" -requires_python = ">=3.8" -summary = "Foreign Function Interface for Python calling C code." -groups = ["default", "dev"] +summary = "" dependencies = [ "pycparser", ] @@ -166,38 +146,13 @@ files = [ {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8"}, {file = "cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65"}, {file = "cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903"}, - {file = "cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e"}, - {file = "cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2"}, - {file = "cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3"}, - {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683"}, - {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5"}, - {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4"}, - {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd"}, - {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed"}, - {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9"}, - {file = "cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d"}, - {file = "cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a"}, - {file = "cffi-1.17.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16"}, - {file = "cffi-1.17.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36"}, - {file = "cffi-1.17.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8"}, - {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576"}, - {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87"}, - {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0"}, - {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3"}, - {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595"}, - {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a"}, - {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e"}, - {file = "cffi-1.17.1-cp39-cp39-win32.whl", hash = "sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7"}, - {file = "cffi-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662"}, {file = "cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824"}, ] [[package]] name = "cfgv" version = "3.4.0" -requires_python = ">=3.8" -summary = "Validate configuration and produce human readable error messages." -groups = ["dev"] +summary = "" files = [ {file = "cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9"}, {file = "cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560"}, @@ -206,9 +161,7 @@ files = [ [[package]] name = "charset-normalizer" version = "3.4.2" -requires_python = ">=3.7" -summary = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -groups = ["default"] +summary = "" files = [ {file = "charset_normalizer-3.4.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7c48ed483eb946e6c04ccbe02c6b4d1d48e51944b6db70f697e089c193404941"}, {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2d318c11350e10662026ad0eb71bb51c7812fc8590825304ae0bdd4ac283acd"}, @@ -249,32 +202,6 @@ files = [ {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dedb8adb91d11846ee08bec4c8236c8549ac721c245678282dcb06b221aab59f"}, {file = "charset_normalizer-3.4.2-cp312-cp312-win32.whl", hash = "sha256:db4c7bf0e07fc3b7d89ac2a5880a6a8062056801b83ff56d8464b70f65482b6c"}, {file = "charset_normalizer-3.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:5a9979887252a82fefd3d3ed2a8e3b937a7a809f65dcb1e068b090e165bbe99e"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:926ca93accd5d36ccdabd803392ddc3e03e6d4cd1cf17deff3b989ab8e9dbcf0"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eba9904b0f38a143592d9fc0e19e2df0fa2e41c3c3745554761c5f6447eedabf"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3fddb7e2c84ac87ac3a947cb4e66d143ca5863ef48e4a5ecb83bd48619e4634e"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98f862da73774290f251b9df8d11161b6cf25b599a66baf087c1ffe340e9bfd1"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c9379d65defcab82d07b2a9dfbfc2e95bc8fe0ebb1b176a3190230a3ef0e07c"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e635b87f01ebc977342e2697d05b56632f5f879a4f15955dfe8cef2448b51691"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1c95a1e2902a8b722868587c0e1184ad5c55631de5afc0eb96bc4b0d738092c0"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ef8de666d6179b009dce7bcb2ad4c4a779f113f12caf8dc77f0162c29d20490b"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:32fc0341d72e0f73f80acb0a2c94216bd704f4f0bce10aedea38f30502b271ff"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:289200a18fa698949d2b39c671c2cc7a24d44096784e76614899a7ccf2574b7b"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4a476b06fbcf359ad25d34a057b7219281286ae2477cc5ff5e3f70a246971148"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-win32.whl", hash = "sha256:aaeeb6a479c7667fbe1099af9617c83aaca22182d6cf8c53966491a0f1b7ffb7"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-win_amd64.whl", hash = "sha256:aa6af9e7d59f9c12b33ae4e9450619cf2488e2bbe9b44030905877f0b2324980"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:005fa3432484527f9732ebd315da8da8001593e2cf46a3d817669f062c3d9ed4"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e92fca20c46e9f5e1bb485887d074918b13543b1c2a1185e69bb8d17ab6236a7"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:50bf98d5e563b83cc29471fa114366e6806bc06bc7a25fd59641e41445327836"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:721c76e84fe669be19c5791da68232ca2e05ba5185575086e384352e2c309597"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82d8fd25b7f4675d0c47cf95b594d4e7b158aca33b76aa63d07186e13c0e0ab7"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3daeac64d5b371dea99714f08ffc2c208522ec6b06fbc7866a450dd446f5c0f"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:dccab8d5fa1ef9bfba0590ecf4d46df048d18ffe3eec01eeb73a42e0d9e7a8ba"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:aaf27faa992bfee0264dc1f03f4c75e9fcdda66a519db6b957a3f826e285cf12"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:eb30abc20df9ab0814b5a2524f23d75dcf83cde762c161917a2b4b7b55b1e518"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:c72fbbe68c6f32f251bdc08b8611c7b3060612236e960ef848e0a517ddbe76c5"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:982bb1e8b4ffda883b3d0a521e23abcd6fd17418f6d2c4118d257a10199c0ce3"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-win32.whl", hash = "sha256:43e0933a0eff183ee85833f341ec567c0980dae57c464d8a508e1b2ceb336471"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:d11b54acf878eef558599658b0ffca78138c8c3655cf4f3a4a673c437e67732e"}, {file = "charset_normalizer-3.4.2-py3-none-any.whl", hash = "sha256:7f56930ab0abd1c45cd15be65cc741c28b1c9a34876ce8c17a2fa107810c0af0"}, {file = "charset_normalizer-3.4.2.tar.gz", hash = "sha256:5baececa9ecba31eff645232d59845c07aa030f0c81ee70184a90d35099a0e63"}, ] @@ -282,12 +209,10 @@ files = [ [[package]] name = "classy-fastapi" version = "0.7.0" -requires_python = ">=3.9" -summary = "Class based routing for FastAPI" -groups = ["default"] +summary = "" dependencies = [ - "fastapi<1.0.0,>=0.73.0", - "pydantic<3.0.0,>=2.8", + "fastapi", + "pydantic", ] files = [ {file = "classy_fastapi-0.7.0-py3-none-any.whl", hash = "sha256:eea211181d065fecb543d68b75a6a6ab93393bb7ca48551887fa898ba7d40ec3"}, @@ -297,12 +222,9 @@ files = [ [[package]] name = "click" version = "8.1.8" -requires_python = ">=3.7" -summary = "Composable command line interface toolkit" -groups = ["default"] +summary = "" dependencies = [ - "colorama; platform_system == \"Windows\"", - "importlib-metadata; python_version < \"3.8\"", + "colorama; sys_platform == \"win32\"", ] files = [ {file = "click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2"}, @@ -312,10 +234,7 @@ files = [ [[package]] name = "colorama" version = "0.4.6" -requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" -summary = "Cross-platform colored terminal text." -groups = ["default", "dev"] -marker = "platform_system == \"Windows\" or sys_platform == \"win32\"" +summary = "" files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, @@ -324,11 +243,9 @@ files = [ [[package]] name = "comm" version = "0.2.2" -requires_python = ">=3.8" -summary = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc." -groups = ["dev"] +summary = "" dependencies = [ - "traitlets>=4", + "traitlets", ] files = [ {file = "comm-0.2.2-py3-none-any.whl", hash = "sha256:e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3"}, @@ -338,9 +255,7 @@ files = [ [[package]] name = "debugpy" version = "1.8.14" -requires_python = ">=3.8" -summary = "An implementation of the Debug Adapter Protocol for Python" -groups = ["dev"] +summary = "" files = [ {file = "debugpy-1.8.14-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:93fee753097e85623cab1c0e6a68c76308cd9f13ffdf44127e6fab4fbf024339"}, {file = "debugpy-1.8.14-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d937d93ae4fa51cdc94d3e865f535f185d5f9748efb41d0d49e33bf3365bd79"}, @@ -354,14 +269,6 @@ files = [ {file = "debugpy-1.8.14-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6bb5c0dcf80ad5dbc7b7d6eac484e2af34bdacdf81df09b6a3e62792b722826"}, {file = "debugpy-1.8.14-cp312-cp312-win32.whl", hash = "sha256:281d44d248a0e1791ad0eafdbbd2912ff0de9eec48022a5bfbc332957487ed3f"}, {file = "debugpy-1.8.14-cp312-cp312-win_amd64.whl", hash = "sha256:5aa56ef8538893e4502a7d79047fe39b1dae08d9ae257074c6464a7b290b806f"}, - {file = "debugpy-1.8.14-cp313-cp313-macosx_14_0_universal2.whl", hash = "sha256:329a15d0660ee09fec6786acdb6e0443d595f64f5d096fc3e3ccf09a4259033f"}, - {file = "debugpy-1.8.14-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f920c7f9af409d90f5fd26e313e119d908b0dd2952c2393cd3247a462331f15"}, - {file = "debugpy-1.8.14-cp313-cp313-win32.whl", hash = "sha256:3784ec6e8600c66cbdd4ca2726c72d8ca781e94bce2f396cc606d458146f8f4e"}, - {file = "debugpy-1.8.14-cp313-cp313-win_amd64.whl", hash = "sha256:684eaf43c95a3ec39a96f1f5195a7ff3d4144e4a18d69bb66beeb1a6de605d6e"}, - {file = "debugpy-1.8.14-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:413512d35ff52c2fb0fd2d65e69f373ffd24f0ecb1fac514c04a668599c5ce7f"}, - {file = "debugpy-1.8.14-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c9156f7524a0d70b7a7e22b2e311d8ba76a15496fb00730e46dcdeedb9e1eea"}, - {file = "debugpy-1.8.14-cp39-cp39-win32.whl", hash = "sha256:b44985f97cc3dd9d52c42eb59ee9d7ee0c4e7ecd62bca704891f997de4cef23d"}, - {file = "debugpy-1.8.14-cp39-cp39-win_amd64.whl", hash = "sha256:b1528cfee6c1b1c698eb10b6b096c598738a8238822d218173d21c3086de8123"}, {file = "debugpy-1.8.14-py2.py3-none-any.whl", hash = "sha256:5cd9a579d553b6cb9759a7908a41988ee6280b961f24f63336835d9418216a20"}, {file = "debugpy-1.8.14.tar.gz", hash = "sha256:7cd287184318416850aa8b60ac90105837bb1e59531898c07569d197d2ed5322"}, ] @@ -369,9 +276,7 @@ files = [ [[package]] name = "decorator" version = "5.2.1" -requires_python = ">=3.8" -summary = "Decorators for Humans" -groups = ["dev"] +summary = "" files = [ {file = "decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a"}, {file = "decorator-5.2.1.tar.gz", hash = "sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360"}, @@ -380,9 +285,7 @@ files = [ [[package]] name = "dill" version = "0.4.0" -requires_python = ">=3.8" -summary = "serialize all of Python" -groups = ["default"] +summary = "" files = [ {file = "dill-0.4.0-py3-none-any.whl", hash = "sha256:44f54bf6412c2c8464c14e8243eb163690a9800dbe2c367330883b19c7561049"}, {file = "dill-0.4.0.tar.gz", hash = "sha256:0633f1d2df477324f53a895b02c901fb961bdbf65a17122586ea7019292cbcf0"}, @@ -391,8 +294,7 @@ files = [ [[package]] name = "distlib" version = "0.4.0" -summary = "Distribution utilities" -groups = ["dev"] +summary = "" files = [ {file = "distlib-0.4.0-py2.py3-none-any.whl", hash = "sha256:9659f7d87e46584a30b5780e43ac7a2143098441670ff0a49d5f9034c54a6c16"}, {file = "distlib-0.4.0.tar.gz", hash = "sha256:feec40075be03a04501a973d81f633735b4b69f98b05450592310c0f401a4e0d"}, @@ -401,9 +303,7 @@ files = [ [[package]] name = "dnspython" version = "2.7.0" -requires_python = ">=3.9" -summary = "DNS toolkit" -groups = ["default"] +summary = "" files = [ {file = "dnspython-2.7.0-py3-none-any.whl", hash = "sha256:b4c34b7d10b51bcc3a5071e7b8dee77939f1e878477eeecc965e9835f63c6c86"}, {file = "dnspython-2.7.0.tar.gz", hash = "sha256:ce9c432eda0dc91cf618a5cedf1a4e142651196bbcd2c80e89ed5a907e5cfaf1"}, @@ -412,10 +312,7 @@ files = [ [[package]] name = "evdev" version = "1.9.2" -requires_python = ">=3.8" -summary = "Bindings to the Linux input handling subsystem" -groups = ["default"] -marker = "\"linux\" in sys_platform" +summary = "" files = [ {file = "evdev-1.9.2.tar.gz", hash = "sha256:5d3278892ce1f92a74d6bf888cc8525d9f68af85dbe336c95d1c87fb8f423069"}, ] @@ -423,12 +320,9 @@ files = [ [[package]] name = "exceptiongroup" version = "1.3.0" -requires_python = ">=3.7" -summary = "Backport of PEP 654 (exception groups)" -groups = ["default", "dev"] -marker = "python_version < \"3.11\"" +summary = "" dependencies = [ - "typing-extensions>=4.6.0; python_version < \"3.13\"", + "typing-extensions", ] files = [ {file = "exceptiongroup-1.3.0-py3-none-any.whl", hash = "sha256:4d111e6e0c13d0644cad6ddaa7ed0261a0b36971f6d23e7ec9b4b9097da78a10"}, @@ -438,9 +332,7 @@ files = [ [[package]] name = "executing" version = "2.2.0" -requires_python = ">=3.8" -summary = "Get the currently executing AST node of a frame, and other information" -groups = ["dev"] +summary = "" files = [ {file = "executing-2.2.0-py2.py3-none-any.whl", hash = "sha256:11387150cad388d62750327a53d3339fad4888b39a6fe233c3afbb54ecffd3aa"}, {file = "executing-2.2.0.tar.gz", hash = "sha256:5d108c028108fe2551d1a7b2e8b713341e2cb4fc0aa7dcf966fa4327a5226755"}, @@ -449,13 +341,11 @@ files = [ [[package]] name = "fastapi" version = "0.115.13" -requires_python = ">=3.8" -summary = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" -groups = ["default"] +summary = "" dependencies = [ - "pydantic!=1.8,!=1.8.1,!=2.0.0,!=2.0.1,!=2.1.0,<3.0.0,>=1.7.4", - "starlette<0.47.0,>=0.40.0", - "typing-extensions>=4.8.0", + "pydantic", + "starlette", + "typing-extensions", ] files = [ {file = "fastapi-0.115.13-py3-none-any.whl", hash = "sha256:0a0cab59afa7bab22f5eb347f8c9864b681558c278395e94035a741fc10cd865"}, @@ -465,9 +355,7 @@ files = [ [[package]] name = "filelock" version = "3.19.1" -requires_python = ">=3.9" -summary = "A platform independent file lock." -groups = ["dev"] +summary = "" files = [ {file = "filelock-3.19.1-py3-none-any.whl", hash = "sha256:d38e30481def20772f5baf097c122c3babc4fcdb7e14e57049eb9d88c6dc017d"}, {file = "filelock-3.19.1.tar.gz", hash = "sha256:66eda1888b0171c998b35be2bcc0f6d75c388a7ce20c3f3f37aa8e96c2dddf58"}, @@ -476,15 +364,11 @@ files = [ [[package]] name = "greenlet" version = "3.2.3" -requires_python = ">=3.9" -summary = "Lightweight in-process concurrent programming" -groups = ["default"] -marker = "(platform_machine == \"win32\" or platform_machine == \"WIN32\" or platform_machine == \"AMD64\" or platform_machine == \"amd64\" or platform_machine == \"x86_64\" or platform_machine == \"ppc64le\" or platform_machine == \"aarch64\") and python_version < \"3.14\"" +summary = "" files = [ {file = "greenlet-3.2.3-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:1afd685acd5597349ee6d7a88a8bec83ce13c106ac78c196ee9dde7c04fe87be"}, {file = "greenlet-3.2.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:761917cac215c61e9dc7324b2606107b3b292a8349bdebb31503ab4de3f559ac"}, {file = "greenlet-3.2.3-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:a433dbc54e4a37e4fff90ef34f25a8c00aed99b06856f0119dcf09fbafa16392"}, - {file = "greenlet-3.2.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:72e77ed69312bab0434d7292316d5afd6896192ac4327d44f3d613ecb85b037c"}, {file = "greenlet-3.2.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:68671180e3849b963649254a882cd544a3c75bfcd2c527346ad8bb53494444db"}, {file = "greenlet-3.2.3-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:49c8cfb18fb419b3d08e011228ef8a25882397f3a859b9fe1436946140b6756b"}, {file = "greenlet-3.2.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:efc6dc8a792243c31f2f5674b670b3a95d46fa1c6a912b8e310d6f542e7b0712"}, @@ -493,7 +377,6 @@ files = [ {file = "greenlet-3.2.3-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:784ae58bba89fa1fa5733d170d42486580cab9decda3484779f4759345b29822"}, {file = "greenlet-3.2.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0921ac4ea42a5315d3446120ad48f90c3a6b9bb93dd9b3cf4e4d84a66e42de83"}, {file = "greenlet-3.2.3-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:d2971d93bb99e05f8c2c0c2f4aa9484a18d98c4c3bd3c62b65b7e6ae33dfcfaf"}, - {file = "greenlet-3.2.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:c667c0bf9d406b77a15c924ef3285e1e05250948001220368e039b6aa5b5034b"}, {file = "greenlet-3.2.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:592c12fb1165be74592f5de0d70f82bc5ba552ac44800d632214b76089945147"}, {file = "greenlet-3.2.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:29e184536ba333003540790ba29829ac14bb645514fbd7e32af331e8202a62a5"}, {file = "greenlet-3.2.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:93c0bb79844a367782ec4f429d07589417052e621aa39a5ac1fb99c5aa308edc"}, @@ -502,58 +385,40 @@ files = [ {file = "greenlet-3.2.3-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:25ad29caed5783d4bd7a85c9251c651696164622494c00802a139c00d639242d"}, {file = "greenlet-3.2.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:88cd97bf37fe24a6710ec6a3a7799f3f81d9cd33317dcf565ff9950c83f55e0b"}, {file = "greenlet-3.2.3-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:baeedccca94880d2f5666b4fa16fc20ef50ba1ee353ee2d7092b383a243b0b0d"}, - {file = "greenlet-3.2.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:be52af4b6292baecfa0f397f3edb3c6092ce071b499dd6fe292c9ac9f2c8f264"}, {file = "greenlet-3.2.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0cc73378150b8b78b0c9fe2ce56e166695e67478550769536a6742dca3651688"}, {file = "greenlet-3.2.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:706d016a03e78df129f68c4c9b4c4f963f7d73534e48a24f5f5a7101ed13dbbb"}, {file = "greenlet-3.2.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:419e60f80709510c343c57b4bb5a339d8767bf9aef9b8ce43f4f143240f88b7c"}, {file = "greenlet-3.2.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:93d48533fade144203816783373f27a97e4193177ebaaf0fc396db19e5d61163"}, {file = "greenlet-3.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:7454d37c740bb27bdeddfc3f358f26956a07d5220818ceb467a483197d84f849"}, - {file = "greenlet-3.2.3-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:500b8689aa9dd1ab26872a34084503aeddefcb438e2e7317b89b11eaea1901ad"}, - {file = "greenlet-3.2.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a07d3472c2a93117af3b0136f246b2833fdc0b542d4a9799ae5f41c28323faef"}, - {file = "greenlet-3.2.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:8704b3768d2f51150626962f4b9a9e4a17d2e37c8a8d9867bbd9fa4eb938d3b3"}, - {file = "greenlet-3.2.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:5035d77a27b7c62db6cf41cf786cfe2242644a7a337a0e155c80960598baab95"}, - {file = "greenlet-3.2.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2d8aa5423cd4a396792f6d4580f88bdc6efcb9205891c9d40d20f6e670992efb"}, - {file = "greenlet-3.2.3-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2c724620a101f8170065d7dded3f962a2aea7a7dae133a009cada42847e04a7b"}, - {file = "greenlet-3.2.3-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:873abe55f134c48e1f2a6f53f7d1419192a3d1a4e873bace00499a4e45ea6af0"}, - {file = "greenlet-3.2.3-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:024571bbce5f2c1cfff08bf3fbaa43bbc7444f580ae13b0099e95d0e6e67ed36"}, - {file = "greenlet-3.2.3-cp313-cp313-win_amd64.whl", hash = "sha256:5195fb1e75e592dd04ce79881c8a22becdfa3e6f500e7feb059b1e6fdd54d3e3"}, - {file = "greenlet-3.2.3-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:3d04332dddb10b4a211b68111dabaee2e1a073663d117dc10247b5b1642bac86"}, - {file = "greenlet-3.2.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8186162dffde068a465deab08fc72c767196895c39db26ab1c17c0b77a6d8b97"}, - {file = "greenlet-3.2.3-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f4bfbaa6096b1b7a200024784217defedf46a07c2eee1a498e94a1b5f8ec5728"}, - {file = "greenlet-3.2.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:ed6cfa9200484d234d8394c70f5492f144b20d4533f69262d530a1a082f6ee9a"}, - {file = "greenlet-3.2.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:02b0df6f63cd15012bed5401b47829cfd2e97052dc89da3cfaf2c779124eb892"}, - {file = "greenlet-3.2.3-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:86c2d68e87107c1792e2e8d5399acec2487a4e993ab76c792408e59394d52141"}, - {file = "greenlet-3.2.3-cp314-cp314-win_amd64.whl", hash = "sha256:8c47aae8fbbfcf82cc13327ae802ba13c9c36753b67e760023fd116bc124a62a"}, - {file = "greenlet-3.2.3-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:42efc522c0bd75ffa11a71e09cd8a399d83fafe36db250a87cf1dacfaa15dc64"}, - {file = "greenlet-3.2.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d760f9bdfe79bff803bad32b4d8ffb2c1d2ce906313fc10a83976ffb73d64ca7"}, - {file = "greenlet-3.2.3-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:8324319cbd7b35b97990090808fdc99c27fe5338f87db50514959f8059999805"}, - {file = "greenlet-3.2.3-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:8c37ef5b3787567d322331d5250e44e42b58c8c713859b8a04c6065f27efbf72"}, - {file = "greenlet-3.2.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ce539fb52fb774d0802175d37fcff5c723e2c7d249c65916257f0a940cee8904"}, - {file = "greenlet-3.2.3-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:003c930e0e074db83559edc8705f3a2d066d4aa8c2f198aff1e454946efd0f26"}, - {file = "greenlet-3.2.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7e70ea4384b81ef9e84192e8a77fb87573138aa5d4feee541d8014e452b434da"}, - {file = "greenlet-3.2.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:22eb5ba839c4b2156f18f76768233fe44b23a31decd9cc0d4cc8141c211fd1b4"}, - {file = "greenlet-3.2.3-cp39-cp39-win32.whl", hash = "sha256:4532f0d25df67f896d137431b13f4cdce89f7e3d4a96387a41290910df4d3a57"}, - {file = "greenlet-3.2.3-cp39-cp39-win_amd64.whl", hash = "sha256:aaa7aae1e7f75eaa3ae400ad98f8644bb81e1dc6ba47ce8a93d3f17274e08322"}, {file = "greenlet-3.2.3.tar.gz", hash = "sha256:8b0dd8ae4c0d6f5e54ee55ba935eeb3d735a9b58a8a1e5b5cbab64e01a39f365"}, ] [[package]] name = "h11" version = "0.16.0" -requires_python = ">=3.8" -summary = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" -groups = ["default"] +summary = "" files = [ {file = "h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86"}, {file = "h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1"}, ] +[[package]] +name = "httpcore" +version = "1.0.9" +summary = "" +dependencies = [ + "certifi", + "h11", +] +files = [ + {file = "httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55"}, + {file = "httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8"}, +] + [[package]] name = "httptools" version = "0.6.4" -requires_python = ">=3.8.0" -summary = "A collection of framework independent HTTP protocol utils." -groups = ["default"] +summary = "" files = [ {file = "httptools-0.6.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3c73ce323711a6ffb0d247dcd5a550b8babf0f757e86a52558fe5b86d6fefcc0"}, {file = "httptools-0.6.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:345c288418f0944a6fe67be8e6afa9262b18c7626c3ef3c28adc5eabc06a68da"}, @@ -576,29 +441,28 @@ files = [ {file = "httptools-0.6.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ec4f178901fa1834d4a060320d2f3abc5c9e39766953d038f1458cb885f47e81"}, {file = "httptools-0.6.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f9eb89ecf8b290f2e293325c646a211ff1c2493222798bb80a530c5e7502494f"}, {file = "httptools-0.6.4-cp312-cp312-win_amd64.whl", hash = "sha256:db78cb9ca56b59b016e64b6031eda5653be0589dba2b1b43453f6e8b405a0970"}, - {file = "httptools-0.6.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ade273d7e767d5fae13fa637f4d53b6e961fb7fd93c7797562663f0171c26660"}, - {file = "httptools-0.6.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:856f4bc0478ae143bad54a4242fccb1f3f86a6e1be5548fecfd4102061b3a083"}, - {file = "httptools-0.6.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:322d20ea9cdd1fa98bd6a74b77e2ec5b818abdc3d36695ab402a0de8ef2865a3"}, - {file = "httptools-0.6.4-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4d87b29bd4486c0093fc64dea80231f7c7f7eb4dc70ae394d70a495ab8436071"}, - {file = "httptools-0.6.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:342dd6946aa6bda4b8f18c734576106b8a31f2fe31492881a9a160ec84ff4bd5"}, - {file = "httptools-0.6.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4b36913ba52008249223042dca46e69967985fb4051951f94357ea681e1f5dc0"}, - {file = "httptools-0.6.4-cp313-cp313-win_amd64.whl", hash = "sha256:28908df1b9bb8187393d5b5db91435ccc9c8e891657f9cbb42a2541b44c82fc8"}, - {file = "httptools-0.6.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:85797e37e8eeaa5439d33e556662cc370e474445d5fab24dcadc65a8ffb04003"}, - {file = "httptools-0.6.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:db353d22843cf1028f43c3651581e4bb49374d85692a85f95f7b9a130e1b2cab"}, - {file = "httptools-0.6.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1ffd262a73d7c28424252381a5b854c19d9de5f56f075445d33919a637e3547"}, - {file = "httptools-0.6.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:703c346571fa50d2e9856a37d7cd9435a25e7fd15e236c397bf224afaa355fe9"}, - {file = "httptools-0.6.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:aafe0f1918ed07b67c1e838f950b1c1fabc683030477e60b335649b8020e1076"}, - {file = "httptools-0.6.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:0e563e54979e97b6d13f1bbc05a96109923e76b901f786a5eae36e99c01237bd"}, - {file = "httptools-0.6.4-cp39-cp39-win_amd64.whl", hash = "sha256:b799de31416ecc589ad79dd85a0b2657a8fe39327944998dea368c1d4c9e55e6"}, {file = "httptools-0.6.4.tar.gz", hash = "sha256:4e93eee4add6493b59a5c514da98c939b244fce4a0d8879cd3f466562f4b7d5c"}, ] +[[package]] +name = "httpx" +version = "0.28.1" +summary = "" +dependencies = [ + "anyio", + "certifi", + "httpcore", + "idna", +] +files = [ + {file = "httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad"}, + {file = "httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc"}, +] + [[package]] name = "identify" version = "2.6.15" -requires_python = ">=3.9" -summary = "File identification library for Python" -groups = ["dev"] +summary = "" files = [ {file = "identify-2.6.15-py2.py3-none-any.whl", hash = "sha256:1181ef7608e00704db228516541eb83a88a9f94433a8c80bb9b5bd54b1d81757"}, {file = "identify-2.6.15.tar.gz", hash = "sha256:e4f4864b96c6557ef2a1e1c951771838f4edc9df3a72ec7118b338801b11c7bf"}, @@ -607,9 +471,7 @@ files = [ [[package]] name = "idna" version = "3.10" -requires_python = ">=3.6" -summary = "Internationalized Domain Names in Applications (IDNA)" -groups = ["default"] +summary = "" files = [ {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, @@ -618,13 +480,9 @@ files = [ [[package]] name = "importlib-metadata" version = "8.7.0" -requires_python = ">=3.9" -summary = "Read metadata from Python packages" -groups = ["dev"] -marker = "python_version < \"3.10\"" +summary = "" dependencies = [ - "typing-extensions>=3.6.4; python_version < \"3.8\"", - "zipp>=3.20", + "zipp", ] files = [ {file = "importlib_metadata-8.7.0-py3-none-any.whl", hash = "sha256:e5dd1551894c77868a30651cef00984d50e1002d06942a7101d34870c5f02afd"}, @@ -634,23 +492,21 @@ files = [ [[package]] name = "ipykernel" version = "6.29.5" -requires_python = ">=3.8" -summary = "IPython Kernel for Jupyter" -groups = ["dev"] +summary = "" dependencies = [ - "appnope; platform_system == \"Darwin\"", - "comm>=0.1.1", - "debugpy>=1.6.5", - "ipython>=7.23.1", - "jupyter-client>=6.1.12", - "jupyter-core!=5.0.*,>=4.12", - "matplotlib-inline>=0.1", + "appnope; sys_platform == \"darwin\"", + "comm", + "debugpy", + "ipython", + "jupyter-client", + "jupyter-core", + "matplotlib-inline", "nest-asyncio", "packaging", "psutil", - "pyzmq>=24", - "tornado>=6.1", - "traitlets>=5.4.0", + "pyzmq", + "tornado", + "traitlets", ] files = [ {file = "ipykernel-6.29.5-py3-none-any.whl", hash = "sha256:afdb66ba5aa354b09b91379bac28ae4afebbb30e8b39510c9690afb7a10421b5"}, @@ -660,21 +516,18 @@ files = [ [[package]] name = "ipython" version = "8.18.1" -requires_python = ">=3.9" -summary = "IPython: Productive Interactive Computing" -groups = ["dev"] +summary = "" dependencies = [ "colorama; sys_platform == \"win32\"", "decorator", - "exceptiongroup; python_version < \"3.11\"", - "jedi>=0.16", + "exceptiongroup; python_full_version < \"3.11\"", + "jedi", "matplotlib-inline", - "pexpect>4.3; sys_platform != \"win32\"", - "prompt-toolkit<3.1.0,>=3.0.41", - "pygments>=2.4.0", + "pexpect; sys_platform != \"win32\"", + "prompt-toolkit", + "pygments", "stack-data", - "traitlets>=5", - "typing-extensions; python_version < \"3.10\"", + "traitlets", ] files = [ {file = "ipython-8.18.1-py3-none-any.whl", hash = "sha256:e8267419d72d81955ec1177f8a29aaa90ac80ad647499201119e2f05e99aa397"}, @@ -684,11 +537,9 @@ files = [ [[package]] name = "jedi" version = "0.19.2" -requires_python = ">=3.6" -summary = "An autocompletion tool for Python that can be used for text editors." -groups = ["dev"] +summary = "" dependencies = [ - "parso<0.9.0,>=0.8.4", + "parso", ] files = [ {file = "jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9"}, @@ -698,16 +549,13 @@ files = [ [[package]] name = "jupyter-client" version = "8.6.3" -requires_python = ">=3.8" -summary = "Jupyter protocol implementation and client libraries" -groups = ["dev"] +summary = "" dependencies = [ - "importlib-metadata>=4.8.3; python_version < \"3.10\"", - "jupyter-core!=5.0.*,>=4.12", - "python-dateutil>=2.8.2", - "pyzmq>=23.0", - "tornado>=6.2", - "traitlets>=5.3", + "jupyter-core", + "python-dateutil", + "pyzmq", + "tornado", + "traitlets", ] files = [ {file = "jupyter_client-8.6.3-py3-none-any.whl", hash = "sha256:e8a19cc986cc45905ac3362915f410f3af85424b4c0905e94fa5f2cb08e8f23f"}, @@ -717,13 +565,11 @@ files = [ [[package]] name = "jupyter-core" version = "5.8.1" -requires_python = ">=3.8" -summary = "Jupyter core package. A base package on which Jupyter projects rely." -groups = ["dev"] +summary = "" dependencies = [ - "platformdirs>=2.5", - "pywin32>=300; sys_platform == \"win32\" and platform_python_implementation != \"PyPy\"", - "traitlets>=5.3", + "platformdirs", + "pywin32; platform_python_implementation != \"PyPy\" and sys_platform == \"win32\"", + "traitlets", ] files = [ {file = "jupyter_core-5.8.1-py3-none-any.whl", hash = "sha256:c28d268fc90fb53f1338ded2eb410704c5449a358406e8a948b75706e24863d0"}, @@ -733,9 +579,7 @@ files = [ [[package]] name = "linkify-it-py" version = "2.0.3" -requires_python = ">=3.7" -summary = "Links recognition library with FULL unicode support." -groups = ["default"] +summary = "" dependencies = [ "uc-micro-py", ] @@ -746,76 +590,78 @@ files = [ [[package]] name = "madsci-client" -version = "0.5.0" -requires_python = ">=3.9.1" -summary = "The Modular Autonomous Discovery for Science (MADSci) Python Client and CLI." -groups = ["default"] +version = "0.7.0rc1" +summary = "" dependencies = [ - "click>=8.1.7", + "click", + "httpx", "madsci-common", - "minio>=7.1.0", - "trogon>=0.6.0", + "minio", + "opentelemetry-api", + "rich", + "structlog", + "trogon", ] files = [ - {file = "madsci_client-0.5.0-py3-none-any.whl", hash = "sha256:350f63132a8a64a0c238e0b9d946b4a65cf03e744c2971d4fb3ff4e58d9f36fb"}, - {file = "madsci_client-0.5.0.tar.gz", hash = "sha256:1f7eb89ff83d20042f0d6b5d22a0a893cc535a3948c2e7bf487bbea259d3b946"}, + {file = "madsci_client-0.7.0rc1-py3-none-any.whl", hash = "sha256:043193f976b691b1dada2b2f31782338157a95fbf0c541a18f35585f266fda62"}, + {file = "madsci_client-0.7.0rc1.tar.gz", hash = "sha256:c2a9fd1cf470b1d24f3f0372f309b55d953cda1335471e9cb342ec35eb3d9e2a"}, ] [[package]] name = "madsci-common" -version = "0.5.0" -requires_python = ">=3.9.1" -summary = "The Modular Autonomous Discovery for Science (MADSci) Common Definitions and Utilities." -groups = ["default"] +version = "0.7.0rc1" +summary = "" dependencies = [ - "PyYAML>=6.0.2", - "aenum>=3.1.15", - "classy-fastapi>=0.7.0", - "fastapi>=0.115.4", - "multiprocess>=0.70.17", - "pydantic-extra-types>=2.10.2", - "pydantic-settings-export>=1.0.2", - "pydantic-settings>=2.9.1", - "pydantic>=2.10", - "pymongo>=4.10.1", - "python-dotenv>=1.0.1", - "python-multipart>=0.0.17", - "python-ulid[pydantic]>=3.0.0", - "regex>=2025.7.34", - "requests>=2.32.3", - "semver>=3.0.4", - "sqlmodel>=0.0.22", - "uvicorn[standard]>=0.32.0", -] -files = [ - {file = "madsci_common-0.5.0-py3-none-any.whl", hash = "sha256:69f123576a414c046cff5b238ac9b2ab5f3ae895bde69688f1bb3b56bcada3d5"}, - {file = "madsci_common-0.5.0.tar.gz", hash = "sha256:68c7a2fbd27262ea0d228c1a20c18173d68e653908ebb672bbcdd9fe019f2835"}, + "aenum", + "classy-fastapi", + "click", + "fastapi", + "httpx", + "multiprocess", + "opentelemetry-api", + "psycopg2-binary", + "pydantic", + "pydantic-extra-types", + "pydantic-settings", + "pydantic-settings-export", + "pymongo", + "python-dotenv", + "python-multipart", + "python-ulid[pydantic]", + "pyyaml", + "regex", + "requests", + "rich", + "semver", + "simpleeval", + "sqlmodel", + "uvicorn[standard]", +] +files = [ + {file = "madsci_common-0.7.0rc1-py3-none-any.whl", hash = "sha256:6fd3f71f2105c6861d0f81175a9b99991b5c64b7c7920e2ca585c2170bff1069"}, + {file = "madsci_common-0.7.0rc1.tar.gz", hash = "sha256:541d2b9da128c6fc67d9c3ba1a8a191900a6bafa24791ff3d6d2452576f84d3d"}, ] [[package]] name = "madsci-node-module" -version = "0.5.0" -requires_python = ">=3.9.1" -summary = "The Modular Autonomous Discovery for Science (MADSci) Node Module Helper Classes." -groups = ["default"] +version = "0.7.0rc1" +summary = "" dependencies = [ "madsci-client", "madsci-common", "regex", ] files = [ - {file = "madsci_node_module-0.5.0-py3-none-any.whl", hash = "sha256:b7353d8633740bf62cfad05ad1a3bd2e9c190f997fac7fed93919361c503c36e"}, - {file = "madsci_node_module-0.5.0.tar.gz", hash = "sha256:77bdea14bf1ce01bc46fe99865cb3294f947e81e613d7b79c4097c6ed8462087"}, + {file = "madsci_node_module-0.7.0rc1-py3-none-any.whl", hash = "sha256:a7b82acd7ab1edbe5d5c1f517d26a5d0c7b53b2c643603bd3afd22a21a3a6921"}, + {file = "madsci_node_module-0.7.0rc1.tar.gz", hash = "sha256:01d1c7cd5ec91e98e5c66b725d897417bda85a961479d64346a05a35a0d7e70e"}, ] [[package]] name = "markdown-it-py" version = "3.0.0" -requires_python = ">=3.8" -summary = "Python port of markdown-it. Markdown parsing, done right!" -groups = ["default"] +summary = "" dependencies = [ - "mdurl~=0.1", + "mdurl", ] files = [ {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, @@ -825,12 +671,23 @@ files = [ [[package]] name = "markdown-it-py" version = "3.0.0" -extras = ["linkify", "plugins"] -requires_python = ">=3.8" -summary = "Python port of markdown-it. Markdown parsing, done right!" -groups = ["default"] +extras = ["linkify"] +summary = "" +dependencies = [ + "linkify-it-py", + "markdown-it-py==3.0.0", +] +files = [ + {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, + {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, +] + +[[package]] +name = "markdown-it-py" +version = "3.0.0" +extras = ["plugins"] +summary = "" dependencies = [ - "linkify-it-py<3,>=1", "markdown-it-py==3.0.0", "mdit-py-plugins", ] @@ -842,9 +699,7 @@ files = [ [[package]] name = "matplotlib-inline" version = "0.1.7" -requires_python = ">=3.8" -summary = "Inline Matplotlib backend for Jupyter" -groups = ["dev"] +summary = "" dependencies = [ "traitlets", ] @@ -856,11 +711,9 @@ files = [ [[package]] name = "mdit-py-plugins" version = "0.4.2" -requires_python = ">=3.8" -summary = "Collection of plugins for markdown-it-py" -groups = ["default"] +summary = "" dependencies = [ - "markdown-it-py<4.0.0,>=1.0.0", + "markdown-it-py", ] files = [ {file = "mdit_py_plugins-0.4.2-py3-none-any.whl", hash = "sha256:0c673c3f889399a33b95e88d2f0d111b4447bdfea7f237dab2d488f459835636"}, @@ -870,9 +723,7 @@ files = [ [[package]] name = "mdurl" version = "0.1.2" -requires_python = ">=3.7" -summary = "Markdown URL utilities" -groups = ["default"] +summary = "" files = [ {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, @@ -881,9 +732,7 @@ files = [ [[package]] name = "minio" version = "7.2.15" -requires_python = ">=3.9" -summary = "MinIO Python SDK for Amazon S3 Compatible Cloud Storage" -groups = ["default"] +summary = "" dependencies = [ "argon2-cffi", "certifi", @@ -899,11 +748,9 @@ files = [ [[package]] name = "multiprocess" version = "0.70.18" -requires_python = ">=3.8" -summary = "better multiprocessing and multithreading in Python" -groups = ["default"] +summary = "" dependencies = [ - "dill>=0.4.0", + "dill", ] files = [ {file = "multiprocess-0.70.18-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:25d4012dcaaf66b9e8e955f58482b42910c2ee526d532844d8bcf661bbc604df"}, @@ -912,13 +759,10 @@ files = [ {file = "multiprocess-0.70.18-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:8b8940ae30139e04b076da6c5b83e9398585ebdf0f2ad3250673fef5b2ff06d6"}, {file = "multiprocess-0.70.18-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:0929ba95831adb938edbd5fb801ac45e705ecad9d100b3e653946b7716cb6bd3"}, {file = "multiprocess-0.70.18-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:4d77f8e4bfe6c6e2e661925bbf9aed4d5ade9a1c6502d5dfc10129b9d1141797"}, - {file = "multiprocess-0.70.18-pp39-pypy39_pp73-macosx_10_13_arm64.whl", hash = "sha256:9fd8d662f7524a95a1be7cbea271f0b33089fe792baabec17d93103d368907da"}, - {file = "multiprocess-0.70.18-pp39-pypy39_pp73-macosx_10_13_x86_64.whl", hash = "sha256:3fbba48bfcd932747c33f0b152b26207c4e0840c35cab359afaff7a8672b1031"}, - {file = "multiprocess-0.70.18-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:5f9be0342e597dde86152c10442c5fb6c07994b1c29de441b7a3a08b0e6be2a0"}, {file = "multiprocess-0.70.18-py310-none-any.whl", hash = "sha256:60c194974c31784019c1f459d984e8f33ee48f10fcf42c309ba97b30d9bd53ea"}, {file = "multiprocess-0.70.18-py311-none-any.whl", hash = "sha256:5aa6eef98e691281b3ad923be2832bf1c55dd2c859acd73e5ec53a66aae06a1d"}, {file = "multiprocess-0.70.18-py312-none-any.whl", hash = "sha256:9b78f8e5024b573730bfb654783a13800c2c0f2dfc0c25e70b40d184d64adaa2"}, - {file = "multiprocess-0.70.18-py313-none-any.whl", hash = "sha256:871743755f43ef57d7910a38433cfe41319e72be1bbd90b79c7a5ac523eb9334"}, + {file = "multiprocess-0.70.18-py38-none-any.whl", hash = "sha256:dbf705e52a154fe5e90fb17b38f02556169557c2dd8bb084f2e06c2784d8279b"}, {file = "multiprocess-0.70.18-py39-none-any.whl", hash = "sha256:e78ca805a72b1b810c690b6b4cc32579eba34f403094bbbae962b7b5bf9dfcb8"}, {file = "multiprocess-0.70.18.tar.gz", hash = "sha256:f9597128e6b3e67b23956da07cf3d2e5cba79e2f4e0fba8d7903636663ec6d0d"}, ] @@ -926,9 +770,7 @@ files = [ [[package]] name = "nest-asyncio" version = "1.6.0" -requires_python = ">=3.5" -summary = "Patch asyncio to allow nested event loops" -groups = ["dev"] +summary = "" files = [ {file = "nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c"}, {file = "nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe"}, @@ -937,20 +779,29 @@ files = [ [[package]] name = "nodeenv" version = "1.9.1" -requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" -summary = "Node.js virtual environment builder" -groups = ["dev"] +summary = "" files = [ {file = "nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9"}, {file = "nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f"}, ] +[[package]] +name = "opentelemetry-api" +version = "1.39.1" +summary = "" +dependencies = [ + "importlib-metadata", + "typing-extensions", +] +files = [ + {file = "opentelemetry_api-1.39.1-py3-none-any.whl", hash = "sha256:2edd8463432a7f8443edce90972169b195e7d6a05500cd29e6d13898187c9950"}, + {file = "opentelemetry_api-1.39.1.tar.gz", hash = "sha256:fbde8c80e1b937a2c61f20347e91c0c18a1940cecf012d62e65a7caf08967c9c"}, +] + [[package]] name = "packaging" version = "25.0" -requires_python = ">=3.8" -summary = "Core utilities for Python packages" -groups = ["dev"] +summary = "" files = [ {file = "packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484"}, {file = "packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f"}, @@ -959,9 +810,7 @@ files = [ [[package]] name = "parso" version = "0.8.4" -requires_python = ">=3.6" -summary = "A Python Parser" -groups = ["dev"] +summary = "" files = [ {file = "parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18"}, {file = "parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d"}, @@ -970,11 +819,9 @@ files = [ [[package]] name = "pexpect" version = "4.9.0" -summary = "Pexpect allows easy control of interactive console applications." -groups = ["dev"] -marker = "sys_platform != \"win32\"" +summary = "" dependencies = [ - "ptyprocess>=0.5", + "ptyprocess", ] files = [ {file = "pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523"}, @@ -984,9 +831,7 @@ files = [ [[package]] name = "platformdirs" version = "4.3.8" -requires_python = ">=3.9" -summary = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." -groups = ["default", "dev"] +summary = "" files = [ {file = "platformdirs-4.3.8-py3-none-any.whl", hash = "sha256:ff7059bb7eb1179e2685604f4aaf157cfd9535242bd23742eadc3c13542139b4"}, {file = "platformdirs-4.3.8.tar.gz", hash = "sha256:3d512d96e16bcb959a814c9f348431070822a6496326a4be0911c40b5a74c2bc"}, @@ -995,15 +840,13 @@ files = [ [[package]] name = "pre-commit" version = "4.3.0" -requires_python = ">=3.9" -summary = "A framework for managing and maintaining multi-language pre-commit hooks." -groups = ["dev"] +summary = "" dependencies = [ - "cfgv>=2.0.0", - "identify>=1.0.0", - "nodeenv>=0.11.1", - "pyyaml>=5.1", - "virtualenv>=20.10.0", + "cfgv", + "identify", + "nodeenv", + "pyyaml", + "virtualenv", ] files = [ {file = "pre_commit-4.3.0-py2.py3-none-any.whl", hash = "sha256:2b0747ad7e6e967169136edffee14c16e148a778a54e4f967921aa1ebf2308d8"}, @@ -1013,9 +856,7 @@ files = [ [[package]] name = "prompt-toolkit" version = "3.0.51" -requires_python = ">=3.8" -summary = "Library for building powerful interactive command lines in Python" -groups = ["dev"] +summary = "" dependencies = [ "wcwidth", ] @@ -1027,9 +868,7 @@ files = [ [[package]] name = "psutil" version = "7.0.0" -requires_python = ">=3.6" -summary = "Cross-platform lib for process and system monitoring in Python. NOTE: the syntax of this script MUST be kept compatible with Python 2.7." -groups = ["dev"] +summary = "" files = [ {file = "psutil-7.0.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:101d71dc322e3cffd7cea0650b09b3d08b8e7c4109dd6809fe452dfd00e58b25"}, {file = "psutil-7.0.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:39db632f6bb862eeccf56660871433e111b6ea58f2caea825571951d4b6aa3da"}, @@ -1041,12 +880,51 @@ files = [ {file = "psutil-7.0.0.tar.gz", hash = "sha256:7be9c3eba38beccb6495ea33afd982a44074b78f28c434a1f51cc07fd315c456"}, ] +[[package]] +name = "psycopg2-binary" +version = "2.9.11" +summary = "" +files = [ + {file = "psycopg2-binary-2.9.11.tar.gz", hash = "sha256:b6aed9e096bf63f9e75edf2581aa9a7e7186d97ab5c177aa6c87797cd591236c"}, + {file = "psycopg2_binary-2.9.11-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d6fe6b47d0b42ce1c9f1fa3e35bb365011ca22e39db37074458f27921dca40f2"}, + {file = "psycopg2_binary-2.9.11-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a6c0e4262e089516603a09474ee13eabf09cb65c332277e39af68f6233911087"}, + {file = "psycopg2_binary-2.9.11-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c47676e5b485393f069b4d7a811267d3168ce46f988fa602658b8bb901e9e64d"}, + {file = "psycopg2_binary-2.9.11-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:a28d8c01a7b27a1e3265b11250ba7557e5f72b5ee9e5f3a2fa8d2949c29bf5d2"}, + {file = "psycopg2_binary-2.9.11-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5f3f2732cf504a1aa9e9609d02f79bea1067d99edf844ab92c247bbca143303b"}, + {file = "psycopg2_binary-2.9.11-cp310-cp310-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:865f9945ed1b3950d968ec4690ce68c55019d79e4497366d36e090327ce7db14"}, + {file = "psycopg2_binary-2.9.11-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:91537a8df2bde69b1c1db01d6d944c831ca793952e4f57892600e96cee95f2cd"}, + {file = "psycopg2_binary-2.9.11-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:4dca1f356a67ecb68c81a7bc7809f1569ad9e152ce7fd02c2f2036862ca9f66b"}, + {file = "psycopg2_binary-2.9.11-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:0da4de5c1ac69d94ed4364b6cbe7190c1a70d325f112ba783d83f8440285f152"}, + {file = "psycopg2_binary-2.9.11-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:37d8412565a7267f7d79e29ab66876e55cb5e8e7b3bbf94f8206f6795f8f7e7e"}, + {file = "psycopg2_binary-2.9.11-cp310-cp310-win_amd64.whl", hash = "sha256:c665f01ec8ab273a61c62beeb8cce3014c214429ced8a308ca1fc410ecac3a39"}, + {file = "psycopg2_binary-2.9.11-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0e8480afd62362d0a6a27dd09e4ca2def6fa50ed3a4e7c09165266106b2ffa10"}, + {file = "psycopg2_binary-2.9.11-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:763c93ef1df3da6d1a90f86ea7f3f806dc06b21c198fa87c3c25504abec9404a"}, + {file = "psycopg2_binary-2.9.11-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2e164359396576a3cc701ba8af4751ae68a07235d7a380c631184a611220d9a4"}, + {file = "psycopg2_binary-2.9.11-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:d57c9c387660b8893093459738b6abddbb30a7eab058b77b0d0d1c7d521ddfd7"}, + {file = "psycopg2_binary-2.9.11-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2c226ef95eb2250974bf6fa7a842082b31f68385c4f3268370e3f3870e7859ee"}, + {file = "psycopg2_binary-2.9.11-cp311-cp311-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a311f1edc9967723d3511ea7d2708e2c3592e3405677bf53d5c7246753591fbb"}, + {file = "psycopg2_binary-2.9.11-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ebb415404821b6d1c47353ebe9c8645967a5235e6d88f914147e7fd411419e6f"}, + {file = "psycopg2_binary-2.9.11-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f07c9c4a5093258a03b28fab9b4f151aa376989e7f35f855088234e656ee6a94"}, + {file = "psycopg2_binary-2.9.11-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:00ce1830d971f43b667abe4a56e42c1e2d594b32da4802e44a73bacacb25535f"}, + {file = "psycopg2_binary-2.9.11-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:cffe9d7697ae7456649617e8bb8d7a45afb71cd13f7ab22af3e5c61f04840908"}, + {file = "psycopg2_binary-2.9.11-cp311-cp311-win_amd64.whl", hash = "sha256:304fd7b7f97eef30e91b8f7e720b3db75fee010b520e434ea35ed1ff22501d03"}, + {file = "psycopg2_binary-2.9.11-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:be9b840ac0525a283a96b556616f5b4820e0526addb8dcf6525a0fa162730be4"}, + {file = "psycopg2_binary-2.9.11-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f090b7ddd13ca842ebfe301cd587a76a4cf0913b1e429eb92c1be5dbeb1a19bc"}, + {file = "psycopg2_binary-2.9.11-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ab8905b5dcb05bf3fb22e0cf90e10f469563486ffb6a96569e51f897c750a76a"}, + {file = "psycopg2_binary-2.9.11-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:bf940cd7e7fec19181fdbc29d76911741153d51cab52e5c21165f3262125685e"}, + {file = "psycopg2_binary-2.9.11-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fa0f693d3c68ae925966f0b14b8edda71696608039f4ed61b1fe9ffa468d16db"}, + {file = "psycopg2_binary-2.9.11-cp312-cp312-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a1cf393f1cdaf6a9b57c0a719a1068ba1069f022a59b8b1fe44b006745b59757"}, + {file = "psycopg2_binary-2.9.11-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ef7a6beb4beaa62f88592ccc65df20328029d721db309cb3250b0aae0fa146c3"}, + {file = "psycopg2_binary-2.9.11-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:31b32c457a6025e74d233957cc9736742ac5a6cb196c6b68499f6bb51390bd6a"}, + {file = "psycopg2_binary-2.9.11-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:edcb3aeb11cb4bf13a2af3c53a15b3d612edeb6409047ea0b5d6a21a9d744b34"}, + {file = "psycopg2_binary-2.9.11-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:62b6d93d7c0b61a1dd6197d208ab613eb7dcfdcca0a49c42ceb082257991de9d"}, + {file = "psycopg2_binary-2.9.11-cp312-cp312-win_amd64.whl", hash = "sha256:b33fabeb1fde21180479b2d4667e994de7bbf0eec22832ba5d9b5e4cf65b6c6d"}, +] + [[package]] name = "ptyprocess" version = "0.7.0" -summary = "Run a subprocess in a pseudo terminal" -groups = ["dev"] -marker = "sys_platform != \"win32\"" +summary = "" files = [ {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, @@ -1055,8 +933,7 @@ files = [ [[package]] name = "pure-eval" version = "0.2.3" -summary = "Safely evaluate AST nodes without side effects" -groups = ["dev"] +summary = "" files = [ {file = "pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0"}, {file = "pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42"}, @@ -1065,9 +942,7 @@ files = [ [[package]] name = "pycparser" version = "2.22" -requires_python = ">=3.8" -summary = "C parser in Python" -groups = ["default", "dev"] +summary = "" files = [ {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, @@ -1076,21 +951,8 @@ files = [ [[package]] name = "pycryptodome" version = "3.23.0" -requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" -summary = "Cryptographic library for Python" -groups = ["default"] -files = [ - {file = "pycryptodome-3.23.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:0011f7f00cdb74879142011f95133274741778abba114ceca229adbf8e62c3e4"}, - {file = "pycryptodome-3.23.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:90460fc9e088ce095f9ee8356722d4f10f86e5be06e2354230a9880b9c549aae"}, - {file = "pycryptodome-3.23.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4764e64b269fc83b00f682c47443c2e6e85b18273712b98aa43bcb77f8570477"}, - {file = "pycryptodome-3.23.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb8f24adb74984aa0e5d07a2368ad95276cf38051fe2dc6605cbcf482e04f2a7"}, - {file = "pycryptodome-3.23.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d97618c9c6684a97ef7637ba43bdf6663a2e2e77efe0f863cce97a76af396446"}, - {file = "pycryptodome-3.23.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9a53a4fe5cb075075d515797d6ce2f56772ea7e6a1e5e4b96cf78a14bac3d265"}, - {file = "pycryptodome-3.23.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:763d1d74f56f031788e5d307029caef067febf890cd1f8bf61183ae142f1a77b"}, - {file = "pycryptodome-3.23.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:954af0e2bd7cea83ce72243b14e4fb518b18f0c1649b576d114973e2073b273d"}, - {file = "pycryptodome-3.23.0-cp313-cp313t-win32.whl", hash = "sha256:257bb3572c63ad8ba40b89f6fc9d63a2a628e9f9708d31ee26560925ebe0210a"}, - {file = "pycryptodome-3.23.0-cp313-cp313t-win_amd64.whl", hash = "sha256:6501790c5b62a29fcb227bd6b62012181d886a767ce9ed03b303d1f22eb5c625"}, - {file = "pycryptodome-3.23.0-cp313-cp313t-win_arm64.whl", hash = "sha256:9a77627a330ab23ca43b48b130e202582e91cc69619947840ea4d2d1be21eb39"}, +summary = "" +files = [ {file = "pycryptodome-3.23.0-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:187058ab80b3281b1de11c2e6842a357a1f71b42cb1e15bce373f3d238135c27"}, {file = "pycryptodome-3.23.0-cp37-abi3-macosx_10_9_x86_64.whl", hash = "sha256:cfb5cd445280c5b0a4e6187a7ce8de5a07b5f3f897f235caa11f1f435f182843"}, {file = "pycryptodome-3.23.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67bd81fcbe34f43ad9422ee8fd4843c8e7198dd88dd3d40e6de42ee65fbe1490"}, @@ -1107,25 +969,18 @@ files = [ {file = "pycryptodome-3.23.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14e15c081e912c4b0d75632acd8382dfce45b258667aa3c67caf7a4d4c13f630"}, {file = "pycryptodome-3.23.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a7fc76bf273353dc7e5207d172b83f569540fc9a28d63171061c42e361d22353"}, {file = "pycryptodome-3.23.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:45c69ad715ca1a94f778215a11e66b7ff989d792a4d63b68dc586a1da1392ff5"}, - {file = "pycryptodome-3.23.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:865d83c906b0fc6a59b510deceee656b6bc1c4fa0d82176e2b77e97a420a996a"}, - {file = "pycryptodome-3.23.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89d4d56153efc4d81defe8b65fd0821ef8b2d5ddf8ed19df31ba2f00872b8002"}, - {file = "pycryptodome-3.23.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3f2d0aaf8080bda0587d58fc9fe4766e012441e2eed4269a77de6aea981c8be"}, - {file = "pycryptodome-3.23.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:64093fc334c1eccfd3933c134c4457c34eaca235eeae49d69449dc4728079339"}, - {file = "pycryptodome-3.23.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:ce64e84a962b63a47a592690bdc16a7eaf709d2c2697ababf24a0def566899a6"}, {file = "pycryptodome-3.23.0.tar.gz", hash = "sha256:447700a657182d60338bab09fdb27518f8856aecd80ae4c6bdddb67ff5da44ef"}, ] [[package]] name = "pydantic" version = "2.11.7" -requires_python = ">=3.9" -summary = "Data validation using Python type hints" -groups = ["default"] +summary = "" dependencies = [ - "annotated-types>=0.6.0", - "pydantic-core==2.33.2", - "typing-extensions>=4.12.2", - "typing-inspection>=0.4.0", + "annotated-types", + "pydantic-core", + "typing-extensions", + "typing-inspection", ] files = [ {file = "pydantic-2.11.7-py3-none-any.whl", hash = "sha256:dde5df002701f6de26248661f6835bbe296a47bf73990135c7d07ce741b9623b"}, @@ -1135,11 +990,9 @@ files = [ [[package]] name = "pydantic-core" version = "2.33.2" -requires_python = ">=3.9" -summary = "Core functionality for Pydantic validation and serialization" -groups = ["default"] +summary = "" dependencies = [ - "typing-extensions!=4.7.0,>=4.6.0", + "typing-extensions", ] files = [ {file = "pydantic_core-2.33.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2b3d326aaef0c0399d9afffeb6367d5e26ddc24d351dbc9c636840ac355dc5d8"}, @@ -1183,36 +1036,6 @@ files = [ {file = "pydantic_core-2.33.2-cp312-cp312-win32.whl", hash = "sha256:9cb1da0f5a471435a7bc7e439b8a728e8b61e59784b2af70d7c169f8dd8ae290"}, {file = "pydantic_core-2.33.2-cp312-cp312-win_amd64.whl", hash = "sha256:f941635f2a3d96b2973e867144fde513665c87f13fe0e193c158ac51bfaaa7b2"}, {file = "pydantic_core-2.33.2-cp312-cp312-win_arm64.whl", hash = "sha256:cca3868ddfaccfbc4bfb1d608e2ccaaebe0ae628e1416aeb9c4d88c001bb45ab"}, - {file = "pydantic_core-2.33.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:1082dd3e2d7109ad8b7da48e1d4710c8d06c253cbc4a27c1cff4fbcaa97a9e3f"}, - {file = "pydantic_core-2.33.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f517ca031dfc037a9c07e748cefd8d96235088b83b4f4ba8939105d20fa1dcd6"}, - {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a9f2c9dd19656823cb8250b0724ee9c60a82f3cdf68a080979d13092a3b0fef"}, - {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2b0a451c263b01acebe51895bfb0e1cc842a5c666efe06cdf13846c7418caa9a"}, - {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ea40a64d23faa25e62a70ad163571c0b342b8bf66d5fa612ac0dec4f069d916"}, - {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fb2d542b4d66f9470e8065c5469ec676978d625a8b7a363f07d9a501a9cb36a"}, - {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fdac5d6ffa1b5a83bca06ffe7583f5576555e6c8b3a91fbd25ea7780f825f7d"}, - {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:04a1a413977ab517154eebb2d326da71638271477d6ad87a769102f7c2488c56"}, - {file = "pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c8e7af2f4e0194c22b5b37205bfb293d166a7344a5b0d0eaccebc376546d77d5"}, - {file = "pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:5c92edd15cd58b3c2d34873597a1e20f13094f59cf88068adb18947df5455b4e"}, - {file = "pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:65132b7b4a1c0beded5e057324b7e16e10910c106d43675d9bd87d4f38dde162"}, - {file = "pydantic_core-2.33.2-cp313-cp313-win32.whl", hash = "sha256:52fb90784e0a242bb96ec53f42196a17278855b0f31ac7c3cc6f5c1ec4811849"}, - {file = "pydantic_core-2.33.2-cp313-cp313-win_amd64.whl", hash = "sha256:c083a3bdd5a93dfe480f1125926afcdbf2917ae714bdb80b36d34318b2bec5d9"}, - {file = "pydantic_core-2.33.2-cp313-cp313-win_arm64.whl", hash = "sha256:e80b087132752f6b3d714f041ccf74403799d3b23a72722ea2e6ba2e892555b9"}, - {file = "pydantic_core-2.33.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:61c18fba8e5e9db3ab908620af374db0ac1baa69f0f32df4f61ae23f15e586ac"}, - {file = "pydantic_core-2.33.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95237e53bb015f67b63c91af7518a62a8660376a6a0db19b89acc77a4d6199f5"}, - {file = "pydantic_core-2.33.2-cp313-cp313t-win_amd64.whl", hash = "sha256:c2fc0a768ef76c15ab9238afa6da7f69895bb5d1ee83aeea2e3509af4472d0b9"}, - {file = "pydantic_core-2.33.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:a2b911a5b90e0374d03813674bf0a5fbbb7741570dcd4b4e85a2e48d17def29d"}, - {file = "pydantic_core-2.33.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6fa6dfc3e4d1f734a34710f391ae822e0a8eb8559a85c6979e14e65ee6ba2954"}, - {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c54c939ee22dc8e2d545da79fc5381f1c020d6d3141d3bd747eab59164dc89fb"}, - {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:53a57d2ed685940a504248187d5685e49eb5eef0f696853647bf37c418c538f7"}, - {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:09fb9dd6571aacd023fe6aaca316bd01cf60ab27240d7eb39ebd66a3a15293b4"}, - {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0e6116757f7959a712db11f3e9c0a99ade00a5bbedae83cb801985aa154f071b"}, - {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d55ab81c57b8ff8548c3e4947f119551253f4e3787a7bbc0b6b3ca47498a9d3"}, - {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c20c462aa4434b33a2661701b861604913f912254e441ab8d78d30485736115a"}, - {file = "pydantic_core-2.33.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:44857c3227d3fb5e753d5fe4a3420d6376fa594b07b621e220cd93703fe21782"}, - {file = "pydantic_core-2.33.2-cp39-cp39-musllinux_1_1_armv7l.whl", hash = "sha256:eb9b459ca4df0e5c87deb59d37377461a538852765293f9e6ee834f0435a93b9"}, - {file = "pydantic_core-2.33.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9fcd347d2cc5c23b06de6d3b7b8275be558a0c90549495c699e379a80bf8379e"}, - {file = "pydantic_core-2.33.2-cp39-cp39-win32.whl", hash = "sha256:83aa99b1285bc8f038941ddf598501a86f1536789740991d7d8756e34f1e74d9"}, - {file = "pydantic_core-2.33.2-cp39-cp39-win_amd64.whl", hash = "sha256:f481959862f57f29601ccced557cc2e817bce7533ab8e01a797a48b49c9692b3"}, {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5c4aa4e82353f65e548c476b37e64189783aa5384903bfea4f41580f255fddfa"}, {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d946c8bf0d5c24bf4fe333af284c59a19358aa3ec18cb3dc4370080da1e8ad29"}, {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87b31b6846e361ef83fedb187bb5b4372d0da3f7e28d85415efa92d6125d6e6d"}, @@ -1231,26 +1054,15 @@ files = [ {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:de4b83bb311557e439b9e186f733f6c645b9417c84e2eb8203f3f820a4b988bf"}, {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:82f68293f055f51b51ea42fafc74b6aad03e70e191799430b90c13d643059ebb"}, {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:329467cecfb529c925cf2bbd4d60d2c509bc2fb52a20c1045bf09bb70971a9c1"}, - {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:87acbfcf8e90ca885206e98359d7dca4bcbb35abdc0ff66672a293e1d7a19101"}, - {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:7f92c15cd1e97d4b12acd1cc9004fa092578acfa57b67ad5e43a197175d01a64"}, - {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3f26877a748dc4251cfcfda9dfb5f13fcb034f5308388066bcfe9031b63ae7d"}, - {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dac89aea9af8cd672fa7b510e7b8c33b0bba9a43186680550ccf23020f32d535"}, - {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:970919794d126ba8645f3837ab6046fb4e72bbc057b3709144066204c19a455d"}, - {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:3eb3fe62804e8f859c49ed20a8451342de53ed764150cb14ca71357c765dc2a6"}, - {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:3abcd9392a36025e3bd55f9bd38d908bd17962cc49bc6da8e7e96285336e2bca"}, - {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:3a1c81334778f9e3af2f8aeb7a960736e5cab1dfebfb26aabca09afd2906c039"}, - {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2807668ba86cb38c6817ad9bc66215ab8584d1d304030ce4f0887336f28a5e27"}, {file = "pydantic_core-2.33.2.tar.gz", hash = "sha256:7cb8bc3605c29176e1b105350d2e6474142d7c1bd1d9327c4a9bdb46bf827acc"}, ] [[package]] name = "pydantic-extra-types" version = "2.10.5" -requires_python = ">=3.8" -summary = "Extra Pydantic types." -groups = ["default"] +summary = "" dependencies = [ - "pydantic>=2.5.2", + "pydantic", "typing-extensions", ] files = [ @@ -1261,13 +1073,11 @@ files = [ [[package]] name = "pydantic-settings" version = "2.9.1" -requires_python = ">=3.9" -summary = "Settings management using Pydantic" -groups = ["default"] +summary = "" dependencies = [ - "pydantic>=2.7.0", - "python-dotenv>=0.21.0", - "typing-inspection>=0.4.0", + "pydantic", + "python-dotenv", + "typing-inspection", ] files = [ {file = "pydantic_settings-2.9.1-py3-none-any.whl", hash = "sha256:59b4f431b1defb26fe620c71a7d3968a710d719f5f4cdbbdb7926edeb770f6ef"}, @@ -1277,14 +1087,12 @@ files = [ [[package]] name = "pydantic-settings-export" version = "1.0.2" -requires_python = ">=3.9" -summary = "Export your Pydantic settings to documentation with ease!" -groups = ["default"] +summary = "" dependencies = [ - "pydantic-settings>=2.3", - "pydantic>=2.7", - "tomli>=2.2.1; python_full_version < \"3.11\"", - "typing-extensions>=4.12.2; python_full_version < \"3.11\"", + "pydantic", + "pydantic-settings", + "tomli; python_full_version < \"3.11\"", + "typing-extensions; python_full_version < \"3.11\"", ] files = [ {file = "pydantic_settings_export-1.0.2-py3-none-any.whl", hash = "sha256:12b809f4f1c2388470e720c522dcbfb808d11aa5fb7efc8f7aae6272fddb9bbe"}, @@ -1294,9 +1102,7 @@ files = [ [[package]] name = "pygments" version = "2.19.1" -requires_python = ">=3.8" -summary = "Pygments is a syntax highlighting package written in Python." -groups = ["default", "dev"] +summary = "" files = [ {file = "pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c"}, {file = "pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f"}, @@ -1305,11 +1111,9 @@ files = [ [[package]] name = "pymongo" version = "4.13.2" -requires_python = ">=3.9" -summary = "PyMongo - the Official MongoDB Python driver" -groups = ["default"] +summary = "" dependencies = [ - "dnspython<3.0.0,>=1.16.0", + "dnspython", ] files = [ {file = "pymongo-4.13.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:01065eb1838e3621a30045ab14d1a60ee62e01f65b7cf154e69c5c722ef14d2f"}, @@ -1339,49 +1143,18 @@ files = [ {file = "pymongo-4.13.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3dcb0b8cdd499636017a53f63ef64cf9b6bd3fd9355796c5a1d228e4be4a4c94"}, {file = "pymongo-4.13.2-cp312-cp312-win32.whl", hash = "sha256:bf43ae07804d7762b509f68e5ec73450bb8824e960b03b861143ce588b41f467"}, {file = "pymongo-4.13.2-cp312-cp312-win_amd64.whl", hash = "sha256:812a473d584bcb02ab819d379cd5e752995026a2bb0d7713e78462b6650d3f3a"}, - {file = "pymongo-4.13.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d6044ca0eb74d97f7d3415264de86a50a401b7b0b136d30705f022f9163c3124"}, - {file = "pymongo-4.13.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:dd326bcb92d28d28a3e7ef0121602bad78691b6d4d1f44b018a4616122f1ba8b"}, - {file = "pymongo-4.13.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfb0c21bdd58e58625c9cd8de13e859630c29c9537944ec0a14574fdf88c2ac4"}, - {file = "pymongo-4.13.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c9c7d345d57f17b1361008aea78a37e8c139631a46aeb185dd2749850883c7ba"}, - {file = "pymongo-4.13.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8860445a8da1b1545406fab189dc20319aff5ce28e65442b2b4a8f4228a88478"}, - {file = "pymongo-4.13.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01c184b612f67d5a4c8f864ae7c40b6cc33c0e9bb05e39d08666f8831d120504"}, - {file = "pymongo-4.13.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ea8c62d5f3c6529407c12471385d9a05f9fb890ce68d64976340c85cd661b"}, - {file = "pymongo-4.13.2-cp313-cp313-win32.whl", hash = "sha256:d13556e91c4a8cb07393b8c8be81e66a11ebc8335a40fa4af02f4d8d3b40c8a1"}, - {file = "pymongo-4.13.2-cp313-cp313-win_amd64.whl", hash = "sha256:cfc69d7bc4d4d5872fd1e6de25e6a16e2372c7d5556b75c3b8e2204dce73e3fb"}, - {file = "pymongo-4.13.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:a457d2ac34c05e9e8a6bb724115b093300bf270f0655fb897df8d8604b2e3700"}, - {file = "pymongo-4.13.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:02f131a6e61559613b1171b53fbe21fed64e71b0cb4858c47fc9bc7c8e0e501c"}, - {file = "pymongo-4.13.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c942d1c6334e894271489080404b1a2e3b8bd5de399f2a0c14a77d966be5bc9"}, - {file = "pymongo-4.13.2-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:850168d115680ab66a0931a6aa9dd98ed6aa5e9c3b9a6c12128049b9a5721bc5"}, - {file = "pymongo-4.13.2-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:af7dfff90647ee77c53410f7fe8ca4fe343f8b768f40d2d0f71a5602f7b5a541"}, - {file = "pymongo-4.13.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8057f9bc9c94a8fd54ee4f5e5106e445a8f406aff2df74746f21c8791ee2403"}, - {file = "pymongo-4.13.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:51040e1ba78d6671f8c65b29e2864483451e789ce93b1536de9cc4456ede87fa"}, - {file = "pymongo-4.13.2-cp313-cp313t-win32.whl", hash = "sha256:7ab86b98a18c8689514a9f8d0ec7d9ad23a949369b31c9a06ce4a45dcbffcc5e"}, - {file = "pymongo-4.13.2-cp313-cp313t-win_amd64.whl", hash = "sha256:c38168263ed94a250fc5cf9c6d33adea8ab11c9178994da1c3481c2a49d235f8"}, - {file = "pymongo-4.13.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54a89739a86da31adcef41f6c3ae62b38a8bad156bba71fe5898871746c5af83"}, - {file = "pymongo-4.13.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:de529aebd1ddae2de778d926b3e8e2e42a9b37b5c668396aad8f28af75e606f9"}, - {file = "pymongo-4.13.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:34cc7d4cd7586c1c4f7af2b97447404046c2d8e7ed4c7214ed0e21dbeb17d57d"}, - {file = "pymongo-4.13.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:884cb88a9d4c4c9810056b9c71817bd9714bbe58c461f32b65be60c56759823b"}, - {file = "pymongo-4.13.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:389cb6415ec341c73f81fbf54970ccd0cd5d3fa7c238dcdb072db051d24e2cb4"}, - {file = "pymongo-4.13.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49f9968ea7e6a86d4c9bd31d2095f0419efc498ea5e6067e75ade1f9e64aea3d"}, - {file = "pymongo-4.13.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae07315bb106719c678477e61077cd28505bb7d3fd0a2341e75a9510118cb785"}, - {file = "pymongo-4.13.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4dc60b3f5e1448fd011c729ad5d8735f603b0a08a8773ec8e34a876ccc7de45f"}, - {file = "pymongo-4.13.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:75462d6ce34fb2dd98f8ac3732a7a1a1fbb2e293c4f6e615766731d044ad730e"}, - {file = "pymongo-4.13.2-cp39-cp39-win32.whl", hash = "sha256:b7e04c45f6a7d5a13fe064f42130d29b0730cb83dd387a623563ff3b9bd2f4d1"}, - {file = "pymongo-4.13.2-cp39-cp39-win_amd64.whl", hash = "sha256:0603145c9be5e195ae61ba7a93eb283abafdbd87f6f30e6c2dfc242940fe280c"}, {file = "pymongo-4.13.2.tar.gz", hash = "sha256:0f64c6469c2362962e6ce97258ae1391abba1566a953a492562d2924b44815c2"}, ] [[package]] name = "pynput" version = "1.8.1" -summary = "Monitor and control user input devices" -groups = ["default"] +summary = "" dependencies = [ - "enum34; python_version == \"2.7\"", - "evdev>=1.3; \"linux\" in sys_platform", - "pyobjc-framework-ApplicationServices>=8.0; sys_platform == \"darwin\"", - "pyobjc-framework-Quartz>=8.0; sys_platform == \"darwin\"", - "python-xlib>=0.17; \"linux\" in sys_platform", + "evdev; \"linux\" in sys_platform", + "pyobjc-framework-applicationservices; sys_platform == \"darwin\"", + "pyobjc-framework-quartz; sys_platform == \"darwin\"", + "python-xlib; \"linux\" in sys_platform", "six", ] files = [ @@ -1392,124 +1165,82 @@ files = [ [[package]] name = "pyobjc-core" version = "11.1" -requires_python = ">=3.8" -summary = "Python<->ObjC Interoperability Module" -groups = ["default"] -marker = "sys_platform == \"darwin\"" +summary = "" files = [ {file = "pyobjc_core-11.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4c7536f3e94de0a3eae6bb382d75f1219280aa867cdf37beef39d9e7d580173c"}, {file = "pyobjc_core-11.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ec36680b5c14e2f73d432b03ba7c1457dc6ca70fa59fd7daea1073f2b4157d33"}, {file = "pyobjc_core-11.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:765b97dea6b87ec4612b3212258024d8496ea23517c95a1c5f0735f96b7fd529"}, - {file = "pyobjc_core-11.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:18986f83998fbd5d3f56d8a8428b2f3e0754fd15cef3ef786ca0d29619024f2c"}, - {file = "pyobjc_core-11.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:8849e78cfe6595c4911fbba29683decfb0bf57a350aed8a43316976ba6f659d2"}, - {file = "pyobjc_core-11.1-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:8cb9ed17a8d84a312a6e8b665dd22393d48336ea1d8277e7ad20c19a38edf731"}, - {file = "pyobjc_core-11.1-cp314-cp314t-macosx_11_0_universal2.whl", hash = "sha256:f2455683e807f8541f0d83fbba0f5d9a46128ab0d5cc83ea208f0bec759b7f96"}, - {file = "pyobjc_core-11.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:4a99e6558b48b8e47c092051e7b3be05df1c8d0617b62f6fa6a316c01902d157"}, {file = "pyobjc_core-11.1.tar.gz", hash = "sha256:b63d4d90c5df7e762f34739b39cc55bc63dbcf9fb2fb3f2671e528488c7a87fe"}, ] [[package]] name = "pyobjc-framework-applicationservices" version = "11.1" -requires_python = ">=3.9" -summary = "Wrappers for the framework ApplicationServices on macOS" -groups = ["default"] -marker = "sys_platform == \"darwin\"" +summary = "" dependencies = [ - "pyobjc-core>=11.1", - "pyobjc-framework-Cocoa>=11.1", - "pyobjc-framework-CoreText>=11.1", - "pyobjc-framework-Quartz>=11.1", + "pyobjc-core", + "pyobjc-framework-cocoa", + "pyobjc-framework-coretext", + "pyobjc-framework-quartz", ] files = [ {file = "pyobjc_framework_applicationservices-11.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:89aa713f16f1de66efd82f3be77c632ad1068e51e0ef0c2b0237ac7c7f580814"}, {file = "pyobjc_framework_applicationservices-11.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:cf45d15eddae36dec2330a9992fc852476b61c8f529874b9ec2805c768a75482"}, {file = "pyobjc_framework_applicationservices-11.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:f4a85ccd78bab84f7f05ac65ff9be117839dfc09d48c39edd65c617ed73eb01c"}, - {file = "pyobjc_framework_applicationservices-11.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:385a89f4d0838c97a331e247519d9e9745aa3f7427169d18570e3c664076a63c"}, - {file = "pyobjc_framework_applicationservices-11.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:f480fab20f3005e559c9d06c9a3874a1f1c60dde52c6d28a53ab59b45e79d55f"}, - {file = "pyobjc_framework_applicationservices-11.1-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:e8dee91c6a14fd042f98819dc0ac4a182e0e816282565534032f0e544bfab143"}, - {file = "pyobjc_framework_applicationservices-11.1-cp314-cp314t-macosx_11_0_universal2.whl", hash = "sha256:a0ce40a57a9b993793b6f72c4fd93f80618ef54a69d76a1da97b8360a2f3ffc5"}, - {file = "pyobjc_framework_applicationservices-11.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:ba671fc6b695de69b2ed5e350b09cc1806f39352e8ad07635c94ef17730f6fe0"}, {file = "pyobjc_framework_applicationservices-11.1.tar.gz", hash = "sha256:03fcd8c0c600db98fa8b85eb7b3bc31491701720c795e3f762b54e865138bbaf"}, ] [[package]] name = "pyobjc-framework-cocoa" version = "11.1" -requires_python = ">=3.9" -summary = "Wrappers for the Cocoa frameworks on macOS" -groups = ["default"] -marker = "sys_platform == \"darwin\"" +summary = "" dependencies = [ - "pyobjc-core>=11.1", + "pyobjc-core", ] files = [ {file = "pyobjc_framework_cocoa-11.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b27a5bdb3ab6cdeb998443ff3fce194ffae5f518c6a079b832dbafc4426937f9"}, {file = "pyobjc_framework_cocoa-11.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7b9a9b8ba07f5bf84866399e3de2aa311ed1c34d5d2788a995bdbe82cc36cfa0"}, {file = "pyobjc_framework_cocoa-11.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:806de56f06dfba8f301a244cce289d54877c36b4b19818e3b53150eb7c2424d0"}, - {file = "pyobjc_framework_cocoa-11.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:54e93e1d9b0fc41c032582a6f0834befe1d418d73893968f3f450281b11603da"}, - {file = "pyobjc_framework_cocoa-11.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:fd5245ee1997d93e78b72703be1289d75d88ff6490af94462b564892e9266350"}, - {file = "pyobjc_framework_cocoa-11.1-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:aede53a1afc5433e1e7d66568cc52acceeb171b0a6005407a42e8e82580b4fc0"}, - {file = "pyobjc_framework_cocoa-11.1-cp314-cp314t-macosx_11_0_universal2.whl", hash = "sha256:1b5de4e1757bb65689d6dc1f8d8717de9ec8587eb0c4831c134f13aba29f9b71"}, - {file = "pyobjc_framework_cocoa-11.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:bbee71eeb93b1b31ffbac8560b59a0524a8a4b90846a260d2c4f2188f3d4c721"}, {file = "pyobjc_framework_cocoa-11.1.tar.gz", hash = "sha256:87df76b9b73e7ca699a828ff112564b59251bb9bbe72e610e670a4dc9940d038"}, ] [[package]] name = "pyobjc-framework-coretext" version = "11.1" -requires_python = ">=3.9" -summary = "Wrappers for the framework CoreText on macOS" -groups = ["default"] -marker = "sys_platform == \"darwin\"" +summary = "" dependencies = [ - "pyobjc-core>=11.1", - "pyobjc-framework-Cocoa>=11.1", - "pyobjc-framework-Quartz>=11.1", + "pyobjc-core", + "pyobjc-framework-cocoa", + "pyobjc-framework-quartz", ] files = [ {file = "pyobjc_framework_coretext-11.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:515be6beb48c084ee413c00c4e9fbd6e730c1b8a24270f4c618fc6c7ba0011ce"}, {file = "pyobjc_framework_coretext-11.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:b4f4d2d2a6331fa64465247358d7aafce98e4fb654b99301a490627a073d021e"}, {file = "pyobjc_framework_coretext-11.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1597bf7234270ee1b9963bf112e9061050d5fb8e1384b3f50c11bde2fe2b1570"}, - {file = "pyobjc_framework_coretext-11.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:37e051e8f12a0f47a81b8efc8c902156eb5bc3d8123c43e5bd4cebd24c222228"}, - {file = "pyobjc_framework_coretext-11.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:56a3a02202e0d50be3c43e781c00f9f1859ab9b73a8342ff56260b908e911e37"}, - {file = "pyobjc_framework_coretext-11.1-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:15650ba99692d00953e91e53118c11636056a22c90d472020f7ba31500577bf5"}, - {file = "pyobjc_framework_coretext-11.1-cp314-cp314t-macosx_11_0_universal2.whl", hash = "sha256:fb27f66a56660c31bb956191d64b85b95bac99cfb833f6e99622ca0ac4b3ba12"}, - {file = "pyobjc_framework_coretext-11.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7fee99a1ac96e3f70d482731bc39a546da82a58f87fa9f0e2b784a5febaff33d"}, {file = "pyobjc_framework_coretext-11.1.tar.gz", hash = "sha256:a29bbd5d85c77f46a8ee81d381b847244c88a3a5a96ac22f509027ceceaffaf6"}, ] [[package]] name = "pyobjc-framework-quartz" version = "11.1" -requires_python = ">=3.9" -summary = "Wrappers for the Quartz frameworks on macOS" -groups = ["default"] -marker = "sys_platform == \"darwin\"" +summary = "" dependencies = [ - "pyobjc-core>=11.1", - "pyobjc-framework-Cocoa>=11.1", + "pyobjc-core", + "pyobjc-framework-cocoa", ] files = [ {file = "pyobjc_framework_quartz-11.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b5ef75c416b0209e25b2eb07a27bd7eedf14a8c6b2f968711969d45ceceb0f84"}, {file = "pyobjc_framework_quartz-11.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2d501fe95ef15d8acf587cb7dc4ab4be3c5a84e2252017da8dbb7df1bbe7a72a"}, {file = "pyobjc_framework_quartz-11.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9ac806067541917d6119b98d90390a6944e7d9bd737f5c0a79884202327c9204"}, - {file = "pyobjc_framework_quartz-11.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:43a1138280571bbf44df27a7eef519184b5c4183a588598ebaaeb887b9e73e76"}, - {file = "pyobjc_framework_quartz-11.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b23d81c30c564adf6336e00b357f355b35aad10075dd7e837cfd52a9912863e5"}, - {file = "pyobjc_framework_quartz-11.1-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:07cbda78b4a8fcf3a2d96e047a2ff01f44e3e1820f46f0f4b3b6d77ff6ece07c"}, - {file = "pyobjc_framework_quartz-11.1-cp314-cp314t-macosx_11_0_universal2.whl", hash = "sha256:39d02a3df4b5e3eee1e0da0fb150259476910d2a9aa638ab94153c24317a9561"}, - {file = "pyobjc_framework_quartz-11.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9b1f451ddb5243d8d6316af55f240a02b0fffbfe165bff325628bf73f3df7f44"}, {file = "pyobjc_framework_quartz-11.1.tar.gz", hash = "sha256:a57f35ccfc22ad48c87c5932818e583777ff7276605fef6afad0ac0741169f75"}, ] [[package]] name = "python-dateutil" version = "2.9.0.post0" -requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" -summary = "Extensions to the standard Python datetime module" -groups = ["dev"] +summary = "" dependencies = [ - "six>=1.5", + "six", ] files = [ {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, @@ -1519,9 +1250,7 @@ files = [ [[package]] name = "python-dotenv" version = "1.1.0" -requires_python = ">=3.9" -summary = "Read key-value pairs from a .env file and set them as environment variables" -groups = ["default"] +summary = "" files = [ {file = "python_dotenv-1.1.0-py3-none-any.whl", hash = "sha256:d7c01d9e2293916c18baf562d95698754b0dbbb5e74d457c45d4f6561fb9d55d"}, {file = "python_dotenv-1.1.0.tar.gz", hash = "sha256:41f90bc6f5f177fb41f53e87666db362025010eb28f60a01c9143bfa33a2b2d5"}, @@ -1530,9 +1259,7 @@ files = [ [[package]] name = "python-multipart" version = "0.0.20" -requires_python = ">=3.8" -summary = "A streaming multipart parser for Python" -groups = ["default"] +summary = "" files = [ {file = "python_multipart-0.0.20-py3-none-any.whl", hash = "sha256:8a62d3a8335e06589fe01f2a3e178cdcc632f3fbe0d492ad9ee0ec35aab1f104"}, {file = "python_multipart-0.0.20.tar.gz", hash = "sha256:8dd0cab45b8e23064ae09147625994d090fa46f5b0d1e13af944c331a7fa9d13"}, @@ -1541,9 +1268,7 @@ files = [ [[package]] name = "python-ulid" version = "3.0.0" -requires_python = ">=3.9" -summary = "Universally unique lexicographically sortable identifier" -groups = ["default"] +summary = "" files = [ {file = "python_ulid-3.0.0-py3-none-any.whl", hash = "sha256:e4c4942ff50dbd79167ad01ac725ec58f924b4018025ce22c858bfcff99a5e31"}, {file = "python_ulid-3.0.0.tar.gz", hash = "sha256:e50296a47dc8209d28629a22fc81ca26c00982c78934bd7766377ba37ea49a9f"}, @@ -1553,11 +1278,9 @@ files = [ name = "python-ulid" version = "3.0.0" extras = ["pydantic"] -requires_python = ">=3.9" -summary = "Universally unique lexicographically sortable identifier" -groups = ["default"] +summary = "" dependencies = [ - "pydantic>=2.0", + "pydantic", "python-ulid==3.0.0", ] files = [ @@ -1568,11 +1291,9 @@ files = [ [[package]] name = "python-xlib" version = "0.33" -summary = "Python X Library" -groups = ["default"] -marker = "\"linux\" in sys_platform" +summary = "" dependencies = [ - "six>=1.10.0", + "six", ] files = [ {file = "python-xlib-0.33.tar.gz", hash = "sha256:55af7906a2c75ce6cb280a584776080602444f75815a7aff4d287bb2d7018b32"}, @@ -1582,9 +1303,7 @@ files = [ [[package]] name = "pywin32" version = "310" -summary = "Python for Window Extensions" -groups = ["dev"] -marker = "sys_platform == \"win32\" and platform_python_implementation != \"PyPy\"" +summary = "" files = [ {file = "pywin32-310-cp310-cp310-win32.whl", hash = "sha256:6dd97011efc8bf51d6793a82292419eba2c71cf8e7250cfac03bba284454abc1"}, {file = "pywin32-310-cp310-cp310-win_amd64.whl", hash = "sha256:c3e78706e4229b915a0821941a84e7ef420bf2b77e08c9dae3c76fd03fd2ae3d"}, @@ -1595,19 +1314,12 @@ files = [ {file = "pywin32-310-cp312-cp312-win32.whl", hash = "sha256:8a75a5cc3893e83a108c05d82198880704c44bbaee4d06e442e471d3c9ea4f3d"}, {file = "pywin32-310-cp312-cp312-win_amd64.whl", hash = "sha256:bf5c397c9a9a19a6f62f3fb821fbf36cac08f03770056711f765ec1503972060"}, {file = "pywin32-310-cp312-cp312-win_arm64.whl", hash = "sha256:2349cc906eae872d0663d4d6290d13b90621eaf78964bb1578632ff20e152966"}, - {file = "pywin32-310-cp313-cp313-win32.whl", hash = "sha256:5d241a659c496ada3253cd01cfaa779b048e90ce4b2b38cd44168ad555ce74ab"}, - {file = "pywin32-310-cp313-cp313-win_amd64.whl", hash = "sha256:667827eb3a90208ddbdcc9e860c81bde63a135710e21e4cb3348968e4bd5249e"}, - {file = "pywin32-310-cp313-cp313-win_arm64.whl", hash = "sha256:e308f831de771482b7cf692a1f308f8fca701b2d8f9dde6cc440c7da17e47b33"}, - {file = "pywin32-310-cp39-cp39-win32.whl", hash = "sha256:851c8d927af0d879221e616ae1f66145253537bbdd321a77e8ef701b443a9a1a"}, - {file = "pywin32-310-cp39-cp39-win_amd64.whl", hash = "sha256:96867217335559ac619f00ad70e513c0fcf84b8a3af9fc2bba3b59b97da70475"}, ] [[package]] name = "pyyaml" version = "6.0.2" -requires_python = ">=3.8" -summary = "YAML parser and emitter for Python" -groups = ["default", "dev"] +summary = "" files = [ {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, @@ -1636,33 +1348,13 @@ files = [ {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b"}, {file = "PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4"}, {file = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8"}, - {file = "PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba"}, - {file = "PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1"}, - {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133"}, - {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484"}, - {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5"}, - {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc"}, - {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652"}, - {file = "PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183"}, - {file = "PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563"}, - {file = "PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d"}, - {file = "PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f"}, - {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290"}, - {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12"}, - {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19"}, - {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e"}, - {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725"}, - {file = "PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631"}, - {file = "PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8"}, {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, ] [[package]] name = "pyzmq" version = "27.0.0" -requires_python = ">=3.8" -summary = "Python bindings for 0MQ" -groups = ["dev"] +summary = "" dependencies = [ "cffi; implementation_name == \"pypy\"", ] @@ -1697,25 +1389,6 @@ files = [ {file = "pyzmq-27.0.0-cp312-abi3-win32.whl", hash = "sha256:88b4e43cab04c3c0f0d55df3b1eef62df2b629a1a369b5289a58f6fa8b07c4f4"}, {file = "pyzmq-27.0.0-cp312-abi3-win_amd64.whl", hash = "sha256:dce4199bf5f648a902ce37e7b3afa286f305cd2ef7a8b6ec907470ccb6c8b371"}, {file = "pyzmq-27.0.0-cp312-abi3-win_arm64.whl", hash = "sha256:56e46bbb85d52c1072b3f809cc1ce77251d560bc036d3a312b96db1afe76db2e"}, - {file = "pyzmq-27.0.0-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:c36ad534c0c29b4afa088dc53543c525b23c0797e01b69fef59b1a9c0e38b688"}, - {file = "pyzmq-27.0.0-cp313-cp313t-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:67855c14173aec36395d7777aaba3cc527b393821f30143fd20b98e1ff31fd38"}, - {file = "pyzmq-27.0.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8617c7d43cd8ccdb62aebe984bfed77ca8f036e6c3e46dd3dddda64b10f0ab7a"}, - {file = "pyzmq-27.0.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:67bfbcbd0a04c575e8103a6061d03e393d9f80ffdb9beb3189261e9e9bc5d5e9"}, - {file = "pyzmq-27.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:5cd11d46d7b7e5958121b3eaf4cd8638eff3a720ec527692132f05a57f14341d"}, - {file = "pyzmq-27.0.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:b801c2e40c5aa6072c2f4876de8dccd100af6d9918d4d0d7aa54a1d982fd4f44"}, - {file = "pyzmq-27.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:20d5cb29e8c5f76a127c75b6e7a77e846bc4b655c373baa098c26a61b7ecd0ef"}, - {file = "pyzmq-27.0.0-cp313-cp313t-win32.whl", hash = "sha256:a20528da85c7ac7a19b7384e8c3f8fa707841fd85afc4ed56eda59d93e3d98ad"}, - {file = "pyzmq-27.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:d8229f2efece6a660ee211d74d91dbc2a76b95544d46c74c615e491900dc107f"}, - {file = "pyzmq-27.0.0-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:100f6e5052ba42b2533011d34a018a5ace34f8cac67cb03cfa37c8bdae0ca617"}, - {file = "pyzmq-27.0.0-cp39-cp39-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:bf6c6b061efd00404b9750e2cfbd9507492c8d4b3721ded76cb03786131be2ed"}, - {file = "pyzmq-27.0.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ee05728c0b0b2484a9fc20466fa776fffb65d95f7317a3419985b8c908563861"}, - {file = "pyzmq-27.0.0-cp39-cp39-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7cdf07fe0a557b131366f80727ec8ccc4b70d89f1e3f920d94a594d598d754f0"}, - {file = "pyzmq-27.0.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:90252fa2ff3a104219db1f5ced7032a7b5fc82d7c8d2fec2b9a3e6fd4e25576b"}, - {file = "pyzmq-27.0.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ea6d441c513bf18c578c73c323acf7b4184507fc244762193aa3a871333c9045"}, - {file = "pyzmq-27.0.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:ae2b34bcfaae20c064948a4113bf8709eee89fd08317eb293ae4ebd69b4d9740"}, - {file = "pyzmq-27.0.0-cp39-cp39-win32.whl", hash = "sha256:5b10bd6f008937705cf6e7bf8b6ece5ca055991e3eb130bca8023e20b86aa9a3"}, - {file = "pyzmq-27.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:00387d12a8af4b24883895f7e6b9495dc20a66027b696536edac35cb988c38f3"}, - {file = "pyzmq-27.0.0-cp39-cp39-win_arm64.whl", hash = "sha256:4c19d39c04c29a6619adfeb19e3735c421b3bfee082f320662f52e59c47202ba"}, {file = "pyzmq-27.0.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:656c1866505a5735d0660b7da6d7147174bbf59d4975fc2b7f09f43c9bc25745"}, {file = "pyzmq-27.0.0-pp310-pypy310_pp73-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:74175b9e12779382432dd1d1f5960ebe7465d36649b98a06c6b26be24d173fab"}, {file = "pyzmq-27.0.0-pp310-pypy310_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d8c6de908465697a8708e4d6843a1e884f567962fc61eb1706856545141d0cbb"}, @@ -1726,20 +1399,13 @@ files = [ {file = "pyzmq-27.0.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:14fe7aaac86e4e93ea779a821967360c781d7ac5115b3f1a171ced77065a0174"}, {file = "pyzmq-27.0.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6ad0562d4e6abb785be3e4dd68599c41be821b521da38c402bc9ab2a8e7ebc7e"}, {file = "pyzmq-27.0.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:9df43a2459cd3a3563404c1456b2c4c69564daa7dbaf15724c09821a3329ce46"}, - {file = "pyzmq-27.0.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:39ddd3ba0a641f01d8f13a3cfd4c4924eb58e660d8afe87e9061d6e8ca6f7ac3"}, - {file = "pyzmq-27.0.0-pp39-pypy39_pp73-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:8ca7e6a0388dd9e1180b14728051068f4efe83e0d2de058b5ff92c63f399a73f"}, - {file = "pyzmq-27.0.0-pp39-pypy39_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2524c40891be6a3106885a3935d58452dd83eb7a5742a33cc780a1ad4c49dec0"}, - {file = "pyzmq-27.0.0-pp39-pypy39_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6a56e3e5bd2d62a01744fd2f1ce21d760c7c65f030e9522738d75932a14ab62a"}, - {file = "pyzmq-27.0.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:096af9e133fec3a72108ddefba1e42985cb3639e9de52cfd336b6fc23aa083e9"}, {file = "pyzmq-27.0.0.tar.gz", hash = "sha256:b1f08eeb9ce1510e6939b6e5dcd46a17765e2333daae78ecf4606808442e52cf"}, ] [[package]] name = "regex" version = "2025.9.18" -requires_python = ">=3.9" -summary = "Alternative regular expression module, to replace re." -groups = ["default"] +summary = "" files = [ {file = "regex-2025.9.18-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:12296202480c201c98a84aecc4d210592b2f55e200a1d193235c4db92b9f6788"}, {file = "regex-2025.9.18-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:220381f1464a581f2ea988f2220cf2a67927adcef107d47d6897ba5a2f6d51a4"}, @@ -1784,35 +1450,18 @@ files = [ {file = "regex-2025.9.18-cp312-cp312-win32.whl", hash = "sha256:e1dd06f981eb226edf87c55d523131ade7285137fbde837c34dc9d1bf309f459"}, {file = "regex-2025.9.18-cp312-cp312-win_amd64.whl", hash = "sha256:3d86b5247bf25fa3715e385aa9ff272c307e0636ce0c9595f64568b41f0a9c77"}, {file = "regex-2025.9.18-cp312-cp312-win_arm64.whl", hash = "sha256:032720248cbeeae6444c269b78cb15664458b7bb9ed02401d3da59fe4d68c3a5"}, - {file = "regex-2025.9.18-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3dbcfcaa18e9480669030d07371713c10b4f1a41f791ffa5cb1a99f24e777f40"}, - {file = "regex-2025.9.18-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1e85f73ef7095f0380208269055ae20524bfde3f27c5384126ddccf20382a638"}, - {file = "regex-2025.9.18-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9098e29b3ea4ffffeade423f6779665e2a4f8db64e699c0ed737ef0db6ba7b12"}, - {file = "regex-2025.9.18-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:90b6b7a2d0f45b7ecaaee1aec6b362184d6596ba2092dd583ffba1b78dd0231c"}, - {file = "regex-2025.9.18-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c81b892af4a38286101502eae7aec69f7cd749a893d9987a92776954f3943408"}, - {file = "regex-2025.9.18-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3b524d010973f2e1929aeb635418d468d869a5f77b52084d9f74c272189c251d"}, - {file = "regex-2025.9.18-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6b498437c026a3d5d0be0020023ff76d70ae4d77118e92f6f26c9d0423452446"}, - {file = "regex-2025.9.18-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0716e4d6e58853d83f6563f3cf25c281ff46cf7107e5f11879e32cb0b59797d9"}, - {file = "regex-2025.9.18-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:065b6956749379d41db2625f880b637d4acc14c0a4de0d25d609a62850e96d36"}, - {file = "regex-2025.9.18-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:d4a691494439287c08ddb9b5793da605ee80299dd31e95fa3f323fac3c33d9d4"}, - {file = "regex-2025.9.18-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:ef8d10cc0989565bcbe45fb4439f044594d5c2b8919d3d229ea2c4238f1d55b0"}, - {file = "regex-2025.9.18-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:4baeb1b16735ac969a7eeecc216f1f8b7caf60431f38a2671ae601f716a32d25"}, - {file = "regex-2025.9.18-cp39-cp39-win32.whl", hash = "sha256:8e5f41ad24a1e0b5dfcf4c4e5d9f5bd54c895feb5708dd0c1d0d35693b24d478"}, - {file = "regex-2025.9.18-cp39-cp39-win_amd64.whl", hash = "sha256:50e8290707f2fb8e314ab3831e594da71e062f1d623b05266f8cfe4db4949afd"}, - {file = "regex-2025.9.18-cp39-cp39-win_arm64.whl", hash = "sha256:039a9d7195fd88c943d7c777d4941e8ef736731947becce773c31a1009cb3c35"}, {file = "regex-2025.9.18.tar.gz", hash = "sha256:c5ba23274c61c6fef447ba6a39333297d0c247f53059dba0bca415cac511edc4"}, ] [[package]] name = "requests" version = "2.32.4" -requires_python = ">=3.8" -summary = "Python HTTP for Humans." -groups = ["default"] +summary = "" dependencies = [ - "certifi>=2017.4.17", - "charset-normalizer<4,>=2", - "idna<4,>=2.5", - "urllib3<3,>=1.21.1", + "certifi", + "charset-normalizer", + "idna", + "urllib3", ] files = [ {file = "requests-2.32.4-py3-none-any.whl", hash = "sha256:27babd3cda2a6d50b30443204ee89830707d396671944c998b5975b031ac2b2c"}, @@ -1822,13 +1471,11 @@ files = [ [[package]] name = "rich" version = "14.0.0" -requires_python = ">=3.8.0" -summary = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" -groups = ["default"] +summary = "" dependencies = [ - "markdown-it-py>=2.2.0", - "pygments<3.0.0,>=2.13.0", - "typing-extensions<5.0,>=4.0.0; python_version < \"3.11\"", + "markdown-it-py", + "pygments", + "typing-extensions; python_full_version < \"3.11\"", ] files = [ {file = "rich-14.0.0-py3-none-any.whl", hash = "sha256:1c9491e1951aac09caffd42f448ee3d04e58923ffe14993f6e83068dc395d7e0"}, @@ -1838,9 +1485,7 @@ files = [ [[package]] name = "ruff" version = "0.12.3" -requires_python = ">=3.7" -summary = "An extremely fast Python linter and code formatter, written in Rust." -groups = ["dev"] +summary = "" files = [ {file = "ruff-0.12.3-py3-none-linux_armv6l.whl", hash = "sha256:47552138f7206454eaf0c4fe827e546e9ddac62c2a3d2585ca54d29a890137a2"}, {file = "ruff-0.12.3-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:0a9153b000c6fe169bb307f5bd1b691221c4286c133407b8827c406a55282041"}, @@ -1865,20 +1510,25 @@ files = [ [[package]] name = "semver" version = "3.0.4" -requires_python = ">=3.7" -summary = "Python helper for Semantic Versioning (https://semver.org)" -groups = ["default"] +summary = "" files = [ {file = "semver-3.0.4-py3-none-any.whl", hash = "sha256:9c824d87ba7f7ab4a1890799cec8596f15c1241cb473404ea1cb0c55e4b04746"}, {file = "semver-3.0.4.tar.gz", hash = "sha256:afc7d8c584a5ed0a11033af086e8af226a9c0b206f313e0301f8dd7b6b589602"}, ] +[[package]] +name = "simpleeval" +version = "1.0.3" +summary = "" +files = [ + {file = "simpleeval-1.0.3-py3-none-any.whl", hash = "sha256:e3bdbb8c82c26297c9a153902d0fd1858a6c3774bf53ff4f134788c3f2035c38"}, + {file = "simpleeval-1.0.3.tar.gz", hash = "sha256:67bbf246040ac3b57c29cf048657b9cf31d4e7b9d6659684daa08ca8f1e45829"}, +] + [[package]] name = "six" version = "1.17.0" -requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" -summary = "Python 2 and 3 compatibility utilities" -groups = ["default", "dev"] +summary = "" files = [ {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, @@ -1887,9 +1537,7 @@ files = [ [[package]] name = "sniffio" version = "1.3.1" -requires_python = ">=3.7" -summary = "Sniff out which async library your code is running under" -groups = ["default"] +summary = "" files = [ {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, @@ -1898,13 +1546,10 @@ files = [ [[package]] name = "sqlalchemy" version = "2.0.41" -requires_python = ">=3.7" -summary = "Database Abstraction Library" -groups = ["default"] +summary = "" dependencies = [ - "greenlet>=1; (platform_machine == \"win32\" or platform_machine == \"WIN32\" or platform_machine == \"AMD64\" or platform_machine == \"amd64\" or platform_machine == \"x86_64\" or platform_machine == \"ppc64le\" or platform_machine == \"aarch64\") and python_version < \"3.14\"", - "importlib-metadata; python_version < \"3.8\"", - "typing-extensions>=4.6.0", + "greenlet; platform_machine == \"AMD64\" or platform_machine == \"WIN32\" or platform_machine == \"aarch64\" or platform_machine == \"amd64\" or platform_machine == \"ppc64le\" or platform_machine == \"win32\" or platform_machine == \"x86_64\"", + "typing-extensions", ] files = [ {file = "sqlalchemy-2.0.41-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b1f09b6821406ea1f94053f346f28f8215e293344209129a9c0fcc3578598d7b"}, @@ -1931,22 +1576,6 @@ files = [ {file = "sqlalchemy-2.0.41-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41836fe661cc98abfae476e14ba1906220f92c4e528771a8a3ae6a151242d2ae"}, {file = "sqlalchemy-2.0.41-cp312-cp312-win32.whl", hash = "sha256:a8808d5cf866c781150d36a3c8eb3adccfa41a8105d031bf27e92c251e3969d6"}, {file = "sqlalchemy-2.0.41-cp312-cp312-win_amd64.whl", hash = "sha256:5b14e97886199c1f52c14629c11d90c11fbb09e9334fa7bb5f6d068d9ced0ce0"}, - {file = "sqlalchemy-2.0.41-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4eeb195cdedaf17aab6b247894ff2734dcead6c08f748e617bfe05bd5a218443"}, - {file = "sqlalchemy-2.0.41-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d4ae769b9c1c7757e4ccce94b0641bc203bbdf43ba7a2413ab2523d8d047d8dc"}, - {file = "sqlalchemy-2.0.41-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a62448526dd9ed3e3beedc93df9bb6b55a436ed1474db31a2af13b313a70a7e1"}, - {file = "sqlalchemy-2.0.41-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc56c9788617b8964ad02e8fcfeed4001c1f8ba91a9e1f31483c0dffb207002a"}, - {file = "sqlalchemy-2.0.41-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c153265408d18de4cc5ded1941dcd8315894572cddd3c58df5d5b5705b3fa28d"}, - {file = "sqlalchemy-2.0.41-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4f67766965996e63bb46cfbf2ce5355fc32d9dd3b8ad7e536a920ff9ee422e23"}, - {file = "sqlalchemy-2.0.41-cp313-cp313-win32.whl", hash = "sha256:bfc9064f6658a3d1cadeaa0ba07570b83ce6801a1314985bf98ec9b95d74e15f"}, - {file = "sqlalchemy-2.0.41-cp313-cp313-win_amd64.whl", hash = "sha256:82ca366a844eb551daff9d2e6e7a9e5e76d2612c8564f58db6c19a726869c1df"}, - {file = "sqlalchemy-2.0.41-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9a420a91913092d1e20c86a2f5f1fc85c1a8924dbcaf5e0586df8aceb09c9cc2"}, - {file = "sqlalchemy-2.0.41-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:906e6b0d7d452e9a98e5ab8507c0da791856b2380fdee61b765632bb8698026f"}, - {file = "sqlalchemy-2.0.41-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a373a400f3e9bac95ba2a06372c4fd1412a7cee53c37fc6c05f829bf672b8769"}, - {file = "sqlalchemy-2.0.41-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:087b6b52de812741c27231b5a3586384d60c353fbd0e2f81405a814b5591dc8b"}, - {file = "sqlalchemy-2.0.41-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:34ea30ab3ec98355235972dadc497bb659cc75f8292b760394824fab9cf39826"}, - {file = "sqlalchemy-2.0.41-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:8280856dd7c6a68ab3a164b4a4b1c51f7691f6d04af4d4ca23d6ecf2261b7923"}, - {file = "sqlalchemy-2.0.41-cp39-cp39-win32.whl", hash = "sha256:b50eab9994d64f4a823ff99a0ed28a6903224ddbe7fef56a6dd865eec9243440"}, - {file = "sqlalchemy-2.0.41-cp39-cp39-win_amd64.whl", hash = "sha256:5e22575d169529ac3e0a120cf050ec9daa94b6a9597993d1702884f6954a7d71"}, {file = "sqlalchemy-2.0.41-py3-none-any.whl", hash = "sha256:57df5dc6fdb5ed1a88a1ed2195fd31927e705cad62dedd86b46972752a80f576"}, {file = "sqlalchemy-2.0.41.tar.gz", hash = "sha256:edba70118c4be3c2b1f90754d308d0b79c6fe2c0fdc52d8ddf603916f83f4db9"}, ] @@ -1954,12 +1583,10 @@ files = [ [[package]] name = "sqlmodel" version = "0.0.24" -requires_python = ">=3.7" -summary = "SQLModel, SQL databases in Python, designed for simplicity, compatibility, and robustness." -groups = ["default"] +summary = "" dependencies = [ - "SQLAlchemy<2.1.0,>=2.0.14", - "pydantic<3.0.0,>=1.10.13", + "pydantic", + "sqlalchemy", ] files = [ {file = "sqlmodel-0.0.24-py3-none-any.whl", hash = "sha256:6778852f09370908985b667d6a3ab92910d0d5ec88adcaf23dbc242715ff7193"}, @@ -1969,11 +1596,10 @@ files = [ [[package]] name = "stack-data" version = "0.6.3" -summary = "Extract data from python stack frames and tracebacks for informative displays" -groups = ["dev"] +summary = "" dependencies = [ - "asttokens>=2.1.0", - "executing>=1.2.0", + "asttokens", + "executing", "pure-eval", ] files = [ @@ -1984,29 +1610,36 @@ files = [ [[package]] name = "starlette" version = "0.46.2" -requires_python = ">=3.9" -summary = "The little ASGI library that shines." -groups = ["default"] +summary = "" dependencies = [ - "anyio<5,>=3.6.2", - "typing-extensions>=3.10.0; python_version < \"3.10\"", + "anyio", ] files = [ {file = "starlette-0.46.2-py3-none-any.whl", hash = "sha256:595633ce89f8ffa71a015caed34a5b2dc1c0cdb3f0f1fbd1e69339cf2abeec35"}, {file = "starlette-0.46.2.tar.gz", hash = "sha256:7f7361f34eed179294600af672f565727419830b54b7b084efe44bb82d2fccd5"}, ] +[[package]] +name = "structlog" +version = "25.5.0" +summary = "" +dependencies = [ + "typing-extensions; python_full_version < \"3.11\"", +] +files = [ + {file = "structlog-25.5.0-py3-none-any.whl", hash = "sha256:a8453e9b9e636ec59bd9e79bbd4a72f025981b3ba0f5837aebf48f02f37a7f9f"}, + {file = "structlog-25.5.0.tar.gz", hash = "sha256:098522a3bebed9153d4570c6d0288abf80a031dfdb2048d59a49e9dc2190fc98"}, +] + [[package]] name = "textual" version = "3.4.0" -requires_python = "<4.0.0,>=3.8.1" -summary = "Modern Text User Interface framework" -groups = ["default"] +summary = "" dependencies = [ - "markdown-it-py[linkify,plugins]>=2.1.0", - "platformdirs<5,>=3.6.0", - "rich>=13.3.3", - "typing-extensions<5.0.0,>=4.4.0", + "markdown-it-py[linkify,plugins]", + "platformdirs", + "rich", + "typing-extensions", ] files = [ {file = "textual-3.4.0-py3-none-any.whl", hash = "sha256:5b3fd07772d3897d30b257825de3df011b83742863aa9d9abcb10e76e61e6ee4"}, @@ -2016,10 +1649,7 @@ files = [ [[package]] name = "tomli" version = "2.2.1" -requires_python = ">=3.8" -summary = "A lil' TOML parser" -groups = ["default"] -marker = "python_full_version < \"3.11\"" +summary = "" files = [ {file = "tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249"}, {file = "tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6"}, @@ -2041,16 +1671,6 @@ files = [ {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e"}, {file = "tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98"}, {file = "tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4"}, - {file = "tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7"}, - {file = "tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c"}, - {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13"}, - {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281"}, - {file = "tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272"}, - {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140"}, - {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2"}, - {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744"}, - {file = "tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec"}, - {file = "tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69"}, {file = "tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc"}, {file = "tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff"}, ] @@ -2058,9 +1678,7 @@ files = [ [[package]] name = "tornado" version = "6.5.1" -requires_python = ">=3.9" -summary = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." -groups = ["dev"] +summary = "" files = [ {file = "tornado-6.5.1-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:d50065ba7fd11d3bd41bcad0825227cc9a95154bad83239357094c36708001f7"}, {file = "tornado-6.5.1-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:9e9ca370f717997cb85606d074b0e5b247282cf5e2e1611568b8821afe0342d6"}, @@ -2079,9 +1697,7 @@ files = [ [[package]] name = "traitlets" version = "5.14.3" -requires_python = ">=3.8" -summary = "Traitlets Python configuration system" -groups = ["dev"] +summary = "" files = [ {file = "traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f"}, {file = "traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7"}, @@ -2090,12 +1706,10 @@ files = [ [[package]] name = "trogon" version = "0.6.0" -requires_python = "<4.0.0,>=3.8.1" -summary = "Automatically generate a Textual TUI for your Click CLI" -groups = ["default"] +summary = "" dependencies = [ - "click>=8.0.0", - "textual>=0.61.0", + "click", + "textual", ] files = [ {file = "trogon-0.6.0-py3-none-any.whl", hash = "sha256:fb5b6c25acd7a0eaba8d2cd32a57f1d80c26413cea737dad7a4eebcda56060e0"}, @@ -2105,9 +1719,7 @@ files = [ [[package]] name = "typing-extensions" version = "4.14.0" -requires_python = ">=3.9" -summary = "Backported and Experimental Type Hints for Python 3.9+" -groups = ["default", "dev"] +summary = "" files = [ {file = "typing_extensions-4.14.0-py3-none-any.whl", hash = "sha256:a1514509136dd0b477638fc68d6a91497af5076466ad0fa6c338e44e359944af"}, {file = "typing_extensions-4.14.0.tar.gz", hash = "sha256:8676b788e32f02ab42d9e7c61324048ae4c6d844a399eebace3d4979d75ceef4"}, @@ -2116,11 +1728,9 @@ files = [ [[package]] name = "typing-inspection" version = "0.4.1" -requires_python = ">=3.9" -summary = "Runtime typing introspection tools" -groups = ["default"] +summary = "" dependencies = [ - "typing-extensions>=4.12.0", + "typing-extensions", ] files = [ {file = "typing_inspection-0.4.1-py3-none-any.whl", hash = "sha256:389055682238f53b04f7badcb49b989835495a96700ced5dab2d8feae4b26f51"}, @@ -2130,9 +1740,7 @@ files = [ [[package]] name = "uc-micro-py" version = "1.0.3" -requires_python = ">=3.7" -summary = "Micro subset of unicode data files for linkify-it-py projects." -groups = ["default"] +summary = "" files = [ {file = "uc-micro-py-1.0.3.tar.gz", hash = "sha256:d321b92cff673ec58027c04015fcaa8bb1e005478643ff4a500882eaab88c48a"}, {file = "uc_micro_py-1.0.3-py3-none-any.whl", hash = "sha256:db1dffff340817673d7b466ec86114a9dc0e9d4d9b5ba229d9d60e5c12600cd5"}, @@ -2141,9 +1749,7 @@ files = [ [[package]] name = "urllib3" version = "2.5.0" -requires_python = ">=3.9" -summary = "HTTP library with thread-safe connection pooling, file post, and more." -groups = ["default"] +summary = "" files = [ {file = "urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc"}, {file = "urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760"}, @@ -2152,13 +1758,11 @@ files = [ [[package]] name = "uvicorn" version = "0.34.3" -requires_python = ">=3.9" -summary = "The lightning-fast ASGI server." -groups = ["default"] +summary = "" dependencies = [ - "click>=7.0", - "h11>=0.8", - "typing-extensions>=4.0; python_version < \"3.11\"", + "click", + "h11", + "typing-extensions; python_full_version < \"3.11\"", ] files = [ {file = "uvicorn-0.34.3-py3-none-any.whl", hash = "sha256:16246631db62bdfbf069b0645177d6e8a77ba950cfedbfd093acef9444e4d885"}, @@ -2169,18 +1773,16 @@ files = [ name = "uvicorn" version = "0.34.3" extras = ["standard"] -requires_python = ">=3.9" -summary = "The lightning-fast ASGI server." -groups = ["default"] +summary = "" dependencies = [ - "colorama>=0.4; sys_platform == \"win32\"", - "httptools>=0.6.3", - "python-dotenv>=0.13", - "pyyaml>=5.1", + "colorama; sys_platform == \"win32\"", + "httptools", + "python-dotenv", + "pyyaml", "uvicorn==0.34.3", - "uvloop>=0.15.1; (sys_platform != \"cygwin\" and sys_platform != \"win32\") and platform_python_implementation != \"PyPy\"", - "watchfiles>=0.13", - "websockets>=10.4", + "uvloop; platform_python_implementation != \"PyPy\" and (sys_platform != \"cygwin\" and sys_platform != \"win32\")", + "watchfiles", + "websockets", ] files = [ {file = "uvicorn-0.34.3-py3-none-any.whl", hash = "sha256:16246631db62bdfbf069b0645177d6e8a77ba950cfedbfd093acef9444e4d885"}, @@ -2190,10 +1792,7 @@ files = [ [[package]] name = "uvloop" version = "0.21.0" -requires_python = ">=3.8.0" -summary = "Fast implementation of asyncio event loop on top of libuv" -groups = ["default"] -marker = "(sys_platform != \"cygwin\" and sys_platform != \"win32\") and platform_python_implementation != \"PyPy\"" +summary = "" files = [ {file = "uvloop-0.21.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ec7e6b09a6fdded42403182ab6b832b71f4edaf7f37a9a0e371a01db5f0cb45f"}, {file = "uvloop-0.21.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:196274f2adb9689a289ad7d65700d37df0c0930fd8e4e743fa4834e850d7719d"}, @@ -2213,33 +1812,18 @@ files = [ {file = "uvloop-0.21.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86975dca1c773a2c9864f4c52c5a55631038e387b47eaf56210f873887b6c8dc"}, {file = "uvloop-0.21.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:461d9ae6660fbbafedd07559c6a2e57cd553b34b0065b6550685f6653a98c1cb"}, {file = "uvloop-0.21.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:183aef7c8730e54c9a3ee3227464daed66e37ba13040bb3f350bc2ddc040f22f"}, - {file = "uvloop-0.21.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:bfd55dfcc2a512316e65f16e503e9e450cab148ef11df4e4e679b5e8253a5281"}, - {file = "uvloop-0.21.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:787ae31ad8a2856fc4e7c095341cccc7209bd657d0e71ad0dc2ea83c4a6fa8af"}, - {file = "uvloop-0.21.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ee4d4ef48036ff6e5cfffb09dd192c7a5027153948d85b8da7ff705065bacc6"}, - {file = "uvloop-0.21.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3df876acd7ec037a3d005b3ab85a7e4110422e4d9c1571d4fc89b0fc41b6816"}, - {file = "uvloop-0.21.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bd53ecc9a0f3d87ab847503c2e1552b690362e005ab54e8a48ba97da3924c0dc"}, - {file = "uvloop-0.21.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a5c39f217ab3c663dc699c04cbd50c13813e31d917642d459fdcec07555cc553"}, - {file = "uvloop-0.21.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c097078b8031190c934ed0ebfee8cc5f9ba9642e6eb88322b9958b649750f72b"}, - {file = "uvloop-0.21.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:46923b0b5ee7fc0020bef24afe7836cb068f5050ca04caf6b487c513dc1a20b2"}, - {file = "uvloop-0.21.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:53e420a3afe22cdcf2a0f4846e377d16e718bc70103d7088a4f7623567ba5fb0"}, - {file = "uvloop-0.21.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88cb67cdbc0e483da00af0b2c3cdad4b7c61ceb1ee0f33fe00e09c81e3a6cb75"}, - {file = "uvloop-0.21.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:221f4f2a1f46032b403bf3be628011caf75428ee3cc204a22addf96f586b19fd"}, - {file = "uvloop-0.21.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:2d1f581393673ce119355d56da84fe1dd9d2bb8b3d13ce792524e1607139feff"}, {file = "uvloop-0.21.0.tar.gz", hash = "sha256:3bf12b0fda68447806a7ad847bfa591613177275d35b6724b1ee573faa3704e3"}, ] [[package]] name = "virtualenv" version = "20.35.4" -requires_python = ">=3.8" -summary = "Virtual Python Environment builder" -groups = ["dev"] +summary = "" dependencies = [ - "distlib<1,>=0.3.7", - "filelock<4,>=3.12.2", - "importlib-metadata>=6.6; python_version < \"3.8\"", - "platformdirs<5,>=3.9.1", - "typing-extensions>=4.13.2; python_version < \"3.11\"", + "distlib", + "filelock", + "platformdirs", + "typing-extensions; python_full_version < \"3.11\"", ] files = [ {file = "virtualenv-20.35.4-py3-none-any.whl", hash = "sha256:c21c9cede36c9753eeade68ba7d523529f228a403463376cf821eaae2b650f1b"}, @@ -2249,11 +1833,9 @@ files = [ [[package]] name = "watchfiles" version = "1.1.0" -requires_python = ">=3.9" -summary = "Simple, modern and high performance file watching and code reload in python." -groups = ["default"] +summary = "" dependencies = [ - "anyio>=3.0.0", + "anyio", ] files = [ {file = "watchfiles-1.1.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:27f30e14aa1c1e91cb653f03a63445739919aef84c8d2517997a83155e7a2fcc"}, @@ -2294,61 +1876,6 @@ files = [ {file = "watchfiles-1.1.0-cp312-cp312-win32.whl", hash = "sha256:cbcf8630ef4afb05dc30107bfa17f16c0896bb30ee48fc24bf64c1f970f3b1fd"}, {file = "watchfiles-1.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:cbd949bdd87567b0ad183d7676feb98136cde5bb9025403794a4c0db28ed3a47"}, {file = "watchfiles-1.1.0-cp312-cp312-win_arm64.whl", hash = "sha256:0a7d40b77f07be87c6faa93d0951a0fcd8cbca1ddff60a1b65d741bac6f3a9f6"}, - {file = "watchfiles-1.1.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:5007f860c7f1f8df471e4e04aaa8c43673429047d63205d1630880f7637bca30"}, - {file = "watchfiles-1.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:20ecc8abbd957046f1fe9562757903f5eaf57c3bce70929fda6c7711bb58074a"}, - {file = "watchfiles-1.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2f0498b7d2a3c072766dba3274fe22a183dbea1f99d188f1c6c72209a1063dc"}, - {file = "watchfiles-1.1.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:239736577e848678e13b201bba14e89718f5c2133dfd6b1f7846fa1b58a8532b"}, - {file = "watchfiles-1.1.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eff4b8d89f444f7e49136dc695599a591ff769300734446c0a86cba2eb2f9895"}, - {file = "watchfiles-1.1.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:12b0a02a91762c08f7264e2e79542f76870c3040bbc847fb67410ab81474932a"}, - {file = "watchfiles-1.1.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:29e7bc2eee15cbb339c68445959108803dc14ee0c7b4eea556400131a8de462b"}, - {file = "watchfiles-1.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d9481174d3ed982e269c090f780122fb59cee6c3796f74efe74e70f7780ed94c"}, - {file = "watchfiles-1.1.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:80f811146831c8c86ab17b640801c25dc0a88c630e855e2bef3568f30434d52b"}, - {file = "watchfiles-1.1.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:60022527e71d1d1fda67a33150ee42869042bce3d0fcc9cc49be009a9cded3fb"}, - {file = "watchfiles-1.1.0-cp313-cp313-win32.whl", hash = "sha256:32d6d4e583593cb8576e129879ea0991660b935177c0f93c6681359b3654bfa9"}, - {file = "watchfiles-1.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:f21af781a4a6fbad54f03c598ab620e3a77032c5878f3d780448421a6e1818c7"}, - {file = "watchfiles-1.1.0-cp313-cp313-win_arm64.whl", hash = "sha256:5366164391873ed76bfdf618818c82084c9db7fac82b64a20c44d335eec9ced5"}, - {file = "watchfiles-1.1.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:17ab167cca6339c2b830b744eaf10803d2a5b6683be4d79d8475d88b4a8a4be1"}, - {file = "watchfiles-1.1.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:328dbc9bff7205c215a7807da7c18dce37da7da718e798356212d22696404339"}, - {file = "watchfiles-1.1.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f7208ab6e009c627b7557ce55c465c98967e8caa8b11833531fdf95799372633"}, - {file = "watchfiles-1.1.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a8f6f72974a19efead54195bc9bed4d850fc047bb7aa971268fd9a8387c89011"}, - {file = "watchfiles-1.1.0-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d181ef50923c29cf0450c3cd47e2f0557b62218c50b2ab8ce2ecaa02bd97e670"}, - {file = "watchfiles-1.1.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:adb4167043d3a78280d5d05ce0ba22055c266cf8655ce942f2fb881262ff3cdf"}, - {file = "watchfiles-1.1.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8c5701dc474b041e2934a26d31d39f90fac8a3dee2322b39f7729867f932b1d4"}, - {file = "watchfiles-1.1.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b067915e3c3936966a8607f6fe5487df0c9c4afb85226613b520890049deea20"}, - {file = "watchfiles-1.1.0-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:9c733cda03b6d636b4219625a4acb5c6ffb10803338e437fb614fef9516825ef"}, - {file = "watchfiles-1.1.0-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:cc08ef8b90d78bfac66f0def80240b0197008e4852c9f285907377b2947ffdcb"}, - {file = "watchfiles-1.1.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:9974d2f7dc561cce3bb88dfa8eb309dab64c729de85fba32e98d75cf24b66297"}, - {file = "watchfiles-1.1.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c68e9f1fcb4d43798ad8814c4c1b61547b014b667216cb754e606bfade587018"}, - {file = "watchfiles-1.1.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:95ab1594377effac17110e1352989bdd7bdfca9ff0e5eeccd8c69c5389b826d0"}, - {file = "watchfiles-1.1.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fba9b62da882c1be1280a7584ec4515d0a6006a94d6e5819730ec2eab60ffe12"}, - {file = "watchfiles-1.1.0-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3434e401f3ce0ed6b42569128b3d1e3af773d7ec18751b918b89cd49c14eaafb"}, - {file = "watchfiles-1.1.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fa257a4d0d21fcbca5b5fcba9dca5a78011cb93c0323fb8855c6d2dfbc76eb77"}, - {file = "watchfiles-1.1.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7fd1b3879a578a8ec2076c7961076df540b9af317123f84569f5a9ddee64ce92"}, - {file = "watchfiles-1.1.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:62cc7a30eeb0e20ecc5f4bd113cd69dcdb745a07c68c0370cea919f373f65d9e"}, - {file = "watchfiles-1.1.0-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:891c69e027748b4a73847335d208e374ce54ca3c335907d381fde4e41661b13b"}, - {file = "watchfiles-1.1.0-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:12fe8eaffaf0faa7906895b4f8bb88264035b3f0243275e0bf24af0436b27259"}, - {file = "watchfiles-1.1.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:bfe3c517c283e484843cb2e357dd57ba009cff351edf45fb455b5fbd1f45b15f"}, - {file = "watchfiles-1.1.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a9ccbf1f129480ed3044f540c0fdbc4ee556f7175e5ab40fe077ff6baf286d4e"}, - {file = "watchfiles-1.1.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba0e3255b0396cac3cc7bbace76404dd72b5438bf0d8e7cefa2f79a7f3649caa"}, - {file = "watchfiles-1.1.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4281cd9fce9fc0a9dbf0fc1217f39bf9cf2b4d315d9626ef1d4e87b84699e7e8"}, - {file = "watchfiles-1.1.0-cp314-cp314t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6d2404af8db1329f9a3c9b79ff63e0ae7131986446901582067d9304ae8aaf7f"}, - {file = "watchfiles-1.1.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e78b6ed8165996013165eeabd875c5dfc19d41b54f94b40e9fff0eb3193e5e8e"}, - {file = "watchfiles-1.1.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:249590eb75ccc117f488e2fabd1bfa33c580e24b96f00658ad88e38844a040bb"}, - {file = "watchfiles-1.1.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d05686b5487cfa2e2c28ff1aa370ea3e6c5accfe6435944ddea1e10d93872147"}, - {file = "watchfiles-1.1.0-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:d0e10e6f8f6dc5762adee7dece33b722282e1f59aa6a55da5d493a97282fedd8"}, - {file = "watchfiles-1.1.0-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:af06c863f152005c7592df1d6a7009c836a247c9d8adb78fef8575a5a98699db"}, - {file = "watchfiles-1.1.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:865c8e95713744cf5ae261f3067861e9da5f1370ba91fc536431e29b418676fa"}, - {file = "watchfiles-1.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:42f92befc848bb7a19658f21f3e7bae80d7d005d13891c62c2cd4d4d0abb3433"}, - {file = "watchfiles-1.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa0cc8365ab29487eb4f9979fd41b22549853389e22d5de3f134a6796e1b05a4"}, - {file = "watchfiles-1.1.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:90ebb429e933645f3da534c89b29b665e285048973b4d2b6946526888c3eb2c7"}, - {file = "watchfiles-1.1.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c588c45da9b08ab3da81d08d7987dae6d2a3badd63acdb3e206a42dbfa7cb76f"}, - {file = "watchfiles-1.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7c55b0f9f68590115c25272b06e63f0824f03d4fc7d6deed43d8ad5660cabdbf"}, - {file = "watchfiles-1.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd17a1e489f02ce9117b0de3c0b1fab1c3e2eedc82311b299ee6b6faf6c23a29"}, - {file = "watchfiles-1.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da71945c9ace018d8634822f16cbc2a78323ef6c876b1d34bbf5d5222fd6a72e"}, - {file = "watchfiles-1.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:51556d5004887045dba3acdd1fdf61dddea2be0a7e18048b5e853dcd37149b86"}, - {file = "watchfiles-1.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04e4ed5d1cd3eae68c89bcc1a485a109f39f2fd8de05f705e98af6b5f1861f1f"}, - {file = "watchfiles-1.1.0-cp39-cp39-win32.whl", hash = "sha256:c600e85f2ffd9f1035222b1a312aff85fd11ea39baff1d705b9b047aad2ce267"}, - {file = "watchfiles-1.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:3aba215958d88182e8d2acba0fdaf687745180974946609119953c0e112397dc"}, {file = "watchfiles-1.1.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3a6fd40bbb50d24976eb275ccb55cd1951dfb63dbc27cae3066a6ca5f4beabd5"}, {file = "watchfiles-1.1.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:9f811079d2f9795b5d48b55a37aa7773680a5659afe34b54cc1d86590a51507d"}, {file = "watchfiles-1.1.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a2726d7bfd9f76158c84c10a409b77a320426540df8c35be172444394b17f7ea"}, @@ -2357,21 +1884,13 @@ files = [ {file = "watchfiles-1.1.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:51b81e55d40c4b4aa8658427a3ee7ea847c591ae9e8b81ef94a90b668999353c"}, {file = "watchfiles-1.1.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2bcdc54ea267fe72bfc7d83c041e4eb58d7d8dc6f578dfddb52f037ce62f432"}, {file = "watchfiles-1.1.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:923fec6e5461c42bd7e3fd5ec37492c6f3468be0499bc0707b4bbbc16ac21792"}, - {file = "watchfiles-1.1.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:7b3443f4ec3ba5aa00b0e9fa90cf31d98321cbff8b925a7c7b84161619870bc9"}, - {file = "watchfiles-1.1.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:7049e52167fc75fc3cc418fc13d39a8e520cbb60ca08b47f6cedb85e181d2f2a"}, - {file = "watchfiles-1.1.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54062ef956807ba806559b3c3d52105ae1827a0d4ab47b621b31132b6b7e2866"}, - {file = "watchfiles-1.1.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a7bd57a1bb02f9d5c398c0c1675384e7ab1dd39da0ca50b7f09af45fa435277"}, {file = "watchfiles-1.1.0.tar.gz", hash = "sha256:693ed7ec72cbfcee399e92c895362b6e66d63dac6b91e2c11ae03d10d503e575"}, ] [[package]] name = "wcwidth" version = "0.2.13" -summary = "Measures the displayed width of unicode strings in a terminal" -groups = ["dev"] -dependencies = [ - "backports-functools-lru-cache>=1.2.1; python_version < \"3.2\"", -] +summary = "" files = [ {file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"}, {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, @@ -2380,9 +1899,7 @@ files = [ [[package]] name = "websockets" version = "15.0.1" -requires_python = ">=3.9" -summary = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" -groups = ["default"] +summary = "" files = [ {file = "websockets-15.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d63efaa0cd96cf0c5fe4d581521d9fa87744540d4bc999ae6e08595a1014b45b"}, {file = "websockets-15.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ac60e3b188ec7574cb761b08d50fcedf9d77f1530352db4eef1707fe9dee7205"}, @@ -2417,40 +1934,12 @@ files = [ {file = "websockets-15.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3be571a8b5afed347da347bfcf27ba12b069d9d7f42cb8c7028b5e98bbb12597"}, {file = "websockets-15.0.1-cp312-cp312-win32.whl", hash = "sha256:c338ffa0520bdb12fbc527265235639fb76e7bc7faafbb93f6ba80d9c06578a9"}, {file = "websockets-15.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:fcd5cf9e305d7b8338754470cf69cf81f420459dbae8a3b40cee57417f4614a7"}, - {file = "websockets-15.0.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ee443ef070bb3b6ed74514f5efaa37a252af57c90eb33b956d35c8e9c10a1931"}, - {file = "websockets-15.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5a939de6b7b4e18ca683218320fc67ea886038265fd1ed30173f5ce3f8e85675"}, - {file = "websockets-15.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:746ee8dba912cd6fc889a8147168991d50ed70447bf18bcda7039f7d2e3d9151"}, - {file = "websockets-15.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:595b6c3969023ecf9041b2936ac3827e4623bfa3ccf007575f04c5a6aa318c22"}, - {file = "websockets-15.0.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c714d2fc58b5ca3e285461a4cc0c9a66bd0e24c5da9911e30158286c9b5be7f"}, - {file = "websockets-15.0.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f3c1e2ab208db911594ae5b4f79addeb3501604a165019dd221c0bdcabe4db8"}, - {file = "websockets-15.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:229cf1d3ca6c1804400b0a9790dc66528e08a6a1feec0d5040e8b9eb14422375"}, - {file = "websockets-15.0.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:756c56e867a90fb00177d530dca4b097dd753cde348448a1012ed6c5131f8b7d"}, - {file = "websockets-15.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:558d023b3df0bffe50a04e710bc87742de35060580a293c2a984299ed83bc4e4"}, - {file = "websockets-15.0.1-cp313-cp313-win32.whl", hash = "sha256:ba9e56e8ceeeedb2e080147ba85ffcd5cd0711b89576b83784d8605a7df455fa"}, - {file = "websockets-15.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:e09473f095a819042ecb2ab9465aee615bd9c2028e4ef7d933600a8401c79561"}, - {file = "websockets-15.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5f4c04ead5aed67c8a1a20491d54cdfba5884507a48dd798ecaf13c74c4489f5"}, - {file = "websockets-15.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:abdc0c6c8c648b4805c5eacd131910d2a7f6455dfd3becab248ef108e89ab16a"}, - {file = "websockets-15.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a625e06551975f4b7ea7102bc43895b90742746797e2e14b70ed61c43a90f09b"}, - {file = "websockets-15.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d591f8de75824cbb7acad4e05d2d710484f15f29d4a915092675ad3456f11770"}, - {file = "websockets-15.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:47819cea040f31d670cc8d324bb6435c6f133b8c7a19ec3d61634e62f8d8f9eb"}, - {file = "websockets-15.0.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac017dd64572e5c3bd01939121e4d16cf30e5d7e110a119399cf3133b63ad054"}, - {file = "websockets-15.0.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:4a9fac8e469d04ce6c25bb2610dc535235bd4aa14996b4e6dbebf5e007eba5ee"}, - {file = "websockets-15.0.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:363c6f671b761efcb30608d24925a382497c12c506b51661883c3e22337265ed"}, - {file = "websockets-15.0.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:2034693ad3097d5355bfdacfffcbd3ef5694f9718ab7f29c29689a9eae841880"}, - {file = "websockets-15.0.1-cp39-cp39-win32.whl", hash = "sha256:3b1ac0d3e594bf121308112697cf4b32be538fb1444468fb0a6ae4feebc83411"}, - {file = "websockets-15.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:b7643a03db5c95c799b89b31c036d5f27eeb4d259c798e878d6937d71832b1e4"}, {file = "websockets-15.0.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0c9e74d766f2818bb95f84c25be4dea09841ac0f734d1966f415e4edfc4ef1c3"}, {file = "websockets-15.0.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:1009ee0c7739c08a0cd59de430d6de452a55e42d6b522de7aa15e6f67db0b8e1"}, {file = "websockets-15.0.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76d1f20b1c7a2fa82367e04982e708723ba0e7b8d43aa643d3dcd404d74f1475"}, {file = "websockets-15.0.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f29d80eb9a9263b8d109135351caf568cc3f80b9928bccde535c235de55c22d9"}, {file = "websockets-15.0.1-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b359ed09954d7c18bbc1680f380c7301f92c60bf924171629c5db97febb12f04"}, {file = "websockets-15.0.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:cad21560da69f4ce7658ca2cb83138fb4cf695a2ba3e475e0559e05991aa8122"}, - {file = "websockets-15.0.1-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7f493881579c90fc262d9cdbaa05a6b54b3811c2f300766748db79f098db9940"}, - {file = "websockets-15.0.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:47b099e1f4fbc95b701b6e85768e1fcdaf1630f3cbe4765fa216596f12310e2e"}, - {file = "websockets-15.0.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67f2b6de947f8c757db2db9c71527933ad0019737ec374a8a6be9a956786aaf9"}, - {file = "websockets-15.0.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d08eb4c2b7d6c41da6ca0600c077e93f5adcfd979cd777d747e9ee624556da4b"}, - {file = "websockets-15.0.1-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b826973a4a2ae47ba357e4e82fa44a463b8f168e1ca775ac64521442b19e87f"}, - {file = "websockets-15.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:21c1fa28a6a7e3cbdc171c694398b6df4744613ce9b36b1a498e816787e28123"}, {file = "websockets-15.0.1-py3-none-any.whl", hash = "sha256:f7a866fbc1e97b5c617ee4116daaa09b722101d4a3c170c787450ba409f9736f"}, {file = "websockets-15.0.1.tar.gz", hash = "sha256:82544de02076bafba038ce055ee6412d68da13ab47f0c60cab827346de828dee"}, ] @@ -2458,10 +1947,7 @@ files = [ [[package]] name = "zipp" version = "3.23.0" -requires_python = ">=3.9" -summary = "Backport of pathlib-compatible object wrapper for zip files" -groups = ["dev"] -marker = "python_version < \"3.10\"" +summary = "" files = [ {file = "zipp-3.23.0-py3-none-any.whl", hash = "sha256:071652d6115ed432f5ce1d34c336c0adfd6a884660d1e9712a256d3d3bd4b14e"}, {file = "zipp-3.23.0.tar.gz", hash = "sha256:a07157588a12518c9d4034df3fbbee09c814741a33ff63c05fa29d26a2404166"}, diff --git a/pyproject.toml b/pyproject.toml index feaa8ce..8931058 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -9,12 +9,12 @@ authors = [ {name = "Tobias Ginsburg", email = "tginsburg@anl.gov"}, ] dependencies = [ - "madsci-node-module~=0.6.0", + "madsci-node-module==0.7.0rc1", "pynput>=1.8.1", - "madsci-client~=0.6.0", - "madsci-common~=0.6.0", + "madsci-client==0.7.0rc1", + "madsci-common==0.7.0rc1", ] -requires-python = ">=3.9.1,<3.13" +requires-python = ">=3.10,<3.13" readme = "README.md" license = {text = "MIT"} diff --git a/settings.yaml b/settings.yaml new file mode 100644 index 0000000..1948e76 --- /dev/null +++ b/settings.yaml @@ -0,0 +1,3 @@ +node_name: test_pf400 +node_description: MADSci node for controlling PF400, plate handler robot +node_module_name: pf400 diff --git a/src/pf400_rest_node.py b/src/pf400_rest_node.py index 30d3487..d912f51 100644 --- a/src/pf400_rest_node.py +++ b/src/pf400_rest_node.py @@ -3,6 +3,7 @@ from typing import Annotated, Optional +from madsci.common.ownership import get_current_ownership_info from madsci.common.types.action_types import ActionFailed from madsci.common.types.location_types import LocationArgument from madsci.common.types.node_types import RestNodeConfig @@ -54,13 +55,13 @@ def startup_handler(self) -> None: description="Template for PF400 robot gripper slot. Used to track what the robot is currently holding.", required_overrides=["resource_name"], tags=["pf400", "gripper", "slot"], - created_by=self.node_definition.node_id, + created_by=get_current_ownership_info().node_id, version="1.0.0", ) self.gripper_resource = self.resource_client.create_resource_from_template( template_name="pf400_gripper", - resource_name=f"{self.node_definition.node_name}.gripper", + resource_name=f"{self.node_info.node_name}.gripper", add_to_database=True, ) self.logger.log_info( @@ -84,7 +85,7 @@ def startup_handler(self) -> None: description="Template for temporary lid storage slot. Used when removing/replacing lids from plates.", required_overrides=["resource_name"], tags=["pf400", "lid", "slot", "temporary"], - created_by=self.node_definition.node_id, + created_by=get_current_ownership_info().node_id, version="1.0.0", ) @@ -106,7 +107,7 @@ def startup_handler(self) -> None: description="Template for plate lids. Used to track lids during lid operations.", required_overrides=["resource_name"], tags=["lid", "plate", "asset"], - created_by=self.node_definition.node_id, + created_by=get_current_ownership_info().node_id, version="1.0.0", ) @@ -213,11 +214,11 @@ def transfer( transfer_result = self.pf400_interface.transfer( source=source, target=target, - source_approach=source_approach if source_approach else None, - target_approach=target_approach if target_approach else None, + source_approach=source_approach or None, + target_approach=target_approach or None, source_plate_rotation=source_plate_rotation, target_plate_rotation=target_plate_rotation, - rotation_deck=rotation_deck if rotation_deck else None, + rotation_deck=rotation_deck or None, grab_offset=grab_offset, source_approach_height_offset=source_approach_height_offset, target_approach_height_offset=target_approach_height_offset, @@ -275,7 +276,7 @@ def pick_plate( pick_result = self.pf400_interface.pick_plate( source=source, - source_approach=source_approach if source_approach else None, + source_approach=source_approach or None, grab_offset=grab_offset, approach_height_offset=approach_height_offset, ) @@ -334,7 +335,7 @@ def place_plate( place_result = self.pf400_interface.place_plate( target=target, - target_approach=target_approach if target_approach else None, + target_approach=target_approach or None, grab_offset=grab_offset, approach_height_offset=approach_height_offset, ) From e11d2002972b82b9eff7a0987e0fb36c27636794 Mon Sep 17 00:00:00 2001 From: Dozgulbas Date: Mon, 2 Mar 2026 12:46:04 -0600 Subject: [PATCH 04/21] Automatic configuration documentation --- .env.example | 20 ++++++++++++++++++++ .pre-commit-config.yaml | 7 +++++++ AGENTS.md | 6 +++--- README.md | 16 ++++++---------- docs/Configuration.md | 30 ++++++++++++++++++++++++++++++ pdm.lock | 2 +- pyproject.toml | 13 +++++++++++++ 7 files changed, 80 insertions(+), 14 deletions(-) create mode 100644 .env.example create mode 100644 docs/Configuration.md diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..3a41e68 --- /dev/null +++ b/.env.example @@ -0,0 +1,20 @@ +### PF400NodeConfig + +# NODE_STATUS_UPDATE_INTERVAL=2.0 +# NODE_STATE_UPDATE_INTERVAL=2.0 +# NODE_NODE_NAME=null +# NODE_NODE_ID=null +# NODE_NODE_TYPE=null +# NODE_MODULE_NAME=null +# NODE_MODULE_VERSION=null +# NODE_URL="http://127.0.0.1:2000/" +# NODE_UVICORN_KWARGS={"limit_concurrency":10} +# NODE_ENABLE_RATE_LIMITING=true +# NODE_RATE_LIMIT_REQUESTS=100 +# NODE_RATE_LIMIT_WINDOW=60 +# NODE_RATE_LIMIT_SHORT_REQUESTS=50 +# NODE_RATE_LIMIT_SHORT_WINDOW=1 +# NODE_RATE_LIMIT_CLEANUP_INTERVAL=300 +# NODE_PF400_IP=null +# NODE_PF400_PORT=10100 +# NODE_PF400_STATUS_PORT=10000 diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 4724a70..95ff59e 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -24,3 +24,10 @@ repos: args: [--fix] # Run the formatter. - id: ruff-format + - repo: https://github.com/jag-k/pydantic-settings-export + rev: v1.0.3 + hooks: + - id: pydantic-settings-export + entry: pdm run pydantic-settings-export + language: system + files: ^src/pf400_rest_node\.py$ diff --git a/AGENTS.md b/AGENTS.md index dc6bd7c..e230412 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -9,11 +9,11 @@ MADSci node module for the Brooks Automation PreciseFlex 400 (PF400) robot arm. ## Installation and Running ```bash -# Install (use pip, not PDM) -pip install . +# Install +pdm install # Configure (see Configuration section below), then run -python -m pf400_rest_node +pdm run python -m pf400_rest_node # Run via Docker docker compose up diff --git a/README.md b/README.md index b5abe6d..da9c96f 100644 --- a/README.md +++ b/README.md @@ -6,17 +6,13 @@ Implementation of a MADSci Node Module for integrating a Brooks Automation Preci ### Python +This project uses [PDM](https://pdm-project.org/en/latest/#installation) for dependency management. + ```bash -# Create a virtual environment named .venv -python -m venv .venv -# Activate the virtual environment on Linux or macOS -source .venv/bin/activate -# Alternatively, activate the virtual environment on Windows -# .venv\Scripts\activate -# Install the module and dependencies in the venv -pip install . +# Install dependencies +pdm install # Create a settings file (see Configuration below), then start the node -python -m pf400_rest_node +pdm run python -m pf400_rest_node ``` ### Configuration @@ -31,7 +27,7 @@ pf400_port: 10100 pf400_status_port: 10000 ``` -All settings can also be provided as environment variables (e.g. `PF400_IP`, `NODE_URL`). The node's stable ID is stored in `.madsci/registry.json` and reused across restarts. +All settings can also be provided as environment variables — see [`.env.example`](.env.example) for the full list. For detailed descriptions of every option, see [`docs/Configuration.md`](docs/Configuration.md). The node's stable ID is stored in `.madsci/registry.json` and reused across restarts. ### Docker diff --git a/docs/Configuration.md b/docs/Configuration.md new file mode 100644 index 0000000..7655cca --- /dev/null +++ b/docs/Configuration.md @@ -0,0 +1,30 @@ +# Configuration + +Here you can find all available configuration options using ENV variables. + +## PF400NodeConfig + +Configuration for the pf400 node module. + +**Environment Prefix**: `NODE_` + +| Name | Type | Default | Description | Example | +|------------------------------------|--------------------------|----------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------| +| `NODE_STATUS_UPDATE_INTERVAL` | `number` \| `NoneType` | `2.0` | The interval in seconds at which the node should update its status. | `2.0` | +| `NODE_STATE_UPDATE_INTERVAL` | `number` \| `NoneType` | `2.0` | The interval in seconds at which the node should update its state. | `2.0` | +| `NODE_NODE_NAME` | `string` \| `NoneType` | `null` | Name for this node. If not set, defaults to the class name. | `null` | +| `NODE_NODE_ID` | `string` \| `NoneType` | `null` | Unique ID for this node. If not set, a new ULID is generated. | `null` | +| `NODE_NODE_TYPE` | `NodeType` \| `NoneType` | `null` | The type of thing this node provides an interface for. | `null` | +| `NODE_MODULE_NAME` | `string` \| `NoneType` | `null` | Name of the node module implementation. | `null` | +| `NODE_MODULE_VERSION` | `string` \| `NoneType` | `null` | Version of the node module implementation. | `null` | +| `NODE_URL` \| `NODE_URL` | `AnyUrl` | `"http://127.0.0.1:2000/"` | The URL used to communicate with the node. This is the base URL for the REST API. | `"http://127.0.0.1:2000/"` | +| `NODE_UVICORN_KWARGS` | `object` | `{"limit_concurrency":10}` | Configuration for the Uvicorn server that runs the REST API. By default, sets limit_concurrency=10 to protect against connection exhaustion attacks. | `{"limit_concurrency":10}` | +| `NODE_ENABLE_RATE_LIMITING` | `boolean` | `true` | Enable rate limiting middleware for the REST API. | `true` | +| `NODE_RATE_LIMIT_REQUESTS` | `integer` | `100` | Maximum number of requests allowed per long time window (only used if enable_rate_limiting is True). | `100` | +| `NODE_RATE_LIMIT_WINDOW` | `integer` | `60` | Long time window in seconds for rate limiting (only used if enable_rate_limiting is True). | `60` | +| `NODE_RATE_LIMIT_SHORT_REQUESTS` | `integer` \| `NoneType` | `50` | Maximum number of requests allowed per short time window for burst protection (only used if enable_rate_limiting is True). If None, short window limiting is disabled. | `50` | +| `NODE_RATE_LIMIT_SHORT_WINDOW` | `integer` \| `NoneType` | `1` | Short time window for burst protection in seconds (only used if enable_rate_limiting is True). If None, short window limiting is disabled. | `1` | +| `NODE_RATE_LIMIT_CLEANUP_INTERVAL` | `integer` | `300` | Interval in seconds between cleanup operations to prevent memory leaks (only used if enable_rate_limiting is True). | `300` | +| `NODE_PF400_IP` | `string` \| `NoneType` | `null` | | `null` | +| `NODE_PF400_PORT` | `integer` | `10100` | | `10100` | +| `NODE_PF400_STATUS_PORT` | `integer` | `10000` | | `10000` | diff --git a/pdm.lock b/pdm.lock index f9eda1a..d298cb1 100644 --- a/pdm.lock +++ b/pdm.lock @@ -5,7 +5,7 @@ groups = ["default", "dev"] strategy = [] lock_version = "4.5.0" -content_hash = "sha256:156028279ae891cca591d8596bd7eeec70235c867534527622147bc9fb96df5f" +content_hash = "sha256:fd74e01c0aa90edb96464d66e43f1df3e85ecb316327a3395fa43c5f234dc398" [[metadata.targets]] requires_python = ">=3.10,<3.13" diff --git a/pyproject.toml b/pyproject.toml index 8931058..ca6a272 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -27,4 +27,17 @@ dev = [ "ipykernel>=6.29.5", "ruff>=0.12.0", "pre-commit>=4.3.0", + "pydantic-settings-export>=1.0.2", ] + +[tool.pydantic_settings_export] +project_dir = "." +default_settings = [ + "pf400_rest_node:PF400NodeConfig", +] + +[[tool.pydantic_settings_export.generators.markdown]] +paths = ["docs/Configuration.md"] + +[[tool.pydantic_settings_export.generators.dotenv]] +paths = [".env.example"] From 5bf957b45dd5e09e48b9e4ead643a79f90803a2f Mon Sep 17 00:00:00 2001 From: Dozgulbas Date: Mon, 9 Mar 2026 15:01:12 -0500 Subject: [PATCH 05/21] Update to v0.7, add move_to_location and move_neutral actions --- Dockerfile | 2 +- pdm.lock | 20 +++++------ pyproject.toml | 6 ++-- src/pf400_interface/pf400.py | 70 ++++++++++++++++++++++++++++++++++++ src/pf400_rest_node.py | 53 +++++++++++++++++++-------- 5 files changed, 123 insertions(+), 28 deletions(-) diff --git a/Dockerfile b/Dockerfile index c9d46e6..90d1114 100644 --- a/Dockerfile +++ b/Dockerfile @@ -19,6 +19,6 @@ RUN --mount=type=cache,target=/root/.cache \ uv pip install --python ${MADSCI_VENV}/bin/python -e /home/madsci/pf400_module && \ chown -R ${USER_ID}:${GROUP_ID} /home/madsci/pf400_module -CMD ["python", "-m", "pf400_rest_node", "--node_definition", "definitions/pf400.node.yaml"] +CMD ["python", "-m", "pf400_rest_node"] ######################################### diff --git a/pdm.lock b/pdm.lock index d298cb1..c56892b 100644 --- a/pdm.lock +++ b/pdm.lock @@ -5,7 +5,7 @@ groups = ["default", "dev"] strategy = [] lock_version = "4.5.0" -content_hash = "sha256:fd74e01c0aa90edb96464d66e43f1df3e85ecb316327a3395fa43c5f234dc398" +content_hash = "sha256:27982f65982f80f0c56310d580de55bd6ffd42f27c42e41004e1e38a4cb0ce7f" [[metadata.targets]] requires_python = ">=3.10,<3.13" @@ -590,7 +590,7 @@ files = [ [[package]] name = "madsci-client" -version = "0.7.0rc1" +version = "0.7.0" summary = "" dependencies = [ "click", @@ -603,13 +603,13 @@ dependencies = [ "trogon", ] files = [ - {file = "madsci_client-0.7.0rc1-py3-none-any.whl", hash = "sha256:043193f976b691b1dada2b2f31782338157a95fbf0c541a18f35585f266fda62"}, - {file = "madsci_client-0.7.0rc1.tar.gz", hash = "sha256:c2a9fd1cf470b1d24f3f0372f309b55d953cda1335471e9cb342ec35eb3d9e2a"}, + {file = "madsci_client-0.7.0-py3-none-any.whl", hash = "sha256:aea70545929af0c07b46fcd35f639fc728be3cab78cd2049d5dfe7d8244f79d9"}, + {file = "madsci_client-0.7.0.tar.gz", hash = "sha256:d707383f607da7e16ea2e7a5ba42e6af6bc0b9beb355e8811f2a4e4cef21739b"}, ] [[package]] name = "madsci-common" -version = "0.7.0rc1" +version = "0.7.0" summary = "" dependencies = [ "aenum", @@ -638,13 +638,13 @@ dependencies = [ "uvicorn[standard]", ] files = [ - {file = "madsci_common-0.7.0rc1-py3-none-any.whl", hash = "sha256:6fd3f71f2105c6861d0f81175a9b99991b5c64b7c7920e2ca585c2170bff1069"}, - {file = "madsci_common-0.7.0rc1.tar.gz", hash = "sha256:541d2b9da128c6fc67d9c3ba1a8a191900a6bafa24791ff3d6d2452576f84d3d"}, + {file = "madsci_common-0.7.0-py3-none-any.whl", hash = "sha256:4eb988c97709d55baa07d24a708e42567de6c75f9713b54e188bff000903adf8"}, + {file = "madsci_common-0.7.0.tar.gz", hash = "sha256:0bf3f155c3de19b85090ef2928ef4eb157405f096484fe7c27b5cc45a16daab6"}, ] [[package]] name = "madsci-node-module" -version = "0.7.0rc1" +version = "0.7.0" summary = "" dependencies = [ "madsci-client", @@ -652,8 +652,8 @@ dependencies = [ "regex", ] files = [ - {file = "madsci_node_module-0.7.0rc1-py3-none-any.whl", hash = "sha256:a7b82acd7ab1edbe5d5c1f517d26a5d0c7b53b2c643603bd3afd22a21a3a6921"}, - {file = "madsci_node_module-0.7.0rc1.tar.gz", hash = "sha256:01d1c7cd5ec91e98e5c66b725d897417bda85a961479d64346a05a35a0d7e70e"}, + {file = "madsci_node_module-0.7.0-py3-none-any.whl", hash = "sha256:744cc1cbf9e4eb698f4709f93039439d693788c9a4ce5d9bf0f022b2784c1a43"}, + {file = "madsci_node_module-0.7.0.tar.gz", hash = "sha256:1bdbf319c56de287e97feb605bc05308195323318db3a22f73081b4ddf21bc67"}, ] [[package]] diff --git a/pyproject.toml b/pyproject.toml index ca6a272..849998e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -9,10 +9,10 @@ authors = [ {name = "Tobias Ginsburg", email = "tginsburg@anl.gov"}, ] dependencies = [ - "madsci-node-module==0.7.0rc1", + "madsci-node-module~=0.7", "pynput>=1.8.1", - "madsci-client==0.7.0rc1", - "madsci-common==0.7.0rc1", + "madsci-client~=0.7", + "madsci-common~=0.7", ] requires-python = ">=3.10,<3.13" readme = "README.md" diff --git a/src/pf400_interface/pf400.py b/src/pf400_interface/pf400.py index 69437ac..23befa5 100644 --- a/src/pf400_interface/pf400.py +++ b/src/pf400_interface/pf400.py @@ -1033,6 +1033,76 @@ def place_plate( return release_succeeded + def move_to_location( + self, + target: LocationArgument, + target_approach: LocationArgument = None, + grab_offset: Optional[float] = None, + approach_height_offset: Optional[float] = None, + ) -> None: + """ + Move to a target location for testing/calibration purposes. + + Follows the same approach and descend sequence as pick_plate, but keeps the + gripper open (unless holding a plate) and does not grip/release or change + resource state. Stays at the target position so the user can inspect and + adjust calibration. Use move_all_joints_neutral() to retract afterward. + """ + above_position = self._calculate_above_position( + target.representation, approach_height_offset, grab_offset + ) + + # Check if the gripper is currently holding a plate + holding_plate = ( + self.resource_client + and len( + self.resource_client.get_resource(self.gripper_resource_id).children + ) + > 0 + ) + + # Only open gripper if not holding a plate (prevent dropping labware) + if not holding_plate: + self.open_gripper() + + if target_approach: + self._handle_approach_location(target_approach) + approach_motion_profile = self.straight_motion_profile + else: + self.move_all_joints_neutral(target.representation) + approach_motion_profile = self.fast_motion_profile + + self.move_joint( + target_joint_angles=above_position, profile=approach_motion_profile + ) + + target_position = ( + self._apply_grab_offset(target.representation, grab_offset) + if grab_offset + else target.representation + ) + self.move_joint( + target_joint_angles=target_position, + profile=approach_motion_profile, + gripper_open=not holding_plate, + ) + + def move_neutral(self, height_offset: Optional[float] = None) -> None: + """ + Retract upward and move to neutral position. + + Retracts the arm upward by height_offset (defaults to default_approach_height) + before moving to neutral, mirroring the retract step in pick_plate/place_plate. + """ + retract_height = ( + height_offset if height_offset is not None else self.default_approach_height + ) + self.move_in_one_axis( + profile=self.slow_motion_profile, + axis_z=retract_height, + ) + self.move_all_joints_neutral() + def transfer( self, source: LocationArgument, diff --git a/src/pf400_rest_node.py b/src/pf400_rest_node.py index d912f51..13e1cb7 100644 --- a/src/pf400_rest_node.py +++ b/src/pf400_rest_node.py @@ -344,6 +344,45 @@ def place_plate( return None + @action( + name="move_to_location", + description="Move to a location for testing/calibration (gripper open, no grip)", + ) + def move_to_location( + self, + target: Annotated[LocationArgument, "Location to move to"], + target_approach: Annotated[ + Optional[LocationArgument], "Location to approach from" + ] = None, + grab_offset: Optional[Annotated[float, "Add grab height offset"]] = None, + approach_height_offset: Optional[ + Annotated[float, "Add approach height offset"] + ] = None, + ) -> None: + """Move to a location using the same approach/descend sequence as pick/place but with gripper open and no grip/release. Stays at the target for inspection. Use move_neutral to retract.""" + self.pf400_interface.move_to_location( + target=target, + target_approach=target_approach or None, + grab_offset=grab_offset, + approach_height_offset=approach_height_offset, + ) + + @action( + name="move_neutral", + description="Retract the arm to neutral position", + ) + def move_neutral( + self, + height_offset: Optional[ + Annotated[ + float, + "Height to retract before moving to neutral (defaults to default_approach_height)", + ] + ] = None, + ) -> None: + """Retract upward and move to neutral position. Use after move_to_location to retract the arm.""" + self.pf400_interface.move_neutral(height_offset=height_offset) + @action(name="remove_lid", description="Remove a lid from a plate") def remove_lid( self, @@ -505,20 +544,6 @@ def reset(self) -> None: self.logger.log("Node reset.") return result - def safety_stop(self) -> None: - """Stop the node.""" - self.logger.log("Stopping node...") - self.node_status.stopped = True - self.logger.log("Node stopped.") - return True - - def cancel(self) -> None: - """Cancel the node.""" - self.logger.log("Canceling node...") - self.node_status.cancelled = True - self.logger.log("Node cancelled.") - return True - if __name__ == "__main__": pf400_node = PF400Node() From 0ad964adeb1178f7f4daf6c023aeb50b1472d6de Mon Sep 17 00:00:00 2001 From: Dozgulbas Date: Mon, 9 Mar 2026 15:07:28 -0500 Subject: [PATCH 06/21] Update pre-commit workflow to use pdm + uv --- .github/workflows/pre-commit.yml | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/.github/workflows/pre-commit.yml b/.github/workflows/pre-commit.yml index f01c862..74a5913 100644 --- a/.github/workflows/pre-commit.yml +++ b/.github/workflows/pre-commit.yml @@ -10,11 +10,17 @@ jobs: pre-commit: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 name: Checkout code - - uses: actions/setup-python@v4 - name: Setup Python + - name: Install the latest version of uv + uses: astral-sh/setup-uv@v7 + - name: Setup PDM + uses: pdm-project/setup-pdm@v4 with: - python-version: 3.9 + python-version: "3.10" + - name: Install dependencies + env: + PDM_USE_UV: "True" + run: pdm install - uses: pre-commit/action@v3.0.1 name: Run Pre-Commit Checks From c3f71d170384b33cd1c40e4d3e9d843be0d1155c Mon Sep 17 00:00:00 2001 From: Dozgulbas Date: Mon, 9 Mar 2026 15:10:46 -0500 Subject: [PATCH 07/21] Update pdm lockfile --- pdm.lock | 1756 ++++++++++++++++++++++++++++-------------------------- 1 file changed, 908 insertions(+), 848 deletions(-) diff --git a/pdm.lock b/pdm.lock index c56892b..0a4e22a 100644 --- a/pdm.lock +++ b/pdm.lock @@ -19,6 +19,15 @@ files = [ {file = "aenum-3.1.16.tar.gz", hash = "sha256:bfaf9589bdb418ee3a986d85750c7318d9d2839c1b1a1d6fe8fc53ec201cf140"}, ] +[[package]] +name = "annotated-doc" +version = "0.0.4" +summary = "" +files = [ + {file = "annotated_doc-0.0.4-py3-none-any.whl", hash = "sha256:571ac1dc6991c450b25a9c2d84a3705e2ae7a53467b5d111c24fa8baabbed320"}, + {file = "annotated_doc-0.0.4.tar.gz", hash = "sha256:fbcda96e87e9c92ad167c2e53839e57503ecfda18804ea28102353485033faa4"}, +] + [[package]] name = "annotated-types" version = "0.7.0" @@ -30,17 +39,16 @@ files = [ [[package]] name = "anyio" -version = "4.9.0" +version = "4.12.1" summary = "" dependencies = [ "exceptiongroup; python_full_version < \"3.11\"", "idna", - "sniffio", "typing-extensions", ] files = [ - {file = "anyio-4.9.0-py3-none-any.whl", hash = "sha256:9f76d541cad6e36af7beb62e978876f3b41e3e04f2c1fbf0884604c0a9c4d93c"}, - {file = "anyio-4.9.0.tar.gz", hash = "sha256:673c0c244e15788651a4ff38710fea9675823028a6f08a5eda409e0c9840a028"}, + {file = "anyio-4.12.1-py3-none-any.whl", hash = "sha256:d405828884fc140aa80a3c667b8beed277f1dfedec42ba031bd6ac3db606ab6c"}, + {file = "anyio-4.12.1.tar.gz", hash = "sha256:41cfcc3a4c85d3f05c932da7c26d0201ac36f72abd4435ba90d0464a3ffed703"}, ] [[package]] @@ -66,144 +74,160 @@ files = [ [[package]] name = "argon2-cffi-bindings" -version = "21.2.0" +version = "25.1.0" summary = "" dependencies = [ "cffi", ] files = [ - {file = "argon2-cffi-bindings-21.2.0.tar.gz", hash = "sha256:bb89ceffa6c791807d1305ceb77dbfacc5aa499891d2c55661c6459651fc39e3"}, - {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ccb949252cb2ab3a08c02024acb77cfb179492d5701c7cbdbfd776124d4d2367"}, - {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9524464572e12979364b7d600abf96181d3541da11e23ddf565a32e70bd4dc0d"}, - {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b746dba803a79238e925d9046a63aa26bf86ab2a2fe74ce6b009a1c3f5c8f2ae"}, - {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58ed19212051f49a523abb1dbe954337dc82d947fb6e5a0da60f7c8471a8476c"}, - {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:bd46088725ef7f58b5a1ef7ca06647ebaf0eb4baff7d1d0d177c6cc8744abd86"}, - {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_i686.whl", hash = "sha256:8cd69c07dd875537a824deec19f978e0f2078fdda07fd5c42ac29668dda5f40f"}, - {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:f1152ac548bd5b8bcecfb0b0371f082037e47128653df2e8ba6e914d384f3c3e"}, - {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-win32.whl", hash = "sha256:603ca0aba86b1349b147cab91ae970c63118a0f30444d4bc80355937c950c082"}, - {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-win_amd64.whl", hash = "sha256:b2ef1c30440dbbcba7a5dc3e319408b59676e2e039e2ae11a8775ecf482b192f"}, - {file = "argon2_cffi_bindings-21.2.0-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e415e3f62c8d124ee16018e491a009937f8cf7ebf5eb430ffc5de21b900dad93"}, + {file = "argon2_cffi_bindings-25.1.0-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:aecba1723ae35330a008418a91ea6cfcedf6d31e5fbaa056a166462ff066d500"}, + {file = "argon2_cffi_bindings-25.1.0-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:2630b6240b495dfab90aebe159ff784d08ea999aa4b0d17efa734055a07d2f44"}, + {file = "argon2_cffi_bindings-25.1.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:7aef0c91e2c0fbca6fc68e7555aa60ef7008a739cbe045541e438373bc54d2b0"}, + {file = "argon2_cffi_bindings-25.1.0-cp39-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1e021e87faa76ae0d413b619fe2b65ab9a037f24c60a1e6cc43457ae20de6dc6"}, + {file = "argon2_cffi_bindings-25.1.0-cp39-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d3e924cfc503018a714f94a49a149fdc0b644eaead5d1f089330399134fa028a"}, + {file = "argon2_cffi_bindings-25.1.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:c87b72589133f0346a1cb8d5ecca4b933e3c9b64656c9d175270a000e73b288d"}, + {file = "argon2_cffi_bindings-25.1.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:1db89609c06afa1a214a69a462ea741cf735b29a57530478c06eb81dd403de99"}, + {file = "argon2_cffi_bindings-25.1.0-cp39-abi3-win32.whl", hash = "sha256:473bcb5f82924b1becbb637b63303ec8d10e84c8d241119419897a26116515d2"}, + {file = "argon2_cffi_bindings-25.1.0-cp39-abi3-win_amd64.whl", hash = "sha256:a98cd7d17e9f7ce244c0803cad3c23a7d379c301ba618a5fa76a67d116618b98"}, + {file = "argon2_cffi_bindings-25.1.0-cp39-abi3-win_arm64.whl", hash = "sha256:b0fdbcf513833809c882823f98dc2f931cf659d9a1429616ac3adebb49f5db94"}, + {file = "argon2_cffi_bindings-25.1.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:6dca33a9859abf613e22733131fc9194091c1fa7cb3e131c143056b4856aa47e"}, + {file = "argon2_cffi_bindings-25.1.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:21378b40e1b8d1655dd5310c84a40fc19a9aa5e6366e835ceb8576bf0fea716d"}, + {file = "argon2_cffi_bindings-25.1.0-pp310-pypy310_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5d588dec224e2a83edbdc785a5e6f3c6cd736f46bfd4b441bbb5aa1f5085e584"}, + {file = "argon2_cffi_bindings-25.1.0-pp310-pypy310_pp73-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5acb4e41090d53f17ca1110c3427f0a130f944b896fc8c83973219c97f57b690"}, + {file = "argon2_cffi_bindings-25.1.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:da0c79c23a63723aa5d782250fbf51b768abca630285262fb5144ba5ae01e520"}, + {file = "argon2_cffi_bindings-25.1.0.tar.gz", hash = "sha256:b957f3e6ea4d55d820e40ff76f450952807013d361a65d7f28acc0acbf29229d"}, ] [[package]] name = "asttokens" -version = "3.0.0" +version = "3.0.1" summary = "" files = [ - {file = "asttokens-3.0.0-py3-none-any.whl", hash = "sha256:e3078351a059199dd5138cb1c706e6430c05eff2ff136af5eb4790f9d28932e2"}, - {file = "asttokens-3.0.0.tar.gz", hash = "sha256:0dcd8baa8d62b0c1d118b399b2ddba3c4aff271d0d7a9e0d4c1681c79035bbc7"}, + {file = "asttokens-3.0.1-py3-none-any.whl", hash = "sha256:15a3ebc0f43c2d0a50eeafea25e19046c68398e487b9f1f5b517f7c0f40f976a"}, + {file = "asttokens-3.0.1.tar.gz", hash = "sha256:71a4ee5de0bde6a31d64f6b13f2293ac190344478f081c3d1bccfcf5eacb0cb7"}, ] [[package]] name = "certifi" -version = "2025.6.15" +version = "2026.2.25" summary = "" files = [ - {file = "certifi-2025.6.15-py3-none-any.whl", hash = "sha256:2e0c7ce7cb5d8f8634ca55d2ba7e6ec2689a2fd6537d8dec1296a477a4910057"}, - {file = "certifi-2025.6.15.tar.gz", hash = "sha256:d747aa5a8b9bbbb1bb8c22bb13e22bd1f18e9796defa16bab421f7f7a317323b"}, + {file = "certifi-2026.2.25-py3-none-any.whl", hash = "sha256:027692e4402ad994f1c42e52a4997a9763c646b73e4096e4d5d6db8af1d6f0fa"}, + {file = "certifi-2026.2.25.tar.gz", hash = "sha256:e887ab5cee78ea814d3472169153c2d12cd43b14bd03329a39a9c6e2e80bfba7"}, ] [[package]] name = "cffi" -version = "1.17.1" +version = "2.0.0" summary = "" dependencies = [ - "pycparser", -] -files = [ - {file = "cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14"}, - {file = "cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67"}, - {file = "cffi-1.17.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382"}, - {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702"}, - {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3"}, - {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6"}, - {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17"}, - {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8"}, - {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e"}, - {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be"}, - {file = "cffi-1.17.1-cp310-cp310-win32.whl", hash = "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c"}, - {file = "cffi-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15"}, - {file = "cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401"}, - {file = "cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf"}, - {file = "cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4"}, - {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41"}, - {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1"}, - {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6"}, - {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d"}, - {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6"}, - {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f"}, - {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b"}, - {file = "cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655"}, - {file = "cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0"}, - {file = "cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4"}, - {file = "cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c"}, - {file = "cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36"}, - {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5"}, - {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff"}, - {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99"}, - {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93"}, - {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3"}, - {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8"}, - {file = "cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65"}, - {file = "cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903"}, - {file = "cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824"}, + "pycparser; implementation_name != \"PyPy\"", +] +files = [ + {file = "cffi-2.0.0-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:0cf2d91ecc3fcc0625c2c530fe004f82c110405f101548512cce44322fa8ac44"}, + {file = "cffi-2.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f73b96c41e3b2adedc34a7356e64c8eb96e03a3782b535e043a986276ce12a49"}, + {file = "cffi-2.0.0-cp310-cp310-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:53f77cbe57044e88bbd5ed26ac1d0514d2acf0591dd6bb02a3ae37f76811b80c"}, + {file = "cffi-2.0.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3e837e369566884707ddaf85fc1744b47575005c0a229de3327f8f9a20f4efeb"}, + {file = "cffi-2.0.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:5eda85d6d1879e692d546a078b44251cdd08dd1cfb98dfb77b670c97cee49ea0"}, + {file = "cffi-2.0.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:9332088d75dc3241c702d852d4671613136d90fa6881da7d770a483fd05248b4"}, + {file = "cffi-2.0.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fc7de24befaeae77ba923797c7c87834c73648a05a4bde34b3b7e5588973a453"}, + {file = "cffi-2.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cf364028c016c03078a23b503f02058f1814320a56ad535686f90565636a9495"}, + {file = "cffi-2.0.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e11e82b744887154b182fd3e7e8512418446501191994dbf9c9fc1f32cc8efd5"}, + {file = "cffi-2.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8ea985900c5c95ce9db1745f7933eeef5d314f0565b27625d9a10ec9881e1bfb"}, + {file = "cffi-2.0.0-cp310-cp310-win32.whl", hash = "sha256:1f72fb8906754ac8a2cc3f9f5aaa298070652a0ffae577e0ea9bd480dc3c931a"}, + {file = "cffi-2.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:b18a3ed7d5b3bd8d9ef7a8cb226502c6bf8308df1525e1cc676c3680e7176739"}, + {file = "cffi-2.0.0-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:b4c854ef3adc177950a8dfc81a86f5115d2abd545751a304c5bcf2c2c7283cfe"}, + {file = "cffi-2.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2de9a304e27f7596cd03d16f1b7c72219bd944e99cc52b84d0145aefb07cbd3c"}, + {file = "cffi-2.0.0-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:baf5215e0ab74c16e2dd324e8ec067ef59e41125d3eade2b863d294fd5035c92"}, + {file = "cffi-2.0.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:730cacb21e1bdff3ce90babf007d0a0917cc3e6492f336c2f0134101e0944f93"}, + {file = "cffi-2.0.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:6824f87845e3396029f3820c206e459ccc91760e8fa24422f8b0c3d1731cbec5"}, + {file = "cffi-2.0.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:9de40a7b0323d889cf8d23d1ef214f565ab154443c42737dfe52ff82cf857664"}, + {file = "cffi-2.0.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8941aaadaf67246224cee8c3803777eed332a19d909b47e29c9842ef1e79ac26"}, + {file = "cffi-2.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a05d0c237b3349096d3981b727493e22147f934b20f6f125a3eba8f994bec4a9"}, + {file = "cffi-2.0.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:94698a9c5f91f9d138526b48fe26a199609544591f859c870d477351dc7b2414"}, + {file = "cffi-2.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:5fed36fccc0612a53f1d4d9a816b50a36702c28a2aa880cb8a122b3466638743"}, + {file = "cffi-2.0.0-cp311-cp311-win32.whl", hash = "sha256:c649e3a33450ec82378822b3dad03cc228b8f5963c0c12fc3b1e0ab940f768a5"}, + {file = "cffi-2.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:66f011380d0e49ed280c789fbd08ff0d40968ee7b665575489afa95c98196ab5"}, + {file = "cffi-2.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:c6638687455baf640e37344fe26d37c404db8b80d037c3d29f58fe8d1c3b194d"}, + {file = "cffi-2.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d02d6655b0e54f54c4ef0b94eb6be0607b70853c45ce98bd278dc7de718be5d"}, + {file = "cffi-2.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8eca2a813c1cb7ad4fb74d368c2ffbbb4789d377ee5bb8df98373c2cc0dee76c"}, + {file = "cffi-2.0.0-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:21d1152871b019407d8ac3985f6775c079416c282e431a4da6afe7aefd2bccbe"}, + {file = "cffi-2.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b21e08af67b8a103c71a250401c78d5e0893beff75e28c53c98f4de42f774062"}, + {file = "cffi-2.0.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:1e3a615586f05fc4065a8b22b8152f0c1b00cdbc60596d187c2a74f9e3036e4e"}, + {file = "cffi-2.0.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:81afed14892743bbe14dacb9e36d9e0e504cd204e0b165062c488942b9718037"}, + {file = "cffi-2.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3e17ed538242334bf70832644a32a7aae3d83b57567f9fd60a26257e992b79ba"}, + {file = "cffi-2.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3925dd22fa2b7699ed2617149842d2e6adde22b262fcbfada50e3d195e4b3a94"}, + {file = "cffi-2.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2c8f814d84194c9ea681642fd164267891702542f028a15fc97d4674b6206187"}, + {file = "cffi-2.0.0-cp312-cp312-win32.whl", hash = "sha256:da902562c3e9c550df360bfa53c035b2f241fed6d9aef119048073680ace4a18"}, + {file = "cffi-2.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:da68248800ad6320861f129cd9c1bf96ca849a2771a59e0344e88681905916f5"}, + {file = "cffi-2.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:4671d9dd5ec934cb9a73e7ee9676f9362aba54f7f34910956b84d727b0d73fb6"}, + {file = "cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529"}, ] [[package]] name = "cfgv" -version = "3.4.0" +version = "3.5.0" summary = "" files = [ - {file = "cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9"}, - {file = "cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560"}, + {file = "cfgv-3.5.0-py2.py3-none-any.whl", hash = "sha256:a8dc6b26ad22ff227d2634a65cb388215ce6cc96bbcc5cfde7641ae87e8dacc0"}, + {file = "cfgv-3.5.0.tar.gz", hash = "sha256:d5b1034354820651caa73ede66a6294d6e95c1b00acc5e9b098e917404669132"}, ] [[package]] name = "charset-normalizer" -version = "3.4.2" -summary = "" -files = [ - {file = "charset_normalizer-3.4.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7c48ed483eb946e6c04ccbe02c6b4d1d48e51944b6db70f697e089c193404941"}, - {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2d318c11350e10662026ad0eb71bb51c7812fc8590825304ae0bdd4ac283acd"}, - {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9cbfacf36cb0ec2897ce0ebc5d08ca44213af24265bd56eca54bee7923c48fd6"}, - {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18dd2e350387c87dabe711b86f83c9c78af772c748904d372ade190b5c7c9d4d"}, - {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8075c35cd58273fee266c58c0c9b670947c19df5fb98e7b66710e04ad4e9ff86"}, - {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5bf4545e3b962767e5c06fe1738f951f77d27967cb2caa64c28be7c4563e162c"}, - {file = "charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7a6ab32f7210554a96cd9e33abe3ddd86732beeafc7a28e9955cdf22ffadbab0"}, - {file = "charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:b33de11b92e9f75a2b545d6e9b6f37e398d86c3e9e9653c4864eb7e89c5773ef"}, - {file = "charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:8755483f3c00d6c9a77f490c17e6ab0c8729e39e6390328e42521ef175380ae6"}, - {file = "charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:68a328e5f55ec37c57f19ebb1fdc56a248db2e3e9ad769919a58672958e8f366"}, - {file = "charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:21b2899062867b0e1fde9b724f8aecb1af14f2778d69aacd1a5a1853a597a5db"}, - {file = "charset_normalizer-3.4.2-cp310-cp310-win32.whl", hash = "sha256:e8082b26888e2f8b36a042a58307d5b917ef2b1cacab921ad3323ef91901c71a"}, - {file = "charset_normalizer-3.4.2-cp310-cp310-win_amd64.whl", hash = "sha256:f69a27e45c43520f5487f27627059b64aaf160415589230992cec34c5e18a509"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:be1e352acbe3c78727a16a455126d9ff83ea2dfdcbc83148d2982305a04714c2"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa88ca0b1932e93f2d961bf3addbb2db902198dca337d88c89e1559e066e7645"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d524ba3f1581b35c03cb42beebab4a13e6cdad7b36246bd22541fa585a56cccd"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28a1005facc94196e1fb3e82a3d442a9d9110b8434fc1ded7a24a2983c9888d8"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fdb20a30fe1175ecabed17cbf7812f7b804b8a315a25f24678bcdf120a90077f"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0f5d9ed7f254402c9e7d35d2f5972c9bbea9040e99cd2861bd77dc68263277c7"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:efd387a49825780ff861998cd959767800d54f8308936b21025326de4b5a42b9"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f0aa37f3c979cf2546b73e8222bbfa3dc07a641585340179d768068e3455e544"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e70e990b2137b29dc5564715de1e12701815dacc1d056308e2b17e9095372a82"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:0c8c57f84ccfc871a48a47321cfa49ae1df56cd1d965a09abe84066f6853b9c0"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6b66f92b17849b85cad91259efc341dce9c1af48e2173bf38a85c6329f1033e5"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-win32.whl", hash = "sha256:daac4765328a919a805fa5e2720f3e94767abd632ae410a9062dff5412bae65a"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:e53efc7c7cee4c1e70661e2e112ca46a575f90ed9ae3fef200f2a25e954f4b28"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0c29de6a1a95f24b9a1aa7aefd27d2487263f00dfd55a77719b530788f75cff7"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cddf7bd982eaa998934a91f69d182aec997c6c468898efe6679af88283b498d3"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcbe676a55d7445b22c10967bceaaf0ee69407fbe0ece4d032b6eb8d4565982a"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d41c4d287cfc69060fa91cae9683eacffad989f1a10811995fa309df656ec214"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e594135de17ab3866138f496755f302b72157d115086d100c3f19370839dd3a"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf713fe9a71ef6fd5adf7a79670135081cd4431c2943864757f0fa3a65b1fafd"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a370b3e078e418187da8c3674eddb9d983ec09445c99a3a263c2011993522981"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a955b438e62efdf7e0b7b52a64dc5c3396e2634baa62471768a64bc2adb73d5c"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:7222ffd5e4de8e57e03ce2cef95a4c43c98fcb72ad86909abdfc2c17d227fc1b"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:bee093bf902e1d8fc0ac143c88902c3dfc8941f7ea1d6a8dd2bcb786d33db03d"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dedb8adb91d11846ee08bec4c8236c8549ac721c245678282dcb06b221aab59f"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-win32.whl", hash = "sha256:db4c7bf0e07fc3b7d89ac2a5880a6a8062056801b83ff56d8464b70f65482b6c"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:5a9979887252a82fefd3d3ed2a8e3b937a7a809f65dcb1e068b090e165bbe99e"}, - {file = "charset_normalizer-3.4.2-py3-none-any.whl", hash = "sha256:7f56930ab0abd1c45cd15be65cc741c28b1c9a34876ce8c17a2fa107810c0af0"}, - {file = "charset_normalizer-3.4.2.tar.gz", hash = "sha256:5baececa9ecba31eff645232d59845c07aa030f0c81ee70184a90d35099a0e63"}, +version = "3.4.5" +summary = "" +files = [ + {file = "charset_normalizer-3.4.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4167a621a9a1a986c73777dbc15d4b5eac8ac5c10393374109a343d4013ec765"}, + {file = "charset_normalizer-3.4.5-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3f64c6bf8f32f9133b668c7f7a7cbdbc453412bc95ecdbd157f3b1e377a92990"}, + {file = "charset_normalizer-3.4.5-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:568e3c34b58422075a1b49575a6abc616d9751b4d61b23f712e12ebb78fe47b2"}, + {file = "charset_normalizer-3.4.5-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:036c079aa08a6a592b82487f97c60b439428320ed1b2ea0b3912e99d30c77765"}, + {file = "charset_normalizer-3.4.5-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:340810d34ef83af92148e96e3e44cb2d3f910d2bf95e5618a5c467d9f102231d"}, + {file = "charset_normalizer-3.4.5-cp310-cp310-manylinux_2_31_armv7l.whl", hash = "sha256:cd2d0f0ec9aa977a27731a3209ebbcacebebaf41f902bd453a928bfd281cf7f8"}, + {file = "charset_normalizer-3.4.5-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0b362bcd27819f9c07cbf23db4e0e8cd4b44c5ecd900c2ff907b2b92274a7412"}, + {file = "charset_normalizer-3.4.5-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:77be992288f720306ab4108fe5c74797de327f3248368dfc7e1a916d6ed9e5a2"}, + {file = "charset_normalizer-3.4.5-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:8b78d8a609a4b82c273257ee9d631ded7fac0d875bdcdccc109f3ee8328cfcb1"}, + {file = "charset_normalizer-3.4.5-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:ba20bdf69bd127f66d0174d6f2a93e69045e0b4036dc1ca78e091bcc765830c4"}, + {file = "charset_normalizer-3.4.5-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:76a9d0de4d0eab387822e7b35d8f89367dd237c72e82ab42b9f7bf5e15ada00f"}, + {file = "charset_normalizer-3.4.5-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:8fff79bf5978c693c9b1a4d71e4a94fddfb5fe744eb062a318e15f4a2f63a550"}, + {file = "charset_normalizer-3.4.5-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c7e84e0c0005e3bdc1a9211cd4e62c78ba80bc37b2365ef4410cd2007a9047f2"}, + {file = "charset_normalizer-3.4.5-cp310-cp310-win32.whl", hash = "sha256:58ad8270cfa5d4bef1bc85bd387217e14ff154d6630e976c6f56f9a040757475"}, + {file = "charset_normalizer-3.4.5-cp310-cp310-win_amd64.whl", hash = "sha256:02a9d1b01c1e12c27883b0c9349e0bcd9ae92e727ff1a277207e1a262b1cbf05"}, + {file = "charset_normalizer-3.4.5-cp310-cp310-win_arm64.whl", hash = "sha256:039215608ac7b358c4da0191d10fc76868567fbf276d54c14721bdedeb6de064"}, + {file = "charset_normalizer-3.4.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:610f72c0ee565dfb8ae1241b666119582fdbfe7c0975c175be719f940e110694"}, + {file = "charset_normalizer-3.4.5-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:60d68e820af339df4ae8358c7a2e7596badeb61e544438e489035f9fbf3246a5"}, + {file = "charset_normalizer-3.4.5-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:10b473fc8dca1c3ad8559985794815f06ca3fc71942c969129070f2c3cdf7281"}, + {file = "charset_normalizer-3.4.5-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d4eb8ac7469b2a5d64b5b8c04f84d8bf3ad340f4514b98523805cbf46e3b3923"}, + {file = "charset_normalizer-3.4.5-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5bcb3227c3d9aaf73eaaab1db7ccd80a8995c509ee9941e2aae060ca6e4e5d81"}, + {file = "charset_normalizer-3.4.5-cp311-cp311-manylinux_2_31_armv7l.whl", hash = "sha256:75ee9c1cce2911581a70a3c0919d8bccf5b1cbc9b0e5171400ec736b4b569497"}, + {file = "charset_normalizer-3.4.5-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:1d1401945cb77787dbd3af2446ff2d75912327c4c3a1526ab7955ecf8600687c"}, + {file = "charset_normalizer-3.4.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0a45e504f5e1be0bd385935a8e1507c442349ca36f511a47057a71c9d1d6ea9e"}, + {file = "charset_normalizer-3.4.5-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:e09f671a54ce70b79a1fc1dc6da3072b7ef7251fadb894ed92d9aa8218465a5f"}, + {file = "charset_normalizer-3.4.5-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:d01de5e768328646e6a3fa9e562706f8f6641708c115c62588aef2b941a4f88e"}, + {file = "charset_normalizer-3.4.5-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:131716d6786ad5e3dc542f5cc6f397ba3339dc0fb87f87ac30e550e8987756af"}, + {file = "charset_normalizer-3.4.5-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:1a374cc0b88aa710e8865dc1bd6edb3743c59f27830f0293ab101e4cf3ce9f85"}, + {file = "charset_normalizer-3.4.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d31f0d1671e1534e395f9eb84a68e0fb670e1edb1fe819a9d7f564ae3bc4e53f"}, + {file = "charset_normalizer-3.4.5-cp311-cp311-win32.whl", hash = "sha256:cace89841c0599d736d3d74a27bc5821288bb47c5441923277afc6059d7fbcb4"}, + {file = "charset_normalizer-3.4.5-cp311-cp311-win_amd64.whl", hash = "sha256:f8102ae93c0bc863b1d41ea0f4499c20a83229f52ed870850892df555187154a"}, + {file = "charset_normalizer-3.4.5-cp311-cp311-win_arm64.whl", hash = "sha256:ed98364e1c262cf5f9363c3eca8c2df37024f52a8fa1180a3610014f26eac51c"}, + {file = "charset_normalizer-3.4.5-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:ed97c282ee4f994ef814042423a529df9497e3c666dca19be1d4cd1129dc7ade"}, + {file = "charset_normalizer-3.4.5-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0294916d6ccf2d069727d65973c3a1ca477d68708db25fd758dd28b0827cff54"}, + {file = "charset_normalizer-3.4.5-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:dc57a0baa3eeedd99fafaef7511b5a6ef4581494e8168ee086031744e2679467"}, + {file = "charset_normalizer-3.4.5-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ed1a9a204f317ef879b32f9af507d47e49cd5e7f8e8d5d96358c98373314fc60"}, + {file = "charset_normalizer-3.4.5-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7ad83b8f9379176c841f8865884f3514d905bcd2a9a3b210eaa446e7d2223e4d"}, + {file = "charset_normalizer-3.4.5-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:a118e2e0b5ae6b0120d5efa5f866e58f2bb826067a646431da4d6a2bdae7950e"}, + {file = "charset_normalizer-3.4.5-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:754f96058e61a5e22e91483f823e07df16416ce76afa4ebf306f8e1d1296d43f"}, + {file = "charset_normalizer-3.4.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0c300cefd9b0970381a46394902cd18eaf2aa00163f999590ace991989dcd0fc"}, + {file = "charset_normalizer-3.4.5-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:c108f8619e504140569ee7de3f97d234f0fbae338a7f9f360455071ef9855a95"}, + {file = "charset_normalizer-3.4.5-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:d1028de43596a315e2720a9849ee79007ab742c06ad8b45a50db8cdb7ed4a82a"}, + {file = "charset_normalizer-3.4.5-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:19092dde50335accf365cce21998a1c6dd8eafd42c7b226eb54b2747cdce2fac"}, + {file = "charset_normalizer-3.4.5-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:4354e401eb6dab9aed3c7b4030514328a6c748d05e1c3e19175008ca7de84fb1"}, + {file = "charset_normalizer-3.4.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a68766a3c58fde7f9aaa22b3786276f62ab2f594efb02d0a1421b6282e852e98"}, + {file = "charset_normalizer-3.4.5-cp312-cp312-win32.whl", hash = "sha256:1827734a5b308b65ac54e86a618de66f935a4f63a8a462ff1e19a6788d6c2262"}, + {file = "charset_normalizer-3.4.5-cp312-cp312-win_amd64.whl", hash = "sha256:728c6a963dfab66ef865f49286e45239384249672cd598576765acc2a640a636"}, + {file = "charset_normalizer-3.4.5-cp312-cp312-win_arm64.whl", hash = "sha256:75dfd1afe0b1647449e852f4fb428195a7ed0588947218f7ba929f6538487f02"}, + {file = "charset_normalizer-3.4.5-py3-none-any.whl", hash = "sha256:9db5e3fcdcee89a78c04dffb3fe33c79f77bd741a624946db2591c81b2fc85b0"}, + {file = "charset_normalizer-3.4.5.tar.gz", hash = "sha256:95adae7b6c42a6c5b5b559b1a99149f090a57128155daeea91732c8d970d8644"}, ] [[package]] @@ -221,14 +245,14 @@ files = [ [[package]] name = "click" -version = "8.1.8" +version = "8.3.1" summary = "" dependencies = [ "colorama; sys_platform == \"win32\"", ] files = [ - {file = "click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2"}, - {file = "click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a"}, + {file = "click-8.3.1-py3-none-any.whl", hash = "sha256:981153a64e25f12d547d3426c367a4857371575ee7ad18df2a6183ab0545b2a6"}, + {file = "click-8.3.1.tar.gz", hash = "sha256:12ff4785d337a1bb490bb7e9c2b1ee5da3112e94a8622f26a6c77f5d2fc6842a"}, ] [[package]] @@ -242,35 +266,32 @@ files = [ [[package]] name = "comm" -version = "0.2.2" +version = "0.2.3" summary = "" -dependencies = [ - "traitlets", -] files = [ - {file = "comm-0.2.2-py3-none-any.whl", hash = "sha256:e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3"}, - {file = "comm-0.2.2.tar.gz", hash = "sha256:3fd7a84065306e07bea1773df6eb8282de51ba82f77c72f9c85716ab11fe980e"}, + {file = "comm-0.2.3-py3-none-any.whl", hash = "sha256:c615d91d75f7f04f095b30d1c1711babd43bdc6419c1be9886a85f2f4e489417"}, + {file = "comm-0.2.3.tar.gz", hash = "sha256:2dc8048c10962d55d7ad693be1e7045d891b7ce8d999c97963a5e3e99c055971"}, ] [[package]] name = "debugpy" -version = "1.8.14" +version = "1.8.20" summary = "" files = [ - {file = "debugpy-1.8.14-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:93fee753097e85623cab1c0e6a68c76308cd9f13ffdf44127e6fab4fbf024339"}, - {file = "debugpy-1.8.14-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d937d93ae4fa51cdc94d3e865f535f185d5f9748efb41d0d49e33bf3365bd79"}, - {file = "debugpy-1.8.14-cp310-cp310-win32.whl", hash = "sha256:c442f20577b38cc7a9aafecffe1094f78f07fb8423c3dddb384e6b8f49fd2987"}, - {file = "debugpy-1.8.14-cp310-cp310-win_amd64.whl", hash = "sha256:f117dedda6d969c5c9483e23f573b38f4e39412845c7bc487b6f2648df30fe84"}, - {file = "debugpy-1.8.14-cp311-cp311-macosx_14_0_universal2.whl", hash = "sha256:1b2ac8c13b2645e0b1eaf30e816404990fbdb168e193322be8f545e8c01644a9"}, - {file = "debugpy-1.8.14-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf431c343a99384ac7eab2f763980724834f933a271e90496944195318c619e2"}, - {file = "debugpy-1.8.14-cp311-cp311-win32.whl", hash = "sha256:c99295c76161ad8d507b413cd33422d7c542889fbb73035889420ac1fad354f2"}, - {file = "debugpy-1.8.14-cp311-cp311-win_amd64.whl", hash = "sha256:7816acea4a46d7e4e50ad8d09d963a680ecc814ae31cdef3622eb05ccacf7b01"}, - {file = "debugpy-1.8.14-cp312-cp312-macosx_14_0_universal2.whl", hash = "sha256:8899c17920d089cfa23e6005ad9f22582fd86f144b23acb9feeda59e84405b84"}, - {file = "debugpy-1.8.14-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6bb5c0dcf80ad5dbc7b7d6eac484e2af34bdacdf81df09b6a3e62792b722826"}, - {file = "debugpy-1.8.14-cp312-cp312-win32.whl", hash = "sha256:281d44d248a0e1791ad0eafdbbd2912ff0de9eec48022a5bfbc332957487ed3f"}, - {file = "debugpy-1.8.14-cp312-cp312-win_amd64.whl", hash = "sha256:5aa56ef8538893e4502a7d79047fe39b1dae08d9ae257074c6464a7b290b806f"}, - {file = "debugpy-1.8.14-py2.py3-none-any.whl", hash = "sha256:5cd9a579d553b6cb9759a7908a41988ee6280b961f24f63336835d9418216a20"}, - {file = "debugpy-1.8.14.tar.gz", hash = "sha256:7cd287184318416850aa8b60ac90105837bb1e59531898c07569d197d2ed5322"}, + {file = "debugpy-1.8.20-cp310-cp310-macosx_15_0_x86_64.whl", hash = "sha256:157e96ffb7f80b3ad36d808646198c90acb46fdcfd8bb1999838f0b6f2b59c64"}, + {file = "debugpy-1.8.20-cp310-cp310-manylinux_2_34_x86_64.whl", hash = "sha256:c1178ae571aff42e61801a38b007af504ec8e05fde1c5c12e5a7efef21009642"}, + {file = "debugpy-1.8.20-cp310-cp310-win32.whl", hash = "sha256:c29dd9d656c0fbd77906a6e6a82ae4881514aa3294b94c903ff99303e789b4a2"}, + {file = "debugpy-1.8.20-cp310-cp310-win_amd64.whl", hash = "sha256:3ca85463f63b5dd0aa7aaa933d97cbc47c174896dcae8431695872969f981893"}, + {file = "debugpy-1.8.20-cp311-cp311-macosx_15_0_universal2.whl", hash = "sha256:eada6042ad88fa1571b74bd5402ee8b86eded7a8f7b827849761700aff171f1b"}, + {file = "debugpy-1.8.20-cp311-cp311-manylinux_2_34_x86_64.whl", hash = "sha256:7de0b7dfeedc504421032afba845ae2a7bcc32ddfb07dae2c3ca5442f821c344"}, + {file = "debugpy-1.8.20-cp311-cp311-win32.whl", hash = "sha256:773e839380cf459caf73cc533ea45ec2737a5cc184cf1b3b796cd4fd98504fec"}, + {file = "debugpy-1.8.20-cp311-cp311-win_amd64.whl", hash = "sha256:1f7650546e0eded1902d0f6af28f787fa1f1dbdbc97ddabaf1cd963a405930cb"}, + {file = "debugpy-1.8.20-cp312-cp312-macosx_15_0_universal2.whl", hash = "sha256:4ae3135e2089905a916909ef31922b2d733d756f66d87345b3e5e52b7a55f13d"}, + {file = "debugpy-1.8.20-cp312-cp312-manylinux_2_34_x86_64.whl", hash = "sha256:88f47850a4284b88bd2bfee1f26132147d5d504e4e86c22485dfa44b97e19b4b"}, + {file = "debugpy-1.8.20-cp312-cp312-win32.whl", hash = "sha256:4057ac68f892064e5f98209ab582abfee3b543fb55d2e87610ddc133a954d390"}, + {file = "debugpy-1.8.20-cp312-cp312-win_amd64.whl", hash = "sha256:a1a8f851e7cf171330679ef6997e9c579ef6dd33c9098458bd9986a0f4ca52e3"}, + {file = "debugpy-1.8.20-py2.py3-none-any.whl", hash = "sha256:5be9bed9ae3be00665a06acaa48f8329d2b9632f15fd09f6a9a8c8d9907e54d7"}, + {file = "debugpy-1.8.20.tar.gz", hash = "sha256:55bc8701714969f1ab89a6d5f2f3d40c36f91b2cbe2f65d98bf8196f6a6a2c33"}, ] [[package]] @@ -284,11 +305,11 @@ files = [ [[package]] name = "dill" -version = "0.4.0" +version = "0.4.1" summary = "" files = [ - {file = "dill-0.4.0-py3-none-any.whl", hash = "sha256:44f54bf6412c2c8464c14e8243eb163690a9800dbe2c367330883b19c7561049"}, - {file = "dill-0.4.0.tar.gz", hash = "sha256:0633f1d2df477324f53a895b02c901fb961bdbf65a17122586ea7019292cbcf0"}, + {file = "dill-0.4.1-py3-none-any.whl", hash = "sha256:1e1ce33e978ae97fcfcff5638477032b801c46c7c65cf717f95fbc2248f79a9d"}, + {file = "dill-0.4.1.tar.gz", hash = "sha256:423092df4182177d4d8ba8290c8a5b640c66ab35ec7da59ccfa00f6fa3eea5fa"}, ] [[package]] @@ -302,95 +323,96 @@ files = [ [[package]] name = "dnspython" -version = "2.7.0" +version = "2.8.0" summary = "" files = [ - {file = "dnspython-2.7.0-py3-none-any.whl", hash = "sha256:b4c34b7d10b51bcc3a5071e7b8dee77939f1e878477eeecc965e9835f63c6c86"}, - {file = "dnspython-2.7.0.tar.gz", hash = "sha256:ce9c432eda0dc91cf618a5cedf1a4e142651196bbcd2c80e89ed5a907e5cfaf1"}, + {file = "dnspython-2.8.0-py3-none-any.whl", hash = "sha256:01d9bbc4a2d76bf0db7c1f729812ded6d912bd318d3b1cf81d30c0f845dbf3af"}, + {file = "dnspython-2.8.0.tar.gz", hash = "sha256:181d3c6996452cb1189c4046c61599b84a5a86e099562ffde77d26984ff26d0f"}, ] [[package]] name = "evdev" -version = "1.9.2" +version = "1.9.3" summary = "" files = [ - {file = "evdev-1.9.2.tar.gz", hash = "sha256:5d3278892ce1f92a74d6bf888cc8525d9f68af85dbe336c95d1c87fb8f423069"}, + {file = "evdev-1.9.3.tar.gz", hash = "sha256:2c140e01ac8437758fa23fe5c871397412461f42d421aa20241dc8fe8cfccbc9"}, ] [[package]] name = "exceptiongroup" -version = "1.3.0" +version = "1.3.1" summary = "" dependencies = [ - "typing-extensions", + "typing-extensions; python_full_version < \"3.11\"", ] files = [ - {file = "exceptiongroup-1.3.0-py3-none-any.whl", hash = "sha256:4d111e6e0c13d0644cad6ddaa7ed0261a0b36971f6d23e7ec9b4b9097da78a10"}, - {file = "exceptiongroup-1.3.0.tar.gz", hash = "sha256:b241f5885f560bc56a59ee63ca4c6a8bfa46ae4ad651af316d4e81817bb9fd88"}, + {file = "exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598"}, + {file = "exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219"}, ] [[package]] name = "executing" -version = "2.2.0" +version = "2.2.1" summary = "" files = [ - {file = "executing-2.2.0-py2.py3-none-any.whl", hash = "sha256:11387150cad388d62750327a53d3339fad4888b39a6fe233c3afbb54ecffd3aa"}, - {file = "executing-2.2.0.tar.gz", hash = "sha256:5d108c028108fe2551d1a7b2e8b713341e2cb4fc0aa7dcf966fa4327a5226755"}, + {file = "executing-2.2.1-py2.py3-none-any.whl", hash = "sha256:760643d3452b4d777d295bb167ccc74c64a81df23fb5e08eff250c425a4b2017"}, + {file = "executing-2.2.1.tar.gz", hash = "sha256:3632cc370565f6648cc328b32435bd120a1e4ebb20c77e3fdde9a13cd1e533c4"}, ] [[package]] name = "fastapi" -version = "0.115.13" +version = "0.135.1" summary = "" dependencies = [ + "annotated-doc", "pydantic", "starlette", "typing-extensions", + "typing-inspection", ] files = [ - {file = "fastapi-0.115.13-py3-none-any.whl", hash = "sha256:0a0cab59afa7bab22f5eb347f8c9864b681558c278395e94035a741fc10cd865"}, - {file = "fastapi-0.115.13.tar.gz", hash = "sha256:55d1d25c2e1e0a0a50aceb1c8705cd932def273c102bff0b1c1da88b3c6eb307"}, + {file = "fastapi-0.135.1-py3-none-any.whl", hash = "sha256:46e2fc5745924b7c840f71ddd277382af29ce1cdb7d5eab5bf697e3fb9999c9e"}, + {file = "fastapi-0.135.1.tar.gz", hash = "sha256:d04115b508d936d254cea545b7312ecaa58a7b3a0f84952535b4c9afae7668cd"}, ] [[package]] name = "filelock" -version = "3.19.1" +version = "3.25.1" summary = "" files = [ - {file = "filelock-3.19.1-py3-none-any.whl", hash = "sha256:d38e30481def20772f5baf097c122c3babc4fcdb7e14e57049eb9d88c6dc017d"}, - {file = "filelock-3.19.1.tar.gz", hash = "sha256:66eda1888b0171c998b35be2bcc0f6d75c388a7ce20c3f3f37aa8e96c2dddf58"}, + {file = "filelock-3.25.1-py3-none-any.whl", hash = "sha256:18972df45473c4aa2c7921b609ee9ca4925910cc3a0fb226c96b92fc224ef7bf"}, + {file = "filelock-3.25.1.tar.gz", hash = "sha256:b9a2e977f794ef94d77cdf7d27129ac648a61f585bff3ca24630c1629f701aa9"}, ] [[package]] name = "greenlet" -version = "3.2.3" -summary = "" -files = [ - {file = "greenlet-3.2.3-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:1afd685acd5597349ee6d7a88a8bec83ce13c106ac78c196ee9dde7c04fe87be"}, - {file = "greenlet-3.2.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:761917cac215c61e9dc7324b2606107b3b292a8349bdebb31503ab4de3f559ac"}, - {file = "greenlet-3.2.3-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:a433dbc54e4a37e4fff90ef34f25a8c00aed99b06856f0119dcf09fbafa16392"}, - {file = "greenlet-3.2.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:68671180e3849b963649254a882cd544a3c75bfcd2c527346ad8bb53494444db"}, - {file = "greenlet-3.2.3-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:49c8cfb18fb419b3d08e011228ef8a25882397f3a859b9fe1436946140b6756b"}, - {file = "greenlet-3.2.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:efc6dc8a792243c31f2f5674b670b3a95d46fa1c6a912b8e310d6f542e7b0712"}, - {file = "greenlet-3.2.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:731e154aba8e757aedd0781d4b240f1225b075b4409f1bb83b05ff410582cf00"}, - {file = "greenlet-3.2.3-cp310-cp310-win_amd64.whl", hash = "sha256:96c20252c2f792defe9a115d3287e14811036d51e78b3aaddbee23b69b216302"}, - {file = "greenlet-3.2.3-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:784ae58bba89fa1fa5733d170d42486580cab9decda3484779f4759345b29822"}, - {file = "greenlet-3.2.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0921ac4ea42a5315d3446120ad48f90c3a6b9bb93dd9b3cf4e4d84a66e42de83"}, - {file = "greenlet-3.2.3-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:d2971d93bb99e05f8c2c0c2f4aa9484a18d98c4c3bd3c62b65b7e6ae33dfcfaf"}, - {file = "greenlet-3.2.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:592c12fb1165be74592f5de0d70f82bc5ba552ac44800d632214b76089945147"}, - {file = "greenlet-3.2.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:29e184536ba333003540790ba29829ac14bb645514fbd7e32af331e8202a62a5"}, - {file = "greenlet-3.2.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:93c0bb79844a367782ec4f429d07589417052e621aa39a5ac1fb99c5aa308edc"}, - {file = "greenlet-3.2.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:751261fc5ad7b6705f5f76726567375bb2104a059454e0226e1eef6c756748ba"}, - {file = "greenlet-3.2.3-cp311-cp311-win_amd64.whl", hash = "sha256:83a8761c75312361aa2b5b903b79da97f13f556164a7dd2d5448655425bd4c34"}, - {file = "greenlet-3.2.3-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:25ad29caed5783d4bd7a85c9251c651696164622494c00802a139c00d639242d"}, - {file = "greenlet-3.2.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:88cd97bf37fe24a6710ec6a3a7799f3f81d9cd33317dcf565ff9950c83f55e0b"}, - {file = "greenlet-3.2.3-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:baeedccca94880d2f5666b4fa16fc20ef50ba1ee353ee2d7092b383a243b0b0d"}, - {file = "greenlet-3.2.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0cc73378150b8b78b0c9fe2ce56e166695e67478550769536a6742dca3651688"}, - {file = "greenlet-3.2.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:706d016a03e78df129f68c4c9b4c4f963f7d73534e48a24f5f5a7101ed13dbbb"}, - {file = "greenlet-3.2.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:419e60f80709510c343c57b4bb5a339d8767bf9aef9b8ce43f4f143240f88b7c"}, - {file = "greenlet-3.2.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:93d48533fade144203816783373f27a97e4193177ebaaf0fc396db19e5d61163"}, - {file = "greenlet-3.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:7454d37c740bb27bdeddfc3f358f26956a07d5220818ceb467a483197d84f849"}, - {file = "greenlet-3.2.3.tar.gz", hash = "sha256:8b0dd8ae4c0d6f5e54ee55ba935eeb3d735a9b58a8a1e5b5cbab64e01a39f365"}, +version = "3.3.2" +summary = "" +files = [ + {file = "greenlet-3.3.2-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:9bc885b89709d901859cf95179ec9f6bb67a3d2bb1f0e88456461bd4b7f8fd0d"}, + {file = "greenlet-3.3.2-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b568183cf65b94919be4438dc28416b234b678c608cafac8874dfeeb2a9bbe13"}, + {file = "greenlet-3.3.2-cp310-cp310-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:527fec58dc9f90efd594b9b700662ed3fb2493c2122067ac9c740d98080a620e"}, + {file = "greenlet-3.3.2-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ad0c8917dd42a819fe77e6bdfcb84e3379c0de956469301d9fd36427a1ca501f"}, + {file = "greenlet-3.3.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:97245cc10e5515dbc8c3104b2928f7f02b6813002770cfaffaf9a6e0fc2b94ef"}, + {file = "greenlet-3.3.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8c1fdd7d1b309ff0da81d60a9688a8bd044ac4e18b250320a96fc68d31c209ca"}, + {file = "greenlet-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:5d0e35379f93a6d0222de929a25ab47b5eb35b5ef4721c2b9cbcc4036129ff1f"}, + {file = "greenlet-3.3.2-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:c56692189a7d1c7606cb794be0a8381470d95c57ce5be03fb3d0ef57c7853b86"}, + {file = "greenlet-3.3.2-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1ebd458fa8285960f382841da585e02201b53a5ec2bac6b156fc623b5ce4499f"}, + {file = "greenlet-3.3.2-cp311-cp311-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a443358b33c4ec7b05b79a7c8b466f5d275025e750298be7340f8fc63dff2a55"}, + {file = "greenlet-3.3.2-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8e2cd90d413acbf5e77ae41e5d3c9b3ac1d011a756d7284d7f3f2b806bbd6358"}, + {file = "greenlet-3.3.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:442b6057453c8cb29b4fb36a2ac689382fc71112273726e2423f7f17dc73bf99"}, + {file = "greenlet-3.3.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:45abe8eb6339518180d5a7fa47fa01945414d7cca5ecb745346fc6a87d2750be"}, + {file = "greenlet-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:1e692b2dae4cc7077cbb11b47d258533b48c8fde69a33d0d8a82e2fe8d8531d5"}, + {file = "greenlet-3.3.2-cp311-cp311-win_arm64.whl", hash = "sha256:02b0a8682aecd4d3c6c18edf52bc8e51eacdd75c8eac52a790a210b06aa295fd"}, + {file = "greenlet-3.3.2-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:ac8d61d4343b799d1e526db579833d72f23759c71e07181c2d2944e429eb09cd"}, + {file = "greenlet-3.3.2-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3ceec72030dae6ac0c8ed7591b96b70410a8be370b6a477b1dbc072856ad02bd"}, + {file = "greenlet-3.3.2-cp312-cp312-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a2a5be83a45ce6188c045bcc44b0ee037d6a518978de9a5d97438548b953a1ac"}, + {file = "greenlet-3.3.2-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:43e99d1749147ac21dde49b99c9abffcbc1e2d55c67501465ef0930d6e78e070"}, + {file = "greenlet-3.3.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4c956a19350e2c37f2c48b336a3afb4bff120b36076d9d7fb68cb44e05d95b79"}, + {file = "greenlet-3.3.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6c6f8ba97d17a1e7d664151284cb3315fc5f8353e75221ed4324f84eb162b395"}, + {file = "greenlet-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:34308836d8370bddadb41f5a7ce96879b72e2fdfb4e87729330c6ab52376409f"}, + {file = "greenlet-3.3.2-cp312-cp312-win_arm64.whl", hash = "sha256:d3a62fa76a32b462a97198e4c9e99afb9ab375115e74e9a83ce180e7a496f643"}, + {file = "greenlet-3.3.2.tar.gz", hash = "sha256:2eaf067fc6d886931c7962e8c6bede15d2f01965560f3359b27c80bde2d151f2"}, ] [[package]] @@ -417,31 +439,31 @@ files = [ [[package]] name = "httptools" -version = "0.6.4" -summary = "" -files = [ - {file = "httptools-0.6.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3c73ce323711a6ffb0d247dcd5a550b8babf0f757e86a52558fe5b86d6fefcc0"}, - {file = "httptools-0.6.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:345c288418f0944a6fe67be8e6afa9262b18c7626c3ef3c28adc5eabc06a68da"}, - {file = "httptools-0.6.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:deee0e3343f98ee8047e9f4c5bc7cedbf69f5734454a94c38ee829fb2d5fa3c1"}, - {file = "httptools-0.6.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca80b7485c76f768a3bc83ea58373f8db7b015551117375e4918e2aa77ea9b50"}, - {file = "httptools-0.6.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:90d96a385fa941283ebd231464045187a31ad932ebfa541be8edf5b3c2328959"}, - {file = "httptools-0.6.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:59e724f8b332319e2875efd360e61ac07f33b492889284a3e05e6d13746876f4"}, - {file = "httptools-0.6.4-cp310-cp310-win_amd64.whl", hash = "sha256:c26f313951f6e26147833fc923f78f95604bbec812a43e5ee37f26dc9e5a686c"}, - {file = "httptools-0.6.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f47f8ed67cc0ff862b84a1189831d1d33c963fb3ce1ee0c65d3b0cbe7b711069"}, - {file = "httptools-0.6.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0614154d5454c21b6410fdf5262b4a3ddb0f53f1e1721cfd59d55f32138c578a"}, - {file = "httptools-0.6.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8787367fbdfccae38e35abf7641dafc5310310a5987b689f4c32cc8cc3ee975"}, - {file = "httptools-0.6.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40b0f7fe4fd38e6a507bdb751db0379df1e99120c65fbdc8ee6c1d044897a636"}, - {file = "httptools-0.6.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:40a5ec98d3f49904b9fe36827dcf1aadfef3b89e2bd05b0e35e94f97c2b14721"}, - {file = "httptools-0.6.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:dacdd3d10ea1b4ca9df97a0a303cbacafc04b5cd375fa98732678151643d4988"}, - {file = "httptools-0.6.4-cp311-cp311-win_amd64.whl", hash = "sha256:288cd628406cc53f9a541cfaf06041b4c71d751856bab45e3702191f931ccd17"}, - {file = "httptools-0.6.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:df017d6c780287d5c80601dafa31f17bddb170232d85c066604d8558683711a2"}, - {file = "httptools-0.6.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:85071a1e8c2d051b507161f6c3e26155b5c790e4e28d7f236422dbacc2a9cc44"}, - {file = "httptools-0.6.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69422b7f458c5af875922cdb5bd586cc1f1033295aa9ff63ee196a87519ac8e1"}, - {file = "httptools-0.6.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:16e603a3bff50db08cd578d54f07032ca1631450ceb972c2f834c2b860c28ea2"}, - {file = "httptools-0.6.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ec4f178901fa1834d4a060320d2f3abc5c9e39766953d038f1458cb885f47e81"}, - {file = "httptools-0.6.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f9eb89ecf8b290f2e293325c646a211ff1c2493222798bb80a530c5e7502494f"}, - {file = "httptools-0.6.4-cp312-cp312-win_amd64.whl", hash = "sha256:db78cb9ca56b59b016e64b6031eda5653be0589dba2b1b43453f6e8b405a0970"}, - {file = "httptools-0.6.4.tar.gz", hash = "sha256:4e93eee4add6493b59a5c514da98c939b244fce4a0d8879cd3f466562f4b7d5c"}, +version = "0.7.1" +summary = "" +files = [ + {file = "httptools-0.7.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:11d01b0ff1fe02c4c32d60af61a4d613b74fad069e47e06e9067758c01e9ac78"}, + {file = "httptools-0.7.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:84d86c1e5afdc479a6fdabf570be0d3eb791df0ae727e8dbc0259ed1249998d4"}, + {file = "httptools-0.7.1-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:c8c751014e13d88d2be5f5f14fc8b89612fcfa92a9cc480f2bc1598357a23a05"}, + {file = "httptools-0.7.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:654968cb6b6c77e37b832a9be3d3ecabb243bbe7a0b8f65fbc5b6b04c8fcabed"}, + {file = "httptools-0.7.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b580968316348b474b020edf3988eecd5d6eec4634ee6561e72ae3a2a0e00a8a"}, + {file = "httptools-0.7.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d496e2f5245319da9d764296e86c5bb6fcf0cf7a8806d3d000717a889c8c0b7b"}, + {file = "httptools-0.7.1-cp310-cp310-win_amd64.whl", hash = "sha256:cbf8317bfccf0fed3b5680c559d3459cccf1abe9039bfa159e62e391c7270568"}, + {file = "httptools-0.7.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:474d3b7ab469fefcca3697a10d11a32ee2b9573250206ba1e50d5980910da657"}, + {file = "httptools-0.7.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a3c3b7366bb6c7b96bd72d0dbe7f7d5eead261361f013be5f6d9590465ea1c70"}, + {file = "httptools-0.7.1-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:379b479408b8747f47f3b253326183d7c009a3936518cdb70db58cffd369d9df"}, + {file = "httptools-0.7.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cad6b591a682dcc6cf1397c3900527f9affef1e55a06c4547264796bbd17cf5e"}, + {file = "httptools-0.7.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:eb844698d11433d2139bbeeb56499102143beb582bd6c194e3ba69c22f25c274"}, + {file = "httptools-0.7.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f65744d7a8bdb4bda5e1fa23e4ba16832860606fcc09d674d56e425e991539ec"}, + {file = "httptools-0.7.1-cp311-cp311-win_amd64.whl", hash = "sha256:135fbe974b3718eada677229312e97f3b31f8a9c8ffa3ae6f565bf808d5b6bcb"}, + {file = "httptools-0.7.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:38e0c83a2ea9746ebbd643bdfb521b9aa4a91703e2cd705c20443405d2fd16a5"}, + {file = "httptools-0.7.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f25bbaf1235e27704f1a7b86cd3304eabc04f569c828101d94a0e605ef7205a5"}, + {file = "httptools-0.7.1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:2c15f37ef679ab9ecc06bfc4e6e8628c32a8e4b305459de7cf6785acd57e4d03"}, + {file = "httptools-0.7.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7fe6e96090df46b36ccfaf746f03034e5ab723162bc51b0a4cf58305324036f2"}, + {file = "httptools-0.7.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f72fdbae2dbc6e68b8239defb48e6a5937b12218e6ffc2c7846cc37befa84362"}, + {file = "httptools-0.7.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e99c7b90a29fd82fea9ef57943d501a16f3404d7b9ee81799d41639bdaae412c"}, + {file = "httptools-0.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:3e14f530fefa7499334a79b0cf7e7cd2992870eb893526fb097d51b4f2d0f321"}, + {file = "httptools-0.7.1.tar.gz", hash = "sha256:abd72556974f8e7c74a259655924a717a2365b236c882c3f6f8a45fe94703ac9"}, ] [[package]] @@ -461,43 +483,45 @@ files = [ [[package]] name = "identify" -version = "2.6.15" +version = "2.6.17" summary = "" files = [ - {file = "identify-2.6.15-py2.py3-none-any.whl", hash = "sha256:1181ef7608e00704db228516541eb83a88a9f94433a8c80bb9b5bd54b1d81757"}, - {file = "identify-2.6.15.tar.gz", hash = "sha256:e4f4864b96c6557ef2a1e1c951771838f4edc9df3a72ec7118b338801b11c7bf"}, + {file = "identify-2.6.17-py2.py3-none-any.whl", hash = "sha256:be5f8412d5ed4b20f2bd41a65f920990bdccaa6a4a18a08f1eefdcd0bdd885f0"}, + {file = "identify-2.6.17.tar.gz", hash = "sha256:f816b0b596b204c9fdf076ded172322f2723cf958d02f9c3587504834c8ff04d"}, ] [[package]] name = "idna" -version = "3.10" +version = "3.11" summary = "" files = [ - {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, - {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, + {file = "idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea"}, + {file = "idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902"}, ] [[package]] name = "importlib-metadata" -version = "8.7.0" +version = "8.7.1" summary = "" dependencies = [ "zipp", ] files = [ - {file = "importlib_metadata-8.7.0-py3-none-any.whl", hash = "sha256:e5dd1551894c77868a30651cef00984d50e1002d06942a7101d34870c5f02afd"}, - {file = "importlib_metadata-8.7.0.tar.gz", hash = "sha256:d13b81ad223b890aa16c5471f2ac3056cf76c5f10f82d6f9292f0b415f389000"}, + {file = "importlib_metadata-8.7.1-py3-none-any.whl", hash = "sha256:5a1f80bf1daa489495071efbb095d75a634cf28a8bc299581244063b53176151"}, + {file = "importlib_metadata-8.7.1.tar.gz", hash = "sha256:49fef1ae6440c182052f407c8d34a68f72efc36db9ca90dc0113398f2fdde8bb"}, ] [[package]] name = "ipykernel" -version = "6.29.5" +version = "7.2.0" summary = "" dependencies = [ "appnope; sys_platform == \"darwin\"", "comm", "debugpy", - "ipython", + "ipython==8.38.0; python_full_version < \"3.11\"", + "ipython==9.10.0; python_full_version == \"3.11.*\"", + "ipython==9.11.0; python_full_version >= \"3.12\"", "jupyter-client", "jupyter-core", "matplotlib-inline", @@ -509,29 +533,85 @@ dependencies = [ "traitlets", ] files = [ - {file = "ipykernel-6.29.5-py3-none-any.whl", hash = "sha256:afdb66ba5aa354b09b91379bac28ae4afebbb30e8b39510c9690afb7a10421b5"}, - {file = "ipykernel-6.29.5.tar.gz", hash = "sha256:f093a22c4a40f8828f8e330a9c297cb93dcab13bd9678ded6de8e5cf81c56215"}, + {file = "ipykernel-7.2.0-py3-none-any.whl", hash = "sha256:3bbd4420d2b3cc105cbdf3756bfc04500b1e52f090a90716851f3916c62e1661"}, + {file = "ipykernel-7.2.0.tar.gz", hash = "sha256:18ed160b6dee2cbb16e5f3575858bc19d8f1fe6046a9a680c708494ce31d909e"}, ] [[package]] name = "ipython" -version = "8.18.1" +version = "8.38.0" summary = "" dependencies = [ - "colorama; sys_platform == \"win32\"", - "decorator", + "colorama; python_full_version < \"3.11\" and sys_platform == \"win32\"", + "decorator; python_full_version < \"3.11\"", "exceptiongroup; python_full_version < \"3.11\"", - "jedi", - "matplotlib-inline", - "pexpect; sys_platform != \"win32\"", - "prompt-toolkit", - "pygments", - "stack-data", - "traitlets", + "jedi; python_full_version < \"3.11\"", + "matplotlib-inline; python_full_version < \"3.11\"", + "pexpect; python_full_version < \"3.11\" and (sys_platform != \"emscripten\" and sys_platform != \"win32\")", + "prompt-toolkit; python_full_version < \"3.11\"", + "pygments; python_full_version < \"3.11\"", + "stack-data; python_full_version < \"3.11\"", + "traitlets; python_full_version < \"3.11\"", + "typing-extensions; python_full_version < \"3.11\"", +] +files = [ + {file = "ipython-8.38.0-py3-none-any.whl", hash = "sha256:750162629d800ac65bb3b543a14e7a74b0e88063eac9b92124d4b2aa3f6d8e86"}, + {file = "ipython-8.38.0.tar.gz", hash = "sha256:9cfea8c903ce0867cc2f23199ed8545eb741f3a69420bfcf3743ad1cec856d39"}, +] + +[[package]] +name = "ipython" +version = "9.10.0" +summary = "" +dependencies = [ + "colorama; python_full_version == \"3.11.*\" and sys_platform == \"win32\"", + "decorator; python_full_version == \"3.11.*\"", + "ipython-pygments-lexers; python_full_version == \"3.11.*\"", + "jedi; python_full_version == \"3.11.*\"", + "matplotlib-inline; python_full_version == \"3.11.*\"", + "pexpect; python_full_version == \"3.11.*\" and (sys_platform != \"emscripten\" and sys_platform != \"win32\")", + "prompt-toolkit; python_full_version == \"3.11.*\"", + "pygments; python_full_version == \"3.11.*\"", + "stack-data; python_full_version == \"3.11.*\"", + "traitlets; python_full_version == \"3.11.*\"", + "typing-extensions; python_full_version == \"3.11.*\"", +] +files = [ + {file = "ipython-9.10.0-py3-none-any.whl", hash = "sha256:c6ab68cc23bba8c7e18e9b932797014cc61ea7fd6f19de180ab9ba73e65ee58d"}, + {file = "ipython-9.10.0.tar.gz", hash = "sha256:cd9e656be97618a0676d058134cd44e6dc7012c0e5cb36a9ce96a8c904adaf77"}, +] + +[[package]] +name = "ipython" +version = "9.11.0" +summary = "" +dependencies = [ + "colorama; python_full_version >= \"3.12\" and sys_platform == \"win32\"", + "decorator; python_full_version >= \"3.12\"", + "ipython-pygments-lexers; python_full_version >= \"3.12\"", + "jedi; python_full_version >= \"3.12\"", + "matplotlib-inline; python_full_version >= \"3.12\"", + "pexpect; python_full_version >= \"3.12\" and (sys_platform != \"emscripten\" and sys_platform != \"win32\")", + "prompt-toolkit; python_full_version >= \"3.12\"", + "pygments; python_full_version >= \"3.12\"", + "stack-data; python_full_version >= \"3.12\"", + "traitlets; python_full_version >= \"3.12\"", +] +files = [ + {file = "ipython-9.11.0-py3-none-any.whl", hash = "sha256:6922d5bcf944c6e525a76a0a304451b60a2b6f875e86656d8bc2dfda5d710e19"}, + {file = "ipython-9.11.0.tar.gz", hash = "sha256:2a94bc4406b22ecc7e4cb95b98450f3ea493a76bec8896cda11b78d7752a6667"}, +] + +[[package]] +name = "ipython-pygments-lexers" +version = "1.1.1" +summary = "" +dependencies = [ + "pygments; python_full_version >= \"3.11\"", ] files = [ - {file = "ipython-8.18.1-py3-none-any.whl", hash = "sha256:e8267419d72d81955ec1177f8a29aaa90ac80ad647499201119e2f05e99aa397"}, - {file = "ipython-8.18.1.tar.gz", hash = "sha256:ca6f079bb33457c66e233e4580ebfc4128855b4cf6370dddd73842a9563e8a27"}, + {file = "ipython_pygments_lexers-1.1.1-py3-none-any.whl", hash = "sha256:a9462224a505ade19a605f71f8fa63c2048833ce50abc86768a0d81d876dc81c"}, + {file = "ipython_pygments_lexers-1.1.1.tar.gz", hash = "sha256:09c0138009e56b6854f9535736f4171d855c8c08a563a0dcd8022f78355c7e81"}, ] [[package]] @@ -548,7 +628,7 @@ files = [ [[package]] name = "jupyter-client" -version = "8.6.3" +version = "8.8.0" summary = "" dependencies = [ "jupyter-core", @@ -558,34 +638,33 @@ dependencies = [ "traitlets", ] files = [ - {file = "jupyter_client-8.6.3-py3-none-any.whl", hash = "sha256:e8a19cc986cc45905ac3362915f410f3af85424b4c0905e94fa5f2cb08e8f23f"}, - {file = "jupyter_client-8.6.3.tar.gz", hash = "sha256:35b3a0947c4a6e9d589eb97d7d4cd5e90f910ee73101611f01283732bd6d9419"}, + {file = "jupyter_client-8.8.0-py3-none-any.whl", hash = "sha256:f93a5b99c5e23a507b773d3a1136bd6e16c67883ccdbd9a829b0bbdb98cd7d7a"}, + {file = "jupyter_client-8.8.0.tar.gz", hash = "sha256:d556811419a4f2d96c869af34e854e3f059b7cc2d6d01a9cd9c85c267691be3e"}, ] [[package]] name = "jupyter-core" -version = "5.8.1" +version = "5.9.1" summary = "" dependencies = [ "platformdirs", - "pywin32; platform_python_implementation != \"PyPy\" and sys_platform == \"win32\"", "traitlets", ] files = [ - {file = "jupyter_core-5.8.1-py3-none-any.whl", hash = "sha256:c28d268fc90fb53f1338ded2eb410704c5449a358406e8a948b75706e24863d0"}, - {file = "jupyter_core-5.8.1.tar.gz", hash = "sha256:0a5f9706f70e64786b75acba995988915ebd4601c8a52e534a40b51c95f59941"}, + {file = "jupyter_core-5.9.1-py3-none-any.whl", hash = "sha256:ebf87fdc6073d142e114c72c9e29a9d7ca03fad818c5d300ce2adc1fb0743407"}, + {file = "jupyter_core-5.9.1.tar.gz", hash = "sha256:4d09aaff303b9566c3ce657f580bd089ff5c91f5f89cf7d8846c3cdf465b5508"}, ] [[package]] name = "linkify-it-py" -version = "2.0.3" +version = "2.1.0" summary = "" dependencies = [ "uc-micro-py", ] files = [ - {file = "linkify-it-py-2.0.3.tar.gz", hash = "sha256:68cda27e162e9215c17d786649d1da0021a451bdc436ef9e0fa0ba5234b9b048"}, - {file = "linkify_it_py-2.0.3-py3-none-any.whl", hash = "sha256:6bcbc417b0ac14323382aef5c5192c0075bf8a9d6b41820a2b66371eac6b6d79"}, + {file = "linkify_it_py-2.1.0-py3-none-any.whl", hash = "sha256:0d252c1594ecba2ecedc444053db5d3a9b7ec1b0dd929c8f1d74dce89f86c05e"}, + {file = "linkify_it_py-2.1.0.tar.gz", hash = "sha256:43360231720999c10e9328dc3691160e27a718e280673d444c38d7d3aaa3b98b"}, ] [[package]] @@ -658,66 +737,52 @@ files = [ [[package]] name = "markdown-it-py" -version = "3.0.0" +version = "4.0.0" summary = "" dependencies = [ "mdurl", ] files = [ - {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, - {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, + {file = "markdown_it_py-4.0.0-py3-none-any.whl", hash = "sha256:87327c59b172c5011896038353a81343b6754500a08cd7a4973bb48c6d578147"}, + {file = "markdown_it_py-4.0.0.tar.gz", hash = "sha256:cb0a2b4aa34f932c007117b194e945bd74e0ec24133ceb5bac59009cda1cb9f3"}, ] [[package]] name = "markdown-it-py" -version = "3.0.0" +version = "4.0.0" extras = ["linkify"] summary = "" dependencies = [ "linkify-it-py", - "markdown-it-py==3.0.0", -] -files = [ - {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, - {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, -] - -[[package]] -name = "markdown-it-py" -version = "3.0.0" -extras = ["plugins"] -summary = "" -dependencies = [ - "markdown-it-py==3.0.0", - "mdit-py-plugins", + "markdown-it-py==4.0.0", ] files = [ - {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, - {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, + {file = "markdown_it_py-4.0.0-py3-none-any.whl", hash = "sha256:87327c59b172c5011896038353a81343b6754500a08cd7a4973bb48c6d578147"}, + {file = "markdown_it_py-4.0.0.tar.gz", hash = "sha256:cb0a2b4aa34f932c007117b194e945bd74e0ec24133ceb5bac59009cda1cb9f3"}, ] [[package]] name = "matplotlib-inline" -version = "0.1.7" +version = "0.2.1" summary = "" dependencies = [ "traitlets", ] files = [ - {file = "matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca"}, - {file = "matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90"}, + {file = "matplotlib_inline-0.2.1-py3-none-any.whl", hash = "sha256:d56ce5156ba6085e00a9d54fead6ed29a9c47e215cd1bba2e976ef39f5710a76"}, + {file = "matplotlib_inline-0.2.1.tar.gz", hash = "sha256:e1ee949c340d771fc39e241ea75683deb94762c8fa5f2927ec57c83c4dffa9fe"}, ] [[package]] name = "mdit-py-plugins" -version = "0.4.2" +version = "0.5.0" summary = "" dependencies = [ "markdown-it-py", ] files = [ - {file = "mdit_py_plugins-0.4.2-py3-none-any.whl", hash = "sha256:0c673c3f889399a33b95e88d2f0d111b4447bdfea7f237dab2d488f459835636"}, - {file = "mdit_py_plugins-0.4.2.tar.gz", hash = "sha256:5f2cd1fdb606ddf152d37ec30e46101a60512bc0e5fa1a7002c36647b09e26b5"}, + {file = "mdit_py_plugins-0.5.0-py3-none-any.whl", hash = "sha256:07a08422fc1936a5d26d146759e9155ea466e842f5ab2f7d2266dd084c8dab1f"}, + {file = "mdit_py_plugins-0.5.0.tar.gz", hash = "sha256:f4918cb50119f50446560513a8e311d574ff6aaed72606ddae6d35716fe809c6"}, ] [[package]] @@ -731,7 +796,7 @@ files = [ [[package]] name = "minio" -version = "7.2.15" +version = "7.2.20" summary = "" dependencies = [ "argon2-cffi", @@ -741,30 +806,29 @@ dependencies = [ "urllib3", ] files = [ - {file = "minio-7.2.15-py3-none-any.whl", hash = "sha256:c06ef7a43e5d67107067f77b6c07ebdd68733e5aa7eed03076472410ca19d876"}, - {file = "minio-7.2.15.tar.gz", hash = "sha256:5247df5d4dca7bfa4c9b20093acd5ad43e82d8710ceb059d79c6eea970f49f79"}, + {file = "minio-7.2.20-py3-none-any.whl", hash = "sha256:eb33dd2fb80e04c3726a76b13241c6be3c4c46f8d81e1d58e757786f6501897e"}, + {file = "minio-7.2.20.tar.gz", hash = "sha256:95898b7a023fbbfde375985aa77e2cd6a0762268db79cf886f002a9ea8e68598"}, ] [[package]] name = "multiprocess" -version = "0.70.18" +version = "0.70.19" summary = "" dependencies = [ "dill", ] files = [ - {file = "multiprocess-0.70.18-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:25d4012dcaaf66b9e8e955f58482b42910c2ee526d532844d8bcf661bbc604df"}, - {file = "multiprocess-0.70.18-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:06b19433de0d02afe5869aec8931dd5c01d99074664f806c73896b0d9e527213"}, - {file = "multiprocess-0.70.18-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:6fa1366f994373aaf2d4738b0f56e707caeaa05486e97a7f71ee0853823180c2"}, - {file = "multiprocess-0.70.18-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:8b8940ae30139e04b076da6c5b83e9398585ebdf0f2ad3250673fef5b2ff06d6"}, - {file = "multiprocess-0.70.18-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:0929ba95831adb938edbd5fb801ac45e705ecad9d100b3e653946b7716cb6bd3"}, - {file = "multiprocess-0.70.18-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:4d77f8e4bfe6c6e2e661925bbf9aed4d5ade9a1c6502d5dfc10129b9d1141797"}, - {file = "multiprocess-0.70.18-py310-none-any.whl", hash = "sha256:60c194974c31784019c1f459d984e8f33ee48f10fcf42c309ba97b30d9bd53ea"}, - {file = "multiprocess-0.70.18-py311-none-any.whl", hash = "sha256:5aa6eef98e691281b3ad923be2832bf1c55dd2c859acd73e5ec53a66aae06a1d"}, - {file = "multiprocess-0.70.18-py312-none-any.whl", hash = "sha256:9b78f8e5024b573730bfb654783a13800c2c0f2dfc0c25e70b40d184d64adaa2"}, - {file = "multiprocess-0.70.18-py38-none-any.whl", hash = "sha256:dbf705e52a154fe5e90fb17b38f02556169557c2dd8bb084f2e06c2784d8279b"}, - {file = "multiprocess-0.70.18-py39-none-any.whl", hash = "sha256:e78ca805a72b1b810c690b6b4cc32579eba34f403094bbbae962b7b5bf9dfcb8"}, - {file = "multiprocess-0.70.18.tar.gz", hash = "sha256:f9597128e6b3e67b23956da07cf3d2e5cba79e2f4e0fba8d7903636663ec6d0d"}, + {file = "multiprocess-0.70.19-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:02e5c35d7d6cd2bdc89c1858867f7bde4012837411023a4696c148c1bdd7c80e"}, + {file = "multiprocess-0.70.19-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:79576c02d1207ec405b00cabf2c643c36070800cca433860e14539df7818b2aa"}, + {file = "multiprocess-0.70.19-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c6b6d78d43a03b68014ca1f0b7937d965393a670c5de7c29026beb2258f2f896"}, + {file = "multiprocess-0.70.19-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:1bbf1b69af1cf64cd05f65337d9215b88079ec819cd0ea7bac4dab84e162efe7"}, + {file = "multiprocess-0.70.19-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:5be9ec7f0c1c49a4f4a6fd20d5dda4aeabc2d39a50f4ad53720f1cd02b3a7c2e"}, + {file = "multiprocess-0.70.19-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1c3dce098845a0db43b32a0b76a228ca059a668071cfeaa0f40c36c0b1585d45"}, + {file = "multiprocess-0.70.19-py310-none-any.whl", hash = "sha256:97404393419dcb2a8385910864eedf47a3cadf82c66345b44f036420eb0b5d87"}, + {file = "multiprocess-0.70.19-py311-none-any.whl", hash = "sha256:928851ae7973aea4ce0eaf330bbdafb2e01398a91518d5c8818802845564f45c"}, + {file = "multiprocess-0.70.19-py312-none-any.whl", hash = "sha256:3a56c0e85dd5025161bac5ce138dcac1e49174c7d8e74596537e729fd5c53c28"}, + {file = "multiprocess-0.70.19-py39-none-any.whl", hash = "sha256:0d4b4397ed669d371c81dcd1ef33fd384a44d6c3de1bd0ca7ac06d837720d3c5"}, + {file = "multiprocess-0.70.19.tar.gz", hash = "sha256:952021e0e6c55a4a9fe4cd787895b86e239a40e76802a789d6305398d3975897"}, ] [[package]] @@ -778,42 +842,42 @@ files = [ [[package]] name = "nodeenv" -version = "1.9.1" +version = "1.10.0" summary = "" files = [ - {file = "nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9"}, - {file = "nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f"}, + {file = "nodeenv-1.10.0-py2.py3-none-any.whl", hash = "sha256:5bb13e3eed2923615535339b3c620e76779af4cb4c6a90deccc9e36b274d3827"}, + {file = "nodeenv-1.10.0.tar.gz", hash = "sha256:996c191ad80897d076bdfba80a41994c2b47c68e224c542b48feba42ba00f8bb"}, ] [[package]] name = "opentelemetry-api" -version = "1.39.1" +version = "1.40.0" summary = "" dependencies = [ "importlib-metadata", "typing-extensions", ] files = [ - {file = "opentelemetry_api-1.39.1-py3-none-any.whl", hash = "sha256:2edd8463432a7f8443edce90972169b195e7d6a05500cd29e6d13898187c9950"}, - {file = "opentelemetry_api-1.39.1.tar.gz", hash = "sha256:fbde8c80e1b937a2c61f20347e91c0c18a1940cecf012d62e65a7caf08967c9c"}, + {file = "opentelemetry_api-1.40.0-py3-none-any.whl", hash = "sha256:82dd69331ae74b06f6a874704be0cfaa49a1650e1537d4a813b86ecef7d0ecf9"}, + {file = "opentelemetry_api-1.40.0.tar.gz", hash = "sha256:159be641c0b04d11e9ecd576906462773eb97ae1b657730f0ecf64d32071569f"}, ] [[package]] name = "packaging" -version = "25.0" +version = "26.0" summary = "" files = [ - {file = "packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484"}, - {file = "packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f"}, + {file = "packaging-26.0-py3-none-any.whl", hash = "sha256:b36f1fef9334a5588b4166f8bcd26a14e521f2b55e6b9de3aaa80d3ff7a37529"}, + {file = "packaging-26.0.tar.gz", hash = "sha256:00243ae351a257117b6a241061796684b084ed1c516a08c48a3f7e147a9d80b4"}, ] [[package]] name = "parso" -version = "0.8.4" +version = "0.8.6" summary = "" files = [ - {file = "parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18"}, - {file = "parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d"}, + {file = "parso-0.8.6-py2.py3-none-any.whl", hash = "sha256:2c549f800b70a5c4952197248825584cb00f033b29c692671d3bf08bf380baff"}, + {file = "parso-0.8.6.tar.gz", hash = "sha256:2b9a0332696df97d454fa67b81618fd69c35a7b90327cbe6ba5c92d2c68a7bfd"}, ] [[package]] @@ -830,16 +894,16 @@ files = [ [[package]] name = "platformdirs" -version = "4.3.8" +version = "4.9.4" summary = "" files = [ - {file = "platformdirs-4.3.8-py3-none-any.whl", hash = "sha256:ff7059bb7eb1179e2685604f4aaf157cfd9535242bd23742eadc3c13542139b4"}, - {file = "platformdirs-4.3.8.tar.gz", hash = "sha256:3d512d96e16bcb959a814c9f348431070822a6496326a4be0911c40b5a74c2bc"}, + {file = "platformdirs-4.9.4-py3-none-any.whl", hash = "sha256:68a9a4619a666ea6439f2ff250c12a853cd1cbd5158d258bd824a7df6be2f868"}, + {file = "platformdirs-4.9.4.tar.gz", hash = "sha256:1ec356301b7dc906d83f371c8f487070e99d3ccf9e501686456394622a01a934"}, ] [[package]] name = "pre-commit" -version = "4.3.0" +version = "4.5.1" summary = "" dependencies = [ "cfgv", @@ -849,35 +913,36 @@ dependencies = [ "virtualenv", ] files = [ - {file = "pre_commit-4.3.0-py2.py3-none-any.whl", hash = "sha256:2b0747ad7e6e967169136edffee14c16e148a778a54e4f967921aa1ebf2308d8"}, - {file = "pre_commit-4.3.0.tar.gz", hash = "sha256:499fe450cc9d42e9d58e606262795ecb64dd05438943c62b66f6a8673da30b16"}, + {file = "pre_commit-4.5.1-py2.py3-none-any.whl", hash = "sha256:3b3afd891e97337708c1674210f8eba659b52a38ea5f822ff142d10786221f77"}, + {file = "pre_commit-4.5.1.tar.gz", hash = "sha256:eb545fcff725875197837263e977ea257a402056661f09dae08e4b149b030a61"}, ] [[package]] name = "prompt-toolkit" -version = "3.0.51" +version = "3.0.52" summary = "" dependencies = [ "wcwidth", ] files = [ - {file = "prompt_toolkit-3.0.51-py3-none-any.whl", hash = "sha256:52742911fde84e2d423e2f9a4cf1de7d7ac4e51958f648d9540e0fb8db077b07"}, - {file = "prompt_toolkit-3.0.51.tar.gz", hash = "sha256:931a162e3b27fc90c86f1b48bb1fb2c528c2761475e57c9c06de13311c7b54ed"}, + {file = "prompt_toolkit-3.0.52-py3-none-any.whl", hash = "sha256:9aac639a3bbd33284347de5ad8d68ecc044b91a762dc39b7c21095fcd6a19955"}, + {file = "prompt_toolkit-3.0.52.tar.gz", hash = "sha256:28cde192929c8e7321de85de1ddbe736f1375148b02f2e17edd840042b1be855"}, ] [[package]] name = "psutil" -version = "7.0.0" +version = "7.2.2" summary = "" files = [ - {file = "psutil-7.0.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:101d71dc322e3cffd7cea0650b09b3d08b8e7c4109dd6809fe452dfd00e58b25"}, - {file = "psutil-7.0.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:39db632f6bb862eeccf56660871433e111b6ea58f2caea825571951d4b6aa3da"}, - {file = "psutil-7.0.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1fcee592b4c6f146991ca55919ea3d1f8926497a713ed7faaf8225e174581e91"}, - {file = "psutil-7.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b1388a4f6875d7e2aff5c4ca1cc16c545ed41dd8bb596cefea80111db353a34"}, - {file = "psutil-7.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5f098451abc2828f7dc6b58d44b532b22f2088f4999a937557b603ce72b1993"}, - {file = "psutil-7.0.0-cp37-abi3-win32.whl", hash = "sha256:ba3fcef7523064a6c9da440fc4d6bd07da93ac726b5733c29027d7dc95b39d99"}, - {file = "psutil-7.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:4cf3d4eb1aa9b348dec30105c55cd9b7d4629285735a102beb4441e38db90553"}, - {file = "psutil-7.0.0.tar.gz", hash = "sha256:7be9c3eba38beccb6495ea33afd982a44074b78f28c434a1f51cc07fd315c456"}, + {file = "psutil-7.2.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ed0cace939114f62738d808fdcecd4c869222507e266e574799e9c0faa17d486"}, + {file = "psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:1a7b04c10f32cc88ab39cbf606e117fd74721c831c98a27dc04578deb0c16979"}, + {file = "psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:076a2d2f923fd4821644f5ba89f059523da90dc9014e85f8e45a5774ca5bc6f9"}, + {file = "psutil-7.2.2-cp36-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b0726cecd84f9474419d67252add4ac0cd9811b04d61123054b9fb6f57df6e9e"}, + {file = "psutil-7.2.2-cp36-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:fd04ef36b4a6d599bbdb225dd1d3f51e00105f6d48a28f006da7f9822f2606d8"}, + {file = "psutil-7.2.2-cp36-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b58fabe35e80b264a4e3bb23e6b96f9e45a3df7fb7eed419ac0e5947c61e47cc"}, + {file = "psutil-7.2.2-cp37-abi3-win_amd64.whl", hash = "sha256:eb7e81434c8d223ec4a219b5fc1c47d0417b12be7ea866e24fb5ad6e84b3d988"}, + {file = "psutil-7.2.2-cp37-abi3-win_arm64.whl", hash = "sha256:8c233660f575a5a89e6d4cb65d9f938126312bca76d8fe087b947b3a1aaac9ee"}, + {file = "psutil-7.2.2.tar.gz", hash = "sha256:0746f5f8d406af344fd547f1c8daa5f5c33dbc293bb8d6a16d80b4bb88f59372"}, ] [[package]] @@ -941,11 +1006,11 @@ files = [ [[package]] name = "pycparser" -version = "2.22" +version = "3.0" summary = "" files = [ - {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, - {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, + {file = "pycparser-3.0-py3-none-any.whl", hash = "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992"}, + {file = "pycparser-3.0.tar.gz", hash = "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29"}, ] [[package]] @@ -974,7 +1039,7 @@ files = [ [[package]] name = "pydantic" -version = "2.11.7" +version = "2.12.5" summary = "" dependencies = [ "annotated-types", @@ -983,96 +1048,102 @@ dependencies = [ "typing-inspection", ] files = [ - {file = "pydantic-2.11.7-py3-none-any.whl", hash = "sha256:dde5df002701f6de26248661f6835bbe296a47bf73990135c7d07ce741b9623b"}, - {file = "pydantic-2.11.7.tar.gz", hash = "sha256:d989c3c6cb79469287b1569f7447a17848c998458d49ebe294e975b9baf0f0db"}, + {file = "pydantic-2.12.5-py3-none-any.whl", hash = "sha256:e561593fccf61e8a20fc46dfc2dfe075b8be7d0188df33f221ad1f0139180f9d"}, + {file = "pydantic-2.12.5.tar.gz", hash = "sha256:4d351024c75c0f085a9febbb665ce8c0c6ec5d30e903bdb6394b7ede26aebb49"}, ] [[package]] name = "pydantic-core" -version = "2.33.2" +version = "2.41.5" summary = "" dependencies = [ "typing-extensions", ] files = [ - {file = "pydantic_core-2.33.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2b3d326aaef0c0399d9afffeb6367d5e26ddc24d351dbc9c636840ac355dc5d8"}, - {file = "pydantic_core-2.33.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e5b2671f05ba48b94cb90ce55d8bdcaaedb8ba00cc5359f6810fc918713983d"}, - {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0069c9acc3f3981b9ff4cdfaf088e98d83440a4c7ea1bc07460af3d4dc22e72d"}, - {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d53b22f2032c42eaaf025f7c40c2e3b94568ae077a606f006d206a463bc69572"}, - {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0405262705a123b7ce9f0b92f123334d67b70fd1f20a9372b907ce1080c7ba02"}, - {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4b25d91e288e2c4e0662b8038a28c6a07eaac3e196cfc4ff69de4ea3db992a1b"}, - {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6bdfe4b3789761f3bcb4b1ddf33355a71079858958e3a552f16d5af19768fef2"}, - {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:efec8db3266b76ef9607c2c4c419bdb06bf335ae433b80816089ea7585816f6a"}, - {file = "pydantic_core-2.33.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:031c57d67ca86902726e0fae2214ce6770bbe2f710dc33063187a68744a5ecac"}, - {file = "pydantic_core-2.33.2-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:f8de619080e944347f5f20de29a975c2d815d9ddd8be9b9b7268e2e3ef68605a"}, - {file = "pydantic_core-2.33.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:73662edf539e72a9440129f231ed3757faab89630d291b784ca99237fb94db2b"}, - {file = "pydantic_core-2.33.2-cp310-cp310-win32.whl", hash = "sha256:0a39979dcbb70998b0e505fb1556a1d550a0781463ce84ebf915ba293ccb7e22"}, - {file = "pydantic_core-2.33.2-cp310-cp310-win_amd64.whl", hash = "sha256:b0379a2b24882fef529ec3b4987cb5d003b9cda32256024e6fe1586ac45fc640"}, - {file = "pydantic_core-2.33.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:4c5b0a576fb381edd6d27f0a85915c6daf2f8138dc5c267a57c08a62900758c7"}, - {file = "pydantic_core-2.33.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e799c050df38a639db758c617ec771fd8fb7a5f8eaaa4b27b101f266b216a246"}, - {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dc46a01bf8d62f227d5ecee74178ffc448ff4e5197c756331f71efcc66dc980f"}, - {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a144d4f717285c6d9234a66778059f33a89096dfb9b39117663fd8413d582dcc"}, - {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:73cf6373c21bc80b2e0dc88444f41ae60b2f070ed02095754eb5a01df12256de"}, - {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3dc625f4aa79713512d1976fe9f0bc99f706a9dee21dfd1810b4bbbf228d0e8a"}, - {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:881b21b5549499972441da4758d662aeea93f1923f953e9cbaff14b8b9565aef"}, - {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bdc25f3681f7b78572699569514036afe3c243bc3059d3942624e936ec93450e"}, - {file = "pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:fe5b32187cbc0c862ee201ad66c30cf218e5ed468ec8dc1cf49dec66e160cc4d"}, - {file = "pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:bc7aee6f634a6f4a95676fcb5d6559a2c2a390330098dba5e5a5f28a2e4ada30"}, - {file = "pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:235f45e5dbcccf6bd99f9f472858849f73d11120d76ea8707115415f8e5ebebf"}, - {file = "pydantic_core-2.33.2-cp311-cp311-win32.whl", hash = "sha256:6368900c2d3ef09b69cb0b913f9f8263b03786e5b2a387706c5afb66800efd51"}, - {file = "pydantic_core-2.33.2-cp311-cp311-win_amd64.whl", hash = "sha256:1e063337ef9e9820c77acc768546325ebe04ee38b08703244c1309cccc4f1bab"}, - {file = "pydantic_core-2.33.2-cp311-cp311-win_arm64.whl", hash = "sha256:6b99022f1d19bc32a4c2a0d544fc9a76e3be90f0b3f4af413f87d38749300e65"}, - {file = "pydantic_core-2.33.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a7ec89dc587667f22b6a0b6579c249fca9026ce7c333fc142ba42411fa243cdc"}, - {file = "pydantic_core-2.33.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3c6db6e52c6d70aa0d00d45cdb9b40f0433b96380071ea80b09277dba021ddf7"}, - {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e61206137cbc65e6d5256e1166f88331d3b6238e082d9f74613b9b765fb9025"}, - {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eb8c529b2819c37140eb51b914153063d27ed88e3bdc31b71198a198e921e011"}, - {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c52b02ad8b4e2cf14ca7b3d918f3eb0ee91e63b3167c32591e57c4317e134f8f"}, - {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:96081f1605125ba0855dfda83f6f3df5ec90c61195421ba72223de35ccfb2f88"}, - {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f57a69461af2a5fa6e6bbd7a5f60d3b7e6cebb687f55106933188e79ad155c1"}, - {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:572c7e6c8bb4774d2ac88929e3d1f12bc45714ae5ee6d9a788a9fb35e60bb04b"}, - {file = "pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:db4b41f9bd95fbe5acd76d89920336ba96f03e149097365afe1cb092fceb89a1"}, - {file = "pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:fa854f5cf7e33842a892e5c73f45327760bc7bc516339fda888c75ae60edaeb6"}, - {file = "pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5f483cfb75ff703095c59e365360cb73e00185e01aaea067cd19acffd2ab20ea"}, - {file = "pydantic_core-2.33.2-cp312-cp312-win32.whl", hash = "sha256:9cb1da0f5a471435a7bc7e439b8a728e8b61e59784b2af70d7c169f8dd8ae290"}, - {file = "pydantic_core-2.33.2-cp312-cp312-win_amd64.whl", hash = "sha256:f941635f2a3d96b2973e867144fde513665c87f13fe0e193c158ac51bfaaa7b2"}, - {file = "pydantic_core-2.33.2-cp312-cp312-win_arm64.whl", hash = "sha256:cca3868ddfaccfbc4bfb1d608e2ccaaebe0ae628e1416aeb9c4d88c001bb45ab"}, - {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5c4aa4e82353f65e548c476b37e64189783aa5384903bfea4f41580f255fddfa"}, - {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d946c8bf0d5c24bf4fe333af284c59a19358aa3ec18cb3dc4370080da1e8ad29"}, - {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87b31b6846e361ef83fedb187bb5b4372d0da3f7e28d85415efa92d6125d6e6d"}, - {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa9d91b338f2df0508606f7009fde642391425189bba6d8c653afd80fd6bb64e"}, - {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2058a32994f1fde4ca0480ab9d1e75a0e8c87c22b53a3ae66554f9af78f2fe8c"}, - {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:0e03262ab796d986f978f79c943fc5f620381be7287148b8010b4097f79a39ec"}, - {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:1a8695a8d00c73e50bff9dfda4d540b7dee29ff9b8053e38380426a85ef10052"}, - {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:fa754d1850735a0b0e03bcffd9d4b4343eb417e47196e4485d9cca326073a42c"}, - {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:a11c8d26a50bfab49002947d3d237abe4d9e4b5bdc8846a63537b6488e197808"}, - {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:dd14041875d09cc0f9308e37a6f8b65f5585cf2598a53aa0123df8b129d481f8"}, - {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:d87c561733f66531dced0da6e864f44ebf89a8fba55f31407b00c2f7f9449593"}, - {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f82865531efd18d6e07a04a17331af02cb7a651583c418df8266f17a63c6612"}, - {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bfb5112df54209d820d7bf9317c7a6c9025ea52e49f46b6a2060104bba37de7"}, - {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:64632ff9d614e5eecfb495796ad51b0ed98c453e447a76bcbeeb69615079fc7e"}, - {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:f889f7a40498cc077332c7ab6b4608d296d852182211787d4f3ee377aaae66e8"}, - {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:de4b83bb311557e439b9e186f733f6c645b9417c84e2eb8203f3f820a4b988bf"}, - {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:82f68293f055f51b51ea42fafc74b6aad03e70e191799430b90c13d643059ebb"}, - {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:329467cecfb529c925cf2bbd4d60d2c509bc2fb52a20c1045bf09bb70971a9c1"}, - {file = "pydantic_core-2.33.2.tar.gz", hash = "sha256:7cb8bc3605c29176e1b105350d2e6474142d7c1bd1d9327c4a9bdb46bf827acc"}, + {file = "pydantic_core-2.41.5-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:77b63866ca88d804225eaa4af3e664c5faf3568cea95360d21f4725ab6e07146"}, + {file = "pydantic_core-2.41.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dfa8a0c812ac681395907e71e1274819dec685fec28273a28905df579ef137e2"}, + {file = "pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5921a4d3ca3aee735d9fd163808f5e8dd6c6972101e4adbda9a4667908849b97"}, + {file = "pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e25c479382d26a2a41b7ebea1043564a937db462816ea07afa8a44c0866d52f9"}, + {file = "pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f547144f2966e1e16ae626d8ce72b4cfa0caedc7fa28052001c94fb2fcaa1c52"}, + {file = "pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6f52298fbd394f9ed112d56f3d11aabd0d5bd27beb3084cc3d8ad069483b8941"}, + {file = "pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:100baa204bb412b74fe285fb0f3a385256dad1d1879f0a5cb1499ed2e83d132a"}, + {file = "pydantic_core-2.41.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:05a2c8852530ad2812cb7914dc61a1125dc4e06252ee98e5638a12da6cc6fb6c"}, + {file = "pydantic_core-2.41.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:29452c56df2ed968d18d7e21f4ab0ac55e71dc59524872f6fc57dcf4a3249ed2"}, + {file = "pydantic_core-2.41.5-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:d5160812ea7a8a2ffbe233d8da666880cad0cbaf5d4de74ae15c313213d62556"}, + {file = "pydantic_core-2.41.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:df3959765b553b9440adfd3c795617c352154e497a4eaf3752555cfb5da8fc49"}, + {file = "pydantic_core-2.41.5-cp310-cp310-win32.whl", hash = "sha256:1f8d33a7f4d5a7889e60dc39856d76d09333d8a6ed0f5f1190635cbec70ec4ba"}, + {file = "pydantic_core-2.41.5-cp310-cp310-win_amd64.whl", hash = "sha256:62de39db01b8d593e45871af2af9e497295db8d73b085f6bfd0b18c83c70a8f9"}, + {file = "pydantic_core-2.41.5-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:a3a52f6156e73e7ccb0f8cced536adccb7042be67cb45f9562e12b319c119da6"}, + {file = "pydantic_core-2.41.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7f3bf998340c6d4b0c9a2f02d6a400e51f123b59565d74dc60d252ce888c260b"}, + {file = "pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:378bec5c66998815d224c9ca994f1e14c0c21cb95d2f52b6021cc0b2a58f2a5a"}, + {file = "pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e7b576130c69225432866fe2f4a469a85a54ade141d96fd396dffcf607b558f8"}, + {file = "pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6cb58b9c66f7e4179a2d5e0f849c48eff5c1fca560994d6eb6543abf955a149e"}, + {file = "pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:88942d3a3dff3afc8288c21e565e476fc278902ae4d6d134f1eeda118cc830b1"}, + {file = "pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f31d95a179f8d64d90f6831d71fa93290893a33148d890ba15de25642c5d075b"}, + {file = "pydantic_core-2.41.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c1df3d34aced70add6f867a8cf413e299177e0c22660cc767218373d0779487b"}, + {file = "pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:4009935984bd36bd2c774e13f9a09563ce8de4abaa7226f5108262fa3e637284"}, + {file = "pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:34a64bc3441dc1213096a20fe27e8e128bd3ff89921706e83c0b1ac971276594"}, + {file = "pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c9e19dd6e28fdcaa5a1de679aec4141f691023916427ef9bae8584f9c2fb3b0e"}, + {file = "pydantic_core-2.41.5-cp311-cp311-win32.whl", hash = "sha256:2c010c6ded393148374c0f6f0bf89d206bf3217f201faa0635dcd56bd1520f6b"}, + {file = "pydantic_core-2.41.5-cp311-cp311-win_amd64.whl", hash = "sha256:76ee27c6e9c7f16f47db7a94157112a2f3a00e958bc626e2f4ee8bec5c328fbe"}, + {file = "pydantic_core-2.41.5-cp311-cp311-win_arm64.whl", hash = "sha256:4bc36bbc0b7584de96561184ad7f012478987882ebf9f9c389b23f432ea3d90f"}, + {file = "pydantic_core-2.41.5-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f41a7489d32336dbf2199c8c0a215390a751c5b014c2c1c5366e817202e9cdf7"}, + {file = "pydantic_core-2.41.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:070259a8818988b9a84a449a2a7337c7f430a22acc0859c6b110aa7212a6d9c0"}, + {file = "pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e96cea19e34778f8d59fe40775a7a574d95816eb150850a85a7a4c8f4b94ac69"}, + {file = "pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed2e99c456e3fadd05c991f8f437ef902e00eedf34320ba2b0842bd1c3ca3a75"}, + {file = "pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:65840751b72fbfd82c3c640cff9284545342a4f1eb1586ad0636955b261b0b05"}, + {file = "pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e536c98a7626a98feb2d3eaf75944ef6f3dbee447e1f841eae16f2f0a72d8ddc"}, + {file = "pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eceb81a8d74f9267ef4081e246ffd6d129da5d87e37a77c9bde550cb04870c1c"}, + {file = "pydantic_core-2.41.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d38548150c39b74aeeb0ce8ee1d8e82696f4a4e16ddc6de7b1d8823f7de4b9b5"}, + {file = "pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c23e27686783f60290e36827f9c626e63154b82b116d7fe9adba1fda36da706c"}, + {file = "pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:482c982f814460eabe1d3bb0adfdc583387bd4691ef00b90575ca0d2b6fe2294"}, + {file = "pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:bfea2a5f0b4d8d43adf9d7b8bf019fb46fdd10a2e5cde477fbcb9d1fa08c68e1"}, + {file = "pydantic_core-2.41.5-cp312-cp312-win32.whl", hash = "sha256:b74557b16e390ec12dca509bce9264c3bbd128f8a2c376eaa68003d7f327276d"}, + {file = "pydantic_core-2.41.5-cp312-cp312-win_amd64.whl", hash = "sha256:1962293292865bca8e54702b08a4f26da73adc83dd1fcf26fbc875b35d81c815"}, + {file = "pydantic_core-2.41.5-cp312-cp312-win_arm64.whl", hash = "sha256:1746d4a3d9a794cacae06a5eaaccb4b8643a131d45fbc9af23e353dc0a5ba5c3"}, + {file = "pydantic_core-2.41.5-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:b96d5f26b05d03cc60f11a7761a5ded1741da411e7fe0909e27a5e6a0cb7b034"}, + {file = "pydantic_core-2.41.5-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:634e8609e89ceecea15e2d61bc9ac3718caaaa71963717bf3c8f38bfde64242c"}, + {file = "pydantic_core-2.41.5-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:93e8740d7503eb008aa2df04d3b9735f845d43ae845e6dcd2be0b55a2da43cd2"}, + {file = "pydantic_core-2.41.5-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f15489ba13d61f670dcc96772e733aad1a6f9c429cc27574c6cdaed82d0146ad"}, + {file = "pydantic_core-2.41.5-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:7da7087d756b19037bc2c06edc6c170eeef3c3bafcb8f532ff17d64dc427adfd"}, + {file = "pydantic_core-2.41.5-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:aabf5777b5c8ca26f7824cb4a120a740c9588ed58df9b2d196ce92fba42ff8dc"}, + {file = "pydantic_core-2.41.5-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c007fe8a43d43b3969e8469004e9845944f1a80e6acd47c150856bb87f230c56"}, + {file = "pydantic_core-2.41.5-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76d0819de158cd855d1cbb8fcafdf6f5cf1eb8e470abe056d5d161106e38062b"}, + {file = "pydantic_core-2.41.5-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b5819cd790dbf0c5eb9f82c73c16b39a65dd6dd4d1439dcdea7816ec9adddab8"}, + {file = "pydantic_core-2.41.5-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:5a4e67afbc95fa5c34cf27d9089bca7fcab4e51e57278d710320a70b956d1b9a"}, + {file = "pydantic_core-2.41.5-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ece5c59f0ce7d001e017643d8d24da587ea1f74f6993467d85ae8a5ef9d4f42b"}, + {file = "pydantic_core-2.41.5-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:16f80f7abe3351f8ea6858914ddc8c77e02578544a0ebc15b4c2e1a0e813b0b2"}, + {file = "pydantic_core-2.41.5-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:33cb885e759a705b426baada1fe68cbb0a2e68e34c5d0d0289a364cf01709093"}, + {file = "pydantic_core-2.41.5-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:c8d8b4eb992936023be7dee581270af5c6e0697a8559895f527f5b7105ecd36a"}, + {file = "pydantic_core-2.41.5-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:242a206cd0318f95cd21bdacff3fcc3aab23e79bba5cac3db5a841c9ef9c6963"}, + {file = "pydantic_core-2.41.5-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d3a978c4f57a597908b7e697229d996d77a6d3c94901e9edee593adada95ce1a"}, + {file = "pydantic_core-2.41.5-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b2379fa7ed44ddecb5bfe4e48577d752db9fc10be00a6b7446e9663ba143de26"}, + {file = "pydantic_core-2.41.5-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:266fb4cbf5e3cbd0b53669a6d1b039c45e3ce651fd5442eff4d07c2cc8d66808"}, + {file = "pydantic_core-2.41.5-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58133647260ea01e4d0500089a8c4f07bd7aa6ce109682b1426394988d8aaacc"}, + {file = "pydantic_core-2.41.5-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:287dad91cfb551c363dc62899a80e9e14da1f0e2b6ebde82c806612ca2a13ef1"}, + {file = "pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:03b77d184b9eb40240ae9fd676ca364ce1085f203e1b1256f8ab9984dca80a84"}, + {file = "pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:a668ce24de96165bb239160b3d854943128f4334822900534f2fe947930e5770"}, + {file = "pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f14f8f046c14563f8eb3f45f499cc658ab8d10072961e07225e507adb700e93f"}, + {file = "pydantic_core-2.41.5-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:56121965f7a4dc965bff783d70b907ddf3d57f6eba29b6d2e5dabfaf07799c51"}, + {file = "pydantic_core-2.41.5.tar.gz", hash = "sha256:08daa51ea16ad373ffd5e7606252cc32f07bc72b28284b6bc9c6df804816476e"}, ] [[package]] name = "pydantic-extra-types" -version = "2.10.5" +version = "2.11.0" summary = "" dependencies = [ "pydantic", "typing-extensions", ] files = [ - {file = "pydantic_extra_types-2.10.5-py3-none-any.whl", hash = "sha256:b60c4e23d573a69a4f1a16dd92888ecc0ef34fb0e655b4f305530377fa70e7a8"}, - {file = "pydantic_extra_types-2.10.5.tar.gz", hash = "sha256:1dcfa2c0cf741a422f088e0dbb4690e7bfadaaf050da3d6f80d6c3cf58a2bad8"}, + {file = "pydantic_extra_types-2.11.0-py3-none-any.whl", hash = "sha256:84b864d250a0fc62535b7ec591e36f2c5b4d1325fa0017eb8cda9aeb63b374a6"}, + {file = "pydantic_extra_types-2.11.0.tar.gz", hash = "sha256:4e9991959d045b75feb775683437a97991d02c138e00b59176571db9ce634f0e"}, ] [[package]] name = "pydantic-settings" -version = "2.9.1" +version = "2.13.1" summary = "" dependencies = [ "pydantic", @@ -1080,13 +1151,13 @@ dependencies = [ "typing-inspection", ] files = [ - {file = "pydantic_settings-2.9.1-py3-none-any.whl", hash = "sha256:59b4f431b1defb26fe620c71a7d3968a710d719f5f4cdbbdb7926edeb770f6ef"}, - {file = "pydantic_settings-2.9.1.tar.gz", hash = "sha256:c509bf79d27563add44e8446233359004ed85066cd096d8b510f715e6ef5d268"}, + {file = "pydantic_settings-2.13.1-py3-none-any.whl", hash = "sha256:d56fd801823dbeae7f0975e1f8c8e25c258eb75d278ea7abb5d9cebb01b56237"}, + {file = "pydantic_settings-2.13.1.tar.gz", hash = "sha256:b4c11847b15237fb0171e1462bf540e294affb9b86db4d9aa5c01730bdbe4025"}, ] [[package]] name = "pydantic-settings-export" -version = "1.0.2" +version = "1.0.3" summary = "" dependencies = [ "pydantic", @@ -1095,55 +1166,58 @@ dependencies = [ "typing-extensions; python_full_version < \"3.11\"", ] files = [ - {file = "pydantic_settings_export-1.0.2-py3-none-any.whl", hash = "sha256:12b809f4f1c2388470e720c522dcbfb808d11aa5fb7efc8f7aae6272fddb9bbe"}, - {file = "pydantic_settings_export-1.0.2.tar.gz", hash = "sha256:1b26277823e25ba4444fcb1e4fa8b1abd81024ecd49d98a7abd9f9c3e8b60c69"}, + {file = "pydantic_settings_export-1.0.3-py3-none-any.whl", hash = "sha256:86c804d837c26ca2d786080b27036818c816b0963e01ea8f473727aa98b84c07"}, + {file = "pydantic_settings_export-1.0.3.tar.gz", hash = "sha256:8b4f0b5daab0113fdfe9018b5684b7fb6be6157275604f2f22cd8cdd7d7b8f7b"}, ] [[package]] name = "pygments" -version = "2.19.1" +version = "2.19.2" summary = "" files = [ - {file = "pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c"}, - {file = "pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f"}, + {file = "pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b"}, + {file = "pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887"}, ] [[package]] name = "pymongo" -version = "4.13.2" +version = "4.16.0" summary = "" dependencies = [ "dnspython", ] files = [ - {file = "pymongo-4.13.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:01065eb1838e3621a30045ab14d1a60ee62e01f65b7cf154e69c5c722ef14d2f"}, - {file = "pymongo-4.13.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9ab0325d436075f5f1901cde95afae811141d162bc42d9a5befb647fda585ae6"}, - {file = "pymongo-4.13.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cdd8041902963c84dc4e27034fa045ac55fabcb2a4ba5b68b880678557573e70"}, - {file = "pymongo-4.13.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b00ab04630aa4af97294e9abdbe0506242396269619c26f5761fd7b2524ef501"}, - {file = "pymongo-4.13.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16440d0da30ba804c6c01ea730405fdbbb476eae760588ea09e6e7d28afc06de"}, - {file = "pymongo-4.13.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad9a2d1357aed5d6750deb315f62cb6f5b3c4c03ffb650da559cb09cb29e6fe8"}, - {file = "pymongo-4.13.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c793223aef21a8c415c840af1ca36c55a05d6fa3297378da35de3fb6661c0174"}, - {file = "pymongo-4.13.2-cp310-cp310-win32.whl", hash = "sha256:8ef6ae029a3390565a0510c872624514dde350007275ecd8126b09175aa02cca"}, - {file = "pymongo-4.13.2-cp310-cp310-win_amd64.whl", hash = "sha256:66f168f8c5b1e2e3d518507cf9f200f0c86ac79e2b2be9e7b6c8fd1e2f7d7824"}, - {file = "pymongo-4.13.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7af8c56d0a7fcaf966d5292e951f308fb1f8bac080257349e14742725fd7990d"}, - {file = "pymongo-4.13.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ad24f5864706f052b05069a6bc59ff875026e28709548131448fe1e40fc5d80f"}, - {file = "pymongo-4.13.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a10069454195d1d2dda98d681b1dbac9a425f4b0fe744aed5230c734021c1cb9"}, - {file = "pymongo-4.13.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3e20862b81e3863bcd72334e3577a3107604553b614a8d25ee1bb2caaea4eb90"}, - {file = "pymongo-4.13.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6b4d5794ca408317c985d7acfb346a60f96f85a7c221d512ff0ecb3cce9d6110"}, - {file = "pymongo-4.13.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c8e0420fb4901006ae7893e76108c2a36a343b4f8922466d51c45e9e2ceb717"}, - {file = "pymongo-4.13.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:239b5f83b83008471d54095e145d4c010f534af99e87cc8877fc6827736451a0"}, - {file = "pymongo-4.13.2-cp311-cp311-win32.whl", hash = "sha256:6bceb524110c32319eb7119422e400dbcafc5b21bcc430d2049a894f69b604e5"}, - {file = "pymongo-4.13.2-cp311-cp311-win_amd64.whl", hash = "sha256:ab87484c97ae837b0a7bbdaa978fa932fbb6acada3f42c3b2bee99121a594715"}, - {file = "pymongo-4.13.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ec89516622dfc8b0fdff499612c0bd235aa45eeb176c9e311bcc0af44bf952b6"}, - {file = "pymongo-4.13.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f30eab4d4326df54fee54f31f93e532dc2918962f733ee8e115b33e6fe151d92"}, - {file = "pymongo-4.13.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cce9428d12ba396ea245fc4c51f20228cead01119fcc959e1c80791ea45f820"}, - {file = "pymongo-4.13.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac9241b727a69c39117c12ac1e52d817ea472260dadc66262c3fdca0bab0709b"}, - {file = "pymongo-4.13.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3efc4c515b371a9fa1d198b6e03340985bfe1a55ae2d2b599a714934e7bc61ab"}, - {file = "pymongo-4.13.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f57a664aa74610eb7a52fa93f2cf794a1491f4f76098343485dd7da5b3bcff06"}, - {file = "pymongo-4.13.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3dcb0b8cdd499636017a53f63ef64cf9b6bd3fd9355796c5a1d228e4be4a4c94"}, - {file = "pymongo-4.13.2-cp312-cp312-win32.whl", hash = "sha256:bf43ae07804d7762b509f68e5ec73450bb8824e960b03b861143ce588b41f467"}, - {file = "pymongo-4.13.2-cp312-cp312-win_amd64.whl", hash = "sha256:812a473d584bcb02ab819d379cd5e752995026a2bb0d7713e78462b6650d3f3a"}, - {file = "pymongo-4.13.2.tar.gz", hash = "sha256:0f64c6469c2362962e6ce97258ae1391abba1566a953a492562d2924b44815c2"}, + {file = "pymongo-4.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ed162b2227f98d5b270ecbe1d53be56c8c81db08a1a8f5f02d89c7bb4d19591d"}, + {file = "pymongo-4.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4a9390dce61d705a88218f0d7b54d7e1fa1b421da8129fc7c009e029a9a6b81e"}, + {file = "pymongo-4.16.0-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:92a232af9927710de08a6c16a9710cc1b175fb9179c0d946cd4e213b92b2a69a"}, + {file = "pymongo-4.16.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4d79aa147ce86aef03079096d83239580006ffb684eead593917186aee407767"}, + {file = "pymongo-4.16.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:19a1c96e7f39c7a59a9cfd4d17920cf9382f6f684faeff4649bf587dc59f8edc"}, + {file = "pymongo-4.16.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:efe020c46ce3c3a89af6baec6569635812129df6fb6cf76d4943af3ba6ee2069"}, + {file = "pymongo-4.16.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9dc2c00bed568732b89e211b6adca389053d5e6d2d5a8979e80b813c3ec4d1f9"}, + {file = "pymongo-4.16.0-cp310-cp310-win32.whl", hash = "sha256:5b9c6d689bbe5beb156374508133218610e14f8c81e35bc17d7a14e30ab593e6"}, + {file = "pymongo-4.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:2290909275c9b8f637b0a92eb9b89281e18a72922749ebb903403ab6cc7da914"}, + {file = "pymongo-4.16.0-cp310-cp310-win_arm64.whl", hash = "sha256:6af1aaa26f0835175d2200e62205b78e7ec3ffa430682e322cc91aaa1a0dbf28"}, + {file = "pymongo-4.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6f2077ec24e2f1248f9cac7b9a2dfb894e50cc7939fcebfb1759f99304caabef"}, + {file = "pymongo-4.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4d4f7ba040f72a9f43a44059872af5a8c8c660aa5d7f90d5344f2ed1c3c02721"}, + {file = "pymongo-4.16.0-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:8a0f73af1ea56c422b2dcfc0437459148a799ef4231c6aee189d2d4c59d6728f"}, + {file = "pymongo-4.16.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:aa30cd16ddd2f216d07ba01d9635c873e97ddb041c61cf0847254edc37d1c60e"}, + {file = "pymongo-4.16.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1d638b0b1b294d95d0fdc73688a3b61e05cc4188872818cd240d51460ccabcb5"}, + {file = "pymongo-4.16.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:21d02cc10a158daa20cb040985e280e7e439832fc6b7857bff3d53ef6914ad50"}, + {file = "pymongo-4.16.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4fbb8d3552c2ad99d9e236003c0b5f96d5f05e29386ba7abae73949bfebc13dd"}, + {file = "pymongo-4.16.0-cp311-cp311-win32.whl", hash = "sha256:be1099a8295b1a722d03fb7b48be895d30f4301419a583dcf50e9045968a041c"}, + {file = "pymongo-4.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:61567f712bda04c7545a037e3284b4367cad8d29b3dec84b4bf3b2147020a75b"}, + {file = "pymongo-4.16.0-cp311-cp311-win_arm64.whl", hash = "sha256:c53338613043038005bf2e41a2fafa08d29cdbc0ce80891b5366c819456c1ae9"}, + {file = "pymongo-4.16.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:bd4911c40a43a821dfd93038ac824b756b6e703e26e951718522d29f6eb166a8"}, + {file = "pymongo-4.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:25a6b03a68f9907ea6ec8bc7cf4c58a1b51a18e23394f962a6402f8e46d41211"}, + {file = "pymongo-4.16.0-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:91ac0cb0fe2bf17616c2039dac88d7c9a5088f5cb5829b27c9d250e053664d31"}, + {file = "pymongo-4.16.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cf0ec79e8ca7077f455d14d915d629385153b6a11abc0b93283ed73a8013e376"}, + {file = "pymongo-4.16.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2d0082631a7510318befc2b4fdab140481eb4b9dd62d9245e042157085da2a70"}, + {file = "pymongo-4.16.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:85dc2f3444c346ea019a371e321ac868a4fab513b7a55fe368f0cc78de8177cc"}, + {file = "pymongo-4.16.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dabbf3c14de75a20cc3c30bf0c6527157224a93dfb605838eabb1a2ee3be008d"}, + {file = "pymongo-4.16.0-cp312-cp312-win32.whl", hash = "sha256:60307bb91e0ab44e560fe3a211087748b2b5f3e31f403baf41f5b7b0a70bd104"}, + {file = "pymongo-4.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:f513b2c6c0d5c491f478422f6b5b5c27ac1af06a54c93ef8631806f7231bd92e"}, + {file = "pymongo-4.16.0-cp312-cp312-win_arm64.whl", hash = "sha256:dfc320f08ea9a7ec5b2403dc4e8150636f0d6150f4b9792faaae539c88e7db3b"}, + {file = "pymongo-4.16.0.tar.gz", hash = "sha256:8ba8405065f6e258a6f872fe62d797a28f383a12178c7153c01ed04e845c600c"}, ] [[package]] @@ -1164,18 +1238,18 @@ files = [ [[package]] name = "pyobjc-core" -version = "11.1" +version = "12.1" summary = "" files = [ - {file = "pyobjc_core-11.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4c7536f3e94de0a3eae6bb382d75f1219280aa867cdf37beef39d9e7d580173c"}, - {file = "pyobjc_core-11.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ec36680b5c14e2f73d432b03ba7c1457dc6ca70fa59fd7daea1073f2b4157d33"}, - {file = "pyobjc_core-11.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:765b97dea6b87ec4612b3212258024d8496ea23517c95a1c5f0735f96b7fd529"}, - {file = "pyobjc_core-11.1.tar.gz", hash = "sha256:b63d4d90c5df7e762f34739b39cc55bc63dbcf9fb2fb3f2671e528488c7a87fe"}, + {file = "pyobjc_core-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:93418e79c1655f66b4352168f8c85c942707cb1d3ea13a1da3e6f6a143bacda7"}, + {file = "pyobjc_core-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c918ebca280925e7fcb14c5c43ce12dcb9574a33cccb889be7c8c17f3bcce8b6"}, + {file = "pyobjc_core-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:818bcc6723561f207e5b5453efe9703f34bc8781d11ce9b8be286bb415eb4962"}, + {file = "pyobjc_core-12.1.tar.gz", hash = "sha256:2bb3903f5387f72422145e1466b3ac3f7f0ef2e9960afa9bcd8961c5cbf8bd21"}, ] [[package]] name = "pyobjc-framework-applicationservices" -version = "11.1" +version = "12.1" summary = "" dependencies = [ "pyobjc-core", @@ -1184,29 +1258,29 @@ dependencies = [ "pyobjc-framework-quartz", ] files = [ - {file = "pyobjc_framework_applicationservices-11.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:89aa713f16f1de66efd82f3be77c632ad1068e51e0ef0c2b0237ac7c7f580814"}, - {file = "pyobjc_framework_applicationservices-11.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:cf45d15eddae36dec2330a9992fc852476b61c8f529874b9ec2805c768a75482"}, - {file = "pyobjc_framework_applicationservices-11.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:f4a85ccd78bab84f7f05ac65ff9be117839dfc09d48c39edd65c617ed73eb01c"}, - {file = "pyobjc_framework_applicationservices-11.1.tar.gz", hash = "sha256:03fcd8c0c600db98fa8b85eb7b3bc31491701720c795e3f762b54e865138bbaf"}, + {file = "pyobjc_framework_applicationservices-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:c4fd1b008757182b9e2603a63c6ffa930cc412fab47294ec64260ab3f8ec695d"}, + {file = "pyobjc_framework_applicationservices-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:bdddd492eeac6d14ff2f5bd342aba29e30dffa72a2d358c08444da22129890e2"}, + {file = "pyobjc_framework_applicationservices-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:c8f6e2fb3b3e9214ab4864ef04eee18f592b46a986c86ea0113448b310520532"}, + {file = "pyobjc_framework_applicationservices-12.1.tar.gz", hash = "sha256:c06abb74f119bc27aeb41bf1aef8102c0ae1288aec1ac8665ea186a067a8945b"}, ] [[package]] name = "pyobjc-framework-cocoa" -version = "11.1" +version = "12.1" summary = "" dependencies = [ "pyobjc-core", ] files = [ - {file = "pyobjc_framework_cocoa-11.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b27a5bdb3ab6cdeb998443ff3fce194ffae5f518c6a079b832dbafc4426937f9"}, - {file = "pyobjc_framework_cocoa-11.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7b9a9b8ba07f5bf84866399e3de2aa311ed1c34d5d2788a995bdbe82cc36cfa0"}, - {file = "pyobjc_framework_cocoa-11.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:806de56f06dfba8f301a244cce289d54877c36b4b19818e3b53150eb7c2424d0"}, - {file = "pyobjc_framework_cocoa-11.1.tar.gz", hash = "sha256:87df76b9b73e7ca699a828ff112564b59251bb9bbe72e610e670a4dc9940d038"}, + {file = "pyobjc_framework_cocoa-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9b880d3bdcd102809d704b6d8e14e31611443aa892d9f60e8491e457182fdd48"}, + {file = "pyobjc_framework_cocoa-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f52228bcf38da64b77328787967d464e28b981492b33a7675585141e1b0a01e6"}, + {file = "pyobjc_framework_cocoa-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:547c182837214b7ec4796dac5aee3aa25abc665757b75d7f44f83c994bcb0858"}, + {file = "pyobjc_framework_cocoa-12.1.tar.gz", hash = "sha256:5556c87db95711b985d5efdaaf01c917ddd41d148b1e52a0c66b1a2e2c5c1640"}, ] [[package]] name = "pyobjc-framework-coretext" -version = "11.1" +version = "12.1" summary = "" dependencies = [ "pyobjc-core", @@ -1214,25 +1288,25 @@ dependencies = [ "pyobjc-framework-quartz", ] files = [ - {file = "pyobjc_framework_coretext-11.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:515be6beb48c084ee413c00c4e9fbd6e730c1b8a24270f4c618fc6c7ba0011ce"}, - {file = "pyobjc_framework_coretext-11.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:b4f4d2d2a6331fa64465247358d7aafce98e4fb654b99301a490627a073d021e"}, - {file = "pyobjc_framework_coretext-11.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1597bf7234270ee1b9963bf112e9061050d5fb8e1384b3f50c11bde2fe2b1570"}, - {file = "pyobjc_framework_coretext-11.1.tar.gz", hash = "sha256:a29bbd5d85c77f46a8ee81d381b847244c88a3a5a96ac22f509027ceceaffaf6"}, + {file = "pyobjc_framework_coretext-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1c8315dcef6699c2953461d97117fe81402f7c29cff36d2950dacce028a362fd"}, + {file = "pyobjc_framework_coretext-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4f6742ba5b0bb7629c345e99eff928fbfd9e9d3d667421ac1a2a43bdb7ba9833"}, + {file = "pyobjc_framework_coretext-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d246fa654bdbf43bae3969887d58f0b336c29b795ad55a54eb76397d0e62b93c"}, + {file = "pyobjc_framework_coretext-12.1.tar.gz", hash = "sha256:e0adb717738fae395dc645c9e8a10bb5f6a4277e73cba8fa2a57f3b518e71da5"}, ] [[package]] name = "pyobjc-framework-quartz" -version = "11.1" +version = "12.1" summary = "" dependencies = [ "pyobjc-core", "pyobjc-framework-cocoa", ] files = [ - {file = "pyobjc_framework_quartz-11.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b5ef75c416b0209e25b2eb07a27bd7eedf14a8c6b2f968711969d45ceceb0f84"}, - {file = "pyobjc_framework_quartz-11.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2d501fe95ef15d8acf587cb7dc4ab4be3c5a84e2252017da8dbb7df1bbe7a72a"}, - {file = "pyobjc_framework_quartz-11.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9ac806067541917d6119b98d90390a6944e7d9bd737f5c0a79884202327c9204"}, - {file = "pyobjc_framework_quartz-11.1.tar.gz", hash = "sha256:a57f35ccfc22ad48c87c5932818e583777ff7276605fef6afad0ac0741169f75"}, + {file = "pyobjc_framework_quartz-12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:c6f312ae79ef8b3019dcf4b3374c52035c7c7bc4a09a1748b61b041bb685a0ed"}, + {file = "pyobjc_framework_quartz-12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:19f99ac49a0b15dd892e155644fe80242d741411a9ed9c119b18b7466048625a"}, + {file = "pyobjc_framework_quartz-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:7730cdce46c7e985535b5a42c31381af4aa6556e5642dc55b5e6597595e57a16"}, + {file = "pyobjc_framework_quartz-12.1.tar.gz", hash = "sha256:27f782f3513ac88ec9b6c82d9767eef95a5cf4175ce88a1e5a65875fee799608"}, ] [[package]] @@ -1247,45 +1321,58 @@ files = [ {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, ] +[[package]] +name = "python-discovery" +version = "1.1.2" +summary = "" +dependencies = [ + "filelock", + "platformdirs", +] +files = [ + {file = "python_discovery-1.1.2-py3-none-any.whl", hash = "sha256:d18edd61b382d62f8bcd004a71ebaabc87df31dbefb30aeed59f4fc6afa005be"}, + {file = "python_discovery-1.1.2.tar.gz", hash = "sha256:c500bd2153e3afc5f48a61d33ff570b6f3e710d36ceaaf882fa9bbe5cc2cec49"}, +] + [[package]] name = "python-dotenv" -version = "1.1.0" +version = "1.2.2" summary = "" files = [ - {file = "python_dotenv-1.1.0-py3-none-any.whl", hash = "sha256:d7c01d9e2293916c18baf562d95698754b0dbbb5e74d457c45d4f6561fb9d55d"}, - {file = "python_dotenv-1.1.0.tar.gz", hash = "sha256:41f90bc6f5f177fb41f53e87666db362025010eb28f60a01c9143bfa33a2b2d5"}, + {file = "python_dotenv-1.2.2-py3-none-any.whl", hash = "sha256:1d8214789a24de455a8b8bd8ae6fe3c6b69a5e3d64aa8a8e5d68e694bbcb285a"}, + {file = "python_dotenv-1.2.2.tar.gz", hash = "sha256:2c371a91fbd7ba082c2c1dc1f8bf89ca22564a087c2c287cd9b662adde799cf3"}, ] [[package]] name = "python-multipart" -version = "0.0.20" +version = "0.0.22" summary = "" files = [ - {file = "python_multipart-0.0.20-py3-none-any.whl", hash = "sha256:8a62d3a8335e06589fe01f2a3e178cdcc632f3fbe0d492ad9ee0ec35aab1f104"}, - {file = "python_multipart-0.0.20.tar.gz", hash = "sha256:8dd0cab45b8e23064ae09147625994d090fa46f5b0d1e13af944c331a7fa9d13"}, + {file = "python_multipart-0.0.22-py3-none-any.whl", hash = "sha256:2b2cd894c83d21bf49d702499531c7bafd057d730c201782048f7945d82de155"}, + {file = "python_multipart-0.0.22.tar.gz", hash = "sha256:7340bef99a7e0032613f56dc36027b959fd3b30a787ed62d310e951f7c3a3a58"}, ] [[package]] name = "python-ulid" -version = "3.0.0" +version = "3.1.0" summary = "" files = [ - {file = "python_ulid-3.0.0-py3-none-any.whl", hash = "sha256:e4c4942ff50dbd79167ad01ac725ec58f924b4018025ce22c858bfcff99a5e31"}, - {file = "python_ulid-3.0.0.tar.gz", hash = "sha256:e50296a47dc8209d28629a22fc81ca26c00982c78934bd7766377ba37ea49a9f"}, + {file = "python_ulid-3.1.0-py3-none-any.whl", hash = "sha256:e2cdc979c8c877029b4b7a38a6fba3bc4578e4f109a308419ff4d3ccf0a46619"}, + {file = "python_ulid-3.1.0.tar.gz", hash = "sha256:ff0410a598bc5f6b01b602851a3296ede6f91389f913a5d5f8c496003836f636"}, ] [[package]] name = "python-ulid" -version = "3.0.0" +version = "3.1.0" extras = ["pydantic"] summary = "" dependencies = [ "pydantic", - "python-ulid==3.0.0", + "python-ulid==3.1.0", ] files = [ - {file = "python_ulid-3.0.0-py3-none-any.whl", hash = "sha256:e4c4942ff50dbd79167ad01ac725ec58f924b4018025ce22c858bfcff99a5e31"}, - {file = "python_ulid-3.0.0.tar.gz", hash = "sha256:e50296a47dc8209d28629a22fc81ca26c00982c78934bd7766377ba37ea49a9f"}, + {file = "python_ulid-3.1.0-py3-none-any.whl", hash = "sha256:e2cdc979c8c877029b4b7a38a6fba3bc4578e4f109a308419ff4d3ccf0a46619"}, + {file = "python_ulid-3.1.0.tar.gz", hash = "sha256:ff0410a598bc5f6b01b602851a3296ede6f91389f913a5d5f8c496003836f636"}, ] [[package]] @@ -1300,162 +1387,153 @@ files = [ {file = "python_xlib-0.33-py2.py3-none-any.whl", hash = "sha256:c3534038d42e0df2f1392a1b30a15a4ff5fdc2b86cfa94f072bf11b10a164398"}, ] -[[package]] -name = "pywin32" -version = "310" -summary = "" -files = [ - {file = "pywin32-310-cp310-cp310-win32.whl", hash = "sha256:6dd97011efc8bf51d6793a82292419eba2c71cf8e7250cfac03bba284454abc1"}, - {file = "pywin32-310-cp310-cp310-win_amd64.whl", hash = "sha256:c3e78706e4229b915a0821941a84e7ef420bf2b77e08c9dae3c76fd03fd2ae3d"}, - {file = "pywin32-310-cp310-cp310-win_arm64.whl", hash = "sha256:33babed0cf0c92a6f94cc6cc13546ab24ee13e3e800e61ed87609ab91e4c8213"}, - {file = "pywin32-310-cp311-cp311-win32.whl", hash = "sha256:1e765f9564e83011a63321bb9d27ec456a0ed90d3732c4b2e312b855365ed8bd"}, - {file = "pywin32-310-cp311-cp311-win_amd64.whl", hash = "sha256:126298077a9d7c95c53823934f000599f66ec9296b09167810eb24875f32689c"}, - {file = "pywin32-310-cp311-cp311-win_arm64.whl", hash = "sha256:19ec5fc9b1d51c4350be7bb00760ffce46e6c95eaf2f0b2f1150657b1a43c582"}, - {file = "pywin32-310-cp312-cp312-win32.whl", hash = "sha256:8a75a5cc3893e83a108c05d82198880704c44bbaee4d06e442e471d3c9ea4f3d"}, - {file = "pywin32-310-cp312-cp312-win_amd64.whl", hash = "sha256:bf5c397c9a9a19a6f62f3fb821fbf36cac08f03770056711f765ec1503972060"}, - {file = "pywin32-310-cp312-cp312-win_arm64.whl", hash = "sha256:2349cc906eae872d0663d4d6290d13b90621eaf78964bb1578632ff20e152966"}, -] - [[package]] name = "pyyaml" -version = "6.0.2" -summary = "" -files = [ - {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, - {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, - {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237"}, - {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b"}, - {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed"}, - {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180"}, - {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68"}, - {file = "PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99"}, - {file = "PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e"}, - {file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"}, - {file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"}, - {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c"}, - {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317"}, - {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85"}, - {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"}, - {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e"}, - {file = "PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5"}, - {file = "PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44"}, - {file = "PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab"}, - {file = "PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725"}, - {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5"}, - {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425"}, - {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476"}, - {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48"}, - {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b"}, - {file = "PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4"}, - {file = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8"}, - {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, +version = "6.0.3" +summary = "" +files = [ + {file = "pyyaml-6.0.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:214ed4befebe12df36bcc8bc2b64b396ca31be9304b8f59e25c11cf94a4c033b"}, + {file = "pyyaml-6.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02ea2dfa234451bbb8772601d7b8e426c2bfa197136796224e50e35a78777956"}, + {file = "pyyaml-6.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b30236e45cf30d2b8e7b3e85881719e98507abed1011bf463a8fa23e9c3e98a8"}, + {file = "pyyaml-6.0.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:66291b10affd76d76f54fad28e22e51719ef9ba22b29e1d7d03d6777a9174198"}, + {file = "pyyaml-6.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9c7708761fccb9397fe64bbc0395abcae8c4bf7b0eac081e12b809bf47700d0b"}, + {file = "pyyaml-6.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:418cf3f2111bc80e0933b2cd8cd04f286338bb88bdc7bc8e6dd775ebde60b5e0"}, + {file = "pyyaml-6.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5e0b74767e5f8c593e8c9b5912019159ed0533c70051e9cce3e8b6aa699fcd69"}, + {file = "pyyaml-6.0.3-cp310-cp310-win32.whl", hash = "sha256:28c8d926f98f432f88adc23edf2e6d4921ac26fb084b028c733d01868d19007e"}, + {file = "pyyaml-6.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:bdb2c67c6c1390b63c6ff89f210c8fd09d9a1217a465701eac7316313c915e4c"}, + {file = "pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e"}, + {file = "pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824"}, + {file = "pyyaml-6.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c"}, + {file = "pyyaml-6.0.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00"}, + {file = "pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d"}, + {file = "pyyaml-6.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37d57ad971609cf3c53ba6a7e365e40660e3be0e5175fa9f2365a379d6095a"}, + {file = "pyyaml-6.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4"}, + {file = "pyyaml-6.0.3-cp311-cp311-win32.whl", hash = "sha256:8098f252adfa6c80ab48096053f512f2321f0b998f98150cea9bd23d83e1467b"}, + {file = "pyyaml-6.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:9f3bfb4965eb874431221a3ff3fdcddc7e74e3b07799e0e84ca4a0f867d449bf"}, + {file = "pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196"}, + {file = "pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0"}, + {file = "pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28"}, + {file = "pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c"}, + {file = "pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc"}, + {file = "pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e"}, + {file = "pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea"}, + {file = "pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5"}, + {file = "pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b"}, + {file = "pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd"}, + {file = "pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f"}, ] [[package]] name = "pyzmq" -version = "27.0.0" +version = "27.1.0" summary = "" dependencies = [ "cffi; implementation_name == \"pypy\"", ] files = [ - {file = "pyzmq-27.0.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:b973ee650e8f442ce482c1d99ca7ab537c69098d53a3d046676a484fd710c87a"}, - {file = "pyzmq-27.0.0-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:661942bc7cd0223d569d808f2e5696d9cc120acc73bf3e88a1f1be7ab648a7e4"}, - {file = "pyzmq-27.0.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:50360fb2a056ffd16e5f4177eee67f1dd1017332ea53fb095fe7b5bf29c70246"}, - {file = "pyzmq-27.0.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cf209a6dc4b420ed32a7093642843cbf8703ed0a7d86c16c0b98af46762ebefb"}, - {file = "pyzmq-27.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c2dace4a7041cca2fba5357a2d7c97c5effdf52f63a1ef252cfa496875a3762d"}, - {file = "pyzmq-27.0.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:63af72b2955fc77caf0a77444baa2431fcabb4370219da38e1a9f8d12aaebe28"}, - {file = "pyzmq-27.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e8c4adce8e37e75c4215297d7745551b8dcfa5f728f23ce09bf4e678a9399413"}, - {file = "pyzmq-27.0.0-cp310-cp310-win32.whl", hash = "sha256:5d5ef4718ecab24f785794e0e7536436698b459bfbc19a1650ef55280119d93b"}, - {file = "pyzmq-27.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:e40609380480b3d12c30f841323f42451c755b8fece84235236f5fe5ffca8c1c"}, - {file = "pyzmq-27.0.0-cp310-cp310-win_arm64.whl", hash = "sha256:6b0397b0be277b46762956f576e04dc06ced265759e8c2ff41a0ee1aa0064198"}, - {file = "pyzmq-27.0.0-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:21457825249b2a53834fa969c69713f8b5a79583689387a5e7aed880963ac564"}, - {file = "pyzmq-27.0.0-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:1958947983fef513e6e98eff9cb487b60bf14f588dc0e6bf35fa13751d2c8251"}, - {file = "pyzmq-27.0.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c0dc628b5493f9a8cd9844b8bee9732ef587ab00002157c9329e4fc0ef4d3afa"}, - {file = "pyzmq-27.0.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f7bbe9e1ed2c8d3da736a15694d87c12493e54cc9dc9790796f0321794bbc91f"}, - {file = "pyzmq-27.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:dc1091f59143b471d19eb64f54bae4f54bcf2a466ffb66fe45d94d8d734eb495"}, - {file = "pyzmq-27.0.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:7011ade88c8e535cf140f8d1a59428676fbbce7c6e54fefce58bf117aefb6667"}, - {file = "pyzmq-27.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:2c386339d7e3f064213aede5d03d054b237937fbca6dd2197ac8cf3b25a6b14e"}, - {file = "pyzmq-27.0.0-cp311-cp311-win32.whl", hash = "sha256:0546a720c1f407b2172cb04b6b094a78773491497e3644863cf5c96c42df8cff"}, - {file = "pyzmq-27.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:15f39d50bd6c9091c67315ceb878a4f531957b121d2a05ebd077eb35ddc5efed"}, - {file = "pyzmq-27.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:c5817641eebb391a2268c27fecd4162448e03538387093cdbd8bf3510c316b38"}, - {file = "pyzmq-27.0.0-cp312-abi3-macosx_10_15_universal2.whl", hash = "sha256:cbabc59dcfaac66655c040dfcb8118f133fb5dde185e5fc152628354c1598e52"}, - {file = "pyzmq-27.0.0-cp312-abi3-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:cb0ac5179cba4b2f94f1aa208fbb77b62c4c9bf24dd446278b8b602cf85fcda3"}, - {file = "pyzmq-27.0.0-cp312-abi3-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:53a48f0228eab6cbf69fde3aa3c03cbe04e50e623ef92ae395fce47ef8a76152"}, - {file = "pyzmq-27.0.0-cp312-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:111db5f395e09f7e775f759d598f43cb815fc58e0147623c4816486e1a39dc22"}, - {file = "pyzmq-27.0.0-cp312-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:c8878011653dcdc27cc2c57e04ff96f0471e797f5c19ac3d7813a245bcb24371"}, - {file = "pyzmq-27.0.0-cp312-abi3-musllinux_1_2_i686.whl", hash = "sha256:c0ed2c1f335ba55b5fdc964622254917d6b782311c50e138863eda409fbb3b6d"}, - {file = "pyzmq-27.0.0-cp312-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:e918d70862d4cfd4b1c187310015646a14e1f5917922ab45b29f28f345eeb6be"}, - {file = "pyzmq-27.0.0-cp312-abi3-win32.whl", hash = "sha256:88b4e43cab04c3c0f0d55df3b1eef62df2b629a1a369b5289a58f6fa8b07c4f4"}, - {file = "pyzmq-27.0.0-cp312-abi3-win_amd64.whl", hash = "sha256:dce4199bf5f648a902ce37e7b3afa286f305cd2ef7a8b6ec907470ccb6c8b371"}, - {file = "pyzmq-27.0.0-cp312-abi3-win_arm64.whl", hash = "sha256:56e46bbb85d52c1072b3f809cc1ce77251d560bc036d3a312b96db1afe76db2e"}, - {file = "pyzmq-27.0.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:656c1866505a5735d0660b7da6d7147174bbf59d4975fc2b7f09f43c9bc25745"}, - {file = "pyzmq-27.0.0-pp310-pypy310_pp73-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:74175b9e12779382432dd1d1f5960ebe7465d36649b98a06c6b26be24d173fab"}, - {file = "pyzmq-27.0.0-pp310-pypy310_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d8c6de908465697a8708e4d6843a1e884f567962fc61eb1706856545141d0cbb"}, - {file = "pyzmq-27.0.0-pp310-pypy310_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c644aaacc01d0df5c7072826df45e67301f191c55f68d7b2916d83a9ddc1b551"}, - {file = "pyzmq-27.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:10f70c1d9a446a85013a36871a296007f6fe4232b530aa254baf9da3f8328bc0"}, - {file = "pyzmq-27.0.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:cd1dc59763effd1576f8368047c9c31468fce0af89d76b5067641137506792ae"}, - {file = "pyzmq-27.0.0-pp311-pypy311_pp73-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:60e8cc82d968174650c1860d7b716366caab9973787a1c060cf8043130f7d0f7"}, - {file = "pyzmq-27.0.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:14fe7aaac86e4e93ea779a821967360c781d7ac5115b3f1a171ced77065a0174"}, - {file = "pyzmq-27.0.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6ad0562d4e6abb785be3e4dd68599c41be821b521da38c402bc9ab2a8e7ebc7e"}, - {file = "pyzmq-27.0.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:9df43a2459cd3a3563404c1456b2c4c69564daa7dbaf15724c09821a3329ce46"}, - {file = "pyzmq-27.0.0.tar.gz", hash = "sha256:b1f08eeb9ce1510e6939b6e5dcd46a17765e2333daae78ecf4606808442e52cf"}, + {file = "pyzmq-27.1.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:508e23ec9bc44c0005c4946ea013d9317ae00ac67778bd47519fdf5a0e930ff4"}, + {file = "pyzmq-27.1.0-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:507b6f430bdcf0ee48c0d30e734ea89ce5567fd7b8a0f0044a369c176aa44556"}, + {file = "pyzmq-27.1.0-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bf7b38f9fd7b81cb6d9391b2946382c8237fd814075c6aa9c3b746d53076023b"}, + {file = "pyzmq-27.1.0-cp310-cp310-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:03ff0b279b40d687691a6217c12242ee71f0fba28bf8626ff50e3ef0f4410e1e"}, + {file = "pyzmq-27.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:677e744fee605753eac48198b15a2124016c009a11056f93807000ab11ce6526"}, + {file = "pyzmq-27.1.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:dd2fec2b13137416a1c5648b7009499bcc8fea78154cd888855fa32514f3dad1"}, + {file = "pyzmq-27.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:08e90bb4b57603b84eab1d0ca05b3bbb10f60c1839dc471fc1c9e1507bef3386"}, + {file = "pyzmq-27.1.0-cp310-cp310-win32.whl", hash = "sha256:a5b42d7a0658b515319148875fcb782bbf118dd41c671b62dae33666c2213bda"}, + {file = "pyzmq-27.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:c0bb87227430ee3aefcc0ade2088100e528d5d3298a0a715a64f3d04c60ba02f"}, + {file = "pyzmq-27.1.0-cp310-cp310-win_arm64.whl", hash = "sha256:9a916f76c2ab8d045b19f2286851a38e9ac94ea91faf65bd64735924522a8b32"}, + {file = "pyzmq-27.1.0-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:226b091818d461a3bef763805e75685e478ac17e9008f49fce2d3e52b3d58b86"}, + {file = "pyzmq-27.1.0-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:0790a0161c281ca9723f804871b4027f2e8b5a528d357c8952d08cd1a9c15581"}, + {file = "pyzmq-27.1.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c895a6f35476b0c3a54e3eb6ccf41bf3018de937016e6e18748317f25d4e925f"}, + {file = "pyzmq-27.1.0-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5bbf8d3630bf96550b3be8e1fc0fea5cbdc8d5466c1192887bd94869da17a63e"}, + {file = "pyzmq-27.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:15c8bd0fe0dabf808e2d7a681398c4e5ded70a551ab47482067a572c054c8e2e"}, + {file = "pyzmq-27.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:bafcb3dd171b4ae9f19ee6380dfc71ce0390fefaf26b504c0e5f628d7c8c54f2"}, + {file = "pyzmq-27.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e829529fcaa09937189178115c49c504e69289abd39967cd8a4c215761373394"}, + {file = "pyzmq-27.1.0-cp311-cp311-win32.whl", hash = "sha256:6df079c47d5902af6db298ec92151db82ecb557af663098b92f2508c398bb54f"}, + {file = "pyzmq-27.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:190cbf120fbc0fc4957b56866830def56628934a9d112aec0e2507aa6a032b97"}, + {file = "pyzmq-27.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:eca6b47df11a132d1745eb3b5b5e557a7dae2c303277aa0e69c6ba91b8736e07"}, + {file = "pyzmq-27.1.0-cp312-abi3-macosx_10_15_universal2.whl", hash = "sha256:452631b640340c928fa343801b0d07eb0c3789a5ffa843f6e1a9cee0ba4eb4fc"}, + {file = "pyzmq-27.1.0-cp312-abi3-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:1c179799b118e554b66da67d88ed66cd37a169f1f23b5d9f0a231b4e8d44a113"}, + {file = "pyzmq-27.1.0-cp312-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3837439b7f99e60312f0c926a6ad437b067356dc2bc2ec96eb395fd0fe804233"}, + {file = "pyzmq-27.1.0-cp312-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:43ad9a73e3da1fab5b0e7e13402f0b2fb934ae1c876c51d0afff0e7c052eca31"}, + {file = "pyzmq-27.1.0-cp312-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:0de3028d69d4cdc475bfe47a6128eb38d8bc0e8f4d69646adfbcd840facbac28"}, + {file = "pyzmq-27.1.0-cp312-abi3-musllinux_1_2_i686.whl", hash = "sha256:cf44a7763aea9298c0aa7dbf859f87ed7012de8bda0f3977b6fb1d96745df856"}, + {file = "pyzmq-27.1.0-cp312-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:f30f395a9e6fbca195400ce833c731e7b64c3919aa481af4d88c3759e0cb7496"}, + {file = "pyzmq-27.1.0-cp312-abi3-win32.whl", hash = "sha256:250e5436a4ba13885494412b3da5d518cd0d3a278a1ae640e113c073a5f88edd"}, + {file = "pyzmq-27.1.0-cp312-abi3-win_amd64.whl", hash = "sha256:9ce490cf1d2ca2ad84733aa1d69ce6855372cb5ce9223802450c9b2a7cba0ccf"}, + {file = "pyzmq-27.1.0-cp312-abi3-win_arm64.whl", hash = "sha256:75a2f36223f0d535a0c919e23615fc85a1e23b71f40c7eb43d7b1dedb4d8f15f"}, + {file = "pyzmq-27.1.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:c17e03cbc9312bee223864f1a2b13a99522e0dc9f7c5df0177cd45210ac286e6"}, + {file = "pyzmq-27.1.0-pp310-pypy310_pp73-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:f328d01128373cb6763823b2b4e7f73bdf767834268c565151eacb3b7a392f90"}, + {file = "pyzmq-27.1.0-pp310-pypy310_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9c1790386614232e1b3a40a958454bdd42c6d1811837b15ddbb052a032a43f62"}, + {file = "pyzmq-27.1.0-pp310-pypy310_pp73-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:448f9cb54eb0cee4732b46584f2710c8bc178b0e5371d9e4fc8125201e413a74"}, + {file = "pyzmq-27.1.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:05b12f2d32112bf8c95ef2e74ec4f1d4beb01f8b5e703b38537f8849f92cb9ba"}, + {file = "pyzmq-27.1.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:18770c8d3563715387139060d37859c02ce40718d1faf299abddcdcc6a649066"}, + {file = "pyzmq-27.1.0-pp311-pypy311_pp73-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:ac25465d42f92e990f8d8b0546b01c391ad431c3bf447683fdc40565941d0604"}, + {file = "pyzmq-27.1.0-pp311-pypy311_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:53b40f8ae006f2734ee7608d59ed661419f087521edbfc2149c3932e9c14808c"}, + {file = "pyzmq-27.1.0-pp311-pypy311_pp73-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f605d884e7c8be8fe1aa94e0a783bf3f591b84c24e4bc4f3e7564c82ac25e271"}, + {file = "pyzmq-27.1.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:c9f7f6e13dff2e44a6afeaf2cf54cee5929ad64afaf4d40b50f93c58fc687355"}, + {file = "pyzmq-27.1.0.tar.gz", hash = "sha256:ac0765e3d44455adb6ddbf4417dcce460fc40a05978c08efdf2948072f6db540"}, ] [[package]] name = "regex" -version = "2025.9.18" -summary = "" -files = [ - {file = "regex-2025.9.18-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:12296202480c201c98a84aecc4d210592b2f55e200a1d193235c4db92b9f6788"}, - {file = "regex-2025.9.18-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:220381f1464a581f2ea988f2220cf2a67927adcef107d47d6897ba5a2f6d51a4"}, - {file = "regex-2025.9.18-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:87f681bfca84ebd265278b5daa1dcb57f4db315da3b5d044add7c30c10442e61"}, - {file = "regex-2025.9.18-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:34d674cbba70c9398074c8a1fcc1a79739d65d1105de2a3c695e2b05ea728251"}, - {file = "regex-2025.9.18-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:385c9b769655cb65ea40b6eea6ff763cbb6d69b3ffef0b0db8208e1833d4e746"}, - {file = "regex-2025.9.18-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8900b3208e022570ae34328712bef6696de0804c122933414014bae791437ab2"}, - {file = "regex-2025.9.18-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c204e93bf32cd7a77151d44b05eb36f469d0898e3fba141c026a26b79d9914a0"}, - {file = "regex-2025.9.18-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3acc471d1dd7e5ff82e6cacb3b286750decd949ecd4ae258696d04f019817ef8"}, - {file = "regex-2025.9.18-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:6479d5555122433728760e5f29edb4c2b79655a8deb681a141beb5c8a025baea"}, - {file = "regex-2025.9.18-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:431bd2a8726b000eb6f12429c9b438a24062a535d06783a93d2bcbad3698f8a8"}, - {file = "regex-2025.9.18-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:0cc3521060162d02bd36927e20690129200e5ac9d2c6d32b70368870b122db25"}, - {file = "regex-2025.9.18-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:a021217b01be2d51632ce056d7a837d3fa37c543ede36e39d14063176a26ae29"}, - {file = "regex-2025.9.18-cp310-cp310-win32.whl", hash = "sha256:4a12a06c268a629cb67cc1d009b7bb0be43e289d00d5111f86a2efd3b1949444"}, - {file = "regex-2025.9.18-cp310-cp310-win_amd64.whl", hash = "sha256:47acd811589301298c49db2c56bde4f9308d6396da92daf99cba781fa74aa450"}, - {file = "regex-2025.9.18-cp310-cp310-win_arm64.whl", hash = "sha256:16bd2944e77522275e5ee36f867e19995bcaa533dcb516753a26726ac7285442"}, - {file = "regex-2025.9.18-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:51076980cd08cd13c88eb7365427ae27f0d94e7cebe9ceb2bb9ffdae8fc4d82a"}, - {file = "regex-2025.9.18-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:828446870bd7dee4e0cbeed767f07961aa07f0ea3129f38b3ccecebc9742e0b8"}, - {file = "regex-2025.9.18-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c28821d5637866479ec4cc23b8c990f5bc6dd24e5e4384ba4a11d38a526e1414"}, - {file = "regex-2025.9.18-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:726177ade8e481db669e76bf99de0b278783be8acd11cef71165327abd1f170a"}, - {file = "regex-2025.9.18-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f5cca697da89b9f8ea44115ce3130f6c54c22f541943ac8e9900461edc2b8bd4"}, - {file = "regex-2025.9.18-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:dfbde38f38004703c35666a1e1c088b778e35d55348da2b7b278914491698d6a"}, - {file = "regex-2025.9.18-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f2f422214a03fab16bfa495cfec72bee4aaa5731843b771860a471282f1bf74f"}, - {file = "regex-2025.9.18-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a295916890f4df0902e4286bc7223ee7f9e925daa6dcdec4192364255b70561a"}, - {file = "regex-2025.9.18-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:5db95ff632dbabc8c38c4e82bf545ab78d902e81160e6e455598014f0abe66b9"}, - {file = "regex-2025.9.18-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:fb967eb441b0f15ae610b7069bdb760b929f267efbf522e814bbbfffdf125ce2"}, - {file = "regex-2025.9.18-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f04d2f20da4053d96c08f7fde6e1419b7ec9dbcee89c96e3d731fca77f411b95"}, - {file = "regex-2025.9.18-cp311-cp311-win32.whl", hash = "sha256:895197241fccf18c0cea7550c80e75f185b8bd55b6924fcae269a1a92c614a07"}, - {file = "regex-2025.9.18-cp311-cp311-win_amd64.whl", hash = "sha256:7e2b414deae99166e22c005e154a5513ac31493db178d8aec92b3269c9cce8c9"}, - {file = "regex-2025.9.18-cp311-cp311-win_arm64.whl", hash = "sha256:fb137ec7c5c54f34a25ff9b31f6b7b0c2757be80176435bf367111e3f71d72df"}, - {file = "regex-2025.9.18-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:436e1b31d7efd4dcd52091d076482031c611dde58bf9c46ca6d0a26e33053a7e"}, - {file = "regex-2025.9.18-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c190af81e5576b9c5fdc708f781a52ff20f8b96386c6e2e0557a78402b029f4a"}, - {file = "regex-2025.9.18-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e4121f1ce2b2b5eec4b397cc1b277686e577e658d8f5870b7eb2d726bd2300ab"}, - {file = "regex-2025.9.18-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:300e25dbbf8299d87205e821a201057f2ef9aa3deb29caa01cd2cac669e508d5"}, - {file = "regex-2025.9.18-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7b47fcf9f5316c0bdaf449e879407e1b9937a23c3b369135ca94ebc8d74b1742"}, - {file = "regex-2025.9.18-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:57a161bd3acaa4b513220b49949b07e252165e6b6dc910ee7617a37ff4f5b425"}, - {file = "regex-2025.9.18-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4f130c3a7845ba42de42f380fff3c8aebe89a810747d91bcf56d40a069f15352"}, - {file = "regex-2025.9.18-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5f96fa342b6f54dcba928dd452e8d8cb9f0d63e711d1721cd765bb9f73bb048d"}, - {file = "regex-2025.9.18-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:0f0d676522d68c207828dcd01fb6f214f63f238c283d9f01d85fc664c7c85b56"}, - {file = "regex-2025.9.18-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:40532bff8a1a0621e7903ae57fce88feb2e8a9a9116d341701302c9302aef06e"}, - {file = "regex-2025.9.18-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:039f11b618ce8d71a1c364fdee37da1012f5a3e79b1b2819a9f389cd82fd6282"}, - {file = "regex-2025.9.18-cp312-cp312-win32.whl", hash = "sha256:e1dd06f981eb226edf87c55d523131ade7285137fbde837c34dc9d1bf309f459"}, - {file = "regex-2025.9.18-cp312-cp312-win_amd64.whl", hash = "sha256:3d86b5247bf25fa3715e385aa9ff272c307e0636ce0c9595f64568b41f0a9c77"}, - {file = "regex-2025.9.18-cp312-cp312-win_arm64.whl", hash = "sha256:032720248cbeeae6444c269b78cb15664458b7bb9ed02401d3da59fe4d68c3a5"}, - {file = "regex-2025.9.18.tar.gz", hash = "sha256:c5ba23274c61c6fef447ba6a39333297d0c247f53059dba0bca415cac511edc4"}, +version = "2026.2.28" +summary = "" +files = [ + {file = "regex-2026.2.28-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:fc48c500838be6882b32748f60a15229d2dea96e59ef341eaa96ec83538f498d"}, + {file = "regex-2026.2.28-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2afa673660928d0b63d84353c6c08a8a476ddfc4a47e11742949d182e6863ce8"}, + {file = "regex-2026.2.28-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7ab218076eb0944549e7fe74cf0e2b83a82edb27e81cc87411f76240865e04d5"}, + {file = "regex-2026.2.28-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:94d63db12e45a9b9f064bfe4800cefefc7e5f182052e4c1b774d46a40ab1d9bb"}, + {file = "regex-2026.2.28-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:195237dc327858a7721bf8b0bbbef797554bc13563c3591e91cd0767bacbe359"}, + {file = "regex-2026.2.28-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b387a0d092dac157fb026d737dde35ff3e49ef27f285343e7c6401851239df27"}, + {file = "regex-2026.2.28-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3935174fa4d9f70525a4367aaff3cb8bc0548129d114260c29d9dfa4a5b41692"}, + {file = "regex-2026.2.28-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2b2b23587b26496ff5fd40df4278becdf386813ec00dc3533fa43a4cf0e2ad3c"}, + {file = "regex-2026.2.28-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3b24bd7e9d85dc7c6a8bd2aa14ecd234274a0248335a02adeb25448aecdd420d"}, + {file = "regex-2026.2.28-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:bd477d5f79920338107f04aa645f094032d9e3030cc55be581df3d1ef61aa318"}, + {file = "regex-2026.2.28-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:b49eb78048c6354f49e91e4b77da21257fecb92256b6d599ae44403cab30b05b"}, + {file = "regex-2026.2.28-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:a25c7701e4f7a70021db9aaf4a4a0a67033c6318752146e03d1b94d32006217e"}, + {file = "regex-2026.2.28-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:9dd450db6458387167e033cfa80887a34c99c81d26da1bf8b0b41bf8c9cac88e"}, + {file = "regex-2026.2.28-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:2954379dd20752e82d22accf3ff465311cbb2bac6c1f92c4afd400e1757f7451"}, + {file = "regex-2026.2.28-cp310-cp310-win32.whl", hash = "sha256:1f8b17be5c27a684ea6759983c13506bd77bfc7c0347dff41b18ce5ddd2ee09a"}, + {file = "regex-2026.2.28-cp310-cp310-win_amd64.whl", hash = "sha256:dd8847c4978bc3c7e6c826fb745f5570e518b8459ac2892151ce6627c7bc00d5"}, + {file = "regex-2026.2.28-cp310-cp310-win_arm64.whl", hash = "sha256:73cdcdbba8028167ea81490c7f45280113e41db2c7afb65a276f4711fa3bcbff"}, + {file = "regex-2026.2.28-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e621fb7c8dc147419b28e1702f58a0177ff8308a76fa295c71f3e7827849f5d9"}, + {file = "regex-2026.2.28-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0d5bef2031cbf38757a0b0bc4298bb4824b6332d28edc16b39247228fbdbad97"}, + {file = "regex-2026.2.28-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bcb399ed84eabf4282587ba151f2732ad8168e66f1d3f85b1d038868fe547703"}, + {file = "regex-2026.2.28-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7c1b34dfa72f826f535b20712afa9bb3ba580020e834f3c69866c5bddbf10098"}, + {file = "regex-2026.2.28-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:851fa70df44325e1e4cdb79c5e676e91a78147b1b543db2aec8734d2add30ec2"}, + {file = "regex-2026.2.28-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:516604edd17b1c2c3e579cf4e9b25a53bf8fa6e7cedddf1127804d3e0140ca64"}, + {file = "regex-2026.2.28-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e7ce83654d1ab701cb619285a18a8e5a889c1216d746ddc710c914ca5fd71022"}, + {file = "regex-2026.2.28-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f2791948f7c70bb9335a9102df45e93d428f4b8128020d85920223925d73b9e1"}, + {file = "regex-2026.2.28-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:03a83cc26aa2acda6b8b9dfe748cf9e84cbd390c424a1de34fdcef58961a297a"}, + {file = "regex-2026.2.28-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:ec6f5674c5dc836994f50f1186dd1fafde4be0666aae201ae2fcc3d29d8adf27"}, + {file = "regex-2026.2.28-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:50c2fc924749543e0eacc93ada6aeeb3ea5f6715825624baa0dccaec771668ae"}, + {file = "regex-2026.2.28-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:ba55c50f408fb5c346a3a02d2ce0ebc839784e24f7c9684fde328ff063c3cdea"}, + {file = "regex-2026.2.28-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:edb1b1b3a5576c56f08ac46f108c40333f222ebfd5cf63afdfa3aab0791ebe5b"}, + {file = "regex-2026.2.28-cp311-cp311-win32.whl", hash = "sha256:948c12ef30ecedb128903c2c2678b339746eb7c689c5c21957c4a23950c96d15"}, + {file = "regex-2026.2.28-cp311-cp311-win_amd64.whl", hash = "sha256:fd63453f10d29097cc3dc62d070746523973fb5aa1c66d25f8558bebd47fed61"}, + {file = "regex-2026.2.28-cp311-cp311-win_arm64.whl", hash = "sha256:00f2b8d9615aa165fdff0a13f1a92049bfad555ee91e20d246a51aa0b556c60a"}, + {file = "regex-2026.2.28-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:fcf26c3c6d0da98fada8ae4ef0aa1c3405a431c0a77eb17306d38a89b02adcd7"}, + {file = "regex-2026.2.28-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:02473c954af35dd2defeb07e44182f5705b30ea3f351a7cbffa9177beb14da5d"}, + {file = "regex-2026.2.28-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9b65d33a17101569f86d9c5966a8b1d7fbf8afdda5a8aa219301b0a80f58cf7d"}, + {file = "regex-2026.2.28-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e71dcecaa113eebcc96622c17692672c2d104b1d71ddf7adeda90da7ddeb26fc"}, + {file = "regex-2026.2.28-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:481df4623fa4969c8b11f3433ed7d5e3dc9cec0f008356c3212b3933fb77e3d8"}, + {file = "regex-2026.2.28-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:64e7c6ad614573e0640f271e811a408d79a9e1fe62a46adb602f598df42a818d"}, + {file = "regex-2026.2.28-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d6b08a06976ff4fb0d83077022fde3eca06c55432bb997d8c0495b9a4e9872f4"}, + {file = "regex-2026.2.28-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:864cdd1a2ef5716b0ab468af40139e62ede1b3a53386b375ec0786bb6783fc05"}, + {file = "regex-2026.2.28-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:511f7419f7afab475fd4d639d4aedfc54205bcb0800066753ef68a59f0f330b5"}, + {file = "regex-2026.2.28-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:b42f7466e32bf15a961cf09f35fa6323cc72e64d3d2c990b10de1274a5da0a59"}, + {file = "regex-2026.2.28-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:8710d61737b0c0ce6836b1da7109f20d495e49b3809f30e27e9560be67a257bf"}, + {file = "regex-2026.2.28-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:4390c365fd2d45278f45afd4673cb90f7285f5701607e3ad4274df08e36140ae"}, + {file = "regex-2026.2.28-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:cb3b1db8ff6c7b8bf838ab05583ea15230cb2f678e569ab0e3a24d1e8320940b"}, + {file = "regex-2026.2.28-cp312-cp312-win32.whl", hash = "sha256:f8ed9a5d4612df9d4de15878f0bc6aa7a268afbe5af21a3fdd97fa19516e978c"}, + {file = "regex-2026.2.28-cp312-cp312-win_amd64.whl", hash = "sha256:01d65fd24206c8e1e97e2e31b286c59009636c022eb5d003f52760b0f42155d4"}, + {file = "regex-2026.2.28-cp312-cp312-win_arm64.whl", hash = "sha256:c0b5ccbb8ffb433939d248707d4a8b31993cb76ab1a0187ca886bf50e96df952"}, + {file = "regex-2026.2.28.tar.gz", hash = "sha256:a729e47d418ea11d03469f321aaf67cdee8954cde3ff2cf8403ab87951ad10f2"}, ] [[package]] name = "requests" -version = "2.32.4" +version = "2.32.5" summary = "" dependencies = [ "certifi", @@ -1464,47 +1542,46 @@ dependencies = [ "urllib3", ] files = [ - {file = "requests-2.32.4-py3-none-any.whl", hash = "sha256:27babd3cda2a6d50b30443204ee89830707d396671944c998b5975b031ac2b2c"}, - {file = "requests-2.32.4.tar.gz", hash = "sha256:27d0316682c8a29834d3264820024b62a36942083d52caf2f14c0591336d3422"}, + {file = "requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6"}, + {file = "requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf"}, ] [[package]] name = "rich" -version = "14.0.0" +version = "14.3.3" summary = "" dependencies = [ "markdown-it-py", "pygments", - "typing-extensions; python_full_version < \"3.11\"", ] files = [ - {file = "rich-14.0.0-py3-none-any.whl", hash = "sha256:1c9491e1951aac09caffd42f448ee3d04e58923ffe14993f6e83068dc395d7e0"}, - {file = "rich-14.0.0.tar.gz", hash = "sha256:82f1bc23a6a21ebca4ae0c45af9bdbc492ed20231dcb63f297d6d1021a9d5725"}, + {file = "rich-14.3.3-py3-none-any.whl", hash = "sha256:793431c1f8619afa7d3b52b2cdec859562b950ea0d4b6b505397612db8d5362d"}, + {file = "rich-14.3.3.tar.gz", hash = "sha256:b8daa0b9e4eef54dd8cf7c86c03713f53241884e814f4e2f5fb342fe520f639b"}, ] [[package]] name = "ruff" -version = "0.12.3" -summary = "" -files = [ - {file = "ruff-0.12.3-py3-none-linux_armv6l.whl", hash = "sha256:47552138f7206454eaf0c4fe827e546e9ddac62c2a3d2585ca54d29a890137a2"}, - {file = "ruff-0.12.3-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:0a9153b000c6fe169bb307f5bd1b691221c4286c133407b8827c406a55282041"}, - {file = "ruff-0.12.3-py3-none-macosx_11_0_arm64.whl", hash = "sha256:fa6b24600cf3b750e48ddb6057e901dd5b9aa426e316addb2a1af185a7509882"}, - {file = "ruff-0.12.3-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2506961bf6ead54887ba3562604d69cb430f59b42133d36976421bc8bd45901"}, - {file = "ruff-0.12.3-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c4faaff1f90cea9d3033cbbcdf1acf5d7fb11d8180758feb31337391691f3df0"}, - {file = "ruff-0.12.3-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40dced4a79d7c264389de1c59467d5d5cefd79e7e06d1dfa2c75497b5269a5a6"}, - {file = "ruff-0.12.3-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:0262d50ba2767ed0fe212aa7e62112a1dcbfd46b858c5bf7bbd11f326998bafc"}, - {file = "ruff-0.12.3-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:12371aec33e1a3758597c5c631bae9a5286f3c963bdfb4d17acdd2d395406687"}, - {file = "ruff-0.12.3-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:560f13b6baa49785665276c963edc363f8ad4b4fc910a883e2625bdb14a83a9e"}, - {file = "ruff-0.12.3-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:023040a3499f6f974ae9091bcdd0385dd9e9eb4942f231c23c57708147b06311"}, - {file = "ruff-0.12.3-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:883d844967bffff5ab28bba1a4d246c1a1b2933f48cb9840f3fdc5111c603b07"}, - {file = "ruff-0.12.3-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:2120d3aa855ff385e0e562fdee14d564c9675edbe41625c87eeab744a7830d12"}, - {file = "ruff-0.12.3-py3-none-musllinux_1_2_i686.whl", hash = "sha256:6b16647cbb470eaf4750d27dddc6ebf7758b918887b56d39e9c22cce2049082b"}, - {file = "ruff-0.12.3-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:e1417051edb436230023575b149e8ff843a324557fe0a265863b7602df86722f"}, - {file = "ruff-0.12.3-py3-none-win32.whl", hash = "sha256:dfd45e6e926deb6409d0616078a666ebce93e55e07f0fb0228d4b2608b2c248d"}, - {file = "ruff-0.12.3-py3-none-win_amd64.whl", hash = "sha256:a946cf1e7ba3209bdef039eb97647f1c77f6f540e5845ec9c114d3af8df873e7"}, - {file = "ruff-0.12.3-py3-none-win_arm64.whl", hash = "sha256:5f9c7c9c8f84c2d7f27e93674d27136fbf489720251544c4da7fb3d742e011b1"}, - {file = "ruff-0.12.3.tar.gz", hash = "sha256:f1b5a4b6668fd7b7ea3697d8d98857390b40c1320a63a178eee6be0899ea2d77"}, +version = "0.15.5" +summary = "" +files = [ + {file = "ruff-0.15.5-py3-none-linux_armv6l.whl", hash = "sha256:4ae44c42281f42e3b06b988e442d344a5b9b72450ff3c892e30d11b29a96a57c"}, + {file = "ruff-0.15.5-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:6edd3792d408ebcf61adabc01822da687579a1a023f297618ac27a5b51ef0080"}, + {file = "ruff-0.15.5-py3-none-macosx_11_0_arm64.whl", hash = "sha256:89f463f7c8205a9f8dea9d658d59eff49db05f88f89cc3047fb1a02d9f344010"}, + {file = "ruff-0.15.5-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba786a8295c6574c1116704cf0b9e6563de3432ac888d8f83685654fe528fd65"}, + {file = "ruff-0.15.5-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fd4b801e57955fe9f02b31d20375ab3a5c4415f2e5105b79fb94cf2642c91440"}, + {file = "ruff-0.15.5-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:391f7c73388f3d8c11b794dbbc2959a5b5afe66642c142a6effa90b45f6f5204"}, + {file = "ruff-0.15.5-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8dc18f30302e379fe1e998548b0f5e9f4dff907f52f73ad6da419ea9c19d66c8"}, + {file = "ruff-0.15.5-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1cc6e7f90087e2d27f98dc34ed1b3ab7c8f0d273cc5431415454e22c0bd2a681"}, + {file = "ruff-0.15.5-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c1cb7169f53c1ddb06e71a9aebd7e98fc0fea936b39afb36d8e86d36ecc2636a"}, + {file = "ruff-0.15.5-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:9b037924500a31ee17389b5c8c4d88874cc6ea8e42f12e9c61a3d754ff72f1ca"}, + {file = "ruff-0.15.5-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:65bb414e5b4eadd95a8c1e4804f6772bbe8995889f203a01f77ddf2d790929dd"}, + {file = "ruff-0.15.5-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:d20aa469ae3b57033519c559e9bc9cd9e782842e39be05b50e852c7c981fa01d"}, + {file = "ruff-0.15.5-py3-none-musllinux_1_2_i686.whl", hash = "sha256:15388dd28c9161cdb8eda68993533acc870aa4e646a0a277aa166de9ad5a8752"}, + {file = "ruff-0.15.5-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:b30da330cbd03bed0c21420b6b953158f60c74c54c5f4c1dabbdf3a57bf355d2"}, + {file = "ruff-0.15.5-py3-none-win32.whl", hash = "sha256:732e5ee1f98ba5b3679029989a06ca39a950cced52143a0ea82a2102cb592b74"}, + {file = "ruff-0.15.5-py3-none-win_amd64.whl", hash = "sha256:821d41c5fa9e19117616c35eaa3f4b75046ec76c65e7ae20a333e9a8696bc7fe"}, + {file = "ruff-0.15.5-py3-none-win_arm64.whl", hash = "sha256:b498d1c60d2fe5c10c45ec3f698901065772730b411f164ae270bb6bfcc4740b"}, + {file = "ruff-0.15.5.tar.gz", hash = "sha256:7c3601d3b6d76dce18c5c824fc8d06f4eef33d6df0c21ec7799510cde0f159a2"}, ] [[package]] @@ -1534,63 +1611,51 @@ files = [ {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, ] -[[package]] -name = "sniffio" -version = "1.3.1" -summary = "" -files = [ - {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, - {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, -] - [[package]] name = "sqlalchemy" -version = "2.0.41" +version = "2.0.48" summary = "" dependencies = [ "greenlet; platform_machine == \"AMD64\" or platform_machine == \"WIN32\" or platform_machine == \"aarch64\" or platform_machine == \"amd64\" or platform_machine == \"ppc64le\" or platform_machine == \"win32\" or platform_machine == \"x86_64\"", "typing-extensions", ] files = [ - {file = "sqlalchemy-2.0.41-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b1f09b6821406ea1f94053f346f28f8215e293344209129a9c0fcc3578598d7b"}, - {file = "sqlalchemy-2.0.41-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1936af879e3db023601196a1684d28e12f19ccf93af01bf3280a3262c4b6b4e5"}, - {file = "sqlalchemy-2.0.41-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2ac41acfc8d965fb0c464eb8f44995770239668956dc4cdf502d1b1ffe0d747"}, - {file = "sqlalchemy-2.0.41-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81c24e0c0fde47a9723c81d5806569cddef103aebbf79dbc9fcbb617153dea30"}, - {file = "sqlalchemy-2.0.41-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:23a8825495d8b195c4aa9ff1c430c28f2c821e8c5e2d98089228af887e5d7e29"}, - {file = "sqlalchemy-2.0.41-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:60c578c45c949f909a4026b7807044e7e564adf793537fc762b2489d522f3d11"}, - {file = "sqlalchemy-2.0.41-cp310-cp310-win32.whl", hash = "sha256:118c16cd3f1b00c76d69343e38602006c9cfb9998fa4f798606d28d63f23beda"}, - {file = "sqlalchemy-2.0.41-cp310-cp310-win_amd64.whl", hash = "sha256:7492967c3386df69f80cf67efd665c0f667cee67032090fe01d7d74b0e19bb08"}, - {file = "sqlalchemy-2.0.41-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6375cd674fe82d7aa9816d1cb96ec592bac1726c11e0cafbf40eeee9a4516b5f"}, - {file = "sqlalchemy-2.0.41-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9f8c9fdd15a55d9465e590a402f42082705d66b05afc3ffd2d2eb3c6ba919560"}, - {file = "sqlalchemy-2.0.41-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32f9dc8c44acdee06c8fc6440db9eae8b4af8b01e4b1aee7bdd7241c22edff4f"}, - {file = "sqlalchemy-2.0.41-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90c11ceb9a1f482c752a71f203a81858625d8df5746d787a4786bca4ffdf71c6"}, - {file = "sqlalchemy-2.0.41-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:911cc493ebd60de5f285bcae0491a60b4f2a9f0f5c270edd1c4dbaef7a38fc04"}, - {file = "sqlalchemy-2.0.41-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:03968a349db483936c249f4d9cd14ff2c296adfa1290b660ba6516f973139582"}, - {file = "sqlalchemy-2.0.41-cp311-cp311-win32.whl", hash = "sha256:293cd444d82b18da48c9f71cd7005844dbbd06ca19be1ccf6779154439eec0b8"}, - {file = "sqlalchemy-2.0.41-cp311-cp311-win_amd64.whl", hash = "sha256:3d3549fc3e40667ec7199033a4e40a2f669898a00a7b18a931d3efb4c7900504"}, - {file = "sqlalchemy-2.0.41-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:81f413674d85cfd0dfcd6512e10e0f33c19c21860342a4890c3a2b59479929f9"}, - {file = "sqlalchemy-2.0.41-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:598d9ebc1e796431bbd068e41e4de4dc34312b7aa3292571bb3674a0cb415dd1"}, - {file = "sqlalchemy-2.0.41-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a104c5694dfd2d864a6f91b0956eb5d5883234119cb40010115fd45a16da5e70"}, - {file = "sqlalchemy-2.0.41-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6145afea51ff0af7f2564a05fa95eb46f542919e6523729663a5d285ecb3cf5e"}, - {file = "sqlalchemy-2.0.41-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b46fa6eae1cd1c20e6e6f44e19984d438b6b2d8616d21d783d150df714f44078"}, - {file = "sqlalchemy-2.0.41-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41836fe661cc98abfae476e14ba1906220f92c4e528771a8a3ae6a151242d2ae"}, - {file = "sqlalchemy-2.0.41-cp312-cp312-win32.whl", hash = "sha256:a8808d5cf866c781150d36a3c8eb3adccfa41a8105d031bf27e92c251e3969d6"}, - {file = "sqlalchemy-2.0.41-cp312-cp312-win_amd64.whl", hash = "sha256:5b14e97886199c1f52c14629c11d90c11fbb09e9334fa7bb5f6d068d9ced0ce0"}, - {file = "sqlalchemy-2.0.41-py3-none-any.whl", hash = "sha256:57df5dc6fdb5ed1a88a1ed2195fd31927e705cad62dedd86b46972752a80f576"}, - {file = "sqlalchemy-2.0.41.tar.gz", hash = "sha256:edba70118c4be3c2b1f90754d308d0b79c6fe2c0fdc52d8ddf603916f83f4db9"}, + {file = "sqlalchemy-2.0.48-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7001dc9d5f6bb4deb756d5928eaefe1930f6f4179da3924cbd95ee0e9f4dce89"}, + {file = "sqlalchemy-2.0.48-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1a89ce07ad2d4b8cfc30bd5889ec40613e028ed80ef47da7d9dd2ce969ad30e0"}, + {file = "sqlalchemy-2.0.48-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:10853a53a4a00417a00913d270dddda75815fcb80675874285f41051c094d7dd"}, + {file = "sqlalchemy-2.0.48-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:fac0fa4e4f55f118fd87177dacb1c6522fe39c28d498d259014020fec9164c29"}, + {file = "sqlalchemy-2.0.48-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3713e21ea67bca727eecd4a24bf68bcd414c403faae4989442be60994301ded0"}, + {file = "sqlalchemy-2.0.48-cp310-cp310-win32.whl", hash = "sha256:d404dc897ce10e565d647795861762aa2d06ca3f4a728c5e9a835096c7059018"}, + {file = "sqlalchemy-2.0.48-cp310-cp310-win_amd64.whl", hash = "sha256:841a94c66577661c1f088ac958cd767d7c9bf507698f45afffe7a4017049de76"}, + {file = "sqlalchemy-2.0.48-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b4c575df7368b3b13e0cebf01d4679f9a28ed2ae6c1cd0b1d5beffb6b2007dc"}, + {file = "sqlalchemy-2.0.48-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e83e3f959aaa1c9df95c22c528096d94848a1bc819f5d0ebf7ee3df0ca63db6c"}, + {file = "sqlalchemy-2.0.48-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6f7b7243850edd0b8b97043f04748f31de50cf426e939def5c16bedb540698f7"}, + {file = "sqlalchemy-2.0.48-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:82745b03b4043e04600a6b665cb98697c4339b24e34d74b0a2ac0a2488b6f94d"}, + {file = "sqlalchemy-2.0.48-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e5e088bf43f6ee6fec7dbf1ef7ff7774a616c236b5c0cb3e00662dd71a56b571"}, + {file = "sqlalchemy-2.0.48-cp311-cp311-win32.whl", hash = "sha256:9c7d0a77e36b5f4b01ca398482230ab792061d243d715299b44a0b55c89fe617"}, + {file = "sqlalchemy-2.0.48-cp311-cp311-win_amd64.whl", hash = "sha256:583849c743e0e3c9bb7446f5b5addeacedc168d657a69b418063dfdb2d90081c"}, + {file = "sqlalchemy-2.0.48-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:348174f228b99f33ca1f773e85510e08927620caa59ffe7803b37170df30332b"}, + {file = "sqlalchemy-2.0.48-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:53667b5f668991e279d21f94ccfa6e45b4e3f4500e7591ae59a8012d0f010dcb"}, + {file = "sqlalchemy-2.0.48-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:34634e196f620c7a61d18d5cf7dc841ca6daa7961aed75d532b7e58b309ac894"}, + {file = "sqlalchemy-2.0.48-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:546572a1793cc35857a2ffa1fe0e58571af1779bcc1ffa7c9fb0839885ed69a9"}, + {file = "sqlalchemy-2.0.48-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:07edba08061bc277bfdc772dd2a1a43978f5a45994dd3ede26391b405c15221e"}, + {file = "sqlalchemy-2.0.48-cp312-cp312-win32.whl", hash = "sha256:908a3fa6908716f803b86896a09a2c4dde5f5ce2bb07aacc71ffebb57986ce99"}, + {file = "sqlalchemy-2.0.48-cp312-cp312-win_amd64.whl", hash = "sha256:68549c403f79a8e25984376480959975212a670405e3913830614432b5daa07a"}, + {file = "sqlalchemy-2.0.48-py3-none-any.whl", hash = "sha256:a66fe406437dd65cacd96a72689a3aaaecaebbcd62d81c5ac1c0fdbeac835096"}, + {file = "sqlalchemy-2.0.48.tar.gz", hash = "sha256:5ca74f37f3369b45e1f6b7b06afb182af1fd5dde009e4ffd831830d98cbe5fe7"}, ] [[package]] name = "sqlmodel" -version = "0.0.24" +version = "0.0.37" summary = "" dependencies = [ "pydantic", "sqlalchemy", ] files = [ - {file = "sqlmodel-0.0.24-py3-none-any.whl", hash = "sha256:6778852f09370908985b667d6a3ab92910d0d5ec88adcaf23dbc242715ff7193"}, - {file = "sqlmodel-0.0.24.tar.gz", hash = "sha256:cc5c7613c1a5533c9c7867e1aab2fd489a76c9e8a061984da11b4e613c182423"}, + {file = "sqlmodel-0.0.37-py3-none-any.whl", hash = "sha256:2137a4045ef3fd66a917a7717ada959a1ceb3630d95e1f6aaab39dd2c0aef278"}, + {file = "sqlmodel-0.0.37.tar.gz", hash = "sha256:d2c19327175794faf50b1ee31cc966764f55b1dedefc046450bc5741a3d68352"}, ] [[package]] @@ -1609,14 +1674,15 @@ files = [ [[package]] name = "starlette" -version = "0.46.2" +version = "0.52.1" summary = "" dependencies = [ "anyio", + "typing-extensions", ] files = [ - {file = "starlette-0.46.2-py3-none-any.whl", hash = "sha256:595633ce89f8ffa71a015caed34a5b2dc1c0cdb3f0f1fbd1e69339cf2abeec35"}, - {file = "starlette-0.46.2.tar.gz", hash = "sha256:7f7361f34eed179294600af672f565727419830b54b7b084efe44bb82d2fccd5"}, + {file = "starlette-0.52.1-py3-none-any.whl", hash = "sha256:0029d43eb3d273bc4f83a08720b4912ea4b071087a3b48db01b7c839f7954d74"}, + {file = "starlette-0.52.1.tar.gz", hash = "sha256:834edd1b0a23167694292e94f597773bc3f89f362be6effee198165a35d62933"}, ] [[package]] @@ -1633,65 +1699,65 @@ files = [ [[package]] name = "textual" -version = "3.4.0" +version = "8.0.2" summary = "" dependencies = [ - "markdown-it-py[linkify,plugins]", + "markdown-it-py[linkify]", + "mdit-py-plugins", "platformdirs", + "pygments", "rich", "typing-extensions", ] files = [ - {file = "textual-3.4.0-py3-none-any.whl", hash = "sha256:5b3fd07772d3897d30b257825de3df011b83742863aa9d9abcb10e76e61e6ee4"}, - {file = "textual-3.4.0.tar.gz", hash = "sha256:f697c3b9371bbc30c11453a094d700e95cf7c2115f68bad35f0249de67996c99"}, + {file = "textual-8.0.2-py3-none-any.whl", hash = "sha256:4ceadbe0e8a30eb80f9995000f4d031f711420a31b02da38f3482957b7c50ce4"}, + {file = "textual-8.0.2.tar.gz", hash = "sha256:7b342f3ee9a5f2f1bd42d7b598cae00ff1275da68536769510db4b7fe8cabf5d"}, ] [[package]] name = "tomli" -version = "2.2.1" -summary = "" -files = [ - {file = "tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249"}, - {file = "tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6"}, - {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a"}, - {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee"}, - {file = "tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e"}, - {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4"}, - {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106"}, - {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8"}, - {file = "tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff"}, - {file = "tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b"}, - {file = "tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea"}, - {file = "tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8"}, - {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192"}, - {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222"}, - {file = "tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77"}, - {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6"}, - {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd"}, - {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e"}, - {file = "tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98"}, - {file = "tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4"}, - {file = "tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc"}, - {file = "tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff"}, +version = "2.4.0" +summary = "" +files = [ + {file = "tomli-2.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b5ef256a3fd497d4973c11bf142e9ed78b150d36f5773f1ca6088c230ffc5867"}, + {file = "tomli-2.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5572e41282d5268eb09a697c89a7bee84fae66511f87533a6f88bd2f7b652da9"}, + {file = "tomli-2.4.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:551e321c6ba03b55676970b47cb1b73f14a0a4dce6a3e1a9458fd6d921d72e95"}, + {file = "tomli-2.4.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5e3f639a7a8f10069d0e15408c0b96a2a828cfdec6fca05296ebcdcc28ca7c76"}, + {file = "tomli-2.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1b168f2731796b045128c45982d3a4874057626da0e2ef1fdd722848b741361d"}, + {file = "tomli-2.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:133e93646ec4300d651839d382d63edff11d8978be23da4cc106f5a18b7d0576"}, + {file = "tomli-2.4.0-cp311-cp311-win32.whl", hash = "sha256:b6c78bdf37764092d369722d9946cb65b8767bfa4110f902a1b2542d8d173c8a"}, + {file = "tomli-2.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:d3d1654e11d724760cdb37a3d7691f0be9db5fbdaef59c9f532aabf87006dbaa"}, + {file = "tomli-2.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:cae9c19ed12d4e8f3ebf46d1a75090e4c0dc16271c5bce1c833ac168f08fb614"}, + {file = "tomli-2.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:920b1de295e72887bafa3ad9f7a792f811847d57ea6b1215154030cf131f16b1"}, + {file = "tomli-2.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7d6d9a4aee98fac3eab4952ad1d73aee87359452d1c086b5ceb43ed02ddb16b8"}, + {file = "tomli-2.4.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:36b9d05b51e65b254ea6c2585b59d2c4cb91c8a3d91d0ed0f17591a29aaea54a"}, + {file = "tomli-2.4.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1c8a885b370751837c029ef9bc014f27d80840e48bac415f3412e6593bbc18c1"}, + {file = "tomli-2.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8768715ffc41f0008abe25d808c20c3d990f42b6e2e58305d5da280ae7d1fa3b"}, + {file = "tomli-2.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7b438885858efd5be02a9a133caf5812b8776ee0c969fea02c45e8e3f296ba51"}, + {file = "tomli-2.4.0-cp312-cp312-win32.whl", hash = "sha256:0408e3de5ec77cc7f81960c362543cbbd91ef883e3138e81b729fc3eea5b9729"}, + {file = "tomli-2.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:685306e2cc7da35be4ee914fd34ab801a6acacb061b6a7abca922aaf9ad368da"}, + {file = "tomli-2.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:5aa48d7c2356055feef06a43611fc401a07337d5b006be13a30f6c58f869e3c3"}, + {file = "tomli-2.4.0-py3-none-any.whl", hash = "sha256:1f776e7d669ebceb01dee46484485f43a4048746235e683bcdffacdf1fb4785a"}, + {file = "tomli-2.4.0.tar.gz", hash = "sha256:aa89c3f6c277dd275d8e243ad24f3b5e701491a860d5121f2cdd399fbb31fc9c"}, ] [[package]] name = "tornado" -version = "6.5.1" +version = "6.5.4" summary = "" files = [ - {file = "tornado-6.5.1-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:d50065ba7fd11d3bd41bcad0825227cc9a95154bad83239357094c36708001f7"}, - {file = "tornado-6.5.1-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:9e9ca370f717997cb85606d074b0e5b247282cf5e2e1611568b8821afe0342d6"}, - {file = "tornado-6.5.1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b77e9dfa7ed69754a54c89d82ef746398be82f749df69c4d3abe75c4d1ff4888"}, - {file = "tornado-6.5.1-cp39-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:253b76040ee3bab8bcf7ba9feb136436a3787208717a1fb9f2c16b744fba7331"}, - {file = "tornado-6.5.1-cp39-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:308473f4cc5a76227157cdf904de33ac268af770b2c5f05ca6c1161d82fdd95e"}, - {file = "tornado-6.5.1-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:caec6314ce8a81cf69bd89909f4b633b9f523834dc1a352021775d45e51d9401"}, - {file = "tornado-6.5.1-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:13ce6e3396c24e2808774741331638ee6c2f50b114b97a55c5b442df65fd9692"}, - {file = "tornado-6.5.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:5cae6145f4cdf5ab24744526cc0f55a17d76f02c98f4cff9daa08ae9a217448a"}, - {file = "tornado-6.5.1-cp39-abi3-win32.whl", hash = "sha256:e0a36e1bc684dca10b1aa75a31df8bdfed656831489bc1e6a6ebed05dc1ec365"}, - {file = "tornado-6.5.1-cp39-abi3-win_amd64.whl", hash = "sha256:908e7d64567cecd4c2b458075589a775063453aeb1d2a1853eedb806922f568b"}, - {file = "tornado-6.5.1-cp39-abi3-win_arm64.whl", hash = "sha256:02420a0eb7bf617257b9935e2b754d1b63897525d8a289c9d65690d580b4dcf7"}, - {file = "tornado-6.5.1.tar.gz", hash = "sha256:84ceece391e8eb9b2b95578db65e920d2a61070260594819589609ba9bc6308c"}, + {file = "tornado-6.5.4-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:d6241c1a16b1c9e4cc28148b1cda97dd1c6cb4fb7068ac1bedc610768dff0ba9"}, + {file = "tornado-6.5.4-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:2d50f63dda1d2cac3ae1fa23d254e16b5e38153758470e9956cbc3d813d40843"}, + {file = "tornado-6.5.4-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1cf66105dc6acb5af613c054955b8137e34a03698aa53272dbda4afe252be17"}, + {file = "tornado-6.5.4-cp39-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:50ff0a58b0dc97939d29da29cd624da010e7f804746621c78d14b80238669335"}, + {file = "tornado-6.5.4-cp39-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e5fb5e04efa54cf0baabdd10061eb4148e0be137166146fff835745f59ab9f7f"}, + {file = "tornado-6.5.4-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9c86b1643b33a4cd415f8d0fe53045f913bf07b4a3ef646b735a6a86047dda84"}, + {file = "tornado-6.5.4-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:6eb82872335a53dd063a4f10917b3efd28270b56a33db69009606a0312660a6f"}, + {file = "tornado-6.5.4-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:6076d5dda368c9328ff41ab5d9dd3608e695e8225d1cd0fd1e006f05da3635a8"}, + {file = "tornado-6.5.4-cp39-abi3-win32.whl", hash = "sha256:1768110f2411d5cd281bac0a090f707223ce77fd110424361092859e089b38d1"}, + {file = "tornado-6.5.4-cp39-abi3-win_amd64.whl", hash = "sha256:fa07d31e0cd85c60713f2b995da613588aa03e1303d75705dca6af8babc18ddc"}, + {file = "tornado-6.5.4-cp39-abi3-win_arm64.whl", hash = "sha256:053e6e16701eb6cbe641f308f4c1a9541f91b6261991160391bfc342e8a551a1"}, + {file = "tornado-6.5.4.tar.gz", hash = "sha256:a22fa9047405d03260b483980635f0b041989d8bcc9a313f8fe18b411d84b1d7"}, ] [[package]] @@ -1718,46 +1784,46 @@ files = [ [[package]] name = "typing-extensions" -version = "4.14.0" +version = "4.15.0" summary = "" files = [ - {file = "typing_extensions-4.14.0-py3-none-any.whl", hash = "sha256:a1514509136dd0b477638fc68d6a91497af5076466ad0fa6c338e44e359944af"}, - {file = "typing_extensions-4.14.0.tar.gz", hash = "sha256:8676b788e32f02ab42d9e7c61324048ae4c6d844a399eebace3d4979d75ceef4"}, + {file = "typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548"}, + {file = "typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466"}, ] [[package]] name = "typing-inspection" -version = "0.4.1" +version = "0.4.2" summary = "" dependencies = [ "typing-extensions", ] files = [ - {file = "typing_inspection-0.4.1-py3-none-any.whl", hash = "sha256:389055682238f53b04f7badcb49b989835495a96700ced5dab2d8feae4b26f51"}, - {file = "typing_inspection-0.4.1.tar.gz", hash = "sha256:6ae134cc0203c33377d43188d4064e9b357dba58cff3185f22924610e70a9d28"}, + {file = "typing_inspection-0.4.2-py3-none-any.whl", hash = "sha256:4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7"}, + {file = "typing_inspection-0.4.2.tar.gz", hash = "sha256:ba561c48a67c5958007083d386c3295464928b01faa735ab8547c5692e87f464"}, ] [[package]] name = "uc-micro-py" -version = "1.0.3" +version = "2.0.0" summary = "" files = [ - {file = "uc-micro-py-1.0.3.tar.gz", hash = "sha256:d321b92cff673ec58027c04015fcaa8bb1e005478643ff4a500882eaab88c48a"}, - {file = "uc_micro_py-1.0.3-py3-none-any.whl", hash = "sha256:db1dffff340817673d7b466ec86114a9dc0e9d4d9b5ba229d9d60e5c12600cd5"}, + {file = "uc_micro_py-2.0.0-py3-none-any.whl", hash = "sha256:3603a3859af53e5a39bc7677713c78ea6589ff188d70f4fee165db88e22b242c"}, + {file = "uc_micro_py-2.0.0.tar.gz", hash = "sha256:c53691e495c8db60e16ffc4861a35469b0ba0821fe409a8a7a0a71864d33a811"}, ] [[package]] name = "urllib3" -version = "2.5.0" +version = "2.6.3" summary = "" files = [ - {file = "urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc"}, - {file = "urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760"}, + {file = "urllib3-2.6.3-py3-none-any.whl", hash = "sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4"}, + {file = "urllib3-2.6.3.tar.gz", hash = "sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed"}, ] [[package]] name = "uvicorn" -version = "0.34.3" +version = "0.41.0" summary = "" dependencies = [ "click", @@ -1765,13 +1831,13 @@ dependencies = [ "typing-extensions; python_full_version < \"3.11\"", ] files = [ - {file = "uvicorn-0.34.3-py3-none-any.whl", hash = "sha256:16246631db62bdfbf069b0645177d6e8a77ba950cfedbfd093acef9444e4d885"}, - {file = "uvicorn-0.34.3.tar.gz", hash = "sha256:35919a9a979d7a59334b6b10e05d77c1d0d574c50e0fc98b8b1a0f165708b55a"}, + {file = "uvicorn-0.41.0-py3-none-any.whl", hash = "sha256:29e35b1d2c36a04b9e180d4007ede3bcb32a85fbdfd6c6aeb3f26839de088187"}, + {file = "uvicorn-0.41.0.tar.gz", hash = "sha256:09d11cf7008da33113824ee5a1c6422d89fbc2ff476540d69a34c87fab8b571a"}, ] [[package]] name = "uvicorn" -version = "0.34.3" +version = "0.41.0" extras = ["standard"] summary = "" dependencies = [ @@ -1779,169 +1845,163 @@ dependencies = [ "httptools", "python-dotenv", "pyyaml", - "uvicorn==0.34.3", + "uvicorn==0.41.0", "uvloop; platform_python_implementation != \"PyPy\" and (sys_platform != \"cygwin\" and sys_platform != \"win32\")", "watchfiles", "websockets", ] files = [ - {file = "uvicorn-0.34.3-py3-none-any.whl", hash = "sha256:16246631db62bdfbf069b0645177d6e8a77ba950cfedbfd093acef9444e4d885"}, - {file = "uvicorn-0.34.3.tar.gz", hash = "sha256:35919a9a979d7a59334b6b10e05d77c1d0d574c50e0fc98b8b1a0f165708b55a"}, + {file = "uvicorn-0.41.0-py3-none-any.whl", hash = "sha256:29e35b1d2c36a04b9e180d4007ede3bcb32a85fbdfd6c6aeb3f26839de088187"}, + {file = "uvicorn-0.41.0.tar.gz", hash = "sha256:09d11cf7008da33113824ee5a1c6422d89fbc2ff476540d69a34c87fab8b571a"}, ] [[package]] name = "uvloop" -version = "0.21.0" -summary = "" -files = [ - {file = "uvloop-0.21.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ec7e6b09a6fdded42403182ab6b832b71f4edaf7f37a9a0e371a01db5f0cb45f"}, - {file = "uvloop-0.21.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:196274f2adb9689a289ad7d65700d37df0c0930fd8e4e743fa4834e850d7719d"}, - {file = "uvloop-0.21.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f38b2e090258d051d68a5b14d1da7203a3c3677321cf32a95a6f4db4dd8b6f26"}, - {file = "uvloop-0.21.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87c43e0f13022b998eb9b973b5e97200c8b90823454d4bc06ab33829e09fb9bb"}, - {file = "uvloop-0.21.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:10d66943def5fcb6e7b37310eb6b5639fd2ccbc38df1177262b0640c3ca68c1f"}, - {file = "uvloop-0.21.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:67dd654b8ca23aed0a8e99010b4c34aca62f4b7fce88f39d452ed7622c94845c"}, - {file = "uvloop-0.21.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c0f3fa6200b3108919f8bdabb9a7f87f20e7097ea3c543754cabc7d717d95cf8"}, - {file = "uvloop-0.21.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0878c2640cf341b269b7e128b1a5fed890adc4455513ca710d77d5e93aa6d6a0"}, - {file = "uvloop-0.21.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9fb766bb57b7388745d8bcc53a359b116b8a04c83a2288069809d2b3466c37e"}, - {file = "uvloop-0.21.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a375441696e2eda1c43c44ccb66e04d61ceeffcd76e4929e527b7fa401b90fb"}, - {file = "uvloop-0.21.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:baa0e6291d91649c6ba4ed4b2f982f9fa165b5bbd50a9e203c416a2797bab3c6"}, - {file = "uvloop-0.21.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4509360fcc4c3bd2c70d87573ad472de40c13387f5fda8cb58350a1d7475e58d"}, - {file = "uvloop-0.21.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:359ec2c888397b9e592a889c4d72ba3d6befba8b2bb01743f72fffbde663b59c"}, - {file = "uvloop-0.21.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f7089d2dc73179ce5ac255bdf37c236a9f914b264825fdaacaded6990a7fb4c2"}, - {file = "uvloop-0.21.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:baa4dcdbd9ae0a372f2167a207cd98c9f9a1ea1188a8a526431eef2f8116cc8d"}, - {file = "uvloop-0.21.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86975dca1c773a2c9864f4c52c5a55631038e387b47eaf56210f873887b6c8dc"}, - {file = "uvloop-0.21.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:461d9ae6660fbbafedd07559c6a2e57cd553b34b0065b6550685f6653a98c1cb"}, - {file = "uvloop-0.21.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:183aef7c8730e54c9a3ee3227464daed66e37ba13040bb3f350bc2ddc040f22f"}, - {file = "uvloop-0.21.0.tar.gz", hash = "sha256:3bf12b0fda68447806a7ad847bfa591613177275d35b6724b1ee573faa3704e3"}, +version = "0.22.1" +summary = "" +files = [ + {file = "uvloop-0.22.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ef6f0d4cc8a9fa1f6a910230cd53545d9a14479311e87e3cb225495952eb672c"}, + {file = "uvloop-0.22.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7cd375a12b71d33d46af85a3343b35d98e8116134ba404bd657b3b1d15988792"}, + {file = "uvloop-0.22.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ac33ed96229b7790eb729702751c0e93ac5bc3bcf52ae9eccbff30da09194b86"}, + {file = "uvloop-0.22.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:481c990a7abe2c6f4fc3d98781cc9426ebd7f03a9aaa7eb03d3bfc68ac2a46bd"}, + {file = "uvloop-0.22.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a592b043a47ad17911add5fbd087c76716d7c9ccc1d64ec9249ceafd735f03c2"}, + {file = "uvloop-0.22.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:1489cf791aa7b6e8c8be1c5a080bae3a672791fcb4e9e12249b05862a2ca9cec"}, + {file = "uvloop-0.22.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c60ebcd36f7b240b30788554b6f0782454826a0ed765d8430652621b5de674b9"}, + {file = "uvloop-0.22.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3b7f102bf3cb1995cfeaee9321105e8f5da76fdb104cdad8986f85461a1b7b77"}, + {file = "uvloop-0.22.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:53c85520781d84a4b8b230e24a5af5b0778efdb39142b424990ff1ef7c48ba21"}, + {file = "uvloop-0.22.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:56a2d1fae65fd82197cb8c53c367310b3eabe1bbb9fb5a04d28e3e3520e4f702"}, + {file = "uvloop-0.22.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:40631b049d5972c6755b06d0bfe8233b1bd9a8a6392d9d1c45c10b6f9e9b2733"}, + {file = "uvloop-0.22.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:535cc37b3a04f6cd2c1ef65fa1d370c9a35b6695df735fcff5427323f2cd5473"}, + {file = "uvloop-0.22.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:fe94b4564e865d968414598eea1a6de60adba0c040ba4ed05ac1300de402cd42"}, + {file = "uvloop-0.22.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:51eb9bd88391483410daad430813d982010f9c9c89512321f5b60e2cddbdddd6"}, + {file = "uvloop-0.22.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:700e674a166ca5778255e0e1dc4e9d79ab2acc57b9171b79e65feba7184b3370"}, + {file = "uvloop-0.22.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7b5b1ac819a3f946d3b2ee07f09149578ae76066d70b44df3fa990add49a82e4"}, + {file = "uvloop-0.22.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e047cc068570bac9866237739607d1313b9253c3051ad84738cbb095be0537b2"}, + {file = "uvloop-0.22.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:512fec6815e2dd45161054592441ef76c830eddaad55c8aa30952e6fe1ed07c0"}, + {file = "uvloop-0.22.1.tar.gz", hash = "sha256:6c84bae345b9147082b17371e3dd5d42775bddce91f885499017f4607fdaf39f"}, ] [[package]] name = "virtualenv" -version = "20.35.4" +version = "21.2.0" summary = "" dependencies = [ "distlib", "filelock", "platformdirs", + "python-discovery", "typing-extensions; python_full_version < \"3.11\"", ] files = [ - {file = "virtualenv-20.35.4-py3-none-any.whl", hash = "sha256:c21c9cede36c9753eeade68ba7d523529f228a403463376cf821eaae2b650f1b"}, - {file = "virtualenv-20.35.4.tar.gz", hash = "sha256:643d3914d73d3eeb0c552cbb12d7e82adf0e504dbf86a3182f8771a153a1971c"}, + {file = "virtualenv-21.2.0-py3-none-any.whl", hash = "sha256:1bd755b504931164a5a496d217c014d098426cddc79363ad66ac78125f9d908f"}, + {file = "virtualenv-21.2.0.tar.gz", hash = "sha256:1720dc3a62ef5b443092e3f499228599045d7fea4c79199770499df8becf9098"}, ] [[package]] name = "watchfiles" -version = "1.1.0" +version = "1.1.1" summary = "" dependencies = [ "anyio", ] files = [ - {file = "watchfiles-1.1.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:27f30e14aa1c1e91cb653f03a63445739919aef84c8d2517997a83155e7a2fcc"}, - {file = "watchfiles-1.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3366f56c272232860ab45c77c3ca7b74ee819c8e1f6f35a7125556b198bbc6df"}, - {file = "watchfiles-1.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8412eacef34cae2836d891836a7fff7b754d6bcac61f6c12ba5ca9bc7e427b68"}, - {file = "watchfiles-1.1.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:df670918eb7dd719642e05979fc84704af913d563fd17ed636f7c4783003fdcc"}, - {file = "watchfiles-1.1.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d7642b9bc4827b5518ebdb3b82698ada8c14c7661ddec5fe719f3e56ccd13c97"}, - {file = "watchfiles-1.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:199207b2d3eeaeb80ef4411875a6243d9ad8bc35b07fc42daa6b801cc39cc41c"}, - {file = "watchfiles-1.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a479466da6db5c1e8754caee6c262cd373e6e6c363172d74394f4bff3d84d7b5"}, - {file = "watchfiles-1.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:935f9edd022ec13e447e5723a7d14456c8af254544cefbc533f6dd276c9aa0d9"}, - {file = "watchfiles-1.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:8076a5769d6bdf5f673a19d51da05fc79e2bbf25e9fe755c47595785c06a8c72"}, - {file = "watchfiles-1.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:86b1e28d4c37e89220e924305cd9f82866bb0ace666943a6e4196c5df4d58dcc"}, - {file = "watchfiles-1.1.0-cp310-cp310-win32.whl", hash = "sha256:d1caf40c1c657b27858f9774d5c0e232089bca9cb8ee17ce7478c6e9264d2587"}, - {file = "watchfiles-1.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:a89c75a5b9bc329131115a409d0acc16e8da8dfd5867ba59f1dd66ae7ea8fa82"}, - {file = "watchfiles-1.1.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:c9649dfc57cc1f9835551deb17689e8d44666315f2e82d337b9f07bd76ae3aa2"}, - {file = "watchfiles-1.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:406520216186b99374cdb58bc48e34bb74535adec160c8459894884c983a149c"}, - {file = "watchfiles-1.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb45350fd1dc75cd68d3d72c47f5b513cb0578da716df5fba02fff31c69d5f2d"}, - {file = "watchfiles-1.1.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:11ee4444250fcbeb47459a877e5e80ed994ce8e8d20283857fc128be1715dac7"}, - {file = "watchfiles-1.1.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bda8136e6a80bdea23e5e74e09df0362744d24ffb8cd59c4a95a6ce3d142f79c"}, - {file = "watchfiles-1.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b915daeb2d8c1f5cee4b970f2e2c988ce6514aace3c9296e58dd64dc9aa5d575"}, - {file = "watchfiles-1.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ed8fc66786de8d0376f9f913c09e963c66e90ced9aa11997f93bdb30f7c872a8"}, - {file = "watchfiles-1.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe4371595edf78c41ef8ac8df20df3943e13defd0efcb732b2e393b5a8a7a71f"}, - {file = "watchfiles-1.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b7c5f6fe273291f4d414d55b2c80d33c457b8a42677ad14b4b47ff025d0893e4"}, - {file = "watchfiles-1.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7738027989881e70e3723c75921f1efa45225084228788fc59ea8c6d732eb30d"}, - {file = "watchfiles-1.1.0-cp311-cp311-win32.whl", hash = "sha256:622d6b2c06be19f6e89b1d951485a232e3b59618def88dbeda575ed8f0d8dbf2"}, - {file = "watchfiles-1.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:48aa25e5992b61debc908a61ab4d3f216b64f44fdaa71eb082d8b2de846b7d12"}, - {file = "watchfiles-1.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:00645eb79a3faa70d9cb15c8d4187bb72970b2470e938670240c7998dad9f13a"}, - {file = "watchfiles-1.1.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9dc001c3e10de4725c749d4c2f2bdc6ae24de5a88a339c4bce32300a31ede179"}, - {file = "watchfiles-1.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d9ba68ec283153dead62cbe81872d28e053745f12335d037de9cbd14bd1877f5"}, - {file = "watchfiles-1.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:130fc497b8ee68dce163e4254d9b0356411d1490e868bd8790028bc46c5cc297"}, - {file = "watchfiles-1.1.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:50a51a90610d0845a5931a780d8e51d7bd7f309ebc25132ba975aca016b576a0"}, - {file = "watchfiles-1.1.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc44678a72ac0910bac46fa6a0de6af9ba1355669b3dfaf1ce5f05ca7a74364e"}, - {file = "watchfiles-1.1.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a543492513a93b001975ae283a51f4b67973662a375a403ae82f420d2c7205ee"}, - {file = "watchfiles-1.1.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ac164e20d17cc285f2b94dc31c384bc3aa3dd5e7490473b3db043dd70fbccfd"}, - {file = "watchfiles-1.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f7590d5a455321e53857892ab8879dce62d1f4b04748769f5adf2e707afb9d4f"}, - {file = "watchfiles-1.1.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:37d3d3f7defb13f62ece99e9be912afe9dd8a0077b7c45ee5a57c74811d581a4"}, - {file = "watchfiles-1.1.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:7080c4bb3efd70a07b1cc2df99a7aa51d98685be56be6038c3169199d0a1c69f"}, - {file = "watchfiles-1.1.0-cp312-cp312-win32.whl", hash = "sha256:cbcf8630ef4afb05dc30107bfa17f16c0896bb30ee48fc24bf64c1f970f3b1fd"}, - {file = "watchfiles-1.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:cbd949bdd87567b0ad183d7676feb98136cde5bb9025403794a4c0db28ed3a47"}, - {file = "watchfiles-1.1.0-cp312-cp312-win_arm64.whl", hash = "sha256:0a7d40b77f07be87c6faa93d0951a0fcd8cbca1ddff60a1b65d741bac6f3a9f6"}, - {file = "watchfiles-1.1.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3a6fd40bbb50d24976eb275ccb55cd1951dfb63dbc27cae3066a6ca5f4beabd5"}, - {file = "watchfiles-1.1.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:9f811079d2f9795b5d48b55a37aa7773680a5659afe34b54cc1d86590a51507d"}, - {file = "watchfiles-1.1.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a2726d7bfd9f76158c84c10a409b77a320426540df8c35be172444394b17f7ea"}, - {file = "watchfiles-1.1.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df32d59cb9780f66d165a9a7a26f19df2c7d24e3bd58713108b41d0ff4f929c6"}, - {file = "watchfiles-1.1.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:0ece16b563b17ab26eaa2d52230c9a7ae46cf01759621f4fbbca280e438267b3"}, - {file = "watchfiles-1.1.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:51b81e55d40c4b4aa8658427a3ee7ea847c591ae9e8b81ef94a90b668999353c"}, - {file = "watchfiles-1.1.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2bcdc54ea267fe72bfc7d83c041e4eb58d7d8dc6f578dfddb52f037ce62f432"}, - {file = "watchfiles-1.1.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:923fec6e5461c42bd7e3fd5ec37492c6f3468be0499bc0707b4bbbc16ac21792"}, - {file = "watchfiles-1.1.0.tar.gz", hash = "sha256:693ed7ec72cbfcee399e92c895362b6e66d63dac6b91e2c11ae03d10d503e575"}, + {file = "watchfiles-1.1.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:eef58232d32daf2ac67f42dea51a2c80f0d03379075d44a587051e63cc2e368c"}, + {file = "watchfiles-1.1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:03fa0f5237118a0c5e496185cafa92878568b652a2e9a9382a5151b1a0380a43"}, + {file = "watchfiles-1.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8ca65483439f9c791897f7db49202301deb6e15fe9f8fe2fed555bf986d10c31"}, + {file = "watchfiles-1.1.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f0ab1c1af0cb38e3f598244c17919fb1a84d1629cc08355b0074b6d7f53138ac"}, + {file = "watchfiles-1.1.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3bc570d6c01c206c46deb6e935a260be44f186a2f05179f52f7fcd2be086a94d"}, + {file = "watchfiles-1.1.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e84087b432b6ac94778de547e08611266f1f8ffad28c0ee4c82e028b0fc5966d"}, + {file = "watchfiles-1.1.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:620bae625f4cb18427b1bb1a2d9426dc0dd5a5ba74c7c2cdb9de405f7b129863"}, + {file = "watchfiles-1.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:544364b2b51a9b0c7000a4b4b02f90e9423d97fbbf7e06689236443ebcad81ab"}, + {file = "watchfiles-1.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:bbe1ef33d45bc71cf21364df962af171f96ecaeca06bd9e3d0b583efb12aec82"}, + {file = "watchfiles-1.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1a0bb430adb19ef49389e1ad368450193a90038b5b752f4ac089ec6942c4dff4"}, + {file = "watchfiles-1.1.1-cp310-cp310-win32.whl", hash = "sha256:3f6d37644155fb5beca5378feb8c1708d5783145f2a0f1c4d5a061a210254844"}, + {file = "watchfiles-1.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:a36d8efe0f290835fd0f33da35042a1bb5dc0e83cbc092dcf69bce442579e88e"}, + {file = "watchfiles-1.1.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:f57b396167a2565a4e8b5e56a5a1c537571733992b226f4f1197d79e94cf0ae5"}, + {file = "watchfiles-1.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:421e29339983e1bebc281fab40d812742268ad057db4aee8c4d2bce0af43b741"}, + {file = "watchfiles-1.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6e43d39a741e972bab5d8100b5cdacf69db64e34eb19b6e9af162bccf63c5cc6"}, + {file = "watchfiles-1.1.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f537afb3276d12814082a2e9b242bdcf416c2e8fd9f799a737990a1dbe906e5b"}, + {file = "watchfiles-1.1.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b2cd9e04277e756a2e2d2543d65d1e2166d6fd4c9b183f8808634fda23f17b14"}, + {file = "watchfiles-1.1.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5f3f58818dc0b07f7d9aa7fe9eb1037aecb9700e63e1f6acfed13e9fef648f5d"}, + {file = "watchfiles-1.1.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9bb9f66367023ae783551042d31b1d7fd422e8289eedd91f26754a66f44d5cff"}, + {file = "watchfiles-1.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aebfd0861a83e6c3d1110b78ad54704486555246e542be3e2bb94195eabb2606"}, + {file = "watchfiles-1.1.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:5fac835b4ab3c6487b5dbad78c4b3724e26bcc468e886f8ba8cc4306f68f6701"}, + {file = "watchfiles-1.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:399600947b170270e80134ac854e21b3ccdefa11a9529a3decc1327088180f10"}, + {file = "watchfiles-1.1.1-cp311-cp311-win32.whl", hash = "sha256:de6da501c883f58ad50db3a32ad397b09ad29865b5f26f64c24d3e3281685849"}, + {file = "watchfiles-1.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:35c53bd62a0b885bf653ebf6b700d1bf05debb78ad9292cf2a942b23513dc4c4"}, + {file = "watchfiles-1.1.1-cp311-cp311-win_arm64.whl", hash = "sha256:57ca5281a8b5e27593cb7d82c2ac927ad88a96ed406aa446f6344e4328208e9e"}, + {file = "watchfiles-1.1.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:8c89f9f2f740a6b7dcc753140dd5e1ab9215966f7a3530d0c0705c83b401bd7d"}, + {file = "watchfiles-1.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bd404be08018c37350f0d6e34676bd1e2889990117a2b90070b3007f172d0610"}, + {file = "watchfiles-1.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8526e8f916bb5b9a0a777c8317c23ce65de259422bba5b31325a6fa6029d33af"}, + {file = "watchfiles-1.1.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2edc3553362b1c38d9f06242416a5d8e9fe235c204a4072e988ce2e5bb1f69f6"}, + {file = "watchfiles-1.1.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:30f7da3fb3f2844259cba4720c3fc7138eb0f7b659c38f3bfa65084c7fc7abce"}, + {file = "watchfiles-1.1.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f8979280bdafff686ba5e4d8f97840f929a87ed9cdf133cbbd42f7766774d2aa"}, + {file = "watchfiles-1.1.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dcc5c24523771db3a294c77d94771abcfcb82a0e0ee8efd910c37c59ec1b31bb"}, + {file = "watchfiles-1.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1db5d7ae38ff20153d542460752ff397fcf5c96090c1230803713cf3147a6803"}, + {file = "watchfiles-1.1.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:28475ddbde92df1874b6c5c8aaeb24ad5be47a11f87cde5a28ef3835932e3e94"}, + {file = "watchfiles-1.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:36193ed342f5b9842edd3532729a2ad55c4160ffcfa3700e0d54be496b70dd43"}, + {file = "watchfiles-1.1.1-cp312-cp312-win32.whl", hash = "sha256:859e43a1951717cc8de7f4c77674a6d389b106361585951d9e69572823f311d9"}, + {file = "watchfiles-1.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:91d4c9a823a8c987cce8fa2690923b069966dabb196dd8d137ea2cede885fde9"}, + {file = "watchfiles-1.1.1-cp312-cp312-win_arm64.whl", hash = "sha256:a625815d4a2bdca61953dbba5a39d60164451ef34c88d751f6c368c3ea73d404"}, + {file = "watchfiles-1.1.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:17ef139237dfced9da49fb7f2232c86ca9421f666d78c264c7ffca6601d154c3"}, + {file = "watchfiles-1.1.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:672b8adf25b1a0d35c96b5888b7b18699d27d4194bac8beeae75be4b7a3fc9b2"}, + {file = "watchfiles-1.1.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77a13aea58bc2b90173bc69f2a90de8e282648939a00a602e1dc4ee23e26b66d"}, + {file = "watchfiles-1.1.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b495de0bb386df6a12b18335a0285dda90260f51bdb505503c02bcd1ce27a8b"}, + {file = "watchfiles-1.1.1-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:db476ab59b6765134de1d4fe96a1a9c96ddf091683599be0f26147ea1b2e4b88"}, + {file = "watchfiles-1.1.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:89eef07eee5e9d1fda06e38822ad167a044153457e6fd997f8a858ab7564a336"}, + {file = "watchfiles-1.1.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce19e06cbda693e9e7686358af9cd6f5d61312ab8b00488bc36f5aabbaf77e24"}, + {file = "watchfiles-1.1.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e6f39af2eab0118338902798b5aa6664f46ff66bc0280de76fca67a7f262a49"}, + {file = "watchfiles-1.1.1.tar.gz", hash = "sha256:a173cb5c16c4f40ab19cecf48a534c409f7ea983ab8fed0741304a1c0a31b3f2"}, ] [[package]] name = "wcwidth" -version = "0.2.13" +version = "0.6.0" summary = "" files = [ - {file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"}, - {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, + {file = "wcwidth-0.6.0-py3-none-any.whl", hash = "sha256:1a3a1e510b553315f8e146c54764f4fb6264ffad731b3d78088cdb1478ffbdad"}, + {file = "wcwidth-0.6.0.tar.gz", hash = "sha256:cdc4e4262d6ef9a1a57e018384cbeb1208d8abbc64176027e2c2455c81313159"}, ] [[package]] name = "websockets" -version = "15.0.1" -summary = "" -files = [ - {file = "websockets-15.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d63efaa0cd96cf0c5fe4d581521d9fa87744540d4bc999ae6e08595a1014b45b"}, - {file = "websockets-15.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ac60e3b188ec7574cb761b08d50fcedf9d77f1530352db4eef1707fe9dee7205"}, - {file = "websockets-15.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5756779642579d902eed757b21b0164cd6fe338506a8083eb58af5c372e39d9a"}, - {file = "websockets-15.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0fdfe3e2a29e4db3659dbd5bbf04560cea53dd9610273917799f1cde46aa725e"}, - {file = "websockets-15.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c2529b320eb9e35af0fa3016c187dffb84a3ecc572bcee7c3ce302bfeba52bf"}, - {file = "websockets-15.0.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac1e5c9054fe23226fb11e05a6e630837f074174c4c2f0fe442996112a6de4fb"}, - {file = "websockets-15.0.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:5df592cd503496351d6dc14f7cdad49f268d8e618f80dce0cd5a36b93c3fc08d"}, - {file = "websockets-15.0.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0a34631031a8f05657e8e90903e656959234f3a04552259458aac0b0f9ae6fd9"}, - {file = "websockets-15.0.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3d00075aa65772e7ce9e990cab3ff1de702aa09be3940d1dc88d5abf1ab8a09c"}, - {file = "websockets-15.0.1-cp310-cp310-win32.whl", hash = "sha256:1234d4ef35db82f5446dca8e35a7da7964d02c127b095e172e54397fb6a6c256"}, - {file = "websockets-15.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:39c1fec2c11dc8d89bba6b2bf1556af381611a173ac2b511cf7231622058af41"}, - {file = "websockets-15.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:823c248b690b2fd9303ba00c4f66cd5e2d8c3ba4aa968b2779be9532a4dad431"}, - {file = "websockets-15.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678999709e68425ae2593acf2e3ebcbcf2e69885a5ee78f9eb80e6e371f1bf57"}, - {file = "websockets-15.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d50fd1ee42388dcfb2b3676132c78116490976f1300da28eb629272d5d93e905"}, - {file = "websockets-15.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d99e5546bf73dbad5bf3547174cd6cb8ba7273062a23808ffea025ecb1cf8562"}, - {file = "websockets-15.0.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:66dd88c918e3287efc22409d426c8f729688d89a0c587c88971a0faa2c2f3792"}, - {file = "websockets-15.0.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8dd8327c795b3e3f219760fa603dcae1dcc148172290a8ab15158cf85a953413"}, - {file = "websockets-15.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8fdc51055e6ff4adeb88d58a11042ec9a5eae317a0a53d12c062c8a8865909e8"}, - {file = "websockets-15.0.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:693f0192126df6c2327cce3baa7c06f2a117575e32ab2308f7f8216c29d9e2e3"}, - {file = "websockets-15.0.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:54479983bd5fb469c38f2f5c7e3a24f9a4e70594cd68cd1fa6b9340dadaff7cf"}, - {file = "websockets-15.0.1-cp311-cp311-win32.whl", hash = "sha256:16b6c1b3e57799b9d38427dda63edcbe4926352c47cf88588c0be4ace18dac85"}, - {file = "websockets-15.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:27ccee0071a0e75d22cb35849b1db43f2ecd3e161041ac1ee9d2352ddf72f065"}, - {file = "websockets-15.0.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:3e90baa811a5d73f3ca0bcbf32064d663ed81318ab225ee4f427ad4e26e5aff3"}, - {file = "websockets-15.0.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:592f1a9fe869c778694f0aa806ba0374e97648ab57936f092fd9d87f8bc03665"}, - {file = "websockets-15.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0701bc3cfcb9164d04a14b149fd74be7347a530ad3bbf15ab2c678a2cd3dd9a2"}, - {file = "websockets-15.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8b56bdcdb4505c8078cb6c7157d9811a85790f2f2b3632c7d1462ab5783d215"}, - {file = "websockets-15.0.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0af68c55afbd5f07986df82831c7bff04846928ea8d1fd7f30052638788bc9b5"}, - {file = "websockets-15.0.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64dee438fed052b52e4f98f76c5790513235efaa1ef7f3f2192c392cd7c91b65"}, - {file = "websockets-15.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d5f6b181bb38171a8ad1d6aa58a67a6aa9d4b38d0f8c5f496b9e42561dfc62fe"}, - {file = "websockets-15.0.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:5d54b09eba2bada6011aea5375542a157637b91029687eb4fdb2dab11059c1b4"}, - {file = "websockets-15.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3be571a8b5afed347da347bfcf27ba12b069d9d7f42cb8c7028b5e98bbb12597"}, - {file = "websockets-15.0.1-cp312-cp312-win32.whl", hash = "sha256:c338ffa0520bdb12fbc527265235639fb76e7bc7faafbb93f6ba80d9c06578a9"}, - {file = "websockets-15.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:fcd5cf9e305d7b8338754470cf69cf81f420459dbae8a3b40cee57417f4614a7"}, - {file = "websockets-15.0.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0c9e74d766f2818bb95f84c25be4dea09841ac0f734d1966f415e4edfc4ef1c3"}, - {file = "websockets-15.0.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:1009ee0c7739c08a0cd59de430d6de452a55e42d6b522de7aa15e6f67db0b8e1"}, - {file = "websockets-15.0.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76d1f20b1c7a2fa82367e04982e708723ba0e7b8d43aa643d3dcd404d74f1475"}, - {file = "websockets-15.0.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f29d80eb9a9263b8d109135351caf568cc3f80b9928bccde535c235de55c22d9"}, - {file = "websockets-15.0.1-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b359ed09954d7c18bbc1680f380c7301f92c60bf924171629c5db97febb12f04"}, - {file = "websockets-15.0.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:cad21560da69f4ce7658ca2cb83138fb4cf695a2ba3e475e0559e05991aa8122"}, - {file = "websockets-15.0.1-py3-none-any.whl", hash = "sha256:f7a866fbc1e97b5c617ee4116daaa09b722101d4a3c170c787450ba409f9736f"}, - {file = "websockets-15.0.1.tar.gz", hash = "sha256:82544de02076bafba038ce055ee6412d68da13ab47f0c60cab827346de828dee"}, +version = "16.0" +summary = "" +files = [ + {file = "websockets-16.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:04cdd5d2d1dacbad0a7bf36ccbcd3ccd5a30ee188f2560b7a62a30d14107b31a"}, + {file = "websockets-16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8ff32bb86522a9e5e31439a58addbb0166f0204d64066fb955265c4e214160f0"}, + {file = "websockets-16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:583b7c42688636f930688d712885cf1531326ee05effd982028212ccc13e5957"}, + {file = "websockets-16.0-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:7d837379b647c0c4c2355c2499723f82f1635fd2c26510e1f587d89bc2199e72"}, + {file = "websockets-16.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:df57afc692e517a85e65b72e165356ed1df12386ecb879ad5693be08fac65dde"}, + {file = "websockets-16.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:2b9f1e0d69bc60a4a87349d50c09a037a2607918746f07de04df9e43252c77a3"}, + {file = "websockets-16.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:335c23addf3d5e6a8633f9f8eda77efad001671e80b95c491dd0924587ece0b3"}, + {file = "websockets-16.0-cp310-cp310-win32.whl", hash = "sha256:37b31c1623c6605e4c00d466c9d633f9b812ea430c11c8a278774a1fde1acfa9"}, + {file = "websockets-16.0-cp310-cp310-win_amd64.whl", hash = "sha256:8e1dab317b6e77424356e11e99a432b7cb2f3ec8c5ab4dabbcee6add48f72b35"}, + {file = "websockets-16.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:31a52addea25187bde0797a97d6fc3d2f92b6f72a9370792d65a6e84615ac8a8"}, + {file = "websockets-16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:417b28978cdccab24f46400586d128366313e8a96312e4b9362a4af504f3bbad"}, + {file = "websockets-16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:af80d74d4edfa3cb9ed973a0a5ba2b2a549371f8a741e0800cb07becdd20f23d"}, + {file = "websockets-16.0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:08d7af67b64d29823fed316505a89b86705f2b7981c07848fb5e3ea3020c1abe"}, + {file = "websockets-16.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7be95cfb0a4dae143eaed2bcba8ac23f4892d8971311f1b06f3c6b78952ee70b"}, + {file = "websockets-16.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d6297ce39ce5c2e6feb13c1a996a2ded3b6832155fcfc920265c76f24c7cceb5"}, + {file = "websockets-16.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1c1b30e4f497b0b354057f3467f56244c603a79c0d1dafce1d16c283c25f6e64"}, + {file = "websockets-16.0-cp311-cp311-win32.whl", hash = "sha256:5f451484aeb5cafee1ccf789b1b66f535409d038c56966d6101740c1614b86c6"}, + {file = "websockets-16.0-cp311-cp311-win_amd64.whl", hash = "sha256:8d7f0659570eefb578dacde98e24fb60af35350193e4f56e11190787bee77dac"}, + {file = "websockets-16.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:71c989cbf3254fbd5e84d3bff31e4da39c43f884e64f2551d14bb3c186230f00"}, + {file = "websockets-16.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:8b6e209ffee39ff1b6d0fa7bfef6de950c60dfb91b8fcead17da4ee539121a79"}, + {file = "websockets-16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:86890e837d61574c92a97496d590968b23c2ef0aeb8a9bc9421d174cd378ae39"}, + {file = "websockets-16.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9b5aca38b67492ef518a8ab76851862488a478602229112c4b0d58d63a7a4d5c"}, + {file = "websockets-16.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e0334872c0a37b606418ac52f6ab9cfd17317ac26365f7f65e203e2d0d0d359f"}, + {file = "websockets-16.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a0b31e0b424cc6b5a04b8838bbaec1688834b2383256688cf47eb97412531da1"}, + {file = "websockets-16.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:485c49116d0af10ac698623c513c1cc01c9446c058a4e61e3bf6c19dff7335a2"}, + {file = "websockets-16.0-cp312-cp312-win32.whl", hash = "sha256:eaded469f5e5b7294e2bdca0ab06becb6756ea86894a47806456089298813c89"}, + {file = "websockets-16.0-cp312-cp312-win_amd64.whl", hash = "sha256:5569417dc80977fc8c2d43a86f78e0a5a22fee17565d78621b6bb264a115d4ea"}, + {file = "websockets-16.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:349f83cd6c9a415428ee1005cadb5c2c56f4389bc06a9af16103c3bc3dcc8b7d"}, + {file = "websockets-16.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:4a1aba3340a8dca8db6eb5a7986157f52eb9e436b74813764241981ca4888f03"}, + {file = "websockets-16.0-pp311-pypy311_pp73-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:f4a32d1bd841d4bcbffdcb3d2ce50c09c3909fbead375ab28d0181af89fd04da"}, + {file = "websockets-16.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0298d07ee155e2e9fda5be8a9042200dd2e3bb0b8a38482156576f863a9d457c"}, + {file = "websockets-16.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:a653aea902e0324b52f1613332ddf50b00c06fdaf7e92624fbf8c77c78fa5767"}, + {file = "websockets-16.0-py3-none-any.whl", hash = "sha256:1637db62fad1dc833276dded54215f2c7fa46912301a24bd94d45d46a011ceec"}, + {file = "websockets-16.0.tar.gz", hash = "sha256:5f6261a5e56e8d5c42a4497b364ea24d94d9563e8fbd44e78ac40879c60179b5"}, ] [[package]] From 6d06b41e874568fcf62cb058252349bf32cfa5fa Mon Sep 17 00:00:00 2001 From: Dozgulbas Date: Mon, 9 Mar 2026 15:15:09 -0500 Subject: [PATCH 08/21] Initialize pdm --- pyproject.toml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/pyproject.toml b/pyproject.toml index 849998e..3d954b9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -41,3 +41,10 @@ paths = ["docs/Configuration.md"] [[tool.pydantic_settings_export.generators.dotenv]] paths = [".env.example"] + +[tool.pdm] +distribution = true + +[build-system] +requires = ["pdm-backend"] +build-backend = "pdm.backend" From 3a1bfdb501af0c36c842cb6c6c73723797750fd9 Mon Sep 17 00:00:00 2001 From: Dozgulbas Date: Tue, 12 May 2026 17:07:17 -0700 Subject: [PATCH 09/21] Removed old kinematics --- src/pf400_interface/pf400_kinematics.py | 180 ------------------------ 1 file changed, 180 deletions(-) delete mode 100644 src/pf400_interface/pf400_kinematics.py diff --git a/src/pf400_interface/pf400_kinematics.py b/src/pf400_interface/pf400_kinematics.py deleted file mode 100644 index 457918d..0000000 --- a/src/pf400_interface/pf400_kinematics.py +++ /dev/null @@ -1,180 +0,0 @@ -"""Handles the kinematics of the PF400 robot arm""" - -import math - - -class KINEMATICS: - """Class for calculating the forward and inverse kinematics of the PF400 robot arm.""" - - """ - Joint coordinates, list of length 6 for PF400 with horizontal rail, - rail positions units are mm, angles in degrees increasing CCW looking down (-z): - 0 vertical rail position in mm, +z up, range [ 0, 1500 ] mm (for the 1.5m v_rail) - 1 angle of shoulder joint (v_rail to upper_arm), 0 deg perp v_rail, range: [-93, 93] deg - 2 angle of elbow joint (upper_arm to forearm), 0 deg under upper_arm, range: [-168, 168] deg - 3 angle of wrist joint (forearm to end_effector), 0 deg extends forearm, range: [-960, 960] deg - 4 the separation between plate-handling gripper fingers, range: [ ???, ??? ] mm - 5 horizontal rail position in mm, +x perp v_rail, range: [-1000,1000] (for the 2m h_rail) - - Cartesian coordinates, list of length 6: - 0 X increasing away from the face of the v_rail, parallel to the h_rail - 1 Y increasing to the left when facing in the +x direction - 2 Z increasing up along the v_rail - 3 yaw angle of gripper fingers to +x axis - 4 pitch fixed at 90 deg - 5 roll fixed at 180 deg - """ - - def __init__(self) -> None: - """Constructor for the KINEMATICS class.""" - # Robot arm segment lengths (in millimeters) - self.shoulder_length = ( - 302 # mm (perhaps rename to upper_arm, as shoulder is a joint) - ) - self.elbow_length = 289 # mm (perhaps rename to forearm, as elbo is a joint) - self.end_effector_length = ( - 162 # mm (???does this length terminate at the Tool Center Point?) - ) - - def forward_kinematics( - self, joint_states: list[float] - ) -> tuple[list[float], float, float]: - """ - Description: Calculates the forward kinematics for a given array of joint_states. - Parameters: - - joint_states : 6 joint states of the target location - Return: - - cartesian_coordinates: Returns the calculated cartesian coordinates of the given joint states (in millimeters) - - phi: Phi angle in degrees to be used for inverse kinematics - - joint_state[5]: The rail length. Needs to be subtracted from x axis if calculated coordinates will be fed into inverse kinematics - """ - - if joint_states[2] > 180: - adjusted_angle_j3 = ( - joint_states[2] - 360 - ) # Fixing the quadrant on the third joint. Joint 3 range is 10 to 350 instead of -180 to 180 - else: - adjusted_angle_j3 = joint_states[2] - - # Convert angles to radians - shoulder_angle = math.radians(joint_states[1]) # Joint 2 - elbow_angle = math.radians(joint_states[2]) # Joint 3 - gripper_angle = math.radians(joint_states[3]) # Joint 4 - - x = ( - self.shoulder_length * math.cos(shoulder_angle) - + self.elbow_length * math.cos(shoulder_angle + elbow_angle) - + self.end_effector_length - * math.cos(shoulder_angle + elbow_angle + gripper_angle) - ) - y = ( - self.shoulder_length * math.sin(shoulder_angle) - + self.elbow_length * math.sin(shoulder_angle + elbow_angle) - + self.end_effector_length - * math.sin(shoulder_angle + elbow_angle + gripper_angle) - ) - z = joint_states[0] - - phi = ( - math.degrees(shoulder_angle) - + adjusted_angle_j3 - + math.degrees(gripper_angle) - ) - - if phi > 0 and phi < 540: - yaw = phi % 360 - elif phi > 540 and phi < 720: - yaw = phi % 360 - 360 - elif phi > 720 and phi < 900: - yaw = phi % 720 - elif phi > 900 and phi < 1080: - yaw = phi % 720 - 720 - - cartesian_coordinates = self.get_cartesian_coordinates() - - cartesian_coordinates[0] = round(x, 3) + joint_states[5] - cartesian_coordinates[1] = round(y, 3) - cartesian_coordinates[2] = round(z, 3) - cartesian_coordinates[3] = round(yaw, 3) - - return cartesian_coordinates, round(phi, 3), joint_states[5] - - def inverse_kinematics( - self, - cartesian_coordinates: list, - phi: float, - rail: float = 0.0, - get_gripper_length: float = 123.0, - ) -> list[float]: - """ - Description: Calculates the inverse kinematics for a given array of cartesian coordinates. - Parameters: - - cartesian_coordinates: X/Y/Z Yaw/Pitch/Roll cartesian coordinates. - X axis has to be subtracted from the rail length before feeding into this function! - - Phi: Phi angle. Phi = Joint_2_angle + Joint_3_angle + Joint_4_angle - - Rail: Rail length (optional). If provided it will be subtracted from X axis. - Return: - - Joint angles: Calculated 6 new joint angles. - """ - - joint1 = cartesian_coordinates[2] - xe = cartesian_coordinates[0] - rail - ye = cartesian_coordinates[1] - - if phi < 360: - phi = cartesian_coordinates[3] - elif phi > 360 and phi < 540: - phi = cartesian_coordinates[3] + 360 - elif (phi > 540 and phi < 720) or (phi > 720 and phi < 900): - phi = cartesian_coordinates[3] + 720 - elif phi > 900 and phi < 1080: - phi = cartesian_coordinates[3] + 1440 - - phi_e = math.radians(phi) - - x_second_joint = xe - self.end_effector_length * math.cos(phi_e) - y_second_joint = ye - self.end_effector_length * math.sin(phi_e) - - radius = math.sqrt(x_second_joint**2 + y_second_joint**2) - gamma = math.acos( - ( - radius * radius - + self.shoulder_length * self.shoulder_length - - self.elbow_length * self.elbow_length - ) - / (2 * radius * self.shoulder_length) - ) - - theta2 = math.pi - math.acos( - ( - self.shoulder_length * self.shoulder_length - + self.elbow_length * self.elbow_length - - radius * radius - ) - / (2 * self.shoulder_length * self.elbow_length) - ) - theta1 = math.atan2(y_second_joint, x_second_joint) - gamma - theta3 = phi_e - theta1 - theta2 - - if cartesian_coordinates[1] > 0 or ( - cartesian_coordinates[1] < 0 - and math.degrees(theta1) < 0 - and abs(math.degrees(theta1)) < abs(math.degrees(theta1 + 2 * gamma)) - ): - # Robot is in the First Quadrant on the coordinate plane (x:+ , y:+) - joint2 = math.degrees(theta1) - joint3 = math.degrees( - theta2 - ) # Adding 360 degrees to Joint 3 to fix the pose. - joint4 = math.degrees(theta3) - - elif cartesian_coordinates[1] < 0: - # Robot is in the Forth Quadrant on the coordinate plane (x:+ , y:-) - # Use the joint angles for Forth Quadrant - joint2 = math.degrees(theta1 + 2 * gamma) - joint3 = ( - math.degrees(theta2 * -1) + 360 - ) # Adding 360 degrees to Joint 3 to fix the pose. - joint4 = math.degrees(theta3 + 2 * (theta2 - gamma)) - - return [joint1, joint2, joint3, joint4, get_gripper_length, rail] From deb066dbf0ad026c1371e345defffd0dfa739ccf Mon Sep 17 00:00:00 2001 From: Dozgulbas Date: Tue, 12 May 2026 17:08:20 -0700 Subject: [PATCH 10/21] Using new internal Kinematics --- src/pf400_interface/pf400.py | 568 ++++++++++++++--------------------- 1 file changed, 232 insertions(+), 336 deletions(-) diff --git a/src/pf400_interface/pf400.py b/src/pf400_interface/pf400.py index 23befa5..5e5e75c 100644 --- a/src/pf400_interface/pf400.py +++ b/src/pf400_interface/pf400.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -"""Driver code for the PF400 robot arm.""" +"""Interface code for the PF400 robot arm.""" import copy import telnetlib @@ -20,11 +20,10 @@ Pf400ConnectionError, Pf400ResponseError, ) -from pf400_interface.pf400_kinematics import KINEMATICS -class PF400(KINEMATICS): - """Main Driver Class for the PF400 Robot Arm.""" +class PF400: + """Main Interface Class for the PF400 Robot Arm.""" slow_motion_profile = 1 fast_motion_profile = 2 @@ -79,9 +78,7 @@ def __init__( - Programs are sent to the 10x00 port (first robot port: 10100). - A program sent to robot will be executed immediately unless there is a prior operation running on the robot. - If a second motion command is sent while the referenced robot is moving, the second command is blocked and will not reply until the first motion is complete. - """ - super().__init__() # PF400 kinematics self.logger = logger or EventClient() self.host = host self.port = port @@ -92,12 +89,9 @@ def __init__( self.gripper_resource_id = gripper_resource_id self.command_lock = Lock() self.status_lock = Lock() - # Initialize robot self.connect() - self.configure_robot() - # Plate variables + self._configure_robot() - # Initialize neutral_joints as an instance attribute self.neutral_joints = [ 400.0, 1.400, @@ -109,14 +103,9 @@ def __init__( self.set_gripper_open() self.set_gripper_close() - self.logger.warn( - "HARD CODED ROTATION LOCATION IS DEPRECATED, USE rotation_deck WITH TRANSFER METHOD INSTEAD" - ) def connect(self) -> None: - """ - Description: Create a streaming socket to send string commands to the robot using telnetlib3. - """ + """Create a streaming socket to send string commands to the robot using telnetlib.""" try: self.robot_connection = telnetlib.Telnet(self.host, self.port, 5) # noqa: S312 self.status_connection = telnetlib.Telnet(self.host, self.status_port, 5) # noqa: S312 @@ -125,11 +114,11 @@ def connect(self) -> None: err_message=f"Failed to connect using telnetlib: {e}" ) from e - def configure_robot(self) -> None: + def _configure_robot(self) -> None: """Configures the robot by setting the mode and selecting the robot ID.""" - self.send_robot_command(f"mode {self.mode}") + self.send_command(f"mode {self.mode}") self.send_status_command(f"mode {self.mode}") - self.send_robot_command(f"selectRobot {self.robot_id}") + self.send_command(f"selectRobot {self.robot_id}") self.send_status_command(f"selectRobot {self.robot_id}") def disconnect(self) -> None: @@ -141,7 +130,7 @@ def disconnect(self) -> None: self.status_connection.close() self.status_connection = None - def send_robot_command(self, command: str) -> str: + def send_command(self, command: str) -> str: """ Sends a command to the robot and return the response. @@ -156,8 +145,7 @@ def send_robot_command(self, command: str) -> str: Returns: str: The response received from the robot. - - Raises: + Raises: Pf400ConnectionError: If no connection to the robot can be established. Pf400CommandError: If an AttributeError occurs during command execution. """ @@ -172,10 +160,10 @@ def send_robot_command(self, command: str) -> str: .rstrip("\r\n") ) if response != "" and response in ERROR_CODES: - self.handle_error_output(response) + self._handle_error_output(response) if response in OUTPUT_CODES: self.logger.log_debug(response) - self.await_movement_completion() + self._await_movement_completion() return response except AttributeError as e: raise Pf400CommandError(err_message="Attribute Error") from e @@ -184,10 +172,6 @@ def send_status_command(self, command: str) -> str: """ Sends a status command to the PF400 device and returns the response. - This method ensures thread-safe access using a lock, establishes a connection if needed, - writes the command to the status writer, and reads the response. It handles error and output - codes appropriately, logging or raising exceptions as necessary. - Args: command (str): The command string to send to the PF400 device. @@ -209,98 +193,70 @@ def send_status_command(self, command: str) -> str: .rstrip("\r\n") ) if response != "" and response in ERROR_CODES: - self.handle_error_output(response) + self._handle_error_output(response) if response in OUTPUT_CODES: self.logger.log_debug(response) return response except AttributeError as e: raise Pf400CommandError(err_message="Attribute Error") from e - def handle_error_output(self, output: str) -> None: - """ - Description: Handles the error message output - """ + def _parse_response(self, response: str) -> list[float]: + """Parse a TCS response string into a list of floats, stripping the leading status code.""" + parts = response.split(" ") + return [float(x) for x in parts[1:]] + + def _handle_error_output(self, output: str) -> None: + """Handles the error message output.""" response = Pf400ResponseError.from_error_code(output) self.logger.log_error(response) raise response def enable_power(self) -> str: - """ - Description: Enables the power on the robot - """ - return self.send_robot_command("hp 1 -1") + """Enables the power on the robot.""" + return self.send_command("hp 1 -1") def disable_power(self) -> str: - """ - Description: Disables the power on the robot - """ - return self.send_robot_command("hp 0") + """Disables the power on the robot.""" + return self.send_command("hp 0") - def split_response(self, response: str) -> list[str]: - """ - Description: Splits the response string into a list of strings. - Parameters: - - response: The response string to be split. - Returns: A list of strings. - """ + def _split_response(self, response: str) -> list[str]: + """Splits the response string into a list of strings.""" return response.split(" ") if response else [] def check_powered(self) -> bool: - """ - Description: Checks whether the robot power is on or off. - Returns: bool indicating whether the robot is powered on. - """ - self.power_state = self.split_response(self.send_status_command("hp"))[1] + """Checks whether the robot power is on or off.""" + self.power_state = self._split_response(self.send_status_command("hp"))[1] return self.power_state == "1" def check_attached(self) -> bool: - """ - Description: Checks whether the robot is attached or not. - Returns: bool indicating whether the robot is attached. - """ - self.attach_state = self.split_response(self.send_robot_command("attach"))[1] + """Checks whether the robot is attached or not.""" + self.attach_state = self._split_response(self.send_command("attach"))[1] return self.attach_state == "1" def check_homed(self) -> bool: - """ - Description: Checks whether the robot is homed or not. - Returns: bool indicating whether the robot is homed. - """ - self.home_state = self.split_response(self.send_status_command("pd 2800"))[1] + """Checks whether the robot is homed or not.""" + self.home_state = self._split_response(self.send_status_command("pd 2800"))[1] return self.home_state == "1" def check_system_state(self) -> str: - """ - Description: Checks the global system state code - Returns: The system state code as a string. - """ - self.system_state = self.send_robot_command("sysState") + """Checks the global system state code.""" + self.system_state = self.send_command("sysState") return self.system_state def attach_robot(self) -> str: - """ - Description: Attach to the robot to enable motion commands. - """ - return self.send_robot_command("attach 1") + """Attach to the robot to enable motion commands.""" + return self.send_command("attach 1") def detach_robot(self) -> str: - """ - Description: Detach from the robot to disable motion commands. - """ - return self.send_robot_command("attach 0") + """Detach from the robot to disable motion commands.""" + return self.send_command("attach 0") def home_robot(self) -> str: - """ - Description: Homes robot joints. Homing takes around 15 seconds. - """ - - return self.send_robot_command("home") + """Homes robot joints. Homing takes around 15 seconds.""" + return self.send_command("home") def initialize_robot(self) -> None: - """ - Description: Initializes the robot by calling enable_power, attach_robot, home_robot, set_profile functions and checks the robot state to find out if the initialization was successful - """ - + """Initializes the robot by calling enable_power, attach_robot, home_robot, set_profile functions.""" self.check_state() retry_count = 0 while self.power_state != "1" and retry_count < 5: @@ -327,70 +283,55 @@ def initialize_robot(self) -> None: self.get_robot_movement_state() def get_robot_movement_state(self) -> int: - """Checks the movement state of the robot - States: 0 = Power off - 1 = Stopped - 2 = Acceleration - 3 = Deceleration + """Checks the movement state of the robot. + + States: 0 = Power off, 1 = Stopped, 2 = Acceleration, 3 = Deceleration """ movement_state = self.send_status_command("state") self.movement_state = int(float(movement_state.split(" ")[1])) return self.movement_state - def await_movement_completion(self) -> None: - """Waits until the robot has finished moving""" + def _await_movement_completion(self) -> None: + """Waits until the robot has finished moving.""" while True: if self.get_robot_movement_state() <= 1: return time.sleep(0.1) def check_state(self) -> int: - """ - Description: Checks the various state values of the robot and returns False if any of the states are not initialized correctly. - """ - + """Checks the various state values of the robot.""" try: is_powered = self.check_powered() is_attached = self.check_attached() is_homed = self.check_homed() system_state = self.check_system_state() - system_state_ok = self.split_response(system_state)[1] == "21" + system_state_ok = self._split_response(system_state)[1] == "21" return is_powered and is_attached and is_homed and system_state_ok except Exception as e: self.logger.log_info(f"Exception during state check: {e}") return False def get_joint_states(self) -> list[float]: - """ - Description: Locates the robot and returns the joint locations for all 6 joints. - """ - states = self.send_robot_command("wherej") + """Locates the robot and returns the joint locations for all 6 joints.""" + states = self.send_command("wherej") joints = states.split(" ") joints = joints[1:] return [float(x) for x in joints] def get_cartesian_coordinates(self) -> list[float]: - """ - Description: This function finds the current cartesian coordinates and angles of the robot. - Return: A float array with x/y/z yaw/pitch/roll - """ - coordinates = self.send_robot_command("whereC") + """Returns the current Cartesian coordinates of the robot as [X, Y, Z, yaw, pitch, roll].""" + coordinates = self.send_command("whereC") coordinates_list = coordinates.split(" ") coordinates_list = coordinates_list[1:-1] return [float(x) for x in coordinates_list] - def get_gripper_position(self) -> float: + def get_gripper_state(self) -> float: """Returns the current position of the gripper.""" joint_angles = self.get_joint_states() return joint_angles[4] def set_profile(self, profile_dict: Optional[dict] = None) -> str: - """ - Description: Sets and saves the motion profiles (defined in robot data) to the robot. - If user defines a custom profile, this profile will saved onto motion profile 4 on the robot - Parameters: - - profile_dict: Custom motion profile - """ + """Sets and saves the motion profiles to the robot.""" if profile_dict is None: profile1 = "Profile 1" for value in MOTION_PROFILES[0].values(): @@ -401,16 +342,14 @@ def set_profile(self, profile_dict: Optional[dict] = None) -> str: profile3 = "Profile 3" for value in MOTION_PROFILES[2].values(): profile3 += " " + str(value) - - self.send_robot_command(profile1) - self.send_robot_command(profile2) - out_msg = self.send_robot_command(profile3) - + self.send_command(profile1) + self.send_command(profile2) + out_msg = self.send_command(profile3) elif len(profile_dict) == 8: profile4 = "Profile 4" for value in profile_dict.values(): profile4 += " " + str(value) - out_msg = self.send_robot_command(profile4) + out_msg = self.send_command(profile4) else: raise Exception( f"Motion profile takes 8 arguments, {len(profile_dict)} where given" @@ -429,33 +368,21 @@ def gripper_close(self) -> int: def set_gripper_open(self, gripper_length: Optional[int] = None) -> None: """Configure the definition of gripper open.""" - self.send_robot_command(f"GripOpenPos {gripper_length or self.gripper_open}") + self.send_command(f"GripOpenPos {gripper_length or self.gripper_open}") def set_gripper_close(self, gripper_length: Optional[int] = None) -> None: """Configure the definition of gripper close.""" - self.send_robot_command(f"GripClosePos {gripper_length or self.gripper_close}") + self.send_command(f"GripClosePos {gripper_length or self.gripper_close}") def grab_plate( self, width: Optional[int] = None, speed: int = 100, force: int = 10 ) -> bool: - """ - Description: - Grabs the plate by applying additional force - Parameters: - - width: Plate width, in mm. Should be accurate to within about 1 mm. - - speed: Percent speed to open fingers. 1 to 100. - - Force: Maximum gripper squeeze force, in Nt. - A positive value indicates the fingers must close to grasp. - A negative value indicates the fingers must open to grasp. - Returns: - True if the plate was successfully grabbed, False otherwise. - """ + """Grabs the plate by applying additional force.""" if width is None: width = self.gripper_close - grab_plate_status = self.send_robot_command( + grab_plate_status = self.send_command( f"GraspPlate {width} {speed} {force}" ).split(" ") - if grab_plate_status[1] == "0": return False if grab_plate_status[1] == "-1": @@ -468,23 +395,12 @@ def grab_plate( ) def release_plate(self, width: Optional[int] = None, speed: int = 100) -> bool: - """ - Description: - Release the plate - Parameters: - - width: Open width, in mm. Larger than the widest corners of the plates. - If None, uses the default gripper_open value based on grip_wide setting. - - speed: Percent speed to open fingers. 1 to 100. - Returns: - True if the gripper successfully opened to the target width, False otherwise. - """ + """Release the plate.""" if width is None: width = self.gripper_open - - release_plate_status = self.send_robot_command( - f"ReleasePlate {width} {speed}" - ).split(" ") - + release_plate_status = self.send_command(f"ReleasePlate {width} {speed}").split( + " " + ) if release_plate_status[0] != "0": self.logger.log_error( f"Unexpected response from ReleasePlate: {release_plate_status[0]}" @@ -492,80 +408,145 @@ def release_plate(self, width: Optional[int] = None, speed: int = 100) -> bool: raise Pf400ResponseError( f"Unexpected response from ReleasePlate command: {release_plate_status[0]}." ) - - # Verify gripper opened to target width - current_gripper_position = self.get_gripper_position() - + current_gripper_position = self.get_gripper_state() if abs(current_gripper_position - width) <= 5: return True - self.logger.log_error( f"Gripper failed to open to target width. Expected: {width}, Got: {current_gripper_position}" ) return False def open_gripper(self, gripper_length: Optional[int] = None) -> float: - """Opens the gripper""" + """Opens the gripper.""" self.set_gripper_open(gripper_length=gripper_length) - self.send_robot_command("gripper 1") - return self.get_gripper_position() + self.send_command("gripper 1") + return self.get_gripper_state() def close_gripper(self, gripper_length: Optional[int] = None) -> float: - """Closes the gripper""" + """Closes the gripper.""" self.set_gripper_close(gripper_length=gripper_length) - self.send_robot_command("gripper 2") - return self.get_gripper_position() + self.send_command("gripper 2") + return self.get_gripper_state() + + # ------------------------------------------------------------------------- + # Kinematics -- implemented via custom TCS server commands (Custom.gpl) + # ------------------------------------------------------------------------- + + def joint_to_cart(self, joint_states: list[float]) -> list[float]: + """Forward kinematics (FK): convert joint angles to Cartesian coordinates. + + Calls the JointToCart custom TCS command which uses the robot's internal + KineSol method. The rail offset is handled automatically inside the command. + + Args: + joint_states: 6 joint values [j1, j2, j3, j4, j5, rail] + + Returns: + Cartesian coordinates as [X, Y, Z, yaw, pitch, roll] + """ + j1, j2, j3, j4, j5, rail = joint_states + response = self.send_command(f"JointToCart {j1} {j2} {j3} {j4} {j5} {rail}") + return self._parse_response(response) - def set_plate_rotation( - self, joint_states: list[float], rotation_degree: float = 0 + def cart_to_joint( + self, cartesian_coordinates: list[float], rail: float ) -> list[float]: + """Inverse kinematics (IK): convert Cartesian coordinates to joint angles. + + Calls the CartToJoint custom TCS command which uses the robot's internal + KineSol method. The rail position must be passed explicitly so the command + can subtract it from X before running IK, then return it as j6. + + Args: + cartesian_coordinates: [X, Y, Z, yaw, pitch, roll] in world coordinates + rail: Rail position in mm (j6 from wherej) + + Returns: + Joint angles as [j1, j2, j3, j4, j5, rail] """ - Description: - Parameters: - - joint_states: - - rotation_degree: - Note: If the rotation requires changing the "Quadrant" on the coordinate plane, - inverse kinematics calculation will be calculated wrong! + x, y, z, yaw, pitch, roll = cartesian_coordinates + response = self.send_command( + f"CartToJoint {x} {y} {z} {yaw} {pitch} {roll} {rail}" + ) + return self._parse_response(response) + + def rotate_yaw(self, joint_states: list[float], rotation_deg: float) -> list[float]: + """Rotate the end effector yaw at a given joint location. + + Calls the RotateLoc custom TCS command which internally runs FK, applies + the yaw rotation, then runs IK to return the new joint angles. Use this + to switch between narrow and wide microplate orientations without saving + duplicate locations. + + Args: + joint_states: 6 joint values [j1, j2, j3, j4, j5, rail] + rotation_deg: Yaw rotation to apply in degrees, typically 90 or -90 + + Returns: + New joint angles as [j1, j2, j3, j4, j5, rail] """ - cartesian_coordinates, phi_angle, rail_pos = self.forward_kinematics( - joint_states + j1, j2, j3, j4, j5, rail = joint_states + response = self.send_command( + f"RotateLoc {j1} {j2} {j3} {j4} {j5} {rail} {rotation_deg}" ) - # Fixing the orientation offset here - if rotation_degree == -90: # Yaw 90 to 0 degrees: - cartesian_coordinates[1] += 4 - cartesian_coordinates[0] += 29 - elif rotation_degree == 90: - cartesian_coordinates[1] -= 4 - cartesian_coordinates[0] -= 29 - - if cartesian_coordinates[1] < 0: - # Location is on the right side of the robot - cartesian_coordinates[3] += rotation_degree - elif cartesian_coordinates[1] > 0 and joint_states[1]: - cartesian_coordinates[3] -= rotation_degree - - return self.inverse_kinematics(cartesian_coordinates, phi_angle, rail_pos) + return self._parse_response(response) + + def move_with_rotation( + self, + joint_states: list[float], + rotation_deg: float, + profile: int = 2, + ) -> str: + """Move the end effector to a location with a yaw rotation applied. + + Computes the rotated Cartesian location using FK and the given rotation, + then moves to it using MoveC (straight line Cartesian motion). This avoids + IK ambiguity by letting the robot's internal motion controller handle the + joint configuration along the straight line path. + + Args: + joint_states: 6 joint values [j1, j2, j3, j4, j5, rail] + rotation_deg: Yaw rotation to apply in degrees, typically 90 or -90 + profile: Motion profile index, defaults to fast profile (2) + + Returns: + Robot response string + """ + cart = self.joint_to_cart(joint_states) + cart[3] += rotation_deg + # Normalize yaw to -180 to 180 + if cart[3] > 180: + cart[3] -= 360 + elif cart[3] < -180: + cart[3] += 360 + return self.move_cartesian(cart, profile=profile) + + # ------------------------------------------------------------------------- + # Motion + # ------------------------------------------------------------------------- def check_incorrect_plate_orientation( - self, goal_location: list[float], goal_rotation: list[float] + self, goal_location: list[float], goal_rotation: float ) -> list[float]: + """Fix plate rotation on the goal location if recorded with incorrect orientation. + + Args: + goal_location: 6 joint values for the goal location + goal_rotation: Expected rotation angle in degrees (0 or 90) + + Returns: + Corrected joint angles if orientation was wrong, otherwise unchanged. """ - Description: Fixes plate rotation on the goal location if it was recorded with an incorrect orientation. - Parameters: - - goal_location - - goal_rotation - Return: - goal_location: - - New goal location if the incorrect orientation was found. - - Same goal location if there orientation was correct. - """ - # This will fix plate rotation on the goal location if it was recorded with an incorrect orientation - cartesian_goal, _phi_source, _rail_source = self.forward_kinematics( - goal_location - ) - # Checking yaw angle - if goal_rotation != 0 and cartesian_goal[3] > -10 and cartesian_goal[3] < 10: - goal_location = self.set_plate_rotation(goal_location, goal_rotation) + if goal_rotation == 0: + return goal_location + + cart = self.joint_to_cart(goal_location) + yaw = cart[3] + + # If yaw is close to 0 but rotation is expected, the location was saved + # with the wrong orientation and needs to be corrected + if -10 < yaw < 10: + return self.rotate_yaw(goal_location, goal_rotation) return goal_location @@ -576,39 +557,31 @@ def move_joint( gripper_close: bool = False, gripper_open: bool = False, ) -> str: - """ - Description: Creates the movement commands with the given robot_location, profile, gripper closed and gripper open info - Parameters: - - target: Which location the PF400 will move. - - profile: Motion profile ID. - - gripper_close: If set to TRUE, gripper is closed. If set to FALSE, gripper position will remain same as the previous location. - - gripper_open: If set to TRUE, gripper is opened. If set to FALSE, gripper position will remain same as the previous location. - Return: Returns the created movement command in string format - """ + """Move the robot to a joint angle location. - # Checking unpermitted gripper command - # add check gripper here and remove gripper open/close from state + Args: + target_joint_angles: Target joint angles [j1, j2, j3, j4, j5, rail] + profile: Motion profile ID + gripper_close: If True, gripper is closed before moving + gripper_open: If True, gripper is opened before moving + """ if gripper_close and gripper_open: raise Exception("Gripper cannot be open and closed at the same time!") - - # Setting the gripper location to open or close. If there is no gripper position passed in, target_joint_angles will be used. if gripper_close: target_joint_angles[4] = self.gripper_close elif gripper_open: target_joint_angles[4] = self.gripper_open else: - target_joint_angles[4] = self.get_gripper_position() - + target_joint_angles[4] = self.get_gripper_state() move_command = ( "movej" + " " + str(profile) + " " + " ".join(map(str, target_joint_angles)) ) - - return self.send_robot_command(move_command) + return self.send_command(move_command) def move_cartesian( self, target_cartesian_coordinates: list[float], profile: int = 2 ) -> str: - """Move the arm to a target location in cartesian coordinates.""" + """Move the arm to a target location in Cartesian coordinates.""" move_command = ( "MoveC" + " " @@ -616,29 +589,16 @@ def move_cartesian( + " " + " ".join(map(str, target_cartesian_coordinates)) ) - - return self.send_robot_command(move_command) + return self.send_command(move_command) def move_in_one_axis( self, profile: int = 1, axis_x: int = 0, axis_y: int = 0, axis_z: int = 0 ) -> str: - """ - Description: Moves the end effector on single axis with a goal movement in millimeters. - Parameters: - - axis_x : Goal movement on x axis in mm - - axis_y : Goal movement on y axis in mm - - axis_z : Goal movement on z axis in mm - Returns: A string response from the robot indicating the result of the move command. - """ - - # Find the cartesian coordinates of the target joint states + """Move the end effector on a single axis by a given distance in mm.""" cartesian_coordinates = self.get_cartesian_coordinates() - - # Move end effector on the single axis cartesian_coordinates[0] += axis_x cartesian_coordinates[1] += axis_y cartesian_coordinates[2] += axis_z - move_command = ( "MoveC" + " " @@ -646,15 +606,11 @@ def move_in_one_axis( + " " + " ".join(map(str, cartesian_coordinates)) ) - return self.send_robot_command(move_command) + return self.send_command(move_command) def move_gripper_safe_zone(self) -> None: - """ - Description: Check if end effector is outside the safe boundaries. If it is, move it on the y axis first to prevent collisions with the module frames. - """ - + """Check if end effector is outside safe boundaries and move it in if needed.""" current_cartesian_coordinates = self.get_cartesian_coordinates() - if current_cartesian_coordinates[1] <= self.safe_left_boundary: y_distance = self.safe_left_boundary - current_cartesian_coordinates[1] self.move_in_one_axis(profile=self.slow_motion_profile, axis_y=y_distance) @@ -663,55 +619,40 @@ def move_gripper_safe_zone(self) -> None: self.move_in_one_axis(profile=self.slow_motion_profile, axis_y=y_distance) def move_gripper_neutral(self) -> None: - """ - Description: Move end effector to neutral position - """ - + """Move end effector to neutral position.""" self.move_gripper_safe_zone() gripper_neutral = self.get_joint_states() gripper_neutral[3] = self.neutral_joints[3] - self.move_joint(gripper_neutral, self.slow_motion_profile) def move_arm_neutral(self) -> None: - """ - Description: Move arm to neutral position - """ + """Move arm to neutral position.""" arm_neutral = self.neutral_joints current_location = self.get_joint_states() arm_neutral[0] = current_location[0] arm_neutral[5] = current_location[5] - self.move_joint(arm_neutral, self.slow_motion_profile) def move_rails_neutral( self, v_rail: Optional[float] = None, h_rail: Optional[float] = None ) -> None: - """Setting the target location's linear rail position for pf400_neutral""" - + """Move rails to neutral position.""" current_location = self.get_joint_states() - if not v_rail: - v_rail = current_location[0] # Keep the vertical rail same + v_rail = current_location[0] if not h_rail: - h_rail = current_location[5] # Keep the horizontal rail same - + h_rail = current_location[5] self.neutral_joints[5] = h_rail self.move_joint(self.neutral_joints, self.fast_motion_profile) self.neutral_joints[0] = v_rail + self.default_approach_height self.move_joint(self.neutral_joints, self.slow_motion_profile) def move_all_joints_neutral(self, target: Optional[list[float]] = None) -> None: - """ - Description: Move all joints to neutral position - """ + """Move all joints to neutral position.""" if target is None: target = self.get_joint_states() - # First move end effector to it's nuetral position self.move_gripper_neutral() - # Setting an arm neutral position without moving the horizontal & vertical rails self.move_arm_neutral() - # Setting the target location's linear rail position for pf400_neutral self.move_rails_neutral(target[0], target[5]) def remove_lid( @@ -726,10 +667,9 @@ def remove_lid( grab_offset: Optional[float] = None, approach_height_offset: Optional[float] = None, ) -> None: - """Remove the lid from the plate""" + """Remove the lid from the plate.""" source.representation = copy.deepcopy(source.representation) source.representation[0] += lid_height - self.transfer( source=source, target=target, @@ -753,10 +693,9 @@ def replace_lid( grab_offset: Optional[float] = None, approach_height_offset: Optional[float] = None, ) -> None: - """Replace the lid on the plate""" + """Replace the lid on the plate.""" target.representation = copy.deepcopy(target.representation) target.representation[0] += lid_height - self.transfer( source=source, target=target, @@ -771,17 +710,13 @@ def replace_lid( def rotate_plate_on_deck( self, rotation_degree: int, rotation_deck: Optional[LocationArgument] = None ) -> None: - """ - Description: Uses the rotation deck to rotate the plate between two transfers - Parameters: - rotation_degree: Rotation degree. - """ + """Use the rotation deck to rotate the plate between two transfers.""" if not rotation_deck: raise ValueError("Rotation deck location must be provided.") target = rotation_deck.representation - # Fixing the offset on the z axis if rotation_degree == -90: - target = self.set_plate_rotation(target, -rotation_degree) + target = self.rotate_yaw(target, -rotation_degree) above_position = list(map(add, target, self.default_approach_vector)) @@ -807,8 +742,7 @@ def rotate_plate_on_deck( ) self.open_gripper(self.gripper_open_wide) - # Rotating gripper to grab the plate from other rotation - target = self.set_plate_rotation(target, rotation_degree) + target = self.rotate_yaw(target, rotation_degree) above_position = list(map(add, target, self.default_approach_vector)) self.move_joint( target_joint_angles=above_position, profile=self.slow_motion_profile @@ -838,11 +772,8 @@ def rotate_plate_on_deck( self.move_all_joints_neutral(target) def _handle_approach_location(self, approach: LocationArgument) -> None: - """ - Handle moving to an approach location, whether single or multiple. - """ + """Handle moving to an approach location, whether single or multiple.""" if isinstance(approach.representation[0], list): - # Multiple approach locations provided self.move_all_joints_neutral(approach.representation[0]) for location in approach.representation: self.move_joint( @@ -850,7 +781,6 @@ def _handle_approach_location(self, approach: LocationArgument) -> None: profile=self.fast_motion_profile, ) else: - # Single approach location provided self.move_all_joints_neutral(approach.representation) self.move_joint( target_joint_angles=approach.representation, @@ -858,11 +788,7 @@ def _handle_approach_location(self, approach: LocationArgument) -> None: ) def _handle_approach_return(self, approach: LocationArgument) -> None: - """ - Handle returning from an approach location, whether single or multiple. - Uses straight motion profile for the first approach location (closest to target), - and fast motion profile for remaining approach locations. - """ + """Handle returning from an approach location, whether single or multiple.""" if isinstance(approach.representation[0], list): for index, location in enumerate(reversed(approach.representation)): motion_profile = ( @@ -888,22 +814,16 @@ def _calculate_above_position( approach_height_offset: Optional[float] = None, grab_height_offset: Optional[float] = None, ) -> list: - """ - Calculate the position above a target with optional height offset. - """ + """Calculate the position above a target with optional height offset.""" above_offset = copy.deepcopy(self.default_approach_vector) - if approach_height_offset: above_offset[0] += approach_height_offset if grab_height_offset: above_offset[0] += grab_height_offset - return list(map(add, position, above_offset)) def _apply_grab_offset(self, position: list, grab_offset: float) -> list: - """ - Apply grab offset to a position. - """ + """Apply grab offset to a position.""" position = copy.deepcopy(position) position[0] += grab_offset return position @@ -916,11 +836,7 @@ def pick_plate( approach_height_offset: Optional[float] = None, grip_width: Optional[int] = None, ) -> bool: - """ - Pick a plate from the source location, optionally using an approach location. - - Returns True if the plate was successfully grabbed, False otherwise. - """ + """Pick a plate from the source location.""" above_position = self._calculate_above_position( source.representation, approach_height_offset, grab_offset ) @@ -979,9 +895,7 @@ def place_plate( approach_height_offset: Optional[float] = None, open_width: Optional[int] = None, ) -> bool: - """ - Place a plate in the target location - """ + """Place a plate in the target location.""" above_position = self._calculate_above_position( target.representation, approach_height_offset, grab_offset ) @@ -1040,19 +954,11 @@ def move_to_location( grab_offset: Optional[float] = None, approach_height_offset: Optional[float] = None, ) -> None: - """ - Move to a target location for testing/calibration purposes. - - Follows the same approach and descend sequence as pick_plate, but keeps the - gripper open (unless holding a plate) and does not grip/release or change - resource state. Stays at the target position so the user can inspect and - adjust calibration. Use move_all_joints_neutral() to retract afterward. - """ + """Move to a target location for testing/calibration purposes.""" above_position = self._calculate_above_position( target.representation, approach_height_offset, grab_offset ) - # Check if the gripper is currently holding a plate holding_plate = ( self.resource_client and len( @@ -1061,7 +967,6 @@ def move_to_location( > 0 ) - # Only open gripper if not holding a plate (prevent dropping labware) if not holding_plate: self.open_gripper() @@ -1088,12 +993,7 @@ def move_to_location( ) def move_neutral(self, height_offset: Optional[float] = None) -> None: - """ - Retract upward and move to neutral position. - - Retracts the arm upward by height_offset (defaults to default_approach_height) - before moving to neutral, mirroring the retract step in pick_plate/place_plate. - """ + """Retract upward and move to neutral position.""" retract_height = ( height_offset if height_offset is not None else self.default_approach_height ) @@ -1116,26 +1016,25 @@ def transfer( source_approach_height_offset: Optional[float] = None, target_approach_height_offset: Optional[float] = None, ) -> bool: - """ - Description: Plate transfer function that performs series of movements to pick and place the plates - Parameters: - - source: Source location - - target: Target location - - source_approach: Approach location for source - - target_approach: Approach location for target - - source_plate_rotation: narrow or wide - - target_plate_rotation: narrow or wide - - rotation_deck: Location for plate rotation deck - - grab_offset: Add grab height offset - - source_approach_height_offset: Add source approach height offset - - target_approach_height_offset: Add target approach height offset - - Note: Plate rotation defines the rotation of the plate on the deck, not the grabbing angle. + """Plate transfer function that performs series of movements to pick and place the plates. + + Args: + source: Source location + target: Target location + source_approach: Approach location for source + target_approach: Approach location for target + source_plate_rotation: 'narrow', 'wide', or '' + target_plate_rotation: 'narrow', 'wide', or '' + rotation_deck: Location for plate rotation deck + grab_offset: Add grab height offset + source_approach_height_offset: Add source approach height offset + target_approach_height_offset: Add target approach height offset + + Note: Plate rotation defines the rotation of the plate on the deck, not the grabbing angle. """ source = copy.deepcopy(source) target = copy.deepcopy(target) - # Validate rotation arguments for rotation_arg in [source_plate_rotation, target_plate_rotation]: if rotation_arg.lower() not in ["wide", "narrow", ""]: raise ValueError( @@ -1143,7 +1042,6 @@ def transfer( "Expected 'wide', 'narrow', or ''." ) - # Determine source rotation (0 or 90 degrees) plate_source_rotation = 90 if source_plate_rotation.lower() == "wide" else 0 self.grip_wide = source_plate_rotation.lower() == "wide" @@ -1164,14 +1062,12 @@ def transfer( self.logger.error("Transfer failed: no plate detected after picking.") return False - # Determine target rotation (0 or 90 degrees) plate_target_rotation = 90 if target_plate_rotation.lower() == "wide" else 0 self.grip_wide = target_plate_rotation.lower() == "wide" target.representation = self.check_incorrect_plate_orientation( target.representation, plate_target_rotation ) - # Rotate plate if needed rotation_needed = plate_target_rotation - plate_source_rotation if rotation_needed != 0: self.rotate_plate_on_deck( From 65053add554b06f5b1014761bb3dda837134a6a0 Mon Sep 17 00:00:00 2001 From: Dozgulbas Date: Tue, 12 May 2026 17:09:30 -0700 Subject: [PATCH 11/21] Custom TCS server methods --- scripts/custom_tcs_server/Custom.gpl | 314 +++++++++++++++++++++++++++ 1 file changed, 314 insertions(+) create mode 100644 scripts/custom_tcs_server/Custom.gpl diff --git a/scripts/custom_tcs_server/Custom.gpl b/scripts/custom_tcs_server/Custom.gpl new file mode 100644 index 0000000..cec7aee --- /dev/null +++ b/scripts/custom_tcs_server/Custom.gpl @@ -0,0 +1,314 @@ +#Region "Module CustomCommands" +' Copyright (c) 2012 by Precise Automation Inc. All rights reserved. +' ======================================================================= +' Permission is granted to customers of Precise Automation to use this +' software for any purpose, including commercial applications, and to +' alter it and redistribute it freely, so long as this notice is included +' with any modified or unmodified version of this software. +' +' This software is provided "as is," without warranty of any kind, express or +' implied. In no event shall Precise Automation be held liable for any +' direct, indirect, incidental, special or consequential damages arising +' out of the use of or inability to use this software. +' ======================================================================= + +Module CustomCommands + +' Custom commands for RPL Argonne National Laboratory +' +' Commands implemented: +' +' JointToCart +' Forward kinematics (FK): converts joint angles to a Cartesian location. +' Rail offset is added to X so the result matches wherec world coordinates. +' Returns: X Y Z yaw pitch roll +' +' CartToJoint +' Inverse kinematics (IK): converts a Cartesian location to joint angles. +' Robot configuration is read from the robot automatically. +' Rail is passed explicitly and subtracted from X before IK. +' Returns: j1 j2 j3 j4 j5 rail +' +' RotateLoc +' Rotates the end effector by rotation_deg around the Z axis (yaw) at the +' given joint location. Internally runs FK, applies the rotation, then runs +' IK to compute the new joint angles. Useful for switching between narrow +' and wide microplate orientations without saving duplicate locations. +' Returns: j1 j2 j3 j4 j5 rail + + Private Const Version As String = "RPL Custom Module 2.0" + Public Custom_global_value As Integer + Public Custom_robot_array(N_ROB) As Integer + +#End Region +#Region "Init" +' Init -- Module Initialization + + Public Sub Init() + Custom_global_value = 123 + Command.AddPlugin(Version, "CustomCommands") + End Sub + +#End Region +#Region "Hook_InitCommand" +' Hook_InitCommand -- Initialization routine called when a command object is created + + Public Sub Hook_InitCommand(ByVal Cmd As Command, ByRef Reply As String) + + If Cmd.Rob.RobNum = 0 Then + GoTo _exit ' No robot + End If + + Custom_robot_array(Cmd.Rob.RobNum) = Cmd.Rob.RobNum + 1000 + + _exit: + Return + End Sub + +#End Region +#Region "Cmd_JointToCart" +' Cmd_JointToCart -- Convert joint angles to Cartesian location (Forward Kinematics, FK) +' +' SYNOPSIS: +' JointToCart +' +' INPUTS: +' j1 Tower Z joint angle in degrees +' j2..j5 Remaining arm joint angles in degrees +' rail Rail position in mm (j6) +' +' OUTPUTS: +' Reply: "0 X Y Z yaw pitch roll" on success +' "-error_code, message" on failure +' +' NOTE: X includes the rail offset so the result matches wherec world coordinates. +' +' EXAMPLE: +' wherej -> 0 176.539 1.4 177.05 537.273 70.803 -967.609 +' Send: JointToCart 176.539 1.4 177.05 537.273 70.803 -967.609 +' Receive: 0 -811.497 24.550 176.539 -4.277 90.000 180.000 + + Public Sub Cmd_JointToCart(ByVal Cmd As Command, ByRef Reply As String) + + Dim joint_loc As New Location + Dim cart_loc As New Location + Dim rail_pos As Double + + If Cmd.Nparm <> 6 Then + Reply = "-1, JointToCart requires 6 parameters: j1 j2 j3 j4 j5 rail" + Return + End If + + Cmd.StringtoDouble(0) + + ' Build joint angle location from the 5 arm joints + joint_loc.Angles( _ + Cmd.cData(1), _ + Cmd.cData(2), _ + Cmd.cData(3), _ + Cmd.cData(4), _ + Cmd.cData(5) _ + ) + + rail_pos = Cmd.cData(6) + + ' Select robot so KineSol can use its kinematic model + Robot.Selected = Cmd.Rob.RobNum + + ' Forward kinematics: convert joint angles to Cartesian + ' mode=1 ignores conversion errors (joint out of range, etc.) + cart_loc = joint_loc.KineSol(1) + + ' Add rail offset to X to match wherec world coordinates + cart_loc.X = cart_loc.X + rail_pos + + Reply = "0 " & _ + Format(cart_loc.X, "0.000") & " " & _ + Format(cart_loc.Y, "0.000") & " " & _ + Format(cart_loc.Z, "0.000") & " " & _ + Format(cart_loc.Yaw, "0.000") & " " & _ + Format(cart_loc.Pitch, "0.000") & " " & _ + Format(cart_loc.Roll, "0.000") + + End Sub + +#End Region +#Region "Cmd_CartToJoint" +' Cmd_CartToJoint -- Convert Cartesian location to joint angles (Inverse Kinematics, IK) +' +' SYNOPSIS: +' CartToJoint +' +' INPUTS: +' X Y Z Cartesian position in mm (world coordinates, including rail offset) +' yaw pitch roll Orientation in degrees +' rail Rail position in mm (j6 from wherej), used to remove rail offset from X +' +' NOTE: Robot configuration is read automatically from Robot.Where.Config. +' Rail is subtracted from X before IK so the kinematic model works in arm-local space. +' Rail is returned unchanged as the last value in the output. +' +' OUTPUTS: +' Reply: "0 j1 j2 j3 j4 j5 rail" on success +' "-error_code, message" on failure +' +' EXAMPLE: +' wherec -> 0 434.606 365.118 357.127 -4.839 90 180 1 +' wherej -> 0 357.127 13.669 84.86 616.632 70.785 40.839 +' Send: CartToJoint 434.606 365.118 357.127 -4.839 90 180 40.839 +' Receive: 0 357.127 13.669 84.860 616.632 70.785 40.839 + + Public Sub Cmd_CartToJoint(ByVal Cmd As Command, ByRef Reply As String) + + Dim cart_loc As New Location + Dim joint_loc As New Location + Dim rail_pos As Double + + If Cmd.Nparm <> 7 Then + Reply = "-1, CartToJoint requires 7 parameters: X Y Z yaw pitch roll rail" + Return + End If + + Cmd.StringtoDouble(0) + + rail_pos = Cmd.cData(7) + + ' Build Cartesian location by setting each property individually + ' Subtract rail offset from X so KineSol works in arm-local coordinates + cart_loc.X = Cmd.cData(1) - rail_pos + cart_loc.Y = Cmd.cData(2) + cart_loc.Z = Cmd.cData(3) + cart_loc.Yaw = Cmd.cData(4) + cart_loc.Pitch = Cmd.cData(5) + cart_loc.Roll = Cmd.cData(6) + + ' Read config from the robot's current position + cart_loc.Config = Robot.Where.Config + + ' Select robot so KineSol can use its kinematic model + Robot.Selected = Cmd.Rob.RobNum + + ' Build a 5-axis joint hint from the robot's current position + ' This is passed to KineSol so the solver stays close to the current + ' configuration and avoids jumping to equivalent but distant solutions + ' for multi-turn axes like j4. Rail axis is excluded as KineSol only + ' works on the 5 arm axes. + Dim hint_loc As New Location + hint_loc.Angles( _ + Robot.WhereAngles.Angle(1), _ + Robot.WhereAngles.Angle(2), _ + Robot.WhereAngles.Angle(3), _ + Robot.WhereAngles.Angle(4), _ + Robot.WhereAngles.Angle(5) _ + ) + + ' Inverse kinematics: convert Cartesian to joint angles + ' Pass hint so solver stays close to current configuration + joint_loc = cart_loc.KineSol(1, hint_loc) + + Reply = "0 " & _ + Format(joint_loc.Angle(1), "0.000") & " " & _ + Format(joint_loc.Angle(2), "0.000") & " " & _ + Format(joint_loc.Angle(3), "0.000") & " " & _ + Format(joint_loc.Angle(4), "0.000") & " " & _ + Format(joint_loc.Angle(5), "0.000") & " " & _ + Format(rail_pos, "0.000") + + End Sub + +#End Region +#Region "Cmd_RotateLoc" +' Cmd_RotateLoc -- Rotate end effector at a joint location by a given angle (FK + IK) +' +' Internally this command runs forward kinematics (FK) to convert the joint angles +' to Cartesian space, applies the rotation to the yaw axis, then runs inverse +' kinematics (IK) to return the new joint angles. This allows switching between +' narrow and wide microplate orientations without saving duplicate locations. +' +' SYNOPSIS: +' RotateLoc +' +' INPUTS: +' j1 Tower Z joint angle in degrees +' j2..j5 Remaining arm joint angles in degrees +' rail Rail position in mm (j6) +' rotation_deg Yaw rotation to apply in degrees (e.g. 90 or -90) +' +' OUTPUTS: +' Reply: "0 j1 j2 j3 j4 j5 rail" on success +' "-error_code, message" on failure +' +' EXAMPLE: +' wherej -> 0 176.539 1.4 177.05 537.273 70.803 -967.609 +' Send: RotateLoc 176.539 1.4 177.05 537.273 70.803 -967.609 90 +' Receive: 0 176.539 1.400 177.050 447.273 70.803 -967.609 + + Public Sub Cmd_RotateLoc(ByVal Cmd As Command, ByRef Reply As String) + + Dim joint_loc As New Location + Dim cart_loc As New Location + Dim result_loc As New Location + Dim rail_pos As Double + Dim rot_deg As Double + Dim new_yaw As Double + + If Cmd.Nparm <> 7 Then + Reply = "-1, RotateLoc requires 7 parameters: j1 j2 j3 j4 j5 rail rotation_deg" + Return + End If + + Cmd.StringtoDouble(0) + + ' Build joint angle location from the 5 arm joints + joint_loc.Angles( _ + Cmd.cData(1), _ + Cmd.cData(2), _ + Cmd.cData(3), _ + Cmd.cData(4), _ + Cmd.cData(5) _ + ) + + rail_pos = Cmd.cData(6) + rot_deg = Cmd.cData(7) + + ' Select robot so KineSol can use its kinematic model + Robot.Selected = Cmd.Rob.RobNum + + ' Step 1: Forward kinematics, convert joint angles to Cartesian + cart_loc = joint_loc.KineSol(1) + + ' Add rail offset to X to work in world coordinates + cart_loc.X = cart_loc.X + rail_pos + + ' Step 2: Apply yaw rotation and normalize to -180 to 180 range + new_yaw = cart_loc.Yaw + rot_deg + If new_yaw > 180.0 Then + new_yaw = new_yaw - 360.0 + End If + If new_yaw < -180.0 Then + new_yaw = new_yaw + 360.0 + End If + cart_loc.Yaw = new_yaw + + ' Step 3: Inverse kinematics, convert rotated Cartesian back to joint angles + ' Subtract rail offset from X so KineSol works in arm-local coordinates + ' Pass input joint angles as hint so solver stays close to original configuration + ' This prevents j4 (and other multi-turn axes) from jumping to an equivalent + ' but physically distant solution + cart_loc.X = cart_loc.X - rail_pos + cart_loc.Config = Robot.Where.Config + result_loc = cart_loc.KineSol(1, joint_loc) + + Reply = "0 " & _ + Format(result_loc.Angle(1), "0.000") & " " & _ + Format(result_loc.Angle(2), "0.000") & " " & _ + Format(result_loc.Angle(3), "0.000") & " " & _ + Format(result_loc.Angle(4), "0.000") & " " & _ + Format(result_loc.Angle(5), "0.000") & " " & _ + Format(rail_pos, "0.000") + + End Sub + +#End Region + +End Module From 01dfed3123544ae77e9067c71ef149d758502ad0 Mon Sep 17 00:00:00 2001 From: Dozgulbas Date: Tue, 12 May 2026 17:12:20 -0700 Subject: [PATCH 12/21] TCS instructions --- scripts/custom_tcs_server/TCS_Instructions.md | 96 +++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 scripts/custom_tcs_server/TCS_Instructions.md diff --git a/scripts/custom_tcs_server/TCS_Instructions.md b/scripts/custom_tcs_server/TCS_Instructions.md new file mode 100644 index 0000000..269b6e4 --- /dev/null +++ b/scripts/custom_tcs_server/TCS_Instructions.md @@ -0,0 +1,96 @@ +# Deploying Custom.gpl to the PF400 TCS Server + +This document describes how to update the PF400 robot's TCS server with a new version of `Custom.gpl`. +`Custom.gpl` adds three custom kinematic commands to the TCS server: `JointToCart`, `CartToJoint`, and `RotateLoc`. + +## Prerequisites + +- Network access to `rplpf400.cels.anl.gov` +- `lftp` installed on your machine (`sudo apt install lftp`) +- The robot's TCS server running on port 10100 + +## Steps + +### 1. Back up the existing file (first time only) + +```bash +lftp ftp://rplpf400.cels.anl.gov +cd /flash/projects/Tcp_cmd_server_pa +get Custom.gpl -o Custom.gpl.bak +quit +``` + +### 2. Upload the new Custom.gpl + +From the repo root: + +```bash +lftp ftp://rplpf400.cels.anl.gov +set ftp:passive-mode off +cd /flash/projects/Tcp_cmd_server_pa +put path/to/Custom.gpl +quit +``` + +### 3. Reload the project on the robot + +- Open the robot web interface at `http://rplpf400.cels.anl.gov` +- Navigate to **Setup > Load/Compile Project** +- Select `Tcp_cmd_server_pa` and click **Load** +- Wait for the confirmation that the project compiled and started successfully + +### 4. Verify the deployment + +Connect via telnet and check that the new module version appears: + +```bash +telnet rplpf400.cels.anl.gov 10100 +``` + +Then send: + +``` +version +``` + +Expected output should include `RPL Custom Module 2.0`. If you see an older version number the project did not reload correctly — repeat step 3. + +### 5. Test the commands + +With the robot powered and attached, run a quick sanity check: + +``` +wherej +``` + +Take the 6 joint values from the response (strip the leading `0`) and run: + +``` +JointToCart +``` + +Compare the output against `wherec` — X, Y, Z, yaw, pitch, roll should match within rounding (~0.01mm). + +## Rolling Back + +If the new `Custom.gpl` causes issues, restore the backup and reload: + +```bash +lftp ftp://rplpf400.cels.anl.gov +set ftp:passive-mode off +cd /flash/projects/Tcp_cmd_server_pa +put Custom.gpl.bak Custom.gpl +quit +``` + +Then reload the project following step 3 above. + +## Custom Commands Reference + +| Command | Arguments | Returns | Description | +|---|---|---|---| +| `JointToCart` | `j1 j2 j3 j4 j5 rail` | `X Y Z yaw pitch roll` | Forward kinematics (FK) | +| `CartToJoint` | `X Y Z yaw pitch roll rail` | `j1 j2 j3 j4 j5 rail` | Inverse kinematics (IK) | +| `RotateLoc` | `j1 j2 j3 j4 j5 rail rotation_deg` | `j1 j2 j3 j4 j5 rail` | Rotate end effector yaw and return new joint angles | + +All responses are prefixed with `0` on success (standard TCS status code) or a negative error code on failure. From 528a9063a6a8ce6ba98b2aed77eacebd547d0f0a Mon Sep 17 00:00:00 2001 From: Dozgulbas Date: Tue, 19 May 2026 12:49:23 -0700 Subject: [PATCH 13/21] Added new implementations to you Force Compliance & Height Detect --- src/pf400_interface/pf400.py | 67 ++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) diff --git a/src/pf400_interface/pf400.py b/src/pf400_interface/pf400.py index 5e5e75c..776fb02 100644 --- a/src/pf400_interface/pf400.py +++ b/src/pf400_interface/pf400.py @@ -521,6 +521,73 @@ def move_with_rotation( cart[3] += 360 return self.move_cartesian(cart, profile=profile) + # ------------------------------------------------------------------------- + # Force Compliance -- implemented via custom TCS server commands (Custom.gpl) + # Requires XY Compliance license on the controller. + # ------------------------------------------------------------------------- + + def enable_compliance(self, bias_torque_pct: int = 0) -> str: + """Enable horizontal force compliance on the robot joints. + + Allows the horizontal arm axes to float and comply to reaction forces + while other axes continue to be driven normally. Use before descending + into a pick or place location where the plate may be slightly misaligned + or stuck. Always call disable_compliance() after the operation. + + Args: + bias_torque_pct: Bias torque as a percentage of last used position control + torque (0-100). 0 = fully free (maximum compliance), 100 = full + holding torque (no compliance). Typical values: 0-20 for most + pick/place operations. + + Returns: + Robot response string + """ + return self.send_robot_command(f"EnableCompliance {bias_torque_pct}") + + def disable_compliance(self) -> str: + """Disable horizontal force compliance and return to normal position control. + + Always call this after enable_compliance() once the pick or place + operation is complete. + + Returns: + Robot response string + """ + return self.send_robot_command("DisableCompliance") + + # ------------------------------------------------------------------------- + # Height Detection -- implemented via TCS PARobot Auto Center module + # Requires Z Height Detection license on the controller. + # ------------------------------------------------------------------------- + + def height_detect( + self, + search_limit_mm: float = -500, + max_force_n: float = -15, + thorough: bool = True, + ) -> float: + """Detect the height of a surface below the gripper using motor force sensing. + + The gripper must be positioned at least 10-20mm above the surface before + calling. The robot will descend until it detects contact or reaches the + search limit. + + Args: + search_limit_mm: Maximum downward search distance in mm, must be negative + max_force_n: Maximum contact force in Newtons before stopping, must be negative + thorough: If True uses thorough mode (0.3mm accuracy, ~4s slower), + else quick mode (0.5mm accuracy, faster) + + Returns: + Detected Z height in mm (world coordinates) + """ + mode = 2 if thorough else 1 + response = self.send_robot_command( + f"HeightDetect {mode} {search_limit_mm} {max_force_n}" + ) + return float(response.split(" ")[1]) + # ------------------------------------------------------------------------- # Motion # ------------------------------------------------------------------------- From 856c37474e8a74945750533398339262ebff5657 Mon Sep 17 00:00:00 2001 From: Dozgulbas Date: Tue, 19 May 2026 12:50:24 -0700 Subject: [PATCH 14/21] Updated TCS Custom.gpl to add Force Compliance --- scripts/custom_tcs_server/Custom.gpl | 99 +++++++++++++++++++++++++++- 1 file changed, 98 insertions(+), 1 deletion(-) diff --git a/scripts/custom_tcs_server/Custom.gpl b/scripts/custom_tcs_server/Custom.gpl index cec7aee..ddbdb6d 100644 --- a/scripts/custom_tcs_server/Custom.gpl +++ b/scripts/custom_tcs_server/Custom.gpl @@ -35,8 +35,23 @@ Module CustomCommands ' IK to compute the new joint angles. Useful for switching between narrow ' and wide microplate orientations without saving duplicate locations. ' Returns: j1 j2 j3 j4 j5 rail +' +' EnableCompliance +' Enables horizontal force compliance on the robot joints (XY plane). +' The arm will float/comply to horizontal reaction forces during motion. +' reduced_pct (0-100) sets a bias torque as a percentage of the last used +' position control torque to prevent axes from drifting or twitching. +' 0 = fully free (no bias torque), 100 = full holding torque (no compliance). +' Typical values: 0-20 for most pick/place operations. +' Always call DisableCompliance after the operation is complete. +' Returns: 0 on success, error code and message on failure +' +' DisableCompliance +' Disables horizontal force compliance and returns joints to normal +' position control mode. +' Returns: 0 on success, error code and message on failure - Private Const Version As String = "RPL Custom Module 2.0" + Private Const Version As String = "RPL Custom Module 2.1" Public Custom_global_value As Integer Public Custom_robot_array(N_ROB) As Integer @@ -309,6 +324,88 @@ Module CustomCommands End Sub +#Region "Cmd_EnableCompliance" +' Cmd_EnableCompliance -- Enable horizontal force compliance on robot joints +' +' Enables AC_HorizCompliance2 mode which allows the horizontal arm axes to +' float and comply to reaction forces while other axes continue to be driven +' normally. Use this before descending into a pick or place location where +' the plate may be slightly misaligned or stuck. +' +' The reduced_pct parameter sets a bias torque as a percentage of the last +' used position control torque to prevent axes from drifting or twitching +' when compliance is first enabled: +' 0 = fully free, no bias torque (maximum compliance) +' 100 = full holding torque (effectively no compliance) +' 10-20 is recommended for most pick/place operations +' +' Requires the XY Compliance license to be installed on the controller. +' +' SYNOPSIS: +' EnableCompliance +' +' INPUTS: +' reduced_pct Bias torque percentage 0-100 +' +' OUTPUTS: +' Reply: "0" on success +' "-error_code, message" on failure + + Public Sub Cmd_EnableCompliance(ByVal Cmd As Command, ByRef Reply As String) + + Dim exc1 As Exception + Dim reduced_pct As Double + + If Cmd.Nparm <> 1 Then + Reply = "-1, EnableCompliance requires 1 parameter: reduced_pct (0-100)" + Return + End If + + Cmd.StringtoDouble(0) + reduced_pct = Cmd.cData(1) + + If reduced_pct < 0 Or reduced_pct > 100 Then + Reply = "-1, EnableCompliance: reduced_pct must be between 0 and 100" + Return + End If + + exc1 = AC_HorizCompliance2(Cmd.Rob.RobNum, True, reduced_pct) + If exc1.ErrorCode < 0 Then + Reply = CStr(exc1.ErrorCode) & ", " & AC_ErrorMessage(exc1) + Else + Reply = "0" + End If + + End Sub + +#End Region +#Region "Cmd_DisableCompliance" +' Cmd_DisableCompliance -- Disable horizontal force compliance on robot joints +' +' Disables AC_HorizCompliance2 mode and returns the horizontal arm axes to +' normal position control mode. Always call this after EnableCompliance +' once the pick or place operation is complete. +' +' SYNOPSIS: +' DisableCompliance +' +' OUTPUTS: +' Reply: "0" on success +' "-error_code, message" on failure + + Public Sub Cmd_DisableCompliance(ByVal Cmd As Command, ByRef Reply As String) + + Dim exc1 As Exception + + exc1 = AC_HorizCompliance2(Cmd.Rob.RobNum, False, 0) + If exc1.ErrorCode < 0 Then + Reply = CStr(exc1.ErrorCode) & ", " & AC_ErrorMessage(exc1) + Else + Reply = "0" + End If + + End Sub + #End Region End Module From f77f7f276d5fdabccf066712be0da236cf840ff9 Mon Sep 17 00:00:00 2001 From: Dozgulbas Date: Tue, 19 May 2026 12:52:38 -0700 Subject: [PATCH 15/21] Updated docs --- scripts/custom_tcs_server/TCS_Instructions.md | 74 ++++++++++++++++--- 1 file changed, 65 insertions(+), 9 deletions(-) diff --git a/scripts/custom_tcs_server/TCS_Instructions.md b/scripts/custom_tcs_server/TCS_Instructions.md index 269b6e4..78524dd 100644 --- a/scripts/custom_tcs_server/TCS_Instructions.md +++ b/scripts/custom_tcs_server/TCS_Instructions.md @@ -1,12 +1,12 @@ # Deploying Custom.gpl to the PF400 TCS Server This document describes how to update the PF400 robot's TCS server with a new version of `Custom.gpl`. -`Custom.gpl` adds three custom kinematic commands to the TCS server: `JointToCart`, `CartToJoint`, and `RotateLoc`. +`Custom.gpl` adds custom commands to the TCS server for kinematics, force compliance, and height detection. ## Prerequisites - Network access to `rplpf400.cels.anl.gov` -- `lftp` installed on your machine (`sudo apt install lftp`) +- `lftp` or FileZilla installed on your machine - The robot's TCS server running on port 10100 ## Steps @@ -22,7 +22,7 @@ quit ### 2. Upload the new Custom.gpl -From the repo root: +**Via lftp:** ```bash lftp ftp://rplpf400.cels.anl.gov @@ -32,6 +32,12 @@ put path/to/Custom.gpl quit ``` +**Via FileZilla:** + +- Host: `rplpf400.cels.anl.gov`, Port: `21`, leave username and password blank +- Navigate to `/flash/projects/Tcp_cmd_server_pa` in the right panel +- Drag `Custom.gpl` from your local machine into that folder + ### 3. Reload the project on the robot - Open the robot web interface at `http://rplpf400.cels.anl.gov` @@ -53,11 +59,13 @@ Then send: version ``` -Expected output should include `RPL Custom Module 2.0`. If you see an older version number the project did not reload correctly — repeat step 3. +Expected output should include `RPL Custom Module 2.1`. If you see an older version number the project did not reload correctly — repeat step 3. ### 5. Test the commands -With the robot powered and attached, run a quick sanity check: +With the robot powered and attached, run a quick sanity check for each command group. + +**Kinematics:** ``` wherej @@ -71,6 +79,25 @@ JointToCart Compare the output against `wherec` — X, Y, Z, yaw, pitch, roll should match within rounding (~0.01mm). +**Force Compliance** (requires XY Compliance license): + +``` +EnableCompliance 0 +DisableCompliance +``` + +Both should return `0`. When compliance is enabled the horizontal arm axes should feel loose when pushed by hand. + +**Height Detection** (requires Z Height Detection license): + +Position the gripper at least 20mm above a surface, then: + +``` +HeightDetect 2 -400 -15 +``` + +Should return `0 ` rather than a license error. + ## Rolling Back If the new `Custom.gpl` causes issues, restore the backup and reload: @@ -87,10 +114,39 @@ Then reload the project following step 3 above. ## Custom Commands Reference +All responses are prefixed with `0` on success (standard TCS status code) or a negative error code and message on failure. + +### Kinematics + +| Command | Arguments | Returns | Description | +|---|---|---|---| +| `JointToCart` | `j1 j2 j3 j4 j5 rail` | `X Y Z yaw pitch roll` | Forward kinematics (FK): convert joint angles to Cartesian coordinates. Rail offset is added to X to match world coordinates. | +| `CartToJoint` | `X Y Z yaw pitch roll rail` | `j1 j2 j3 j4 j5 rail` | Inverse kinematics (IK): convert Cartesian coordinates to joint angles. Rail is subtracted from X before IK and returned unchanged. | +| `RotateLoc` | `j1 j2 j3 j4 j5 rail rotation_deg` | `j1 j2 j3 j4 j5 rail` | Rotate end effector yaw by rotation_deg degrees. Internally runs FK, applies rotation, then IK. Use to switch between narrow and wide plate orientations. | + +### Force Compliance + +Requires XY Compliance license installed on the controller. + | Command | Arguments | Returns | Description | |---|---|---|---| -| `JointToCart` | `j1 j2 j3 j4 j5 rail` | `X Y Z yaw pitch roll` | Forward kinematics (FK) | -| `CartToJoint` | `X Y Z yaw pitch roll rail` | `j1 j2 j3 j4 j5 rail` | Inverse kinematics (IK) | -| `RotateLoc` | `j1 j2 j3 j4 j5 rail rotation_deg` | `j1 j2 j3 j4 j5 rail` | Rotate end effector yaw and return new joint angles | +| `EnableCompliance` | `bias_torque_pct` | `0` | Enable horizontal force compliance. `bias_torque_pct` (0-100) sets a bias torque percentage to prevent axis drift. 0 = fully free, typical values 0-20. | +| `DisableCompliance` | none | `0` | Disable horizontal force compliance and return to normal position control. Always call after EnableCompliance. | + +### Height Detection + +Requires Z Height Detection license installed on the controller. Position the gripper at least 20mm above the surface before calling. + +| Command | Arguments | Returns | Description | +|---|---|---|---| +| `HeightDetect` | `mode search_limit_mm max_force_n` | `detected_Z_mm` | Detect surface height. mode: 1=quick (0.5mm), 2=thorough (0.3mm). search_limit_mm: max downward travel (negative). max_force_n: contact force limit (negative). | + +## License Requirements + +| Feature | Required License | +|---|---| +| Kinematics (JointToCart, CartToJoint, RotateLoc) | GPL license (already installed) | +| Force Compliance (EnableCompliance, DisableCompliance) | XY Compliance | +| Height Detection (HeightDetect) | Z Height Detection | -All responses are prefixed with `0` on success (standard TCS status code) or a negative error code on failure. +To check installed licenses, navigate to **Utilities > Controller Options** in the robot web interface. From 2dd75e7e3bd9ce0f70e91e135404f14cd00b8d22 Mon Sep 17 00:00:00 2001 From: Dozgulbas Date: Tue, 19 May 2026 14:55:32 -0500 Subject: [PATCH 16/21] Interface tests --- tests/test_pf400_interface.ipynb | 664 ++++++++++++++++++++++++++++++- 1 file changed, 655 insertions(+), 9 deletions(-) diff --git a/tests/test_pf400_interface.ipynb b/tests/test_pf400_interface.ipynb index 918f4ab..0cd4611 100644 --- a/tests/test_pf400_interface.ipynb +++ b/tests/test_pf400_interface.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": null, + "execution_count": 124, "id": "0", "metadata": {}, "outputs": [], @@ -12,11 +12,30 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 125, "id": "1", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[2m2026-05-18T22:10:39.280362Z\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mEventClient initialized \u001b[0m \u001b[36mclient_name\u001b[0m=\u001b[35mpf400_interface.pf400\u001b[0m \u001b[36mevent_server\u001b[0m=\u001b[35m'Not configured'\u001b[0m \u001b[36mlog_dir\u001b[0m=\u001b[35m/home/rpl/workspaces/rpl_dev/pf400_module/.madsci/logs\u001b[0m \u001b[36mlog_level\u001b[0m=\u001b[35mEventLogLevel.INFO\u001b[0m \u001b[36mmadsci_version\u001b[0m=\u001b[35m0.7.0\u001b[0m \u001b[36mplatform\u001b[0m=\u001b[35mLinux-6.17.0-19-generic-x86_64-with-glibc2.42\u001b[0m \u001b[36mpython_version\u001b[0m=\u001b[35m3.12.12\u001b[0m\n" + ] + }, + { + "data": { + "text/plain": [ + "1" + ] + }, + "execution_count": 125, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ + "\n", "pf400 = PF400(host=\"rplpf400.cels.anl.gov\")\n", "pf400.initialize_robot()\n", "pf400.get_robot_movement_state()" @@ -24,7 +43,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 23, "id": "2", "metadata": {}, "outputs": [], @@ -41,10 +60,105 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 115, "id": "3", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[2m2026-05-18T22:09:12.860598Z\u001b[0m [\u001b[31m\u001b[1merror \u001b[0m] \u001b[1m*Soft envelope error* Robot 1: 1\u001b[0m \u001b[36mevent_type\u001b[0m=\u001b[35mlog_error\u001b[0m\n" + ] + }, + { + "data": { + "text/html": [ + "
╭─────────────────────────────────────── Traceback (most recent call last) ───────────────────────────────────────╮\n",
+       " in <module>:2                                                                                                   \n",
+       "                                                                                                                 \n",
+       "   1 pf400.open_gripper(pf400.gripper_open_wide)                                                                 \n",
+       " 2 pf400.close_gripper(pf400.gripper_close_narrow)                                                             \n",
+       "   3                                                                                                             \n",
+       "                                                                                                                 \n",
+       " /home/rpl/workspaces/rpl_dev/pf400_module/src/pf400_interface/pf400.py:428 in close_gripper                     \n",
+       "                                                                                                                 \n",
+       "    425 def close_gripper(self, gripper_length: Optional[int] = None) -> float:                              \n",
+       "    426 │   │   \"\"\"Closes the gripper.\"\"\"                                                                        \n",
+       "    427 │   │   self.set_gripper_close(gripper_length=gripper_length)                                            \n",
+       "  428 │   │   self.send_command(\"gripper 2\")                                                                   \n",
+       "    429 │   │   return self.get_gripper_state()                                                                  \n",
+       "    430                                                                                                      \n",
+       "    431 # -------------------------------------------------------------------------                          \n",
+       "                                                                                                                 \n",
+       " /home/rpl/workspaces/rpl_dev/pf400_module/src/pf400_interface/pf400.py:163 in send_command                      \n",
+       "                                                                                                                 \n",
+       "    160 │   │   │   │   │   .rstrip(\"\\r\\n\")                                                                      \n",
+       "    161 │   │   │   │   )                                                                                        \n",
+       "    162 │   │   │   │   if response != \"\" and response in ERROR_CODES:                                           \n",
+       "  163 │   │   │   │   │   self._handle_error_output(response)                                                  \n",
+       "    164 │   │   │   │   if response in OUTPUT_CODES:                                                             \n",
+       "    165 │   │   │   │   │   self.logger.log_debug(response)                                                      \n",
+       "    166 │   │   │   │   self._await_movement_completion()                                                        \n",
+       "                                                                                                                 \n",
+       " /home/rpl/workspaces/rpl_dev/pf400_module/src/pf400_interface/pf400.py:212 in _handle_error_output              \n",
+       "                                                                                                                 \n",
+       "    209 │   │   \"\"\"Handles the error message output.\"\"\"                                                          \n",
+       "    210 │   │   response = Pf400ResponseError.from_error_code(output)                                            \n",
+       "    211 │   │   self.logger.log_error(response)                                                                  \n",
+       "  212 │   │   raise response                                                                                   \n",
+       "    213                                                                                                      \n",
+       "    214 def enable_power(self) -> str:                                                                       \n",
+       "    215 │   │   \"\"\"Enables the power on the robot.\"\"\"                                                            \n",
+       "╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\n",
+       "Pf400ResponseError: *Soft envelope error* Robot 1: 1\n",
+       "
\n" + ], + "text/plain": [ + "\u001b[31m╭─\u001b[0m\u001b[31m──────────────────────────────────────\u001b[0m\u001b[31m \u001b[0m\u001b[1;31mTraceback \u001b[0m\u001b[1;2;31m(most recent call last)\u001b[0m\u001b[31m \u001b[0m\u001b[31m──────────────────────────────────────\u001b[0m\u001b[31m─╮\u001b[0m\n", + "\u001b[31m│\u001b[0m in :2 \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m1 \u001b[0mpf400.open_gripper(pf400.gripper_open_wide) \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[31m❱ \u001b[0m2 \u001b[1;4mpf400.close_gripper(pf400.gripper_close_narrow)\u001b[0m \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m3 \u001b[0m \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m/home/rpl/workspaces/rpl_dev/pf400_module/src/pf400_interface/\u001b[0m\u001b[1mpf400.py\u001b[0m:428 in close_gripper \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m 425 \u001b[0m\u001b[2m│ \u001b[0m\u001b[94mdef\u001b[0m\u001b[90m \u001b[0m\u001b[92mclose_gripper\u001b[0m(\u001b[96mself\u001b[0m, gripper_length: Optional[\u001b[96mint\u001b[0m] = \u001b[94mNone\u001b[0m) -> \u001b[96mfloat\u001b[0m: \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m 426 \u001b[0m\u001b[2;90m│ │ \u001b[0m\u001b[33m\"\"\"Closes the gripper.\"\"\"\u001b[0m \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m 427 \u001b[0m\u001b[2m│ │ \u001b[0m\u001b[96mself\u001b[0m.set_gripper_close(gripper_length=gripper_length) \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[31m❱ \u001b[0m 428 \u001b[2m│ │ \u001b[0m\u001b[1;4;96mself\u001b[0m\u001b[1;4m.send_command(\u001b[0m\u001b[1;4;33m\"\u001b[0m\u001b[1;4;33mgripper 2\u001b[0m\u001b[1;4;33m\"\u001b[0m\u001b[1;4m)\u001b[0m \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m 429 \u001b[0m\u001b[2m│ │ \u001b[0m\u001b[94mreturn\u001b[0m \u001b[96mself\u001b[0m.get_gripper_state() \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m 430 \u001b[0m\u001b[2m│ \u001b[0m \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m 431 \u001b[0m\u001b[2m│ \u001b[0m\u001b[2m# -------------------------------------------------------------------------\u001b[0m \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m/home/rpl/workspaces/rpl_dev/pf400_module/src/pf400_interface/\u001b[0m\u001b[1mpf400.py\u001b[0m:163 in send_command \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m 160 \u001b[0m\u001b[2m│ │ │ │ │ \u001b[0m.rstrip(\u001b[33m\"\u001b[0m\u001b[33m\\r\u001b[0m\u001b[33m\\n\u001b[0m\u001b[33m\"\u001b[0m) \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m 161 \u001b[0m\u001b[2m│ │ │ │ \u001b[0m) \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m 162 \u001b[0m\u001b[2m│ │ │ │ \u001b[0m\u001b[94mif\u001b[0m response != \u001b[33m\"\u001b[0m\u001b[33m\"\u001b[0m \u001b[95mand\u001b[0m response \u001b[95min\u001b[0m ERROR_CODES: \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[31m❱ \u001b[0m 163 \u001b[2m│ │ │ │ │ \u001b[0m\u001b[96mself\u001b[0m._handle_error_output(response) \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m 164 \u001b[0m\u001b[2m│ │ │ │ \u001b[0m\u001b[94mif\u001b[0m response \u001b[95min\u001b[0m OUTPUT_CODES: \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m 165 \u001b[0m\u001b[2m│ │ │ │ │ \u001b[0m\u001b[96mself\u001b[0m.logger.log_debug(response) \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m 166 \u001b[0m\u001b[2m│ │ │ │ \u001b[0m\u001b[96mself\u001b[0m._await_movement_completion() \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m/home/rpl/workspaces/rpl_dev/pf400_module/src/pf400_interface/\u001b[0m\u001b[1mpf400.py\u001b[0m:212 in _handle_error_output \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m 209 \u001b[0m\u001b[2;90m│ │ \u001b[0m\u001b[33m\"\"\"Handles the error message output.\"\"\"\u001b[0m \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m 210 \u001b[0m\u001b[2m│ │ \u001b[0mresponse = Pf400ResponseError.from_error_code(output) \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m 211 \u001b[0m\u001b[2m│ │ \u001b[0m\u001b[96mself\u001b[0m.logger.log_error(response) \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[31m❱ \u001b[0m 212 \u001b[2m│ │ \u001b[0m\u001b[1;4;94mraise\u001b[0m\u001b[1;4m response\u001b[0m \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m 213 \u001b[0m\u001b[2m│ \u001b[0m \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m 214 \u001b[0m\u001b[2m│ \u001b[0m\u001b[94mdef\u001b[0m\u001b[90m \u001b[0m\u001b[92menable_power\u001b[0m(\u001b[96mself\u001b[0m) -> \u001b[96mstr\u001b[0m: \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m 215 \u001b[0m\u001b[2;90m│ │ \u001b[0m\u001b[33m\"\"\"Enables the power on the robot.\"\"\"\u001b[0m \u001b[31m│\u001b[0m\n", + "\u001b[31m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m\n", + "\u001b[1;91mPf400ResponseError: \u001b[0m*Soft envelope error* Robot \u001b[1;36m1\u001b[0m: \u001b[1;36m1\u001b[0m\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "pf400.open_gripper(pf400.gripper_open_wide)\n", "pf400.close_gripper(pf400.gripper_close_narrow)" @@ -64,17 +178,549 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 32, + "id": "58b72672", + "metadata": {}, + "outputs": [], + "source": [ + "camera_loc = LocationArgument(\n", + " location_name=\"source\", location = [106.932,23.387,69.67,714.368,75.058,994.962]\n", + ")\n", + "rotation_deck = LocationArgument(\n", + " location_name=\"rotation_deck\", location = [62.287,-27.703,113.691,631.713,75.088,994.854]\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 33, "id": "5", "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pf400.transfer(source=camera_loc, target=camera_loc, rotation_deck=rotation_deck, source_plate_rotation=\"narrow\", target_plate_rotation=\"wide\")\n", + "pf400.transfer(source=camera_loc, target=camera_loc, rotation_deck=rotation_deck, source_plate_rotation=\"wide\", target_plate_rotation=\"narrow\")" + ] + }, + { + "cell_type": "code", + "execution_count": 187, + "id": "3c7c7602", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 187, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pf400.pick_plate(source=rotation_deck\n", + " )\n" + ] + }, + { + "cell_type": "code", + "execution_count": 188, + "id": "4027bb28", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 188, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pf400.place_plate(target=camera_loc)" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "c813d4ea", + "metadata": {}, "outputs": [], "source": [ - "pf400.transfer(source=location, target=location)" + "pf400.rotate_plate_on_deck(rotation_degree=90, rotation_deck=rotation_deck)" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "id": "34c11807", + "metadata": {}, + "outputs": [], + "source": [ + "rotation_deck_above = LocationArgument(\n", + " location_name=\"rotation_deck_above\", location = [75.287,-27.703,113.691,631.713,70.088,994.854]\n", + ")\n" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "id": "13443d57", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'0 1428.252 164.005 75.293 -2.318 90 180 1'" + ] + }, + "execution_count": 44, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pf400.move_joint(target_joint_angles=rotation_deck_above.representation)\n", + "pf400.send_command(\"wherec\")" ] }, { "cell_type": "code", "execution_count": null, + "id": "984573cd", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'0 1428.194 164.106 75.292 -92.296 90 -180 1'" + ] + }, + "execution_count": 45, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "new_loc =pf400.rotate_yaw(joint_states=rotation_deck_above.representation, rotation_deg=90.0)\n", + "pf400.move_joint(new_loc)\n", + "pf400.send_command(\"wherec\")" + ] + }, + { + "cell_type": "code", + "execution_count": 154, + "id": "46f01a50", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1430.657, 149.952, 75.287, -2.299, 90.0, 180.0]\n" + ] + }, + { + "data": { + "text/plain": [ + "'0'" + ] + }, + "execution_count": 154, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "cart = pf400.joint_to_cart(rotation_deck_above.representation)\n", + "print(cart)\n", + "pf400.move_with_rotation(rotation_deck_above.representation, 90.0)" + ] + }, + { + "cell_type": "code", + "execution_count": 153, + "id": "9d2def7b", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'0'" + ] + }, + "execution_count": 153, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pf400.send_command(\"tool 0 -8 148 0 0 0\")" + ] + }, + { + "cell_type": "code", + "execution_count": 339, + "id": "1f830ba8", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "129.918" + ] + }, + "execution_count": 339, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pf400.open_gripper(pf400.gripper_open_wide)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 347, + "id": "ef000acf", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "71.231" + ] + }, + "execution_count": 347, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pf400.close_gripper(70.0)" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "e9f99e32", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'0 0 -8 145 0 0 0'" + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pf400.send_command(\"tool\")" + ] + }, + { + "cell_type": "code", + "execution_count": 318, + "id": "3689e6af", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'0 0 0 0 0'" + ] + }, + "execution_count": 318, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pf400.send_command(\"base\")" + ] + }, + { + "cell_type": "code", + "execution_count": 201, + "id": "956d4e2b", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[1152.917, 11.806, 130.013, -4.392, 90.0, 180.0]" + ] + }, + "execution_count": 201, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pf400.get_cartesian_coordinates()" + ] + }, + { + "cell_type": "code", + "execution_count": 173, + "id": "24511083", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'0'" + ] + }, + "execution_count": 173, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pf400.move_cartesian([1427.667, 150.069, 175.292 - 100, -90 + -2.299, 90.0, 180.0])" + ] + }, + { + "cell_type": "code", + "execution_count": 199, + "id": "0da2cfa9", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[2m2026-05-15T15:02:19.789546Z\u001b[0m [\u001b[31m\u001b[1merror \u001b[0m] \u001b[1m*Joint out-of-range* Set robot joints within their range\u001b[0m \u001b[36mevent_type\u001b[0m=\u001b[35mlog_error\u001b[0m\n", + "\u001b[2m2026-05-15T15:02:19.789546Z\u001b[0m [\u001b[31m\u001b[1merror \u001b[0m] \u001b[1m*Joint out-of-range* Set robot joints within their range\u001b[0m \u001b[36mevent_type\u001b[0m=\u001b[35mlog_error\u001b[0m\n" + ] + }, + { + "data": { + "text/html": [ + "
╭─────────────────────────────────────── Traceback (most recent call last) ───────────────────────────────────────╮\n",
+       " in <module>:1                                                                                                   \n",
+       "                                                                                                                 \n",
+       " 1 pf400.move_cartesian([1000, 0, 100, 0.0, 90.0, 180.0])                                                      \n",
+       "   2                                                                                                             \n",
+       "                                                                                                                 \n",
+       " /home/rpl/workspaces/rpl_dev/pf400_module/src/pf400_interface/pf400.py:592 in move_cartesian                    \n",
+       "                                                                                                                 \n",
+       "    589 │   │   │   + \" \"                                                                                        \n",
+       "    590 │   │   │   + \" \".join(map(str, target_cartesian_coordinates))                                           \n",
+       "    591 │   │   )                                                                                                \n",
+       "  592 │   │   return self.send_command(move_command)                                                           \n",
+       "    593                                                                                                      \n",
+       "    594 def move_in_one_axis(                                                                                \n",
+       "    595 │   │   self, profile: int = 1, axis_x: int = 0, axis_y: int = 0, axis_z: int = 0                        \n",
+       "                                                                                                                 \n",
+       " /home/rpl/workspaces/rpl_dev/pf400_module/src/pf400_interface/pf400.py:163 in send_command                      \n",
+       "                                                                                                                 \n",
+       "    160 │   │   │   │   │   .rstrip(\"\\r\\n\")                                                                      \n",
+       "    161 │   │   │   │   )                                                                                        \n",
+       "    162 │   │   │   │   if response != \"\" and response in ERROR_CODES:                                           \n",
+       "  163 │   │   │   │   │   self._handle_error_output(response)                                                  \n",
+       "    164 │   │   │   │   if response in OUTPUT_CODES:                                                             \n",
+       "    165 │   │   │   │   │   self.logger.log_debug(response)                                                      \n",
+       "    166 │   │   │   │   self._await_movement_completion()                                                        \n",
+       "                                                                                                                 \n",
+       " /home/rpl/workspaces/rpl_dev/pf400_module/src/pf400_interface/pf400.py:212 in _handle_error_output              \n",
+       "                                                                                                                 \n",
+       "    209 │   │   \"\"\"Handles the error message output.\"\"\"                                                          \n",
+       "    210 │   │   response = Pf400ResponseError.from_error_code(output)                                            \n",
+       "    211 │   │   self.logger.log_error(response)                                                                  \n",
+       "  212 │   │   raise response                                                                                   \n",
+       "    213                                                                                                      \n",
+       "    214 def enable_power(self) -> str:                                                                       \n",
+       "    215 │   │   \"\"\"Enables the power on the robot.\"\"\"                                                            \n",
+       "╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\n",
+       "Pf400ResponseError: *Joint out-of-range* Set robot joints within their range\n",
+       "
\n" + ], + "text/plain": [ + "\u001b[31m╭─\u001b[0m\u001b[31m──────────────────────────────────────\u001b[0m\u001b[31m \u001b[0m\u001b[1;31mTraceback \u001b[0m\u001b[1;2;31m(most recent call last)\u001b[0m\u001b[31m \u001b[0m\u001b[31m──────────────────────────────────────\u001b[0m\u001b[31m─╮\u001b[0m\n", + "\u001b[31m│\u001b[0m in :1 \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[31m❱ \u001b[0m1 \u001b[1;4mpf400.move_cartesian([\u001b[0m\u001b[1;4;94m1000\u001b[0m\u001b[1;4m, \u001b[0m\u001b[1;4;94m0\u001b[0m\u001b[1;4m, \u001b[0m\u001b[1;4;94m100\u001b[0m\u001b[1;4m, \u001b[0m\u001b[1;4;94m0.0\u001b[0m\u001b[1;4m, \u001b[0m\u001b[1;4;94m90.0\u001b[0m\u001b[1;4m, \u001b[0m\u001b[1;4;94m180.0\u001b[0m\u001b[1;4m])\u001b[0m \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m2 \u001b[0m \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m/home/rpl/workspaces/rpl_dev/pf400_module/src/pf400_interface/\u001b[0m\u001b[1mpf400.py\u001b[0m:592 in move_cartesian \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m 589 \u001b[0m\u001b[2m│ │ │ \u001b[0m+ \u001b[33m\"\u001b[0m\u001b[33m \u001b[0m\u001b[33m\"\u001b[0m \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m 590 \u001b[0m\u001b[2m│ │ │ \u001b[0m+ \u001b[33m\"\u001b[0m\u001b[33m \u001b[0m\u001b[33m\"\u001b[0m.join(\u001b[96mmap\u001b[0m(\u001b[96mstr\u001b[0m, target_cartesian_coordinates)) \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m 591 \u001b[0m\u001b[2m│ │ \u001b[0m) \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[31m❱ \u001b[0m 592 \u001b[2m│ │ \u001b[0m\u001b[94mreturn\u001b[0m \u001b[1;4;96mself\u001b[0m\u001b[1;4m.send_command(move_command)\u001b[0m \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m 593 \u001b[0m\u001b[2m│ \u001b[0m \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m 594 \u001b[0m\u001b[2m│ \u001b[0m\u001b[94mdef\u001b[0m\u001b[90m \u001b[0m\u001b[92mmove_in_one_axis\u001b[0m( \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m 595 \u001b[0m\u001b[2m│ │ \u001b[0m\u001b[96mself\u001b[0m, profile: \u001b[96mint\u001b[0m = \u001b[94m1\u001b[0m, axis_x: \u001b[96mint\u001b[0m = \u001b[94m0\u001b[0m, axis_y: \u001b[96mint\u001b[0m = \u001b[94m0\u001b[0m, axis_z: \u001b[96mint\u001b[0m = \u001b[94m0\u001b[0m \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m/home/rpl/workspaces/rpl_dev/pf400_module/src/pf400_interface/\u001b[0m\u001b[1mpf400.py\u001b[0m:163 in send_command \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m 160 \u001b[0m\u001b[2m│ │ │ │ │ \u001b[0m.rstrip(\u001b[33m\"\u001b[0m\u001b[33m\\r\u001b[0m\u001b[33m\\n\u001b[0m\u001b[33m\"\u001b[0m) \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m 161 \u001b[0m\u001b[2m│ │ │ │ \u001b[0m) \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m 162 \u001b[0m\u001b[2m│ │ │ │ \u001b[0m\u001b[94mif\u001b[0m response != \u001b[33m\"\u001b[0m\u001b[33m\"\u001b[0m \u001b[95mand\u001b[0m response \u001b[95min\u001b[0m ERROR_CODES: \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[31m❱ \u001b[0m 163 \u001b[2m│ │ │ │ │ \u001b[0m\u001b[96mself\u001b[0m._handle_error_output(response) \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m 164 \u001b[0m\u001b[2m│ │ │ │ \u001b[0m\u001b[94mif\u001b[0m response \u001b[95min\u001b[0m OUTPUT_CODES: \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m 165 \u001b[0m\u001b[2m│ │ │ │ │ \u001b[0m\u001b[96mself\u001b[0m.logger.log_debug(response) \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m 166 \u001b[0m\u001b[2m│ │ │ │ \u001b[0m\u001b[96mself\u001b[0m._await_movement_completion() \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m/home/rpl/workspaces/rpl_dev/pf400_module/src/pf400_interface/\u001b[0m\u001b[1mpf400.py\u001b[0m:212 in _handle_error_output \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m 209 \u001b[0m\u001b[2;90m│ │ \u001b[0m\u001b[33m\"\"\"Handles the error message output.\"\"\"\u001b[0m \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m 210 \u001b[0m\u001b[2m│ │ \u001b[0mresponse = Pf400ResponseError.from_error_code(output) \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m 211 \u001b[0m\u001b[2m│ │ \u001b[0m\u001b[96mself\u001b[0m.logger.log_error(response) \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[31m❱ \u001b[0m 212 \u001b[2m│ │ \u001b[0m\u001b[1;4;94mraise\u001b[0m\u001b[1;4m response\u001b[0m \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m 213 \u001b[0m\u001b[2m│ \u001b[0m \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m 214 \u001b[0m\u001b[2m│ \u001b[0m\u001b[94mdef\u001b[0m\u001b[90m \u001b[0m\u001b[92menable_power\u001b[0m(\u001b[96mself\u001b[0m) -> \u001b[96mstr\u001b[0m: \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m 215 \u001b[0m\u001b[2;90m│ │ \u001b[0m\u001b[33m\"\"\"Enables the power on the robot.\"\"\"\u001b[0m \u001b[31m│\u001b[0m\n", + "\u001b[31m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m\n", + "\u001b[1;91mPf400ResponseError: \u001b[0m*Joint out-of-range* Set robot joints within their range\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "pf400.move_cartesian([1000, 0, 100, 0.0, 90.0, 180.0])" + ] + }, + { + "cell_type": "code", + "execution_count": 200, + "id": "19b9a6ef", + "metadata": {}, + "outputs": [], + "source": [ + "pf400.move_neutral()" + ] + }, + { + "cell_type": "code", + "execution_count": 282, + "id": "f32966f7", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[2m2026-05-15T20:01:35.076594Z\u001b[0m [\u001b[31m\u001b[1merror \u001b[0m] \u001b[1m*No robot attached* \u001b[0m \u001b[36mevent_type\u001b[0m=\u001b[35mlog_error\u001b[0m\n", + "\u001b[2m2026-05-15T20:01:35.076594Z\u001b[0m [\u001b[31m\u001b[1merror \u001b[0m] \u001b[1m*No robot attached* \u001b[0m \u001b[36mevent_type\u001b[0m=\u001b[35mlog_error\u001b[0m\n" + ] + }, + { + "data": { + "text/html": [ + "
╭─────────────────────────────────────── Traceback (most recent call last) ───────────────────────────────────────╮\n",
+       " in <module>:1                                                                                                   \n",
+       "                                                                                                                 \n",
+       " 1 pf400.open_gripper()                                                                                        \n",
+       "   2                                                                                                             \n",
+       "                                                                                                                 \n",
+       " /home/rpl/workspaces/rpl_dev/pf400_module/src/pf400_interface/pf400.py:422 in open_gripper                      \n",
+       "                                                                                                                 \n",
+       "    419 def open_gripper(self, gripper_length: Optional[int] = None) -> float:                               \n",
+       "    420 │   │   \"\"\"Opens the gripper.\"\"\"                                                                         \n",
+       "    421 │   │   self.set_gripper_open(gripper_length=gripper_length)                                             \n",
+       "  422 │   │   self.send_command(\"gripper 1\")                                                                   \n",
+       "    423 │   │   return self.get_gripper_state()                                                                  \n",
+       "    424                                                                                                      \n",
+       "    425 def close_gripper(self, gripper_length: Optional[int] = None) -> float:                              \n",
+       "                                                                                                                 \n",
+       " /home/rpl/workspaces/rpl_dev/pf400_module/src/pf400_interface/pf400.py:163 in send_command                      \n",
+       "                                                                                                                 \n",
+       "    160 │   │   │   │   │   .rstrip(\"\\r\\n\")                                                                      \n",
+       "    161 │   │   │   │   )                                                                                        \n",
+       "    162 │   │   │   │   if response != \"\" and response in ERROR_CODES:                                           \n",
+       "  163 │   │   │   │   │   self._handle_error_output(response)                                                  \n",
+       "    164 │   │   │   │   if response in OUTPUT_CODES:                                                             \n",
+       "    165 │   │   │   │   │   self.logger.log_debug(response)                                                      \n",
+       "    166 │   │   │   │   self._await_movement_completion()                                                        \n",
+       "                                                                                                                 \n",
+       " /home/rpl/workspaces/rpl_dev/pf400_module/src/pf400_interface/pf400.py:212 in _handle_error_output              \n",
+       "                                                                                                                 \n",
+       "    209 │   │   \"\"\"Handles the error message output.\"\"\"                                                          \n",
+       "    210 │   │   response = Pf400ResponseError.from_error_code(output)                                            \n",
+       "    211 │   │   self.logger.log_error(response)                                                                  \n",
+       "  212 │   │   raise response                                                                                   \n",
+       "    213                                                                                                      \n",
+       "    214 def enable_power(self) -> str:                                                                       \n",
+       "    215 │   │   \"\"\"Enables the power on the robot.\"\"\"                                                            \n",
+       "╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\n",
+       "Pf400ResponseError: *No robot attached*\n",
+       "
\n" + ], + "text/plain": [ + "\u001b[31m╭─\u001b[0m\u001b[31m──────────────────────────────────────\u001b[0m\u001b[31m \u001b[0m\u001b[1;31mTraceback \u001b[0m\u001b[1;2;31m(most recent call last)\u001b[0m\u001b[31m \u001b[0m\u001b[31m──────────────────────────────────────\u001b[0m\u001b[31m─╮\u001b[0m\n", + "\u001b[31m│\u001b[0m in :1 \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[31m❱ \u001b[0m1 \u001b[1;4mpf400.open_gripper()\u001b[0m \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m2 \u001b[0m \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m/home/rpl/workspaces/rpl_dev/pf400_module/src/pf400_interface/\u001b[0m\u001b[1mpf400.py\u001b[0m:422 in open_gripper \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m 419 \u001b[0m\u001b[2m│ \u001b[0m\u001b[94mdef\u001b[0m\u001b[90m \u001b[0m\u001b[92mopen_gripper\u001b[0m(\u001b[96mself\u001b[0m, gripper_length: Optional[\u001b[96mint\u001b[0m] = \u001b[94mNone\u001b[0m) -> \u001b[96mfloat\u001b[0m: \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m 420 \u001b[0m\u001b[2;90m│ │ \u001b[0m\u001b[33m\"\"\"Opens the gripper.\"\"\"\u001b[0m \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m 421 \u001b[0m\u001b[2m│ │ \u001b[0m\u001b[96mself\u001b[0m.set_gripper_open(gripper_length=gripper_length) \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[31m❱ \u001b[0m 422 \u001b[2m│ │ \u001b[0m\u001b[1;4;96mself\u001b[0m\u001b[1;4m.send_command(\u001b[0m\u001b[1;4;33m\"\u001b[0m\u001b[1;4;33mgripper 1\u001b[0m\u001b[1;4;33m\"\u001b[0m\u001b[1;4m)\u001b[0m \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m 423 \u001b[0m\u001b[2m│ │ \u001b[0m\u001b[94mreturn\u001b[0m \u001b[96mself\u001b[0m.get_gripper_state() \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m 424 \u001b[0m\u001b[2m│ \u001b[0m \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m 425 \u001b[0m\u001b[2m│ \u001b[0m\u001b[94mdef\u001b[0m\u001b[90m \u001b[0m\u001b[92mclose_gripper\u001b[0m(\u001b[96mself\u001b[0m, gripper_length: Optional[\u001b[96mint\u001b[0m] = \u001b[94mNone\u001b[0m) -> \u001b[96mfloat\u001b[0m: \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m/home/rpl/workspaces/rpl_dev/pf400_module/src/pf400_interface/\u001b[0m\u001b[1mpf400.py\u001b[0m:163 in send_command \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m 160 \u001b[0m\u001b[2m│ │ │ │ │ \u001b[0m.rstrip(\u001b[33m\"\u001b[0m\u001b[33m\\r\u001b[0m\u001b[33m\\n\u001b[0m\u001b[33m\"\u001b[0m) \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m 161 \u001b[0m\u001b[2m│ │ │ │ \u001b[0m) \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m 162 \u001b[0m\u001b[2m│ │ │ │ \u001b[0m\u001b[94mif\u001b[0m response != \u001b[33m\"\u001b[0m\u001b[33m\"\u001b[0m \u001b[95mand\u001b[0m response \u001b[95min\u001b[0m ERROR_CODES: \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[31m❱ \u001b[0m 163 \u001b[2m│ │ │ │ │ \u001b[0m\u001b[96mself\u001b[0m._handle_error_output(response) \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m 164 \u001b[0m\u001b[2m│ │ │ │ \u001b[0m\u001b[94mif\u001b[0m response \u001b[95min\u001b[0m OUTPUT_CODES: \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m 165 \u001b[0m\u001b[2m│ │ │ │ │ \u001b[0m\u001b[96mself\u001b[0m.logger.log_debug(response) \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m 166 \u001b[0m\u001b[2m│ │ │ │ \u001b[0m\u001b[96mself\u001b[0m._await_movement_completion() \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m/home/rpl/workspaces/rpl_dev/pf400_module/src/pf400_interface/\u001b[0m\u001b[1mpf400.py\u001b[0m:212 in _handle_error_output \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m 209 \u001b[0m\u001b[2;90m│ │ \u001b[0m\u001b[33m\"\"\"Handles the error message output.\"\"\"\u001b[0m \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m 210 \u001b[0m\u001b[2m│ │ \u001b[0mresponse = Pf400ResponseError.from_error_code(output) \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m 211 \u001b[0m\u001b[2m│ │ \u001b[0m\u001b[96mself\u001b[0m.logger.log_error(response) \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[31m❱ \u001b[0m 212 \u001b[2m│ │ \u001b[0m\u001b[1;4;94mraise\u001b[0m\u001b[1;4m response\u001b[0m \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m 213 \u001b[0m\u001b[2m│ \u001b[0m \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m 214 \u001b[0m\u001b[2m│ \u001b[0m\u001b[94mdef\u001b[0m\u001b[90m \u001b[0m\u001b[92menable_power\u001b[0m(\u001b[96mself\u001b[0m) -> \u001b[96mstr\u001b[0m: \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m 215 \u001b[0m\u001b[2;90m│ │ \u001b[0m\u001b[33m\"\"\"Enables the power on the robot.\"\"\"\u001b[0m \u001b[31m│\u001b[0m\n", + "\u001b[31m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m\n", + "\u001b[1;91mPf400ResponseError: \u001b[0m*No robot attached*\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "pf400.open_gripper()" + ] + }, + { + "cell_type": "code", + "execution_count": 123, "id": "6", "metadata": {}, "outputs": [], @@ -99,7 +745,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.3" + "version": "3.12.12" } }, "nbformat": 4, From 77676fa0f47d2dce5438051070b73ca01b2aeed7 Mon Sep 17 00:00:00 2001 From: Dozgulbas Date: Tue, 19 May 2026 17:01:59 -0500 Subject: [PATCH 17/21] Using hardcoded compliance values --- src/pf400_interface/pf400.py | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/pf400_interface/pf400.py b/src/pf400_interface/pf400.py index 776fb02..7ff3972 100644 --- a/src/pf400_interface/pf400.py +++ b/src/pf400_interface/pf400.py @@ -39,6 +39,7 @@ class PF400: safe_left_boundary = -350.0 safe_right_boundary = 350.0 + default_bias_torque_pct: int = 50 default_approach_height = 15.0 default_approach_vector: typing.ClassVar[list] = [ default_approach_height, @@ -526,7 +527,7 @@ def move_with_rotation( # Requires XY Compliance license on the controller. # ------------------------------------------------------------------------- - def enable_compliance(self, bias_torque_pct: int = 0) -> str: + def enable_compliance(self) -> str: """Enable horizontal force compliance on the robot joints. Allows the horizontal arm axes to float and comply to reaction forces @@ -543,7 +544,7 @@ def enable_compliance(self, bias_torque_pct: int = 0) -> str: Returns: Robot response string """ - return self.send_robot_command(f"EnableCompliance {bias_torque_pct}") + return self.send_command(f"EnableCompliance {self.default_bias_torque_pct}") def disable_compliance(self) -> str: """Disable horizontal force compliance and return to normal position control. @@ -554,7 +555,7 @@ def disable_compliance(self) -> str: Returns: Robot response string """ - return self.send_robot_command("DisableCompliance") + return self.send_command("DisableCompliance") # ------------------------------------------------------------------------- # Height Detection -- implemented via TCS PARobot Auto Center module @@ -583,7 +584,7 @@ def height_detect( Detected Z height in mm (world coordinates) """ mode = 2 if thorough else 1 - response = self.send_robot_command( + response = self.send_command( f"HeightDetect {mode} {search_limit_mm} {max_force_n}" ) return float(response.split(" ")[1]) @@ -789,6 +790,7 @@ def rotate_plate_on_deck( self.move_all_joints_neutral(target) self.move_joint(above_position, self.slow_motion_profile) + self.enable_compliance() self.move_joint(target, self.slow_motion_profile) self.release_plate() @@ -807,6 +809,7 @@ def rotate_plate_on_deck( self.move_in_one_axis( profile=self.slow_motion_profile, axis_z=self.default_approach_height ) + self.disable_compliance() self.open_gripper(self.gripper_open_wide) target = self.rotate_yaw(target, rotation_degree) @@ -814,6 +817,7 @@ def rotate_plate_on_deck( self.move_joint( target_joint_angles=above_position, profile=self.slow_motion_profile ) + self.enable_compliance() self.move_joint( target_joint_angles=target, profile=self.slow_motion_profile, @@ -836,6 +840,7 @@ def rotate_plate_on_deck( self.move_in_one_axis( profile=self.slow_motion_profile, axis_z=self.default_approach_height ) + self.disable_compliance() self.move_all_joints_neutral(target) def _handle_approach_location(self, approach: LocationArgument) -> None: @@ -925,6 +930,7 @@ def pick_plate( if grab_offset else source.representation ) + self.enable_compliance() self.move_joint( target_joint_angles=target_position, profile=approach_motion_profile, @@ -946,6 +952,7 @@ def pick_plate( if approach_height_offset else self.default_approach_height, ) + self.disable_compliance() if source_approach: self._handle_approach_return(source_approach) @@ -981,6 +988,7 @@ def place_plate( if grab_offset else target.representation ) + self.enable_compliance() self.move_joint(target_position, approach_motion_profile) release_succeeded = self.release_plate(width=open_width) @@ -1006,7 +1014,7 @@ def place_plate( if approach_height_offset else self.default_approach_height, ) - + self.disable_compliance() if target_approach: self._handle_approach_return(target_approach) else: From 18511390e3be011020ed6558601c1422d716eae4 Mon Sep 17 00:00:00 2001 From: Dozgulbas Date: Tue, 19 May 2026 17:02:14 -0500 Subject: [PATCH 18/21] More tests --- tests/set_tcp.ipynb | 161 ++++++++++ tests/test_pf400_interface.ipynb | 500 +++++-------------------------- 2 files changed, 232 insertions(+), 429 deletions(-) create mode 100644 tests/set_tcp.ipynb diff --git a/tests/set_tcp.ipynb b/tests/set_tcp.ipynb new file mode 100644 index 0000000..9bcbc0c --- /dev/null +++ b/tests/set_tcp.ipynb @@ -0,0 +1,161 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "34aeaee3", + "metadata": {}, + "outputs": [], + "source": [ + "from pf400_interface.pf400 import PF400" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "8391c5af", + "metadata": {}, + "outputs": [], + "source": [ + "from operator import add\n", + "from madsci.common.types.location_types import LocationArgument" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "ea7fbda8", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[2m2026-05-19T21:00:41.341979Z\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mEventClient initialized \u001b[0m \u001b[36mclient_name\u001b[0m=\u001b[35mpf400_interface.pf400\u001b[0m \u001b[36mevent_server\u001b[0m=\u001b[35m'Not configured'\u001b[0m \u001b[36mlog_dir\u001b[0m=\u001b[35m/home/rpl/workspaces/rpl_dev/pf400_module/.madsci/logs\u001b[0m \u001b[36mlog_level\u001b[0m=\u001b[35mEventLogLevel.INFO\u001b[0m \u001b[36mmadsci_version\u001b[0m=\u001b[35m0.7.0\u001b[0m \u001b[36mplatform\u001b[0m=\u001b[35mLinux-6.17.0-19-generic-x86_64-with-glibc2.42\u001b[0m \u001b[36mpython_version\u001b[0m=\u001b[35m3.12.12\u001b[0m\n" + ] + }, + { + "data": { + "text/plain": [ + "1" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\n", + "pf400 = PF400(host=\"rplpf400.cels.anl.gov\")\n", + "pf400.initialize_robot()\n", + "pf400.get_robot_movement_state()" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "23d44ef8", + "metadata": {}, + "outputs": [], + "source": [ + "rotation_deck = LocationArgument(\n", + " location_name=\"rotation_deck\", location = [68.287,-27.703,113.691,631.713,75.088,994.854]\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "f5f043cb", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'0 0 -8 148 0 0 0'" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pf400.send_command(\"tool\")" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "681e2ea1", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1431.177, 150.432, 68.287, -2.299, 90.0, 180.0]\n" + ] + }, + { + "data": { + "text/plain": [ + "'0'" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "cart = pf400.joint_to_cart(rotation_deck.representation)\n", + "print(cart)\n", + "pf400.move_with_rotation(rotation_deck.representation, -90.0)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "8bd11120", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'0'" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pf400.send_command(\"tool 0 -8.5 148.5 0 0 0\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/tests/test_pf400_interface.ipynb b/tests/test_pf400_interface.ipynb index 0cd4611..02a978e 100644 --- a/tests/test_pf400_interface.ipynb +++ b/tests/test_pf400_interface.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 124, + "execution_count": 1, "id": "0", "metadata": {}, "outputs": [], @@ -12,7 +12,7 @@ }, { "cell_type": "code", - "execution_count": 125, + "execution_count": 2, "id": "1", "metadata": {}, "outputs": [ @@ -20,7 +20,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "\u001b[2m2026-05-18T22:10:39.280362Z\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mEventClient initialized \u001b[0m \u001b[36mclient_name\u001b[0m=\u001b[35mpf400_interface.pf400\u001b[0m \u001b[36mevent_server\u001b[0m=\u001b[35m'Not configured'\u001b[0m \u001b[36mlog_dir\u001b[0m=\u001b[35m/home/rpl/workspaces/rpl_dev/pf400_module/.madsci/logs\u001b[0m \u001b[36mlog_level\u001b[0m=\u001b[35mEventLogLevel.INFO\u001b[0m \u001b[36mmadsci_version\u001b[0m=\u001b[35m0.7.0\u001b[0m \u001b[36mplatform\u001b[0m=\u001b[35mLinux-6.17.0-19-generic-x86_64-with-glibc2.42\u001b[0m \u001b[36mpython_version\u001b[0m=\u001b[35m3.12.12\u001b[0m\n" + "\u001b[2m2026-05-19T20:55:54.094275Z\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mEventClient initialized \u001b[0m \u001b[36mclient_name\u001b[0m=\u001b[35mpf400_interface.pf400\u001b[0m \u001b[36mevent_server\u001b[0m=\u001b[35m'Not configured'\u001b[0m \u001b[36mlog_dir\u001b[0m=\u001b[35m/home/rpl/workspaces/rpl_dev/pf400_module/.madsci/logs\u001b[0m \u001b[36mlog_level\u001b[0m=\u001b[35mEventLogLevel.INFO\u001b[0m \u001b[36mmadsci_version\u001b[0m=\u001b[35m0.7.0\u001b[0m \u001b[36mplatform\u001b[0m=\u001b[35mLinux-6.17.0-19-generic-x86_64-with-glibc2.42\u001b[0m \u001b[36mpython_version\u001b[0m=\u001b[35m3.12.12\u001b[0m\n" ] }, { @@ -29,7 +29,7 @@ "1" ] }, - "execution_count": 125, + "execution_count": 2, "metadata": {}, "output_type": "execute_result" } @@ -43,7 +43,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 3, "id": "2", "metadata": {}, "outputs": [], @@ -60,105 +60,10 @@ }, { "cell_type": "code", - "execution_count": 115, + "execution_count": null, "id": "3", "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\u001b[2m2026-05-18T22:09:12.860598Z\u001b[0m [\u001b[31m\u001b[1merror \u001b[0m] \u001b[1m*Soft envelope error* Robot 1: 1\u001b[0m \u001b[36mevent_type\u001b[0m=\u001b[35mlog_error\u001b[0m\n" - ] - }, - { - "data": { - "text/html": [ - "
╭─────────────────────────────────────── Traceback (most recent call last) ───────────────────────────────────────╮\n",
-       " in <module>:2                                                                                                   \n",
-       "                                                                                                                 \n",
-       "   1 pf400.open_gripper(pf400.gripper_open_wide)                                                                 \n",
-       " 2 pf400.close_gripper(pf400.gripper_close_narrow)                                                             \n",
-       "   3                                                                                                             \n",
-       "                                                                                                                 \n",
-       " /home/rpl/workspaces/rpl_dev/pf400_module/src/pf400_interface/pf400.py:428 in close_gripper                     \n",
-       "                                                                                                                 \n",
-       "    425 def close_gripper(self, gripper_length: Optional[int] = None) -> float:                              \n",
-       "    426 │   │   \"\"\"Closes the gripper.\"\"\"                                                                        \n",
-       "    427 │   │   self.set_gripper_close(gripper_length=gripper_length)                                            \n",
-       "  428 │   │   self.send_command(\"gripper 2\")                                                                   \n",
-       "    429 │   │   return self.get_gripper_state()                                                                  \n",
-       "    430                                                                                                      \n",
-       "    431 # -------------------------------------------------------------------------                          \n",
-       "                                                                                                                 \n",
-       " /home/rpl/workspaces/rpl_dev/pf400_module/src/pf400_interface/pf400.py:163 in send_command                      \n",
-       "                                                                                                                 \n",
-       "    160 │   │   │   │   │   .rstrip(\"\\r\\n\")                                                                      \n",
-       "    161 │   │   │   │   )                                                                                        \n",
-       "    162 │   │   │   │   if response != \"\" and response in ERROR_CODES:                                           \n",
-       "  163 │   │   │   │   │   self._handle_error_output(response)                                                  \n",
-       "    164 │   │   │   │   if response in OUTPUT_CODES:                                                             \n",
-       "    165 │   │   │   │   │   self.logger.log_debug(response)                                                      \n",
-       "    166 │   │   │   │   self._await_movement_completion()                                                        \n",
-       "                                                                                                                 \n",
-       " /home/rpl/workspaces/rpl_dev/pf400_module/src/pf400_interface/pf400.py:212 in _handle_error_output              \n",
-       "                                                                                                                 \n",
-       "    209 │   │   \"\"\"Handles the error message output.\"\"\"                                                          \n",
-       "    210 │   │   response = Pf400ResponseError.from_error_code(output)                                            \n",
-       "    211 │   │   self.logger.log_error(response)                                                                  \n",
-       "  212 │   │   raise response                                                                                   \n",
-       "    213                                                                                                      \n",
-       "    214 def enable_power(self) -> str:                                                                       \n",
-       "    215 │   │   \"\"\"Enables the power on the robot.\"\"\"                                                            \n",
-       "╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\n",
-       "Pf400ResponseError: *Soft envelope error* Robot 1: 1\n",
-       "
\n" - ], - "text/plain": [ - "\u001b[31m╭─\u001b[0m\u001b[31m──────────────────────────────────────\u001b[0m\u001b[31m \u001b[0m\u001b[1;31mTraceback \u001b[0m\u001b[1;2;31m(most recent call last)\u001b[0m\u001b[31m \u001b[0m\u001b[31m──────────────────────────────────────\u001b[0m\u001b[31m─╮\u001b[0m\n", - "\u001b[31m│\u001b[0m in :2 \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[2m1 \u001b[0mpf400.open_gripper(pf400.gripper_open_wide) \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[31m❱ \u001b[0m2 \u001b[1;4mpf400.close_gripper(pf400.gripper_close_narrow)\u001b[0m \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[2m3 \u001b[0m \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[2m/home/rpl/workspaces/rpl_dev/pf400_module/src/pf400_interface/\u001b[0m\u001b[1mpf400.py\u001b[0m:428 in close_gripper \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[2m 425 \u001b[0m\u001b[2m│ \u001b[0m\u001b[94mdef\u001b[0m\u001b[90m \u001b[0m\u001b[92mclose_gripper\u001b[0m(\u001b[96mself\u001b[0m, gripper_length: Optional[\u001b[96mint\u001b[0m] = \u001b[94mNone\u001b[0m) -> \u001b[96mfloat\u001b[0m: \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[2m 426 \u001b[0m\u001b[2;90m│ │ \u001b[0m\u001b[33m\"\"\"Closes the gripper.\"\"\"\u001b[0m \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[2m 427 \u001b[0m\u001b[2m│ │ \u001b[0m\u001b[96mself\u001b[0m.set_gripper_close(gripper_length=gripper_length) \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[31m❱ \u001b[0m 428 \u001b[2m│ │ \u001b[0m\u001b[1;4;96mself\u001b[0m\u001b[1;4m.send_command(\u001b[0m\u001b[1;4;33m\"\u001b[0m\u001b[1;4;33mgripper 2\u001b[0m\u001b[1;4;33m\"\u001b[0m\u001b[1;4m)\u001b[0m \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[2m 429 \u001b[0m\u001b[2m│ │ \u001b[0m\u001b[94mreturn\u001b[0m \u001b[96mself\u001b[0m.get_gripper_state() \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[2m 430 \u001b[0m\u001b[2m│ \u001b[0m \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[2m 431 \u001b[0m\u001b[2m│ \u001b[0m\u001b[2m# -------------------------------------------------------------------------\u001b[0m \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[2m/home/rpl/workspaces/rpl_dev/pf400_module/src/pf400_interface/\u001b[0m\u001b[1mpf400.py\u001b[0m:163 in send_command \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[2m 160 \u001b[0m\u001b[2m│ │ │ │ │ \u001b[0m.rstrip(\u001b[33m\"\u001b[0m\u001b[33m\\r\u001b[0m\u001b[33m\\n\u001b[0m\u001b[33m\"\u001b[0m) \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[2m 161 \u001b[0m\u001b[2m│ │ │ │ \u001b[0m) \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[2m 162 \u001b[0m\u001b[2m│ │ │ │ \u001b[0m\u001b[94mif\u001b[0m response != \u001b[33m\"\u001b[0m\u001b[33m\"\u001b[0m \u001b[95mand\u001b[0m response \u001b[95min\u001b[0m ERROR_CODES: \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[31m❱ \u001b[0m 163 \u001b[2m│ │ │ │ │ \u001b[0m\u001b[96mself\u001b[0m._handle_error_output(response) \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[2m 164 \u001b[0m\u001b[2m│ │ │ │ \u001b[0m\u001b[94mif\u001b[0m response \u001b[95min\u001b[0m OUTPUT_CODES: \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[2m 165 \u001b[0m\u001b[2m│ │ │ │ │ \u001b[0m\u001b[96mself\u001b[0m.logger.log_debug(response) \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[2m 166 \u001b[0m\u001b[2m│ │ │ │ \u001b[0m\u001b[96mself\u001b[0m._await_movement_completion() \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[2m/home/rpl/workspaces/rpl_dev/pf400_module/src/pf400_interface/\u001b[0m\u001b[1mpf400.py\u001b[0m:212 in _handle_error_output \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[2m 209 \u001b[0m\u001b[2;90m│ │ \u001b[0m\u001b[33m\"\"\"Handles the error message output.\"\"\"\u001b[0m \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[2m 210 \u001b[0m\u001b[2m│ │ \u001b[0mresponse = Pf400ResponseError.from_error_code(output) \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[2m 211 \u001b[0m\u001b[2m│ │ \u001b[0m\u001b[96mself\u001b[0m.logger.log_error(response) \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[31m❱ \u001b[0m 212 \u001b[2m│ │ \u001b[0m\u001b[1;4;94mraise\u001b[0m\u001b[1;4m response\u001b[0m \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[2m 213 \u001b[0m\u001b[2m│ \u001b[0m \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[2m 214 \u001b[0m\u001b[2m│ \u001b[0m\u001b[94mdef\u001b[0m\u001b[90m \u001b[0m\u001b[92menable_power\u001b[0m(\u001b[96mself\u001b[0m) -> \u001b[96mstr\u001b[0m: \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[2m 215 \u001b[0m\u001b[2;90m│ │ \u001b[0m\u001b[33m\"\"\"Enables the power on the robot.\"\"\"\u001b[0m \u001b[31m│\u001b[0m\n", - "\u001b[31m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m\n", - "\u001b[1;91mPf400ResponseError: \u001b[0m*Soft envelope error* Robot \u001b[1;36m1\u001b[0m: \u001b[1;36m1\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "pf400.open_gripper(pf400.gripper_open_wide)\n", "pf400.close_gripper(pf400.gripper_close_narrow)" @@ -178,7 +83,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 4, "id": "58b72672", "metadata": {}, "outputs": [], @@ -193,30 +98,29 @@ }, { "cell_type": "code", - "execution_count": 33, - "id": "5", + "execution_count": 5, + "id": "966d1340", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "True" + "'0'" ] }, - "execution_count": 33, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "pf400.transfer(source=camera_loc, target=camera_loc, rotation_deck=rotation_deck, source_plate_rotation=\"narrow\", target_plate_rotation=\"wide\")\n", - "pf400.transfer(source=camera_loc, target=camera_loc, rotation_deck=rotation_deck, source_plate_rotation=\"wide\", target_plate_rotation=\"narrow\")" + "pf400.enable_compliance()" ] }, { "cell_type": "code", - "execution_count": 187, - "id": "3c7c7602", + "execution_count": 6, + "id": "5", "metadata": {}, "outputs": [ { @@ -225,40 +129,61 @@ "True" ] }, - "execution_count": 187, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "pf400.pick_plate(source=rotation_deck\n", - " )\n" + "pf400.transfer(source=camera_loc, target=camera_loc, rotation_deck=rotation_deck, source_plate_rotation=\"narrow\", target_plate_rotation=\"wide\")\n", + "#pf400.transfer(source=camera_loc, target=camera_loc, rotation_deck=rotation_deck, source_plate_rotation=\"wide\", target_plate_rotation=\"narrow\")" ] }, { "cell_type": "code", - "execution_count": 188, - "id": "4027bb28", + "execution_count": 6, + "id": "eb627d8c", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "True" + "'0'" ] }, - "execution_count": 188, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], + "source": [ + "pf400.disable_compliance()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3c7c7602", + "metadata": {}, + "outputs": [], + "source": [ + "pf400.pick_plate(source=rotation_deck\n", + " )\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4027bb28", + "metadata": {}, + "outputs": [], "source": [ "pf400.place_plate(target=camera_loc)" ] }, { "cell_type": "code", - "execution_count": 36, + "execution_count": null, "id": "c813d4ea", "metadata": {}, "outputs": [], @@ -268,7 +193,7 @@ }, { "cell_type": "code", - "execution_count": 43, + "execution_count": null, "id": "34c11807", "metadata": {}, "outputs": [], @@ -280,21 +205,10 @@ }, { "cell_type": "code", - "execution_count": 44, + "execution_count": null, "id": "13443d57", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'0 1428.252 164.005 75.293 -2.318 90 180 1'" - ] - }, - "execution_count": 44, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "pf400.move_joint(target_joint_angles=rotation_deck_above.representation)\n", "pf400.send_command(\"wherec\")" @@ -305,18 +219,7 @@ "execution_count": null, "id": "984573cd", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'0 1428.194 164.106 75.292 -92.296 90 -180 1'" - ] - }, - "execution_count": 45, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "new_loc =pf400.rotate_yaw(joint_states=rotation_deck_above.representation, rotation_deg=90.0)\n", "pf400.move_joint(new_loc)\n", @@ -325,28 +228,10 @@ }, { "cell_type": "code", - "execution_count": 154, + "execution_count": null, "id": "46f01a50", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[1430.657, 149.952, 75.287, -2.299, 90.0, 180.0]\n" - ] - }, - { - "data": { - "text/plain": [ - "'0'" - ] - }, - "execution_count": 154, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "cart = pf400.joint_to_cart(rotation_deck_above.representation)\n", "print(cart)\n", @@ -355,7 +240,7 @@ }, { "cell_type": "code", - "execution_count": 153, + "execution_count": 7, "id": "9d2def7b", "metadata": {}, "outputs": [ @@ -365,7 +250,7 @@ "'0'" ] }, - "execution_count": 153, + "execution_count": 7, "metadata": {}, "output_type": "execute_result" } @@ -376,59 +261,37 @@ }, { "cell_type": "code", - "execution_count": 339, + "execution_count": null, "id": "1f830ba8", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "129.918" - ] - }, - "execution_count": 339, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "pf400.open_gripper(pf400.gripper_open_wide)\n" ] }, { "cell_type": "code", - "execution_count": 347, + "execution_count": null, "id": "ef000acf", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "71.231" - ] - }, - "execution_count": 347, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "pf400.close_gripper(70.0)" ] }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 6, "id": "e9f99e32", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "'0 0 -8 145 0 0 0'" + "'0 0 0 162 0 0 0'" ] }, - "execution_count": 30, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } @@ -439,174 +302,47 @@ }, { "cell_type": "code", - "execution_count": 318, + "execution_count": null, "id": "3689e6af", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'0 0 0 0 0'" - ] - }, - "execution_count": 318, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "pf400.send_command(\"base\")" ] }, { "cell_type": "code", - "execution_count": 201, + "execution_count": null, "id": "956d4e2b", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[1152.917, 11.806, 130.013, -4.392, 90.0, 180.0]" - ] - }, - "execution_count": 201, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "pf400.get_cartesian_coordinates()" ] }, { "cell_type": "code", - "execution_count": 173, + "execution_count": null, "id": "24511083", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'0'" - ] - }, - "execution_count": 173, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "pf400.move_cartesian([1427.667, 150.069, 175.292 - 100, -90 + -2.299, 90.0, 180.0])" ] }, { "cell_type": "code", - "execution_count": 199, + "execution_count": null, "id": "0da2cfa9", "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\u001b[2m2026-05-15T15:02:19.789546Z\u001b[0m [\u001b[31m\u001b[1merror \u001b[0m] \u001b[1m*Joint out-of-range* Set robot joints within their range\u001b[0m \u001b[36mevent_type\u001b[0m=\u001b[35mlog_error\u001b[0m\n", - "\u001b[2m2026-05-15T15:02:19.789546Z\u001b[0m [\u001b[31m\u001b[1merror \u001b[0m] \u001b[1m*Joint out-of-range* Set robot joints within their range\u001b[0m \u001b[36mevent_type\u001b[0m=\u001b[35mlog_error\u001b[0m\n" - ] - }, - { - "data": { - "text/html": [ - "
╭─────────────────────────────────────── Traceback (most recent call last) ───────────────────────────────────────╮\n",
-       " in <module>:1                                                                                                   \n",
-       "                                                                                                                 \n",
-       " 1 pf400.move_cartesian([1000, 0, 100, 0.0, 90.0, 180.0])                                                      \n",
-       "   2                                                                                                             \n",
-       "                                                                                                                 \n",
-       " /home/rpl/workspaces/rpl_dev/pf400_module/src/pf400_interface/pf400.py:592 in move_cartesian                    \n",
-       "                                                                                                                 \n",
-       "    589 │   │   │   + \" \"                                                                                        \n",
-       "    590 │   │   │   + \" \".join(map(str, target_cartesian_coordinates))                                           \n",
-       "    591 │   │   )                                                                                                \n",
-       "  592 │   │   return self.send_command(move_command)                                                           \n",
-       "    593                                                                                                      \n",
-       "    594 def move_in_one_axis(                                                                                \n",
-       "    595 │   │   self, profile: int = 1, axis_x: int = 0, axis_y: int = 0, axis_z: int = 0                        \n",
-       "                                                                                                                 \n",
-       " /home/rpl/workspaces/rpl_dev/pf400_module/src/pf400_interface/pf400.py:163 in send_command                      \n",
-       "                                                                                                                 \n",
-       "    160 │   │   │   │   │   .rstrip(\"\\r\\n\")                                                                      \n",
-       "    161 │   │   │   │   )                                                                                        \n",
-       "    162 │   │   │   │   if response != \"\" and response in ERROR_CODES:                                           \n",
-       "  163 │   │   │   │   │   self._handle_error_output(response)                                                  \n",
-       "    164 │   │   │   │   if response in OUTPUT_CODES:                                                             \n",
-       "    165 │   │   │   │   │   self.logger.log_debug(response)                                                      \n",
-       "    166 │   │   │   │   self._await_movement_completion()                                                        \n",
-       "                                                                                                                 \n",
-       " /home/rpl/workspaces/rpl_dev/pf400_module/src/pf400_interface/pf400.py:212 in _handle_error_output              \n",
-       "                                                                                                                 \n",
-       "    209 │   │   \"\"\"Handles the error message output.\"\"\"                                                          \n",
-       "    210 │   │   response = Pf400ResponseError.from_error_code(output)                                            \n",
-       "    211 │   │   self.logger.log_error(response)                                                                  \n",
-       "  212 │   │   raise response                                                                                   \n",
-       "    213                                                                                                      \n",
-       "    214 def enable_power(self) -> str:                                                                       \n",
-       "    215 │   │   \"\"\"Enables the power on the robot.\"\"\"                                                            \n",
-       "╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\n",
-       "Pf400ResponseError: *Joint out-of-range* Set robot joints within their range\n",
-       "
\n" - ], - "text/plain": [ - "\u001b[31m╭─\u001b[0m\u001b[31m──────────────────────────────────────\u001b[0m\u001b[31m \u001b[0m\u001b[1;31mTraceback \u001b[0m\u001b[1;2;31m(most recent call last)\u001b[0m\u001b[31m \u001b[0m\u001b[31m──────────────────────────────────────\u001b[0m\u001b[31m─╮\u001b[0m\n", - "\u001b[31m│\u001b[0m in :1 \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[31m❱ \u001b[0m1 \u001b[1;4mpf400.move_cartesian([\u001b[0m\u001b[1;4;94m1000\u001b[0m\u001b[1;4m, \u001b[0m\u001b[1;4;94m0\u001b[0m\u001b[1;4m, \u001b[0m\u001b[1;4;94m100\u001b[0m\u001b[1;4m, \u001b[0m\u001b[1;4;94m0.0\u001b[0m\u001b[1;4m, \u001b[0m\u001b[1;4;94m90.0\u001b[0m\u001b[1;4m, \u001b[0m\u001b[1;4;94m180.0\u001b[0m\u001b[1;4m])\u001b[0m \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[2m2 \u001b[0m \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[2m/home/rpl/workspaces/rpl_dev/pf400_module/src/pf400_interface/\u001b[0m\u001b[1mpf400.py\u001b[0m:592 in move_cartesian \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[2m 589 \u001b[0m\u001b[2m│ │ │ \u001b[0m+ \u001b[33m\"\u001b[0m\u001b[33m \u001b[0m\u001b[33m\"\u001b[0m \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[2m 590 \u001b[0m\u001b[2m│ │ │ \u001b[0m+ \u001b[33m\"\u001b[0m\u001b[33m \u001b[0m\u001b[33m\"\u001b[0m.join(\u001b[96mmap\u001b[0m(\u001b[96mstr\u001b[0m, target_cartesian_coordinates)) \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[2m 591 \u001b[0m\u001b[2m│ │ \u001b[0m) \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[31m❱ \u001b[0m 592 \u001b[2m│ │ \u001b[0m\u001b[94mreturn\u001b[0m \u001b[1;4;96mself\u001b[0m\u001b[1;4m.send_command(move_command)\u001b[0m \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[2m 593 \u001b[0m\u001b[2m│ \u001b[0m \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[2m 594 \u001b[0m\u001b[2m│ \u001b[0m\u001b[94mdef\u001b[0m\u001b[90m \u001b[0m\u001b[92mmove_in_one_axis\u001b[0m( \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[2m 595 \u001b[0m\u001b[2m│ │ \u001b[0m\u001b[96mself\u001b[0m, profile: \u001b[96mint\u001b[0m = \u001b[94m1\u001b[0m, axis_x: \u001b[96mint\u001b[0m = \u001b[94m0\u001b[0m, axis_y: \u001b[96mint\u001b[0m = \u001b[94m0\u001b[0m, axis_z: \u001b[96mint\u001b[0m = \u001b[94m0\u001b[0m \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[2m/home/rpl/workspaces/rpl_dev/pf400_module/src/pf400_interface/\u001b[0m\u001b[1mpf400.py\u001b[0m:163 in send_command \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[2m 160 \u001b[0m\u001b[2m│ │ │ │ │ \u001b[0m.rstrip(\u001b[33m\"\u001b[0m\u001b[33m\\r\u001b[0m\u001b[33m\\n\u001b[0m\u001b[33m\"\u001b[0m) \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[2m 161 \u001b[0m\u001b[2m│ │ │ │ \u001b[0m) \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[2m 162 \u001b[0m\u001b[2m│ │ │ │ \u001b[0m\u001b[94mif\u001b[0m response != \u001b[33m\"\u001b[0m\u001b[33m\"\u001b[0m \u001b[95mand\u001b[0m response \u001b[95min\u001b[0m ERROR_CODES: \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[31m❱ \u001b[0m 163 \u001b[2m│ │ │ │ │ \u001b[0m\u001b[96mself\u001b[0m._handle_error_output(response) \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[2m 164 \u001b[0m\u001b[2m│ │ │ │ \u001b[0m\u001b[94mif\u001b[0m response \u001b[95min\u001b[0m OUTPUT_CODES: \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[2m 165 \u001b[0m\u001b[2m│ │ │ │ │ \u001b[0m\u001b[96mself\u001b[0m.logger.log_debug(response) \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[2m 166 \u001b[0m\u001b[2m│ │ │ │ \u001b[0m\u001b[96mself\u001b[0m._await_movement_completion() \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[2m/home/rpl/workspaces/rpl_dev/pf400_module/src/pf400_interface/\u001b[0m\u001b[1mpf400.py\u001b[0m:212 in _handle_error_output \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[2m 209 \u001b[0m\u001b[2;90m│ │ \u001b[0m\u001b[33m\"\"\"Handles the error message output.\"\"\"\u001b[0m \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[2m 210 \u001b[0m\u001b[2m│ │ \u001b[0mresponse = Pf400ResponseError.from_error_code(output) \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[2m 211 \u001b[0m\u001b[2m│ │ \u001b[0m\u001b[96mself\u001b[0m.logger.log_error(response) \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[31m❱ \u001b[0m 212 \u001b[2m│ │ \u001b[0m\u001b[1;4;94mraise\u001b[0m\u001b[1;4m response\u001b[0m \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[2m 213 \u001b[0m\u001b[2m│ \u001b[0m \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[2m 214 \u001b[0m\u001b[2m│ \u001b[0m\u001b[94mdef\u001b[0m\u001b[90m \u001b[0m\u001b[92menable_power\u001b[0m(\u001b[96mself\u001b[0m) -> \u001b[96mstr\u001b[0m: \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[2m 215 \u001b[0m\u001b[2;90m│ │ \u001b[0m\u001b[33m\"\"\"Enables the power on the robot.\"\"\"\u001b[0m \u001b[31m│\u001b[0m\n", - "\u001b[31m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m\n", - "\u001b[1;91mPf400ResponseError: \u001b[0m*Joint out-of-range* Set robot joints within their range\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "pf400.move_cartesian([1000, 0, 100, 0.0, 90.0, 180.0])" ] }, { "cell_type": "code", - "execution_count": 200, + "execution_count": null, "id": "19b9a6ef", "metadata": {}, "outputs": [], @@ -616,111 +352,17 @@ }, { "cell_type": "code", - "execution_count": 282, + "execution_count": null, "id": "f32966f7", "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\u001b[2m2026-05-15T20:01:35.076594Z\u001b[0m [\u001b[31m\u001b[1merror \u001b[0m] \u001b[1m*No robot attached* \u001b[0m \u001b[36mevent_type\u001b[0m=\u001b[35mlog_error\u001b[0m\n", - "\u001b[2m2026-05-15T20:01:35.076594Z\u001b[0m [\u001b[31m\u001b[1merror \u001b[0m] \u001b[1m*No robot attached* \u001b[0m \u001b[36mevent_type\u001b[0m=\u001b[35mlog_error\u001b[0m\n" - ] - }, - { - "data": { - "text/html": [ - "
╭─────────────────────────────────────── Traceback (most recent call last) ───────────────────────────────────────╮\n",
-       " in <module>:1                                                                                                   \n",
-       "                                                                                                                 \n",
-       " 1 pf400.open_gripper()                                                                                        \n",
-       "   2                                                                                                             \n",
-       "                                                                                                                 \n",
-       " /home/rpl/workspaces/rpl_dev/pf400_module/src/pf400_interface/pf400.py:422 in open_gripper                      \n",
-       "                                                                                                                 \n",
-       "    419 def open_gripper(self, gripper_length: Optional[int] = None) -> float:                               \n",
-       "    420 │   │   \"\"\"Opens the gripper.\"\"\"                                                                         \n",
-       "    421 │   │   self.set_gripper_open(gripper_length=gripper_length)                                             \n",
-       "  422 │   │   self.send_command(\"gripper 1\")                                                                   \n",
-       "    423 │   │   return self.get_gripper_state()                                                                  \n",
-       "    424                                                                                                      \n",
-       "    425 def close_gripper(self, gripper_length: Optional[int] = None) -> float:                              \n",
-       "                                                                                                                 \n",
-       " /home/rpl/workspaces/rpl_dev/pf400_module/src/pf400_interface/pf400.py:163 in send_command                      \n",
-       "                                                                                                                 \n",
-       "    160 │   │   │   │   │   .rstrip(\"\\r\\n\")                                                                      \n",
-       "    161 │   │   │   │   )                                                                                        \n",
-       "    162 │   │   │   │   if response != \"\" and response in ERROR_CODES:                                           \n",
-       "  163 │   │   │   │   │   self._handle_error_output(response)                                                  \n",
-       "    164 │   │   │   │   if response in OUTPUT_CODES:                                                             \n",
-       "    165 │   │   │   │   │   self.logger.log_debug(response)                                                      \n",
-       "    166 │   │   │   │   self._await_movement_completion()                                                        \n",
-       "                                                                                                                 \n",
-       " /home/rpl/workspaces/rpl_dev/pf400_module/src/pf400_interface/pf400.py:212 in _handle_error_output              \n",
-       "                                                                                                                 \n",
-       "    209 │   │   \"\"\"Handles the error message output.\"\"\"                                                          \n",
-       "    210 │   │   response = Pf400ResponseError.from_error_code(output)                                            \n",
-       "    211 │   │   self.logger.log_error(response)                                                                  \n",
-       "  212 │   │   raise response                                                                                   \n",
-       "    213                                                                                                      \n",
-       "    214 def enable_power(self) -> str:                                                                       \n",
-       "    215 │   │   \"\"\"Enables the power on the robot.\"\"\"                                                            \n",
-       "╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\n",
-       "Pf400ResponseError: *No robot attached*\n",
-       "
\n" - ], - "text/plain": [ - "\u001b[31m╭─\u001b[0m\u001b[31m──────────────────────────────────────\u001b[0m\u001b[31m \u001b[0m\u001b[1;31mTraceback \u001b[0m\u001b[1;2;31m(most recent call last)\u001b[0m\u001b[31m \u001b[0m\u001b[31m──────────────────────────────────────\u001b[0m\u001b[31m─╮\u001b[0m\n", - "\u001b[31m│\u001b[0m in :1 \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[31m❱ \u001b[0m1 \u001b[1;4mpf400.open_gripper()\u001b[0m \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[2m2 \u001b[0m \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[2m/home/rpl/workspaces/rpl_dev/pf400_module/src/pf400_interface/\u001b[0m\u001b[1mpf400.py\u001b[0m:422 in open_gripper \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[2m 419 \u001b[0m\u001b[2m│ \u001b[0m\u001b[94mdef\u001b[0m\u001b[90m \u001b[0m\u001b[92mopen_gripper\u001b[0m(\u001b[96mself\u001b[0m, gripper_length: Optional[\u001b[96mint\u001b[0m] = \u001b[94mNone\u001b[0m) -> \u001b[96mfloat\u001b[0m: \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[2m 420 \u001b[0m\u001b[2;90m│ │ \u001b[0m\u001b[33m\"\"\"Opens the gripper.\"\"\"\u001b[0m \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[2m 421 \u001b[0m\u001b[2m│ │ \u001b[0m\u001b[96mself\u001b[0m.set_gripper_open(gripper_length=gripper_length) \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[31m❱ \u001b[0m 422 \u001b[2m│ │ \u001b[0m\u001b[1;4;96mself\u001b[0m\u001b[1;4m.send_command(\u001b[0m\u001b[1;4;33m\"\u001b[0m\u001b[1;4;33mgripper 1\u001b[0m\u001b[1;4;33m\"\u001b[0m\u001b[1;4m)\u001b[0m \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[2m 423 \u001b[0m\u001b[2m│ │ \u001b[0m\u001b[94mreturn\u001b[0m \u001b[96mself\u001b[0m.get_gripper_state() \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[2m 424 \u001b[0m\u001b[2m│ \u001b[0m \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[2m 425 \u001b[0m\u001b[2m│ \u001b[0m\u001b[94mdef\u001b[0m\u001b[90m \u001b[0m\u001b[92mclose_gripper\u001b[0m(\u001b[96mself\u001b[0m, gripper_length: Optional[\u001b[96mint\u001b[0m] = \u001b[94mNone\u001b[0m) -> \u001b[96mfloat\u001b[0m: \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[2m/home/rpl/workspaces/rpl_dev/pf400_module/src/pf400_interface/\u001b[0m\u001b[1mpf400.py\u001b[0m:163 in send_command \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[2m 160 \u001b[0m\u001b[2m│ │ │ │ │ \u001b[0m.rstrip(\u001b[33m\"\u001b[0m\u001b[33m\\r\u001b[0m\u001b[33m\\n\u001b[0m\u001b[33m\"\u001b[0m) \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[2m 161 \u001b[0m\u001b[2m│ │ │ │ \u001b[0m) \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[2m 162 \u001b[0m\u001b[2m│ │ │ │ \u001b[0m\u001b[94mif\u001b[0m response != \u001b[33m\"\u001b[0m\u001b[33m\"\u001b[0m \u001b[95mand\u001b[0m response \u001b[95min\u001b[0m ERROR_CODES: \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[31m❱ \u001b[0m 163 \u001b[2m│ │ │ │ │ \u001b[0m\u001b[96mself\u001b[0m._handle_error_output(response) \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[2m 164 \u001b[0m\u001b[2m│ │ │ │ \u001b[0m\u001b[94mif\u001b[0m response \u001b[95min\u001b[0m OUTPUT_CODES: \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[2m 165 \u001b[0m\u001b[2m│ │ │ │ │ \u001b[0m\u001b[96mself\u001b[0m.logger.log_debug(response) \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[2m 166 \u001b[0m\u001b[2m│ │ │ │ \u001b[0m\u001b[96mself\u001b[0m._await_movement_completion() \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[2m/home/rpl/workspaces/rpl_dev/pf400_module/src/pf400_interface/\u001b[0m\u001b[1mpf400.py\u001b[0m:212 in _handle_error_output \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[2m 209 \u001b[0m\u001b[2;90m│ │ \u001b[0m\u001b[33m\"\"\"Handles the error message output.\"\"\"\u001b[0m \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[2m 210 \u001b[0m\u001b[2m│ │ \u001b[0mresponse = Pf400ResponseError.from_error_code(output) \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[2m 211 \u001b[0m\u001b[2m│ │ \u001b[0m\u001b[96mself\u001b[0m.logger.log_error(response) \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[31m❱ \u001b[0m 212 \u001b[2m│ │ \u001b[0m\u001b[1;4;94mraise\u001b[0m\u001b[1;4m response\u001b[0m \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[2m 213 \u001b[0m\u001b[2m│ \u001b[0m \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[2m 214 \u001b[0m\u001b[2m│ \u001b[0m\u001b[94mdef\u001b[0m\u001b[90m \u001b[0m\u001b[92menable_power\u001b[0m(\u001b[96mself\u001b[0m) -> \u001b[96mstr\u001b[0m: \u001b[31m│\u001b[0m\n", - "\u001b[31m│\u001b[0m \u001b[2m 215 \u001b[0m\u001b[2;90m│ │ \u001b[0m\u001b[33m\"\"\"Enables the power on the robot.\"\"\"\u001b[0m \u001b[31m│\u001b[0m\n", - "\u001b[31m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m\n", - "\u001b[1;91mPf400ResponseError: \u001b[0m*No robot attached*\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "pf400.open_gripper()" ] }, { "cell_type": "code", - "execution_count": 123, + "execution_count": 16, "id": "6", "metadata": {}, "outputs": [], From 5850f5d31bf6e259e93fc092f7657af7fb7af6c3 Mon Sep 17 00:00:00 2001 From: Dozgulbas Date: Wed, 27 May 2026 15:41:13 -0500 Subject: [PATCH 19/21] Use horizontal compliance with pick & place --- src/pf400_interface/pf400.py | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/src/pf400_interface/pf400.py b/src/pf400_interface/pf400.py index 7ff3972..1dc985b 100644 --- a/src/pf400_interface/pf400.py +++ b/src/pf400_interface/pf400.py @@ -95,9 +95,9 @@ def __init__( self.neutral_joints = [ 400.0, - 1.400, - 177.101, - 537.107, + 1.650, + 177.662, + -179.494, self.gripper_close_narrow, 0.0, ] @@ -784,12 +784,15 @@ def rotate_plate_on_deck( target = rotation_deck.representation if rotation_degree == -90: - target = self.rotate_yaw(target, -rotation_degree) + target = self.rotate_yaw(target, rotation_degree) above_position = list(map(add, target, self.default_approach_vector)) self.move_all_joints_neutral(target) self.move_joint(above_position, self.slow_motion_profile) + target_position_above_compliance = copy.deepcopy(target) + target_position_above_compliance[0] += 1.0 + self.move_joint(target_position_above_compliance, self.slow_motion_profile) self.enable_compliance() self.move_joint(target, self.slow_motion_profile) self.release_plate() @@ -906,7 +909,7 @@ def pick_plate( source_approach: LocationArgument = None, grab_offset: Optional[float] = None, approach_height_offset: Optional[float] = None, - grip_width: Optional[int] = None, + grip_width: Optional[int] = 122, ) -> bool: """Pick a plate from the source location.""" above_position = self._calculate_above_position( @@ -920,7 +923,6 @@ def pick_plate( else: self.move_all_joints_neutral(source.representation) approach_motion_profile = self.fast_motion_profile - self.move_joint( target_joint_angles=above_position, profile=approach_motion_profile ) @@ -930,12 +932,12 @@ def pick_plate( if grab_offset else source.representation ) - self.enable_compliance() self.move_joint( target_joint_angles=target_position, profile=approach_motion_profile, gripper_open=True, ) + self.enable_compliance() grab_succeeded = self.grab_plate(width=grip_width, speed=100, force=10) if self.resource_client and grab_succeeded and source.resource_id: @@ -988,6 +990,9 @@ def place_plate( if grab_offset else target.representation ) + target_position_above_compliance = copy.deepcopy(target_position) + target_position_above_compliance[0] += 2.0 + self.move_joint(target_position_above_compliance) self.enable_compliance() self.move_joint(target_position, approach_motion_profile) release_succeeded = self.release_plate(width=open_width) @@ -1120,9 +1125,10 @@ def transfer( plate_source_rotation = 90 if source_plate_rotation.lower() == "wide" else 0 self.grip_wide = source_plate_rotation.lower() == "wide" - source.representation = self.check_incorrect_plate_orientation( - source.representation, plate_source_rotation - ) + """ + Depricating this implementation + source.representation = self.check_incorrect_plate_orientation(source.representation, plate_source_rotation) + """ pick_result = self.pick_plate( source=source, @@ -1139,9 +1145,13 @@ def transfer( plate_target_rotation = 90 if target_plate_rotation.lower() == "wide" else 0 self.grip_wide = target_plate_rotation.lower() == "wide" + + """ + Depricating this implementation target.representation = self.check_incorrect_plate_orientation( target.representation, plate_target_rotation ) + """ rotation_needed = plate_target_rotation - plate_source_rotation if rotation_needed != 0: From 929eeeee1872f93936279983fa5d88cd244ccebd Mon Sep 17 00:00:00 2001 From: Dozgulbas Date: Wed, 27 May 2026 15:41:45 -0500 Subject: [PATCH 20/21] Notebooks to work on the TCP settings --- tests/set_tcp.ipynb | 131 +++++++++++++++++++++++++++++++------------- 1 file changed, 94 insertions(+), 37 deletions(-) diff --git a/tests/set_tcp.ipynb b/tests/set_tcp.ipynb index 9bcbc0c..d3c6626 100644 --- a/tests/set_tcp.ipynb +++ b/tests/set_tcp.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": 4, "id": "34aeaee3", "metadata": {}, "outputs": [], @@ -12,7 +12,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 5, "id": "8391c5af", "metadata": {}, "outputs": [], @@ -23,24 +23,17 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 6, "id": "ea7fbda8", "metadata": {}, "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\u001b[2m2026-05-19T21:00:41.341979Z\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mEventClient initialized \u001b[0m \u001b[36mclient_name\u001b[0m=\u001b[35mpf400_interface.pf400\u001b[0m \u001b[36mevent_server\u001b[0m=\u001b[35m'Not configured'\u001b[0m \u001b[36mlog_dir\u001b[0m=\u001b[35m/home/rpl/workspaces/rpl_dev/pf400_module/.madsci/logs\u001b[0m \u001b[36mlog_level\u001b[0m=\u001b[35mEventLogLevel.INFO\u001b[0m \u001b[36mmadsci_version\u001b[0m=\u001b[35m0.7.0\u001b[0m \u001b[36mplatform\u001b[0m=\u001b[35mLinux-6.17.0-19-generic-x86_64-with-glibc2.42\u001b[0m \u001b[36mpython_version\u001b[0m=\u001b[35m3.12.12\u001b[0m\n" - ] - }, { "data": { "text/plain": [ "1" ] }, - "execution_count": 2, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } @@ -54,29 +47,57 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, + "id": "fae59b5f", + "metadata": {}, + "outputs": [], + "source": [ + "pf400.open_gripper(130)" + ] + }, + { + "cell_type": "code", + "execution_count": null, "id": "23d44ef8", "metadata": {}, "outputs": [], "source": [ "rotation_deck = LocationArgument(\n", - " location_name=\"rotation_deck\", location = [68.287,-27.703,113.691,631.713,75.088,994.854]\n", + " location_name=\"rotation_deck\", location = [63.063,-28.717,113.020,-82.561,71.348,988.948]\n", + ")\n", + "camera_deck = LocationArgument(\n", + " location_name=\"camera_deck\", location = [105.024,22.029,69.970,-0.551,73.780,991.020]\n", + "\n", ")" ] }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, + "id": "190df468", + "metadata": {}, + "outputs": [], + "source": [ + "camera = pf400.rotate_yaw(camera_deck.representation, -90)\n", + "camera_wide = LocationArgument(location_name=\"camera_wide\", location = [104.961, 59.382, 36.824, -94.872, 122.180, 990.609]\n", + "\n", + ")\n", + "print(camera_wide)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, "id": "f5f043cb", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "'0 0 -8 148 0 0 0'" + "'0 0 1 146.5 0 0 0'" ] }, - "execution_count": 5, + "execution_count": 10, "metadata": {}, "output_type": "execute_result" } @@ -87,34 +108,59 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": null, + "id": "7beac015", + "metadata": {}, + "outputs": [], + "source": [ + "pf400.move_joint(camera_deck.representation)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a3590046", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "pf400.transfer(source=camera_wide, target=camera_deck, rotation_deck=rotation_deck, source_plate_rotation=\"wide\", target_plate_rotation=\"narrow\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, "id": "681e2ea1", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[1431.177, 150.432, 68.287, -2.299, 90.0, 180.0]\n" - ] - }, - { - "data": { - "text/plain": [ - "'0'" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "cart = pf400.joint_to_cart(rotation_deck.representation)\n", "print(cart)\n", "pf400.move_with_rotation(rotation_deck.representation, -90.0)" ] }, + { + "cell_type": "code", + "execution_count": null, + "id": "79ad16ea", + "metadata": {}, + "outputs": [], + "source": [ + "rot = pf400.rotate_yaw(rotation_deck.representation,90)\n", + "rotation_deck_wide = LocationArgument(location_name=\"rotation_deck_wide\", location = rot)\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fdfef70d", + "metadata": {}, + "outputs": [], + "source": [ + "pf400.transfer(rotation_deck_wide,rotation_deck_wide,source_plate_rotation=\"wide\",target_plate_rotation=\"wide\")" + ] + }, { "cell_type": "code", "execution_count": 9, @@ -133,7 +179,18 @@ } ], "source": [ - "pf400.send_command(\"tool 0 -8.5 148.5 0 0 0\")" + "pf400.send_command(\"tool 0 1 146.5 0 0 0\")\n", + "pf400.send_command(\"StoreFile\")" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "a3f2dcba", + "metadata": {}, + "outputs": [], + "source": [ + "pf400.disconnect()" ] } ], From 7c1cae3231427fca9722d153fedf277b52efb4db Mon Sep 17 00:00:00 2001 From: Dozgulbas Date: Wed, 27 May 2026 15:41:57 -0500 Subject: [PATCH 21/21] Interface tests --- tests/set_tcp.ipynb | 114 ++++++++----------- tests/test_pf400_interface.ipynb | 182 ++++++++++--------------------- 2 files changed, 104 insertions(+), 192 deletions(-) diff --git a/tests/set_tcp.ipynb b/tests/set_tcp.ipynb index d3c6626..29c1820 100644 --- a/tests/set_tcp.ipynb +++ b/tests/set_tcp.ipynb @@ -2,8 +2,8 @@ "cells": [ { "cell_type": "code", - "execution_count": 4, - "id": "34aeaee3", + "execution_count": null, + "id": "0", "metadata": {}, "outputs": [], "source": [ @@ -12,34 +12,21 @@ }, { "cell_type": "code", - "execution_count": 5, - "id": "8391c5af", + "execution_count": null, + "id": "1", "metadata": {}, "outputs": [], "source": [ - "from operator import add\n", "from madsci.common.types.location_types import LocationArgument" ] }, { "cell_type": "code", - "execution_count": 6, - "id": "ea7fbda8", + "execution_count": null, + "id": "2", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "1" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ - "\n", "pf400 = PF400(host=\"rplpf400.cels.anl.gov\")\n", "pf400.initialize_robot()\n", "pf400.get_robot_movement_state()" @@ -48,7 +35,7 @@ { "cell_type": "code", "execution_count": null, - "id": "fae59b5f", + "id": "3", "metadata": {}, "outputs": [], "source": [ @@ -58,50 +45,41 @@ { "cell_type": "code", "execution_count": null, - "id": "23d44ef8", + "id": "4", "metadata": {}, "outputs": [], "source": [ "rotation_deck = LocationArgument(\n", - " location_name=\"rotation_deck\", location = [63.063,-28.717,113.020,-82.561,71.348,988.948]\n", + " location_name=\"rotation_deck\",\n", + " location=[63.063, -28.717, 113.020, -82.561, 71.348, 988.948],\n", ")\n", "camera_deck = LocationArgument(\n", - " location_name=\"camera_deck\", location = [105.024,22.029,69.970,-0.551,73.780,991.020]\n", - "\n", + " location_name=\"camera_deck\",\n", + " location=[105.024, 22.029, 69.970, -0.551, 73.780, 991.020],\n", ")" ] }, { "cell_type": "code", "execution_count": null, - "id": "190df468", + "id": "5", "metadata": {}, "outputs": [], "source": [ "camera = pf400.rotate_yaw(camera_deck.representation, -90)\n", - "camera_wide = LocationArgument(location_name=\"camera_wide\", location = [104.961, 59.382, 36.824, -94.872, 122.180, 990.609]\n", - "\n", + "camera_wide = LocationArgument(\n", + " location_name=\"camera_wide\",\n", + " location=[104.961, 59.382, 36.824, -94.872, 122.180, 990.609],\n", ")\n", "print(camera_wide)" ] }, { "cell_type": "code", - "execution_count": 10, - "id": "f5f043cb", + "execution_count": null, + "id": "6", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'0 0 1 146.5 0 0 0'" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "pf400.send_command(\"tool\")" ] @@ -109,7 +87,7 @@ { "cell_type": "code", "execution_count": null, - "id": "7beac015", + "id": "7", "metadata": {}, "outputs": [], "source": [ @@ -119,18 +97,23 @@ { "cell_type": "code", "execution_count": null, - "id": "a3590046", + "id": "8", "metadata": {}, "outputs": [], "source": [ - "\n", - "pf400.transfer(source=camera_wide, target=camera_deck, rotation_deck=rotation_deck, source_plate_rotation=\"wide\", target_plate_rotation=\"narrow\")\n" + "pf400.transfer(\n", + " source=camera_wide,\n", + " target=camera_deck,\n", + " rotation_deck=rotation_deck,\n", + " source_plate_rotation=\"wide\",\n", + " target_plate_rotation=\"narrow\",\n", + ")" ] }, { "cell_type": "code", "execution_count": null, - "id": "681e2ea1", + "id": "9", "metadata": {}, "outputs": [], "source": [ @@ -142,42 +125,35 @@ { "cell_type": "code", "execution_count": null, - "id": "79ad16ea", + "id": "10", "metadata": {}, "outputs": [], "source": [ - "rot = pf400.rotate_yaw(rotation_deck.representation,90)\n", - "rotation_deck_wide = LocationArgument(location_name=\"rotation_deck_wide\", location = rot)\n", - "\n" + "rot = pf400.rotate_yaw(rotation_deck.representation, 90)\n", + "rotation_deck_wide = LocationArgument(location_name=\"rotation_deck_wide\", location=rot)" ] }, { "cell_type": "code", "execution_count": null, - "id": "fdfef70d", + "id": "11", "metadata": {}, "outputs": [], "source": [ - "pf400.transfer(rotation_deck_wide,rotation_deck_wide,source_plate_rotation=\"wide\",target_plate_rotation=\"wide\")" + "pf400.transfer(\n", + " rotation_deck_wide,\n", + " rotation_deck_wide,\n", + " source_plate_rotation=\"wide\",\n", + " target_plate_rotation=\"wide\",\n", + ")" ] }, { "cell_type": "code", - "execution_count": 9, - "id": "8bd11120", + "execution_count": null, + "id": "12", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'0'" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "pf400.send_command(\"tool 0 1 146.5 0 0 0\")\n", "pf400.send_command(\"StoreFile\")" @@ -185,8 +161,8 @@ }, { "cell_type": "code", - "execution_count": 11, - "id": "a3f2dcba", + "execution_count": null, + "id": "13", "metadata": {}, "outputs": [], "source": [ diff --git a/tests/test_pf400_interface.ipynb b/tests/test_pf400_interface.ipynb index 02a978e..7968890 100644 --- a/tests/test_pf400_interface.ipynb +++ b/tests/test_pf400_interface.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "id": "0", "metadata": {}, "outputs": [], @@ -12,30 +12,11 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "id": "1", "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\u001b[2m2026-05-19T20:55:54.094275Z\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mEventClient initialized \u001b[0m \u001b[36mclient_name\u001b[0m=\u001b[35mpf400_interface.pf400\u001b[0m \u001b[36mevent_server\u001b[0m=\u001b[35m'Not configured'\u001b[0m \u001b[36mlog_dir\u001b[0m=\u001b[35m/home/rpl/workspaces/rpl_dev/pf400_module/.madsci/logs\u001b[0m \u001b[36mlog_level\u001b[0m=\u001b[35mEventLogLevel.INFO\u001b[0m \u001b[36mmadsci_version\u001b[0m=\u001b[35m0.7.0\u001b[0m \u001b[36mplatform\u001b[0m=\u001b[35mLinux-6.17.0-19-generic-x86_64-with-glibc2.42\u001b[0m \u001b[36mpython_version\u001b[0m=\u001b[35m3.12.12\u001b[0m\n" - ] - }, - { - "data": { - "text/plain": [ - "1" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ - "\n", "pf400 = PF400(host=\"rplpf400.cels.anl.gov\")\n", "pf400.initialize_robot()\n", "pf400.get_robot_movement_state()" @@ -43,7 +24,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "id": "2", "metadata": {}, "outputs": [], @@ -83,79 +64,54 @@ }, { "cell_type": "code", - "execution_count": 4, - "id": "58b72672", + "execution_count": null, + "id": "5", "metadata": {}, "outputs": [], "source": [ "camera_loc = LocationArgument(\n", - " location_name=\"source\", location = [106.932,23.387,69.67,714.368,75.058,994.962]\n", + " location_name=\"source\", location=[106.932, 23.387, 69.67, 714.368, 75.058, 994.962]\n", ")\n", "rotation_deck = LocationArgument(\n", - " location_name=\"rotation_deck\", location = [62.287,-27.703,113.691,631.713,75.088,994.854]\n", + " location_name=\"rotation_deck\",\n", + " location=[62.287, -27.703, 113.691, 631.713, 75.088, 994.854],\n", ")" ] }, { "cell_type": "code", - "execution_count": 5, - "id": "966d1340", + "execution_count": null, + "id": "6", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'0'" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ - "pf400.enable_compliance()" + "pf400.enablee()" ] }, { "cell_type": "code", - "execution_count": 6, - "id": "5", + "execution_count": null, + "id": "7", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ - "pf400.transfer(source=camera_loc, target=camera_loc, rotation_deck=rotation_deck, source_plate_rotation=\"narrow\", target_plate_rotation=\"wide\")\n", - "#pf400.transfer(source=camera_loc, target=camera_loc, rotation_deck=rotation_deck, source_plate_rotation=\"wide\", target_plate_rotation=\"narrow\")" + "pf400.disable_compliance()\n", + "pf400.transfer(\n", + " source=camera_loc,\n", + " target=camera_loc,\n", + " rotation_deck=rotation_deck,\n", + " source_plate_rotation=\"narrow\",\n", + " target_plate_rotation=\"wide\",\n", + ")\n", + "# pf400.transfer(source=camera_loc, target=camera_loc, rotation_deck=rotation_deck, source_plate_rotation=\"wide\", target_plate_rotation=\"narrow\")" ] }, { "cell_type": "code", - "execution_count": 6, - "id": "eb627d8c", + "execution_count": null, + "id": "8", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'0'" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "pf400.disable_compliance()" ] @@ -163,18 +119,17 @@ { "cell_type": "code", "execution_count": null, - "id": "3c7c7602", + "id": "9", "metadata": {}, "outputs": [], "source": [ - "pf400.pick_plate(source=rotation_deck\n", - " )\n" + "pf400.pick_plate(source=rotation_deck)" ] }, { "cell_type": "code", "execution_count": null, - "id": "4027bb28", + "id": "10", "metadata": {}, "outputs": [], "source": [ @@ -184,7 +139,7 @@ { "cell_type": "code", "execution_count": null, - "id": "c813d4ea", + "id": "11", "metadata": {}, "outputs": [], "source": [ @@ -194,19 +149,20 @@ { "cell_type": "code", "execution_count": null, - "id": "34c11807", + "id": "12", "metadata": {}, "outputs": [], "source": [ "rotation_deck_above = LocationArgument(\n", - " location_name=\"rotation_deck_above\", location = [75.287,-27.703,113.691,631.713,70.088,994.854]\n", - ")\n" + " location_name=\"rotation_deck_above\",\n", + " location=[75.287, -27.703, 113.691, 631.713, 70.088, 994.854],\n", + ")" ] }, { "cell_type": "code", "execution_count": null, - "id": "13443d57", + "id": "13", "metadata": {}, "outputs": [], "source": [ @@ -217,11 +173,13 @@ { "cell_type": "code", "execution_count": null, - "id": "984573cd", + "id": "14", "metadata": {}, "outputs": [], "source": [ - "new_loc =pf400.rotate_yaw(joint_states=rotation_deck_above.representation, rotation_deg=90.0)\n", + "new_loc = pf400.rotate_yaw(\n", + " joint_states=rotation_deck_above.representation, rotation_deg=90.0\n", + ")\n", "pf400.move_joint(new_loc)\n", "pf400.send_command(\"wherec\")" ] @@ -229,7 +187,7 @@ { "cell_type": "code", "execution_count": null, - "id": "46f01a50", + "id": "15", "metadata": {}, "outputs": [], "source": [ @@ -240,21 +198,10 @@ }, { "cell_type": "code", - "execution_count": 7, - "id": "9d2def7b", + "execution_count": null, + "id": "16", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'0'" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "pf400.send_command(\"tool 0 -8 148 0 0 0\")" ] @@ -262,17 +209,17 @@ { "cell_type": "code", "execution_count": null, - "id": "1f830ba8", + "id": "17", "metadata": {}, "outputs": [], "source": [ - "pf400.open_gripper(pf400.gripper_open_wide)\n" + "pf400.open_gripper(pf400.gripper_open_wide)" ] }, { "cell_type": "code", "execution_count": null, - "id": "ef000acf", + "id": "18", "metadata": {}, "outputs": [], "source": [ @@ -281,21 +228,10 @@ }, { "cell_type": "code", - "execution_count": 6, - "id": "e9f99e32", + "execution_count": null, + "id": "19", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'0 0 0 162 0 0 0'" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "pf400.send_command(\"tool\")" ] @@ -303,7 +239,7 @@ { "cell_type": "code", "execution_count": null, - "id": "3689e6af", + "id": "20", "metadata": {}, "outputs": [], "source": [ @@ -313,7 +249,7 @@ { "cell_type": "code", "execution_count": null, - "id": "956d4e2b", + "id": "21", "metadata": {}, "outputs": [], "source": [ @@ -323,7 +259,7 @@ { "cell_type": "code", "execution_count": null, - "id": "24511083", + "id": "22", "metadata": {}, "outputs": [], "source": [ @@ -333,7 +269,7 @@ { "cell_type": "code", "execution_count": null, - "id": "0da2cfa9", + "id": "23", "metadata": {}, "outputs": [], "source": [ @@ -343,7 +279,7 @@ { "cell_type": "code", "execution_count": null, - "id": "19b9a6ef", + "id": "24", "metadata": {}, "outputs": [], "source": [ @@ -353,7 +289,7 @@ { "cell_type": "code", "execution_count": null, - "id": "f32966f7", + "id": "25", "metadata": {}, "outputs": [], "source": [ @@ -362,8 +298,8 @@ }, { "cell_type": "code", - "execution_count": 16, - "id": "6", + "execution_count": null, + "id": "26", "metadata": {}, "outputs": [], "source": [