From 5576e48642b0afcf19319700a598403d5eb18fd6 Mon Sep 17 00:00:00 2001 From: senpai Date: Sun, 5 Oct 2025 16:23:04 +0200 Subject: [PATCH] drive base funzionante --- assi.py | 12 +++++ batteria.py | 41 ++++++++++++++++ guida_funzionante.py | 32 +++++++++++++ info_porte.py | 78 ++++++++++++++++++++++++++++++ pyproject.toml | 11 ++++- robot.py | 112 +++++++++++++++++++++++++++++++++++++++++++ uv.lock | 75 ++++++++++++++++++++++------- 7 files changed, 344 insertions(+), 17 deletions(-) create mode 100644 assi.py create mode 100644 batteria.py create mode 100644 guida_funzionante.py create mode 100644 info_porte.py create mode 100644 robot.py diff --git a/assi.py b/assi.py new file mode 100644 index 0000000..b58ab91 --- /dev/null +++ b/assi.py @@ -0,0 +1,12 @@ +from pybricks.parameters import Axis + + +class A: + RIGHT: Axis = Axis.X # pyright: ignore[reportAssignmentType] # ty: ignore[invalid-assignment] + LEFT: Axis = -Axis.X # pyright: ignore[reportUnknownVariableType,reportOperatorIssue] # ty: ignore[invalid-assignment,unsupported-operator] + + FORWARD: Axis = Axis.Y # pyright: ignore[reportAssignmentType] # ty: ignore[invalid-assignment] + BACKWARD: Axis = -Axis.Y # pyright: ignore[reportUnknownVariableType,reportOperatorIssue] # ty: ignore[invalid-assignment,unsupported-operator] + + UP: Axis = Axis.Z # pyright: ignore[reportAssignmentType] # ty: ignore[invalid-assignment] + DOWN: Axis = -Axis.Z # pyright: ignore[reportUnknownVariableType,reportOperatorIssue] # ty: ignore[invalid-assignment,unsupported-operator] diff --git a/batteria.py b/batteria.py new file mode 100644 index 0000000..6e856d5 --- /dev/null +++ b/batteria.py @@ -0,0 +1,41 @@ +from pybricks.hubs import PrimeHub + +hub = PrimeHub() + + +class Colors: + RED: str = "\033[0;31m" + GRE: str = "\033[0;32m" + YEL: str = "\033[0;33m" + BLU: str = "\033[0;34m" + MAG: str = "\033[0;35m" + CYA: str = "\033[0;36m" + WHI: str = "\033[0;37m" + NC: str = "\033[0m" + + +def calcola_carica(v_mv: float): + v: float = v_mv / 1000 + carica = "" + if v >= 8.4: + carica = f"{Colors.BLU}CARICA" + elif v >= 7.4: + carica = f"{Colors.GRE}MEDIA" + elif v > 6.8: + carica = f"{Colors.YEL}QUASI SCARICA" + else: + carica = f"{Colors.RED}SCARICA" + return carica + Colors.NC + + +def print_carica(): + v_mv = hub.battery.voltage() # millivolt + i_ma = hub.battery.current() # milliampere (corrente assorbita) + print(f"Voltage: {v_mv} mV | Current: {i_ma} mA") + # print(f"Caricatore: {}") + print(f"Batteria: {calcola_carica(v_mv)}") + + +print_carica() +# if __name__ == "__main__": +# print_carica() diff --git a/guida_funzionante.py b/guida_funzionante.py new file mode 100644 index 0000000..9c6ce0f --- /dev/null +++ b/guida_funzionante.py @@ -0,0 +1,32 @@ +from pybricks.hubs import PrimeHub +from pybricks.parameters import Axis, Direction, Port +from pybricks.pupdevices import Motor +from pybricks.robotics import DriveBase +from pybricks.tools import wait + +import batteria +from assi import A + +left = Motor(Port.B, Direction.COUNTERCLOCKWISE) +right = Motor(Port.A) + + +hub = PrimeHub(top_side=A.UP, front_side=A.BACKWARD) +db = DriveBase(left, right, wheel_diameter=56, axle_track=105) +db.use_gyro(True) +# (mm/s, mm/s², deg/s, deg/s²) +db.settings(100, 100, 90, 50) +wait(300) +db.reset(angle=0) + + +db.straight(100) +db.turn(90) +db.straight(100) +db.turn(90) +db.straight(100) +db.turn(90) +db.straight(100) +db.turn(90) + +print(f"drived {db.distance()}") diff --git a/info_porte.py b/info_porte.py new file mode 100644 index 0000000..2d07c69 --- /dev/null +++ b/info_porte.py @@ -0,0 +1,78 @@ +# --- SCAN DELLE PORTE A–F: CHE DISPOSITIVO C'È COLLEGATO? (fix senza p.name) --- + +from pybricks.parameters import Port # costanti delle porte fisiche: A, B, C, D, E, F +from pybricks.pupdevices import ( + ColorDistanceSensor, # sensore colore+distanza (SPIKE Essential / PUP combo) + ColorSensor, # sensore colore (SPIKE Prime) + ForceSensor, # sensore di forza/pulsante + Motor, # motori con encoder + UltrasonicSensor, # sensore ultrasuoni +) +from pybricks.tools import wait # piccole attese per non “martellare” il bus + +# Mapping esplicito: da oggetto Port alla sua etichetta stringa +PORT_LABEL = { + Port.A: "A", + Port.B: "B", + Port.C: "C", + Port.D: "D", + Port.E: "E", + Port.F: "F", +} + + +def scan_ports() -> list[tuple[str, str]]: + """ + Ritorna una lista di coppie (porta, cosa_c'è). + Esempio: [("A","Motor"), ("B","vuota"), ...] + """ + # elenco delle porte esterne da scandire in ordine + ports: list[Port] = [Port.A, Port.B, Port.C, Port.D, Port.E, Port.F] + + # accumulatore risultati (stringa etichetta porta, descrizione) + results: list[tuple[str, str]] = [] + + # analizza ogni porta + for p in ports: + descr: str = "-" # predefinito: niente collegato/riconosciuto + + # prova come MOTORE (se fallisce, solleva OSError -> proviamo altro) + try: + _ = Motor(p) + descr = "Motor" + except OSError: + # prova come COLOR SENSOR “classico” + try: + _ = ColorSensor(p) + descr = "ColorSensor" + except OSError: + # prova come COLOR+DISTANCE (combo sensor) + try: + _ = ColorDistanceSensor(p) + descr = "ColorDistanceSensor" + except OSError: + # prova come ULTRASONIC + try: + _ = UltrasonicSensor(p) + descr = "UltrasonicSensor" + except OSError: + # prova come FORCE SENSOR + try: + _ = ForceSensor(p) + descr = "ForceSensor" + except OSError: + # nessun device riconosciuto: lasciamo "vuota" + pass + + # aggiungi la riga risultato con etichetta porta (dal mapping) e descrizione + results.append((PORT_LABEL[p], descr)) + + # piccola pausa (facoltativa) per stabilità del bus + wait(5) + + # ritorna la lista completa + return results + + +# --- Esempio d'uso minimale (stampa la lista) --- +print(scan_ports()) # otterrai qualcosa tipo: [('A','Motor'), ('B','vuota'), ...] diff --git a/pyproject.toml b/pyproject.toml index 5ff5445..71df3ba 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -6,10 +6,16 @@ readme = "README.md" requires-python = ">=3.13" dependencies = [ "lefthook>=1.13.0", + "pybricks>=3.6.1", "pybricksdev>=2.1.0", "ruff>=0.13.0", + "umath>=1.0.0", ] +[tool.basedpyright] +reportUnusedCallResult = "none" + reportUnusedImport = "none" + [tool.black] target-version = ["py313"] line-length = 88 @@ -19,7 +25,10 @@ target-version = "py313" line-length = 88 [tool.ruff.lint] -extend-select = ["I", "UP", "C"] # isort, pyupgrade, pep8-naming, mccabe +extend-select = ["I", "UP", "C"] # isort, pyupgrade, mccabe +# non rimuove import non usati +unfixable = ["F401"] +ignore = ["F401"] [tool.ruff.lint.mccabe] max-complexity = 12 diff --git a/robot.py b/robot.py new file mode 100644 index 0000000..ca74d8a --- /dev/null +++ b/robot.py @@ -0,0 +1,112 @@ +from pybricks.hubs import PrimeHub +from pybricks.parameters import Axis, Direction, Port, Stop +from pybricks.pupdevices import Motor +from pybricks.robotics import DriveBase +from pybricks.tools import wait + +from assi import A + +DEFAULT_STRAIGHT_SPEED: int = 100 # mm/s +DEFAULT_STRAIGHT_ACCELERATION: int = 100 # mm/s² +DEFAULT_TURN_RATE: int = 90 # deg/s +DEFAULT_TURN_ACCELERATION: int = 50 # deg/s² +DEFAULT_GYRO_SETTLE_MS: int = 300 # ms + + +class Robot: + """Inizializza Hub, Motori e DriveBase con impostazioni coerenti. + + Parametri: + name: Nome logico del robot (per logging/diagnostica). + top_side: Faccia dell'hub che punta verso l'alto (Axis). + front_side: Faccia dell'hub che definisce l'“avanti” del robot (Axis). + left_port: Porta del motore sinistro (guardando verso l'“avanti”). + right_port: Porta del motore destro. + left_direction: Verso del motore sinistro (Direction). + right_direction: Verso del motore destro (Direction). + wheel_diameter: Diametro ruote in millimetri (mm). + axle_track: Distanza tra i punti di contatto a terra delle due ruote (mm). + use_gyro: Se True abilita il giroscopio per turn/straight. + straight_speed: Velocità lineare predefinita (mm/s). + straight_acceleration: Accelerazione lineare predefinita (mm/s²). + turn_rate: Velocità di rotazione predefinita (deg/s). + turn_acceleration: Accelerazione di rotazione predefinita (deg/s²). + settle_ms: Millisecondi di attesa dopo l’abilitazione del gyro. + + Attributi: + hub: Istanza di PrimeHub configurata con l’orientamento dato. + left: Motore sinistro. + right: Motore destro. + db: DriveBase pronta all’uso (settings applicati). + """ + + name: str + hub: PrimeHub + left: Motor + right: Motor + db: DriveBase + + def __init__( + self, + name: str, + top_side: Axis, + front_side: Axis, + left_port: Port, + right_port: Port, + left_direction: Direction, + right_direction: Direction, + wheel_diameter: int, + axle_track: int, + use_gyro: bool, + straight_speed: int = DEFAULT_STRAIGHT_SPEED, + straight_acceleration: int = DEFAULT_STRAIGHT_ACCELERATION, + turn_rate: int = DEFAULT_TURN_RATE, + turn_acceleration: int = DEFAULT_TURN_ACCELERATION, + settle_ms: int = DEFAULT_GYRO_SETTLE_MS, + ) -> None: + self.name = name + + self.hub = PrimeHub(top_side=top_side, front_side=front_side) + + self.left = Motor(left_port, left_direction) + self.right = Motor(right_port, right_direction) + + self.db = DriveBase( + self.left, + self.right, + wheel_diameter=wheel_diameter, + axle_track=axle_track, + ) + + self.db.settings( + straight_speed, + straight_acceleration, + turn_rate, + turn_acceleration, + ) + + if use_gyro: + self.db.use_gyro(True) + wait(settle_ms) + self.db.reset(angle=0) + else: + self.db.reset() + + +LEOHUB: Robot = Robot( + name="leohub", + top_side=A.UP, + front_side=A.BACKWARD, + left_port=Port.B, + right_port=Port.A, + left_direction=Direction.COUNTERCLOCKWISE, + right_direction=Direction.CLOCKWISE, + wheel_diameter=56, + axle_track=105, + use_gyro=True, + straight_speed=DEFAULT_STRAIGHT_SPEED, + straight_acceleration=DEFAULT_STRAIGHT_ACCELERATION, + turn_rate=DEFAULT_TURN_RATE, + turn_acceleration=DEFAULT_TURN_ACCELERATION, + settle_ms=DEFAULT_GYRO_SETTLE_MS, +) diff --git a/uv.lock b/uv.lock index ce58e55..a465d2e 100644 --- a/uv.lock +++ b/uv.lock @@ -54,17 +54,23 @@ wheels = [ [[package]] name = "dbus-fast" -version = "2.44.3" +version = "2.44.5" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/00/f2/8a3f2345452f4aa8e9899544ba6dfdf699cef39ecfb04238fdad381451c8/dbus_fast-2.44.3.tar.gz", hash = "sha256:962b36abbe885159e31135c57a7d9659997c61a13d55ecb070a61dc502dbd87e", size = 72458, upload-time = "2025-08-04T00:42:18.892Z" } +sdist = { url = "https://files.pythonhosted.org/packages/1b/f9/3952e3514244417a33643087bc5dc134aff546606d5f66f796018cb7fdfc/dbus_fast-2.44.5.tar.gz", hash = "sha256:e9d738e3898e2d505d7f2d5d21949bd705d7cd3d7240dda5481bb1c5fd5e3da8", size = 72474, upload-time = "2025-10-04T20:05:34.741Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ca/cf/e4ae27e14e470b84827848694836e8fae0c386162d98e43f891783c0abc8/dbus_fast-2.44.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da0910f813350b951efe4964a19d7f4aaf253b6c1021b0d68340160a990dc2fc", size = 835165, upload-time = "2025-08-04T00:57:12.44Z" }, - { url = "https://files.pythonhosted.org/packages/ba/88/6d8b0d0d274fd944a5c9506e559a38b7020884fd4250ee31e9fdb279c80f/dbus_fast-2.44.3-cp313-cp313-manylinux_2_17_i686.manylinux_2_5_i686.manylinux1_i686.manylinux2014_i686.whl", hash = "sha256:253ad2417b0651ba32325661bb559228ceaedea9fb75d238972087a5f66551fd", size = 905750, upload-time = "2025-08-04T00:57:13.973Z" }, - { url = "https://files.pythonhosted.org/packages/67/f0/4306e52ea702fe79be160f333ed84af111d725c75605b1ca7286f7df69f8/dbus_fast-2.44.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ebb4c56bef8f69e4e2606eb29a5c137ba448cf7d6958f4f2fba263d74623bd06", size = 888637, upload-time = "2025-08-04T00:57:15.414Z" }, - { url = "https://files.pythonhosted.org/packages/78/c8/b45ff0a015f606c1998df2070967f016f873d4087845af14fd3d01303b0b/dbus_fast-2.44.3-cp313-cp313-manylinux_2_36_x86_64.whl", hash = "sha256:6e0a6a27a1f53b32259d0789bca6f53decd88dec52722cac9a93327f8b7670c3", size = 891773, upload-time = "2025-08-04T00:42:16.199Z" }, - { url = "https://files.pythonhosted.org/packages/6f/4f/344bd7247b74b4af0562cf01be70832af62bd1495c6796125ea944d2a909/dbus_fast-2.44.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2a990390c5d019e8e4d41268a3ead0eb6e48e977173d7685b0f5b5b3d0695c2f", size = 850429, upload-time = "2025-08-04T00:57:16.776Z" }, - { url = "https://files.pythonhosted.org/packages/43/26/ec514f6e882975d4c40e88cf88b0240952f9cf425aebdd59081afa7f6ad2/dbus_fast-2.44.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:5aca3c940eddb99f19bd3f0c6c50cd566fd98396dd9516d35dbf12af25b7a2c6", size = 939261, upload-time = "2025-08-04T00:57:18.274Z" }, - { url = "https://files.pythonhosted.org/packages/3b/e3/cb514104c0e98aa0514e4f09e5c16e78585e11dae392d501b742a92843c5/dbus_fast-2.44.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0046e74c25b79ffb6ea5b07f33b5da0bdc2a75ad6aede3f7836654485239121d", size = 916025, upload-time = "2025-08-04T00:57:19.939Z" }, + { url = "https://files.pythonhosted.org/packages/79/ad/17eadd06e533e2828b0f9b16da25b11d47629d4e2da3e817fa4cdffb96b5/dbus_fast-2.44.5-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:44d3232fd70f4deffa509b9aec8b1143895382554cda6513c34f70fa0b2ccb0c", size = 868405, upload-time = "2025-10-04T20:15:16.056Z" }, + { url = "https://files.pythonhosted.org/packages/24/29/71d5a77e04a7a44ff46a6adaeaaf1f3cdb0b1ac3486e05cf079724f2799e/dbus_fast-2.44.5-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0b247075d035c4f33a24ee35a81c1313c46a7712ebad959fa8850654d3d6d64f", size = 948188, upload-time = "2025-10-04T20:15:17.847Z" }, + { url = "https://files.pythonhosted.org/packages/a8/24/39261f09d4fef3a57b45b71842cbdfc0a532b259236c1347fc2df3629936/dbus_fast-2.44.5-cp313-cp313-manylinux_2_36_x86_64.whl", hash = "sha256:b5fea7b5ea19f83220752c8560c3b4c3b9ee79976cc02dec7be21f57c01c1338", size = 891815, upload-time = "2025-10-04T20:05:32.868Z" }, + { url = "https://files.pythonhosted.org/packages/91/48/685e3e846b8f7a7e9dec679763fde808c2443e6201a2c6eab45b48dec456/dbus_fast-2.44.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:8546604aebd57f3928647b0e1ea32912c80ddcf7119a35dd57606bf3a38b8571", size = 873356, upload-time = "2025-10-04T20:15:19.405Z" }, + { url = "https://files.pythonhosted.org/packages/3d/ff/9798912b8c6eb6dac6504dd1db4391c7b48ed21123ea55832c754ba92dd7/dbus_fast-2.44.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:46ca373a4eb8f036597d25787f4410af7822ab37c5db7c44ac4bc18bb25b9d6f", size = 957077, upload-time = "2025-10-04T20:15:21.608Z" }, + { url = "https://files.pythonhosted.org/packages/22/b7/de79d48aee3e164121d4dd887b328ba8386d848c152bec1fd89fc55069ce/dbus_fast-2.44.5-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b9f49e3fe97a7de27b3bdb4d80b8bc40aa0827462988b790a9e007d40518b7e2", size = 879901, upload-time = "2025-10-04T20:15:25.218Z" }, + { url = "https://files.pythonhosted.org/packages/4e/ce/8fe1fcc0de1a80c58d2f09b5bf0ab201c2af577ec23a9ab78e8542a23814/dbus_fast-2.44.5-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b164214d2abc4b232c02100448bdf7a8858ac8da62c17cfe3ad54e05eae4b133", size = 951654, upload-time = "2025-10-04T20:15:27.513Z" }, + { url = "https://files.pythonhosted.org/packages/47/17/e689c631fac91616ae2dbf2097e03ba200975c4e3df983aaef02ca23413d/dbus_fast-2.44.5-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:13ae2801d94bb782aad71c21542e90ba65bc86ccbcc365e52a473eba208aab54", size = 882964, upload-time = "2025-10-04T20:15:29.063Z" }, + { url = "https://files.pythonhosted.org/packages/8e/27/ea16587576621810ceb6c08a8533101993c4ad2ea5089d25acd807c03fd3/dbus_fast-2.44.5-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:e3e24fd1fe09ddd87b6ce57fc99e9a95201ae4296d6518e3fb101df392e3dc85", size = 960017, upload-time = "2025-10-04T20:15:31.19Z" }, + { url = "https://files.pythonhosted.org/packages/f9/a5/b8f698a321546c9640206dd52e6233948adadc7672fe36d4028fffc7a4e7/dbus_fast-2.44.5-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:644a0ba6958550707ad56acd9654f1534fca16a6e1bf5f38f2f74a5370123584", size = 879903, upload-time = "2025-10-04T20:15:34.668Z" }, + { url = "https://files.pythonhosted.org/packages/39/f2/d86628f8ccde215ba592bad87318134a84675960fa9453a88846325e5fec/dbus_fast-2.44.5-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ad9b36518984a363cfa5eacbd4a2a82ce35a0d4cfcb9e43980c8df3d742121e9", size = 951654, upload-time = "2025-10-04T20:15:36.521Z" }, + { url = "https://files.pythonhosted.org/packages/10/98/b13d391109a948e58074d59c28076ea0b8eb69884ffbab03cda98f6ace3d/dbus_fast-2.44.5-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:bdb8688394bb28b9535d38a1e7dfeed8143fd0ee09cb9aea07ff314fb5af55dc", size = 882967, upload-time = "2025-10-04T20:15:38.674Z" }, + { url = "https://files.pythonhosted.org/packages/cc/41/2d2baa32486a2f3f8248fbc855670caa861e66e017988c74a3f234664d3a/dbus_fast-2.44.5-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:2979c4b90596ddb72d2056de7cb47a2994143e805844732d96bcd882731b936b", size = 960019, upload-time = "2025-10-04T20:15:40.435Z" }, ] [[package]] @@ -163,7 +169,7 @@ wheels = [ [[package]] name = "pybricksdev" -version = "2.1.0" +version = "2.1.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "appdirs" }, @@ -182,9 +188,9 @@ dependencies = [ { name = "tqdm" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/77/26/2551759154f58fa65e70e7fedebaede4aa180696ae790383e97cb4277a56/pybricksdev-2.1.0.tar.gz", hash = "sha256:65fa0f28cee5db9416af1fdb194e26c9bbae43d34c93558b8f17dffe85cdfda2", size = 213451, upload-time = "2025-09-11T02:25:21.959Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6a/e4/6b71847b2642c9231e2bec6e7e31c035c670243348c1b62ca381479a6c11/pybricksdev-2.1.1.tar.gz", hash = "sha256:24535f9f2907a8ac873043ddf9b4db37839d9af746b5618b20625ae4b827506f", size = 213685, upload-time = "2025-09-14T01:43:37.049Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/27/ed/da842007b73712e63eca607c0446ddb5da85e7a8991a641a10aecc38a2c6/pybricksdev-2.1.0-py3-none-any.whl", hash = "sha256:1c28deaeda027c5aa99fa49e81f22d63aa7360da5c1a2e2a34293fc47621ce39", size = 231251, upload-time = "2025-09-11T02:25:20.628Z" }, + { url = "https://files.pythonhosted.org/packages/77/3f/294b39a87a9681d3050f1bf2eeccd607e83f7a0aa10f3b1a8c855b545289/pybricksdev-2.1.1-py3-none-any.whl", hash = "sha256:04b628cd85c3d8eda7c9f9f9250bc163c1251fb145ca1e1017a19e5e490bf513", size = 231629, upload-time = "2025-09-14T01:43:35.429Z" }, ] [[package]] @@ -285,15 +291,19 @@ version = "0.1.0" source = { virtual = "." } dependencies = [ { name = "lefthook" }, + { name = "pybricks" }, { name = "pybricksdev" }, { name = "ruff" }, + { name = "umath" }, ] [package.metadata] requires-dist = [ { name = "lefthook", specifier = ">=1.13.0" }, + { name = "pybricks", specifier = ">=3.6.1" }, { name = "pybricksdev", specifier = ">=2.1.0" }, { name = "ruff", specifier = ">=0.13.0" }, + { name = "umath", specifier = ">=1.0.0" }, ] [[package]] @@ -362,12 +372,21 @@ wheels = [ ] [[package]] -name = "wcwidth" -version = "0.2.13" +name = "umath" +version = "1.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6c/63/53559446a878410fc5a5974feb13d31d78d752eb18aeba59c7fef1af7598/wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5", size = 101301, upload-time = "2024-01-06T02:10:57.829Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f1/08/7e67a3c4f3cf10cd39cb28ea4dfeefff61b7c75e95f78f88fa79a49c91b5/uMath-1.0.0.tar.gz", hash = "sha256:a02a9643dc7ae6ca2bfe795ee5bd36f5de4815bc5325382d5a70eedea86e2b94", size = 2162, upload-time = "2021-09-20T09:28:15.609Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859", size = 34166, upload-time = "2024-01-06T02:10:55.763Z" }, + { url = "https://files.pythonhosted.org/packages/d5/25/d7f80b606ef55e1ea9c7f2de05342df322e3a587cc9d2f35a8d370208822/uMath-1.0.0-py3-none-any.whl", hash = "sha256:78a295e7e969fdb99168e7f73f9c0ee258b84c1c3eb91862bb261b8a552af3a9", size = 2679, upload-time = "2021-09-20T09:28:14.063Z" }, +] + +[[package]] +name = "wcwidth" +version = "0.2.14" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/24/30/6b0809f4510673dc723187aeaf24c7f5459922d01e2f794277a3dfb90345/wcwidth-0.2.14.tar.gz", hash = "sha256:4d478375d31bc5395a3c55c40ccdf3354688364cd61c4f6adacaa9215d0b3605", size = 102293, upload-time = "2025-09-22T16:29:53.023Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/af/b5/123f13c975e9f27ab9c0770f514345bd406d0e8d3b7a0723af9d43f710af/wcwidth-0.2.14-py2.py3-none-any.whl", hash = "sha256:a7bb560c8aee30f9957e5f9895805edd20602f2d7f720186dfd906e82b4982e1", size = 37286, upload-time = "2025-09-22T16:29:51.641Z" }, ] [[package]] @@ -382,6 +401,9 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/79/d4/1a555d8bdcb8b920f8e896232c82901cc0cda6d3e4f92842199ae7dff70a/winrt_runtime-3.2.1-cp313-cp313-win32.whl", hash = "sha256:44e2733bc709b76c554aee6c7fe079443b8306b2e661e82eecfebe8b9d71e4d1", size = 210022, upload-time = "2025-06-06T06:44:11.767Z" }, { url = "https://files.pythonhosted.org/packages/aa/24/2b6e536ca7745d788dfd17a2ec376fa03a8c7116dc638bb39b035635484f/winrt_runtime-3.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:3c1fdcaeedeb2920dc3b9039db64089a6093cad2be56a3e64acc938849245a6d", size = 241349, upload-time = "2025-06-06T06:44:12.661Z" }, { url = "https://files.pythonhosted.org/packages/d4/7f/6d72973279e2929b2a71ed94198ad4a5d63ee2936e91a11860bf7b431410/winrt_runtime-3.2.1-cp313-cp313-win_arm64.whl", hash = "sha256:28f3dab083412625ff4d2b46e81246932e6bebddf67bea7f05e01712f54e6159", size = 415126, upload-time = "2025-06-06T06:44:13.702Z" }, + { url = "https://files.pythonhosted.org/packages/c8/87/88bd98419a9da77a68e030593fee41702925a7ad8a8aec366945258cbb31/winrt_runtime-3.2.1-cp314-cp314-win32.whl", hash = "sha256:9b6298375468ac2f6815d0c008a059fc16508c8f587e824c7936ed9216480dad", size = 210257, upload-time = "2025-09-20T07:06:41.054Z" }, + { url = "https://files.pythonhosted.org/packages/87/85/e5c2a10d287edd9d3ee8dc24bf7d7f335636b92bf47119768b7dd2fd1669/winrt_runtime-3.2.1-cp314-cp314-win_amd64.whl", hash = "sha256:e36e587ab5fd681ee472cd9a5995743f75107a1a84d749c64f7e490bc86bc814", size = 241873, upload-time = "2025-09-20T07:06:42.059Z" }, + { url = "https://files.pythonhosted.org/packages/52/2a/eb9e78397132175f70dd51dfa4f93e489c17d6b313ae9dce60369b8d84a7/winrt_runtime-3.2.1-cp314-cp314-win_arm64.whl", hash = "sha256:35d6241a2ebd5598e4788e69768b8890ee1eee401a819865767a1fbdd3e9a650", size = 416222, upload-time = "2025-09-20T07:06:43.376Z" }, ] [[package]] @@ -396,6 +418,9 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d4/cc/797516c5c0f8d7f5b680862e0ed7c1087c58aec0bcf57a417fa90f7eb983/winrt_windows_devices_bluetooth-3.2.1-cp313-cp313-win32.whl", hash = "sha256:12b0a16fb36ce0b42243ca81f22a6b53fbb344ed7ea07a6eeec294604f0505e4", size = 105757, upload-time = "2025-06-06T07:00:13.269Z" }, { url = "https://files.pythonhosted.org/packages/05/6d/f60588846a065e69a2ec5e67c5f85eb45cb7edef2ee8974cd52fa8504de6/winrt_windows_devices_bluetooth-3.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:6703dfbe444ee22426738830fb305c96a728ea9ccce905acfdf811d81045fdb3", size = 113363, upload-time = "2025-06-06T07:00:14.135Z" }, { url = "https://files.pythonhosted.org/packages/2c/13/2d3c4762018b26a9f66879676ea15d7551cdbf339c8e8e0c56ea05ea31ef/winrt_windows_devices_bluetooth-3.2.1-cp313-cp313-win_arm64.whl", hash = "sha256:2cf8a0bfc9103e32dc7237af15f84be06c791f37711984abdca761f6318bbdb2", size = 104722, upload-time = "2025-06-06T07:00:14.999Z" }, + { url = "https://files.pythonhosted.org/packages/b7/95/91cfdf941a1ba791708ab3477fc4e46793c8fe9117fc3e0a8c5ac5d7a09c/winrt_windows_devices_bluetooth-3.2.1-cp314-cp314-win32.whl", hash = "sha256:de36ded53ca3ba12fc6dd4deb14b779acc391447726543815df4800348aad63a", size = 109015, upload-time = "2025-09-20T07:09:51.067Z" }, + { url = "https://files.pythonhosted.org/packages/61/fa/7460655628d0f340a93524f5236bb9f8514eb0e1d334b38cba8a89f6c1a6/winrt_windows_devices_bluetooth-3.2.1-cp314-cp314-win_amd64.whl", hash = "sha256:3295d932cc93259d5ccb23a41e3a3af4c78ce5d6a6223b2b7638985f604fa34c", size = 115931, upload-time = "2025-09-20T07:09:51.922Z" }, + { url = "https://files.pythonhosted.org/packages/de/70/e1248dea2ab881eb76b61ff1ad6cb9c07ac005faf99349e4af0b29bc3f1b/winrt_windows_devices_bluetooth-3.2.1-cp314-cp314-win_arm64.whl", hash = "sha256:1f61c178766a1bbce0669f44790c6161ff4669404c477b4aedaa576348f9e102", size = 109561, upload-time = "2025-09-20T07:09:52.733Z" }, ] [[package]] @@ -410,6 +435,9 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/34/01/8fc8e57605ea08dd0723c035ed0c2d0435dace2bc80a66d33aecfea49a56/winrt_windows_devices_bluetooth_advertisement-3.2.1-cp313-cp313-win32.whl", hash = "sha256:4122348ea525a914e85615647a0b54ae8b2f42f92cdbf89c5a12eea53ef6ed90", size = 90037, upload-time = "2025-06-06T07:00:25.818Z" }, { url = "https://files.pythonhosted.org/packages/86/83/503cf815d84c5ba8c8bc61480f32e55579ebf76630163405f7df39aa297b/winrt_windows_devices_bluetooth_advertisement-3.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:b66410c04b8dae634a7e4b615c3b7f8adda9c7d4d6902bcad5b253da1a684943", size = 95822, upload-time = "2025-06-06T07:00:26.666Z" }, { url = "https://files.pythonhosted.org/packages/32/13/052be8b6642e6f509b30c194312b37bfee8b6b60ac3bd5ca2968c3ea5b80/winrt_windows_devices_bluetooth_advertisement-3.2.1-cp313-cp313-win_arm64.whl", hash = "sha256:07af19b1d252ddb9dd3eb2965118bc2b7cabff4dda6e499341b765e5038ca61d", size = 89326, upload-time = "2025-06-06T07:00:27.477Z" }, + { url = "https://files.pythonhosted.org/packages/27/3d/421d04a20037370baf13de929bc1dc5438b306a76fe17275ec5d893aae6c/winrt_windows_devices_bluetooth_advertisement-3.2.1-cp314-cp314-win32.whl", hash = "sha256:2985565c265b3f9eab625361b0e40e88c94b03d89f5171f36146f2e88b3ee214", size = 92264, upload-time = "2025-09-20T07:09:53.563Z" }, + { url = "https://files.pythonhosted.org/packages/07/c7/43601ab82fe42bcff430b8466d84d92b31be06cc45c7fd64e9aac40f7851/winrt_windows_devices_bluetooth_advertisement-3.2.1-cp314-cp314-win_amd64.whl", hash = "sha256:d102f3fac64fde32332e370969dfbc6f37b405d8cc055d9da30d14d07449a3c2", size = 97517, upload-time = "2025-09-20T07:09:54.411Z" }, + { url = "https://files.pythonhosted.org/packages/91/17/e3303f6a25a2d98e424b06580fc85bbfd068f383424c67fa47cb1b357a46/winrt_windows_devices_bluetooth_advertisement-3.2.1-cp314-cp314-win_arm64.whl", hash = "sha256:ffeb5e946cd42c32c6999a62e240d6730c653cdfb7b49c7839afba375e20a62a", size = 94122, upload-time = "2025-09-20T07:09:55.187Z" }, ] [[package]] @@ -424,6 +452,9 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ec/93/30b45ce473d1a604908221a1fa035fe8d5e4bb9008e820ae671a21dab94c/winrt_windows_devices_bluetooth_genericattributeprofile-3.2.1-cp313-cp313-win32.whl", hash = "sha256:b1879c8dcf46bd2110b9ad4b0b185f4e2a5f95170d014539203a5fee2b2115f0", size = 183342, upload-time = "2025-06-06T07:00:56.16Z" }, { url = "https://files.pythonhosted.org/packages/5b/3b/eb9d99b82a36002d7885206d00ea34f4a23db69c16c94816434ded728fa3/winrt_windows_devices_bluetooth_genericattributeprofile-3.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:8d8d89f01e9b6931fb48217847caac3227a0aeb38a5b7782af71c2e7b262ec30", size = 187844, upload-time = "2025-06-06T07:00:57.134Z" }, { url = "https://files.pythonhosted.org/packages/84/9b/ebbbe9be9a3e640dcfc5f166eb48f2f9d8ce42553f83aa9f4c5dcd9eb5f5/winrt_windows_devices_bluetooth_genericattributeprofile-3.2.1-cp313-cp313-win_arm64.whl", hash = "sha256:4e71207bb89798016b1795bb15daf78afe45529f2939b3b9e78894cfe650b383", size = 184540, upload-time = "2025-06-06T07:00:58.081Z" }, + { url = "https://files.pythonhosted.org/packages/b7/32/cb447ca7730a1e05730272309b074da6a04af29a8c0f5121014db8a2fc02/winrt_windows_devices_bluetooth_genericattributeprofile-3.2.1-cp314-cp314-win32.whl", hash = "sha256:d5f83739ca370f0baf52b0400aebd6240ab80150081fbfba60fd6e7b2e7b4c5f", size = 185249, upload-time = "2025-09-20T07:09:58.639Z" }, + { url = "https://files.pythonhosted.org/packages/bb/fa/f465d5d44dda166bf7ec64b7a950f57eca61f165bfe18345e9a5ea542def/winrt_windows_devices_bluetooth_genericattributeprofile-3.2.1-cp314-cp314-win_amd64.whl", hash = "sha256:13786a5853a933de140d456cd818696e1121c7c296ae7b7af262fc5d2cffb851", size = 193739, upload-time = "2025-09-20T07:09:59.893Z" }, + { url = "https://files.pythonhosted.org/packages/78/08/51c53ac3c704cd92da5ed7e7b9b57159052f6e46744e4f7e447ed708aa22/winrt_windows_devices_bluetooth_genericattributeprofile-3.2.1-cp314-cp314-win_arm64.whl", hash = "sha256:5140682da2860f6a55eb6faf9e980724dc457c2e4b4b35a10e1cebd8fc97d892", size = 194836, upload-time = "2025-09-20T07:10:00.87Z" }, ] [[package]] @@ -438,6 +469,9 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ff/7d/ebd712ab8ccd599c593796fbcd606abe22b5a8e20db134aa87987d67ac0e/winrt_windows_devices_enumeration-3.2.1-cp313-cp313-win32.whl", hash = "sha256:14a71cdcc84f624c209cbb846ed6bd9767a9a9437b2bf26b48ac9a91599da6e9", size = 130276, upload-time = "2025-06-06T07:02:05.178Z" }, { url = "https://files.pythonhosted.org/packages/70/de/f30daaaa0e6f4edb6bd7ddb3e058bd453c9ad90c032a4545c4d4639338aa/winrt_windows_devices_enumeration-3.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:6ca40d334734829e178ad46375275c4f7b5d6d2d4fc2e8879690452cbfb36015", size = 141536, upload-time = "2025-06-06T07:02:06.067Z" }, { url = "https://files.pythonhosted.org/packages/75/4b/9a6aafdc74a085c550641a325be463bf4b811f6f605766c9cd4f4b5c19d2/winrt_windows_devices_enumeration-3.2.1-cp313-cp313-win_arm64.whl", hash = "sha256:2d14d187f43e4409c7814b7d1693c03a270e77489b710d92fcbbaeca5de260d4", size = 135362, upload-time = "2025-06-06T07:02:06.997Z" }, + { url = "https://files.pythonhosted.org/packages/41/31/5785cd1ec54dc0f0e6f3e6a466d07a62b8014a6e2b782e80444ef87e83ab/winrt_windows_devices_enumeration-3.2.1-cp314-cp314-win32.whl", hash = "sha256:e087364273ed7c717cd0191fed4be9def6fdf229fe9b536a4b8d0228f7814106", size = 134252, upload-time = "2025-09-20T07:10:12.935Z" }, + { url = "https://files.pythonhosted.org/packages/cb/f6/68d91068048410f49794c0b19c45759c63ca559607068cfe5affba2f211b/winrt_windows_devices_enumeration-3.2.1-cp314-cp314-win_amd64.whl", hash = "sha256:0da1ddb8285d97a6775c36265d7157acf1bbcb88bcc9a7ce9a4549906c822472", size = 145509, upload-time = "2025-09-20T07:10:13.797Z" }, + { url = "https://files.pythonhosted.org/packages/5c/a4/898951d5bfc474aa9c7d133fe30870f0f2184f4ba3027eafb779d30eb7bc/winrt_windows_devices_enumeration-3.2.1-cp314-cp314-win_arm64.whl", hash = "sha256:09bf07e74e897e97a49a9275d0a647819254ddb74142806bbbcf4777ed240a22", size = 141334, upload-time = "2025-09-20T07:10:14.637Z" }, ] [[package]] @@ -452,6 +486,9 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/7b/71/5e87131e4aecc8546c76b9e190bfe4e1292d028bda3f9dd03b005d19c76c/winrt_windows_foundation-3.2.1-cp313-cp313-win32.whl", hash = "sha256:3998dc58ed50ecbdbabace1cdef3a12920b725e32a5806d648ad3f4829d5ba46", size = 112184, upload-time = "2025-06-06T07:11:04.459Z" }, { url = "https://files.pythonhosted.org/packages/ba/7f/8d5108461351d4f6017f550af8874e90c14007f9122fa2eab9f9e0e9b4e1/winrt_windows_foundation-3.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:6e98617c1e46665c7a56ce3f5d28e252798416d1ebfee3201267a644a4e3c479", size = 118672, upload-time = "2025-06-06T07:11:05.55Z" }, { url = "https://files.pythonhosted.org/packages/44/f5/2edf70922a3d03500dab17121b90d368979bd30016f6dbca0d043f0c71f1/winrt_windows_foundation-3.2.1-cp313-cp313-win_arm64.whl", hash = "sha256:2a8c1204db5c352f6a563130a5a41d25b887aff7897bb677d4ff0b660315aad4", size = 109673, upload-time = "2025-06-06T07:11:06.398Z" }, + { url = "https://files.pythonhosted.org/packages/e3/0a/d77346e39fe0c81f718cde49f83fe77c368c0e14c6418f72dfa1e7ef22d0/winrt_windows_foundation-3.2.1-cp314-cp314-win32.whl", hash = "sha256:35e973ab3c77c2a943e139302256c040e017fd6ff1a75911c102964603bba1da", size = 114590, upload-time = "2025-09-20T07:11:49.97Z" }, + { url = "https://files.pythonhosted.org/packages/a1/56/4d2b545bea0f34f68df6d4d4ca22950ff8a935497811dccdc0ca58737a05/winrt_windows_foundation-3.2.1-cp314-cp314-win_amd64.whl", hash = "sha256:a22a7ebcec0d262e60119cff728f32962a02df60471ded8b2735a655eccc0ef5", size = 122148, upload-time = "2025-09-20T07:11:50.826Z" }, + { url = "https://files.pythonhosted.org/packages/ed/ed/b9d3a11cac73444c0a3703200161cd7267dab5ab85fd00e1f965526e74a8/winrt_windows_foundation-3.2.1-cp314-cp314-win_arm64.whl", hash = "sha256:3be7fbae829b98a6a946db4fbaf356b11db1fbcbb5d4f37e7a73ac6b25de8b87", size = 114360, upload-time = "2025-09-20T07:11:51.626Z" }, ] [[package]] @@ -466,6 +503,9 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a6/cd/99ef050d80bea2922fa1ded93e5c250732634095d8bd3595dd808083e5ca/winrt_windows_foundation_collections-3.2.1-cp313-cp313-win32.whl", hash = "sha256:4267a711b63476d36d39227883aeb3fb19ac92b88a9fc9973e66fbce1fd4aed9", size = 60063, upload-time = "2025-06-06T07:11:18.65Z" }, { url = "https://files.pythonhosted.org/packages/94/93/4f75fd6a4c96f1e9bee198c5dc9a9b57e87a9c38117e1b5e423401886353/winrt_windows_foundation_collections-3.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:5e12a6e75036ee90484c33e204b85fb6785fcc9e7c8066ad65097301f48cdd10", size = 69057, upload-time = "2025-06-06T07:11:19.446Z" }, { url = "https://files.pythonhosted.org/packages/40/76/de47ccc390017ec5575e7e7fd9f659ee3747c52049cdb2969b1b538ce947/winrt_windows_foundation_collections-3.2.1-cp313-cp313-win_arm64.whl", hash = "sha256:34b556255562f1b36d07fba933c2bcd9f0db167fa96727a6cbb4717b152ad7a2", size = 58792, upload-time = "2025-06-06T07:11:20.24Z" }, + { url = "https://files.pythonhosted.org/packages/e1/47/b3301d964422d4611c181348149a7c5956a2a76e6339de451a000d4ae8e7/winrt_windows_foundation_collections-3.2.1-cp314-cp314-win32.whl", hash = "sha256:33188ed2d63e844c8adfbb82d1d3d461d64aaf78d225ce9c5930421b413c45ab", size = 62211, upload-time = "2025-09-20T07:11:52.411Z" }, + { url = "https://files.pythonhosted.org/packages/20/59/5f2c940ff606297129e93ebd6030c813e6a43a786de7fc33ccb268e0b06b/winrt_windows_foundation_collections-3.2.1-cp314-cp314-win_amd64.whl", hash = "sha256:d4cfece7e9c0ead2941e55a1da82f20d2b9c8003bb7a8853bb7f999b539f80a4", size = 70399, upload-time = "2025-09-20T07:11:53.254Z" }, + { url = "https://files.pythonhosted.org/packages/f8/2d/2c8eb89062c71d4be73d618457ed68e7e2ba29a660ac26349d44fc121cbf/winrt_windows_foundation_collections-3.2.1-cp314-cp314-win_arm64.whl", hash = "sha256:3884146fea13727510458f6a14040b7632d5d90127028b9bfd503c6c655d0c01", size = 61392, upload-time = "2025-09-20T07:11:53.993Z" }, ] [[package]] @@ -480,4 +520,7 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d9/d2/24d9f59bdc05e741261d5bec3bcea9a848d57714126a263df840e2b515a8/winrt_windows_storage_streams-3.2.1-cp313-cp313-win32.whl", hash = "sha256:401bb44371720dc43bd1e78662615a2124372e7d5d9d65dfa8f77877bbcb8163", size = 127774, upload-time = "2025-06-06T14:02:04.752Z" }, { url = "https://files.pythonhosted.org/packages/15/59/601724453b885265c7779d5f8025b043a68447cbc64ceb9149d674d5b724/winrt_windows_storage_streams-3.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:202c5875606398b8bfaa2a290831458bb55f2196a39c1d4e5fa88a03d65ef915", size = 131827, upload-time = "2025-06-06T14:02:05.601Z" }, { url = "https://files.pythonhosted.org/packages/fb/c2/a419675a6087c9ea496968c9b7805ef234afa585b7483e2269608a12b044/winrt_windows_storage_streams-3.2.1-cp313-cp313-win_arm64.whl", hash = "sha256:ca3c5ec0aab60895006bf61053a1aca6418bc7f9a27a34791ba3443b789d230d", size = 128180, upload-time = "2025-06-06T14:02:06.759Z" }, + { url = "https://files.pythonhosted.org/packages/55/70/2869ea2112c565caace73c9301afd1d7afcc49bdd37fac058f0178ba95d4/winrt_windows_storage_streams-3.2.1-cp314-cp314-win32.whl", hash = "sha256:5cd0dbad86fcc860366f6515fce97177b7eaa7069da261057be4813819ba37ee", size = 131701, upload-time = "2025-09-20T07:17:16.849Z" }, + { url = "https://files.pythonhosted.org/packages/f4/3d/aae50b1d0e37b5a61055759aedd42c6c99d7c17ab8c3e568ab33c0288938/winrt_windows_storage_streams-3.2.1-cp314-cp314-win_amd64.whl", hash = "sha256:3c5bf41d725369b9986e6d64bad7079372b95c329897d684f955d7028c7f27a0", size = 135566, upload-time = "2025-09-20T07:17:17.69Z" }, + { url = "https://files.pythonhosted.org/packages/bb/c3/6d3ce7a58e6c828e0795c9db8790d0593dd7fdf296e513c999150deb98d4/winrt_windows_storage_streams-3.2.1-cp314-cp314-win_arm64.whl", hash = "sha256:293e09825559d0929bbe5de01e1e115f7a6283d8996ab55652e5af365f032987", size = 134393, upload-time = "2025-09-20T07:17:18.802Z" }, ]