diff --git a/Makefile b/Makefile index a55bd82..9825ab1 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -PYSQUARED_VERSION ?= v2.0.0-alpha-25w29 +PYSQUARED_VERSION ?= v2.0.0-alpha-25w31 PYSQUARED ?= git+https://github.com/proveskit/pysquared@$(PYSQUARED_VERSION) BOARD_MOUNT_POINT ?= "" BOARD_TTY_PORT ?= "" diff --git a/config.json b/config.json index db106ad..4882a8e 100644 --- a/config.json +++ b/config.json @@ -1,7 +1,7 @@ { "battery_voltage": 5.2, "critical_battery_voltage": 6.6, - "cubesat_name": "Orpheus", + "cubesat_name": "PROVES-", "current_draw": 240.5, "debug": true, "degraded_battery_voltage": 6.6, diff --git a/src/flight-software/main.py b/src/flight-software/main.py index 1f41993..33ab8c1 100644 --- a/src/flight-software/main.py +++ b/src/flight-software/main.py @@ -37,7 +37,7 @@ logger.info( "Booting", - hardware_version=os.uname().version, + hardware_version=os.uname().version, # type: ignore[attr-defined] software_version=__version__, ) diff --git a/src/flight-software/repl.py b/src/flight-software/repl.py index 446882a..b98e67f 100644 --- a/src/flight-software/repl.py +++ b/src/flight-software/repl.py @@ -1,27 +1,12 @@ +import os import time +import board import digitalio - -try: - # from board_definitions import proveskit_rp2040_v4 as board - raise ImportError -except ImportError: - import board - -try: - from typing import Union -except Exception: - pass - -import os - -from lib.adafruit_drv2605 import DRV2605 # This is Hacky V5a Devel Stuff### from lib.adafruit_mcp230xx.mcp23017 import ( MCP23017, # This is Hacky V5a Devel Stuff### ) -from lib.adafruit_mcp9808 import MCP9808 # This is Hacky V5a Devel Stuff### from lib.adafruit_tca9548a import TCA9548A # This is Hacky V5a Devel Stuff### -from lib.adafruit_veml7700 import VEML7700 # This is Hacky V5a Devel Stuff### # from lib.pysquared.Big_Data import AllFaces ### This is Hacky V5a Devel Stuff### from lib.pysquared.beacon import Beacon @@ -31,11 +16,13 @@ from lib.pysquared.hardware.busio import _spi_init, initialize_i2c_bus from lib.pysquared.hardware.digitalio import initialize_pin from lib.pysquared.hardware.imu.manager.lsm6dsox import LSM6DSOXManager +from lib.pysquared.hardware.light_sensor.manager.veml7700 import VEML7700Manager from lib.pysquared.hardware.magnetometer.manager.lis2mdl import LIS2MDLManager from lib.pysquared.hardware.power_monitor.manager.ina219 import INA219Manager from lib.pysquared.hardware.radio.manager.rfm9x import RFM9xManager from lib.pysquared.hardware.radio.manager.sx1280 import SX1280Manager from lib.pysquared.hardware.radio.packetizer.packet_manager import PacketManager +from lib.pysquared.hardware.temperature_sensor.manager.mcp9808 import MCP9808Manager from lib.pysquared.logger import Logger from lib.pysquared.nvm.counter import Counter from lib.pysquared.protos.power_monitor import PowerMonitorProto @@ -53,10 +40,17 @@ logger.info( "Booting", - hardware_version=os.uname().version, + hardware_version=os.uname().version, # type: ignore[attr-defined] software_version=__version__, ) + +def get_temp(sensor): + for i in range(1000): + print(sensor.get_temperature().value) + time.sleep(0.1) + + watchdog = Watchdog(logger, board.WDT_WDI) watchdog.pet() @@ -99,6 +93,13 @@ 100000, ) +i2c0 = initialize_i2c_bus( + logger, + board.SCL0, + board.SDA0, + 100000, +) + sleep_helper = SleepHelper(logger, config, watchdog) uhf_radio = RFM9xManager( @@ -134,53 +135,6 @@ sband_radio, ) - -## Initializing the Burn Wire ## -ENABLE_BURN_A = initialize_pin( - logger, board.FIRE_DEPLOY1_A, digitalio.Direction.OUTPUT, True -) -ENABLE_BURN_B = initialize_pin( - logger, board.FIRE_DEPLOY1_B, digitalio.Direction.OUTPUT, True -) - - -def dumb_burn(duration=5) -> None: - """ - This function is used to test the burn wire. - It will turn on the burn wire for 5 seconds and then turn it off. - - Args: - duration (int): The duration to burn for in seconds. Default is 5 seconds. - Returns: - None - """ - ENABLE_BURN_A.value = False - ENABLE_BURN_B.value = False - logger.info("Burn Wire Enabled") - time.sleep(duration) - logger.info("Burn Wire Disabled") - ENABLE_BURN_A.value = True - ENABLE_BURN_B.value = True - - -## Initializing the Heater ## -def heater_pulse() -> None: - """ - This function is used to turn on the heater. - It will turn on the heater for 5 seconds and then turn it off. - - Args: - None - Returns: - None - """ - ENABLE_HEATER.value = False - logger.info("Heater Enabled") - time.sleep(5) - logger.info("Heater Disabled") - ENABLE_HEATER.value = True - - ## Initialize the MCP23017 GPIO Expander and its pins ## GPIO_RESET = initialize_pin( logger, board.GPIO_EXPANDER_RESET, digitalio.Direction.OUTPUT, True @@ -218,7 +172,7 @@ def heater_pulse() -> None: # Face Control Helper Functions def all_faces_off(): """ - This function turns off all of the faces. Note the load switches are disabled high. + This function turns off all of the faces. Note the load switches are disabled low. """ FACE0_ENABLE.value = False FACE1_ENABLE.value = False @@ -229,7 +183,7 @@ def all_faces_off(): def all_faces_on(): """ - This function turns on all of the faces. Note the load switches are enabled low. + This function turns on all of the faces. Note the load switches are enabled high. """ FACE0_ENABLE.value = True FACE1_ENABLE.value = True @@ -246,103 +200,26 @@ def all_faces_on(): tca = TCA9548A(i2c1, address=int(0x77)) -### This is Hacky V5a Devel Stuff### -class Face: - def __init__(self, add: int, pos: str, tca: TCA9548A, logger: Logger) -> None: - self.tca: TCA9548A = tca - self.address: int = add - self.position: str = pos - self.logger: Logger = logger - - # Define sensors based on position using a dictionary lookup instead of if-elif chain - sensor_map: dict[str, tuple[str, ...]] = { - "x+": ("MCP", "VEML", "DRV"), - "x-": ("MCP", "VEML"), - "y+": ("MCP", "VEML", "DRV"), - "y-": ("MCP", "VEML"), - "z-": ("MCP", "VEML", "DRV"), - } - - # Use tuple instead of list for immutable data - self.senlist: tuple[str, ...] = sensor_map.get(pos, ()) - - # Initialize sensor states dict only with needed sensors - self.sensors: dict[str, bool] = {sensor: False for sensor in self.senlist} - - # Initialize sensor objects as None - self.mcp: MCP9808 | None = None - self.veml: VEML7700 | None = None - self.drv: DRV2605 | None = None - - def sensor_init(self, senlist, address) -> None: - if "MCP" in senlist: - try: - self.mcp = MCP9808(self.tca[address], address=27) - self.sensors["MCP"] = True - except Exception as e: - self.logger.error("Error Initializing Temperature Sensor", e) - - if "VEML" in senlist: - try: - self.veml = VEML7700(self.tca[address]) - self.sensors["VEML"] = True - except Exception as e: - self.logger.error("Error Initializing Light Sensor", e) - - if "DRV" in senlist: - try: - self.drv = DRV2605(self.tca[address]) - self.sensors["DRV"] = True - except Exception as e: - self.logger.error("Error Initializing Motor Driver", e) - - -class AllFaces: - def __init__(self, tca: TCA9548A, logger: Logger) -> None: - self.tca: TCA9548A = tca - self.faces: list[Face] = [] - self.logger: Logger = logger - - # Create faces using a loop instead of individual variables - positions: list[tuple[str, int]] = [ - ("y+", 0), - ("y-", 1), - ("x+", 2), - ("x-", 3), - ("z-", 4), - ] - for pos, addr in positions: - face: Face = Face(addr, pos, tca, self.logger) - face.sensor_init(face.senlist, face.address) - self.faces.append(face) - - def face_test_all(self) -> list[list[float]]: - results: list[list[float]] = [] - for face in self.faces: - if face: - try: - temp: Union[float, None] = ( - face.mcp.temperature if face.sensors.get("MCP") else None # type: ignore - ) - light: Union[float, None] = ( - face.veml.lux if face.sensors.get("VEML") else None # type: ignore - ) - results.append([temp, light]) # type: ignore - except Exception: - results.append([None, None]) # type: ignore - return results - - -all_faces = AllFaces(tca, logger) +light_sensor0 = VEML7700Manager(logger, tca[0]) +light_sensor1 = VEML7700Manager(logger, tca[1]) +light_sensor2 = VEML7700Manager(logger, tca[2]) +light_sensor3 = VEML7700Manager(logger, tca[3]) +light_sensor4 = VEML7700Manager(logger, tca[4]) + ## Onboard Temp Sensor ## -mcp1 = MCP9808(i2c1, address=30) # Not working for some reason +temp_sensor5 = MCP9808Manager(logger, i2c0, addr=25) # Antenna Board +temp_sensor6 = MCP9808Manager(logger, i2c1, addr=27) # Flight Controller Board +temp_sensor0 = MCP9808Manager(logger, tca[0], addr=27) +temp_sensor1 = MCP9808Manager(logger, tca[1], addr=27) +temp_sensor2 = MCP9808Manager(logger, tca[2], addr=27) +temp_sensor3 = MCP9808Manager(logger, tca[3], addr=27) +temp_sensor4 = MCP9808Manager(logger, tca[4], addr=27) + + +battery_power_monitor: PowerMonitorProto = INA219Manager(logger, i2c1, 0x40) +solar_power_monitor: PowerMonitorProto = INA219Manager(logger, i2c1, 0x44) -try: - battery_power_monitor: PowerMonitorProto = INA219Manager(logger, i2c1, 0x40) - solar_power_monitor: PowerMonitorProto = INA219Manager(logger, i2c1, 0x44) -except Exception as e: - logger.error("Error Initializing Power Monitors", e) ## Init Misc Pins ## burnwire_heater_enable = initialize_pin( @@ -356,10 +233,3 @@ def face_test_all(self) -> list[list[float]]: antenna_deployment = BurnwireManager( logger, burnwire_heater_enable, burnwire1_fire, enable_logic=True ) - - -## Initialize the MCP23017 GPIO Expander and its pins ## -GPIO_RESET = initialize_pin( - logger, board.GPIO_EXPANDER_RESET, digitalio.Direction.OUTPUT, True -) -mcp2 = MCP23017(i2c1) diff --git a/uv.lock b/uv.lock index 964dd3c..ffaff69 100644 --- a/uv.lock +++ b/uv.lock @@ -4,7 +4,7 @@ requires-python = ">=3.13" [[package]] name = "adafruit-blinka" -version = "8.51.0" +version = "8.62.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "adafruit-circuitpython-typing" }, @@ -14,47 +14,47 @@ dependencies = [ { name = "pyftdi" }, { name = "sysv-ipc", marker = "platform_machine != 'mips' and sys_platform == 'linux'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/2c/5b/5083c60638c3fa3f8307d5d56e724908edc7f29079807d9161837eba5eb0/adafruit_blinka-8.51.0.tar.gz", hash = "sha256:844f15be775ee5c418446969a427c5a3847928e644f2b1a35542acff5b208f3a", size = 249212, upload-time = "2025-01-16T19:08:17.614Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/f1/f6a049f72bb22027547991bdd6c3ad3906e3478b3892461c5259ebfcfbf0/adafruit_blinka-8.62.0.tar.gz", hash = "sha256:b70d7ffe4ee097676c4035ab4bf36798271c1a6055b4b0cfee27b738a31cfdaa", size = 266292, upload-time = "2025-07-02T19:34:19.163Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/29/78/1325d33bd9bc7270124d1e8315a226e42a7dd195543a78e775be69daa2ed/Adafruit_Blinka-8.51.0-py3-none-any.whl", hash = "sha256:f01635f4fb5c5255167dea5c0b8feb20cc162f8e8d0140696e236796f897a834", size = 364720, upload-time = "2025-01-16T19:08:15.596Z" }, + { url = "https://files.pythonhosted.org/packages/89/a8/fa70af6c9d6bfb9d2688f4610a33719f56a3419e9a1f69aa2dae299007f8/adafruit_blinka-8.62.0-py3-none-any.whl", hash = "sha256:22234f4c8fa8ca5717ce588ae90f71b95bcf2869f855bb47a62e9dacc6b1099a", size = 394096, upload-time = "2025-07-02T19:34:17.239Z" }, ] [[package]] name = "adafruit-circuitpython-busdevice" -version = "5.2.11" +version = "5.2.13" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "adafruit-blinka" }, { name = "adafruit-circuitpython-typing" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a2/c0/f6347ab32f077413c20f55bc4b0f1592f35affd4d26753394c5ed6c36c4c/adafruit_circuitpython_busdevice-5.2.11.tar.gz", hash = "sha256:a9a1310bee7021703ccc247bb3ff04d0873573948a6c7bee9016361cd6707a71", size = 27627, upload-time = "2025-01-16T19:31:48.745Z" } +sdist = { url = "https://files.pythonhosted.org/packages/34/de/6c974f577169789d5105baba5f9e7d3ac00fdc467bc21673382a5d9e41f4/adafruit_circuitpython_busdevice-5.2.13.tar.gz", hash = "sha256:8dbe511f08a347527652f494b55d793c91dc077e01666824b691ae96a05ff2e6", size = 24165, upload-time = "2025-06-17T16:35:35.483Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e0/c7/9f0e2b2674cb5b1fb35d067a7585a2a76596a36044264eb390980d428ccf/adafruit_circuitpython_busdevice-5.2.11-py3-none-any.whl", hash = "sha256:d4379c9ae86a15f7044dea815a94525ca9eda6a7c0b2fa0e75cf9e700c9384b8", size = 7539, upload-time = "2025-01-16T19:31:38.015Z" }, + { url = "https://files.pythonhosted.org/packages/fb/4f/e9fad422c8e85213f3b9e2d0e58342c67bf03c50f889661adef12f07495f/adafruit_circuitpython_busdevice-5.2.13-py3-none-any.whl", hash = "sha256:de90f8cd9cc7f8815840f04b6a24c9aa5ec355b368934c7373e219a1c740ea97", size = 7501, upload-time = "2025-06-17T16:35:34.738Z" }, ] [[package]] name = "adafruit-circuitpython-connectionmanager" -version = "3.1.3" +version = "3.1.5" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "adafruit-blinka" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/69/8b/8316002905f97a7f7e9c3a53dd9bb5a17889033ec55c403a6e55077f6298/adafruit_circuitpython_connectionmanager-3.1.3.tar.gz", hash = "sha256:0f133bdedf454ede0c0a866ed605fe166cc85f75cfcea74758e3622ae403e5f9", size = 37381, upload-time = "2025-01-16T19:42:03.074Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6b/24/22c00c99d0597e703dd73b5f042854620a5db2424c03606e93d3f4e2e5a8/adafruit_circuitpython_connectionmanager-3.1.5.tar.gz", hash = "sha256:fc037d7ff81cf7bab7653f2810ed8c65fe228e7d51ca7a630724b412d6c77226", size = 33632, upload-time = "2025-06-17T16:33:46.705Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/55/7d/896b31bd31eff89e5cab5d3acec9d3d34f5a0654ceab25e01865e628d9f9/adafruit_circuitpython_connectionmanager-3.1.3-py3-none-any.whl", hash = "sha256:9df3a4c617dae27bad1ac8607f1a084312c8498d831ebe1c6a2c8d5cb309daea", size = 7811, upload-time = "2025-01-16T19:42:00.823Z" }, + { url = "https://files.pythonhosted.org/packages/eb/37/09acb7aed34a1c72465884d071a9dbad112994a3f416ad904e4acfd83bc8/adafruit_circuitpython_connectionmanager-3.1.5-py3-none-any.whl", hash = "sha256:cea077efe79eaefcd8fc0d6649dbcc6cb0765f71a08bd944fb163043b18cd094", size = 7767, upload-time = "2025-06-17T16:33:45.931Z" }, ] [[package]] name = "adafruit-circuitpython-requests" -version = "4.1.9" +version = "4.1.13" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "adafruit-blinka" }, { name = "adafruit-circuitpython-connectionmanager" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/6a/45/070129e6b77f801514cd974524c6b9fd502aa04dd5c2e45ab03e85c96cac/adafruit_circuitpython_requests-4.1.9.tar.gz", hash = "sha256:b9eeb252b43946f1a90c34ca8844e07bb1e01cd210c927f561d0e10b97c5ff9d", size = 66232, upload-time = "2025-01-16T20:00:08.727Z" } +sdist = { url = "https://files.pythonhosted.org/packages/55/5c/d17ff26270289c11ea787a73a922c1a9d85d8dea67e8d2fad1e36b181bc1/adafruit_circuitpython_requests-4.1.13.tar.gz", hash = "sha256:a63fa4eb5824f1f458030da6f44a060d28c01570ffa48569b992abe8e477a1d6", size = 67276, upload-time = "2025-06-17T16:39:26.862Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/40/ff356fd61ef3ea044b7944687d62419c304217381ee20d9fa444aeb98339/adafruit_circuitpython_requests-4.1.9-py3-none-any.whl", hash = "sha256:d0f0a899c6ef143eab9a50a9625be43f5f8da7b9688c1496891999fa20107c93", size = 10721, upload-time = "2025-01-16T20:00:07.437Z" }, + { url = "https://files.pythonhosted.org/packages/bf/53/c59ee1edf3305fc5a66ea62db50918ce841a5f6bf7b94d273625a9364f7d/adafruit_circuitpython_requests-4.1.13-py3-none-any.whl", hash = "sha256:2d5af59a96dca033033fcc8c17829c3fb28ed8c36a95fe1093c463f5841bc5a5", size = 10880, upload-time = "2025-06-17T16:39:25.909Z" }, ] [[package]] @@ -74,11 +74,11 @@ wheels = [ [[package]] name = "adafruit-platformdetect" -version = "3.77.0" +version = "3.81.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6b/4e/2b2ca031227de47e2aab6cf092b78934c9c0033a685075ddab3e0c0b55fe/adafruit_platformdetect-3.77.0.tar.gz", hash = "sha256:adce6386059637e92b4cb5d3430d016119cd3eb19f9276920c54515f3d798949", size = 48024, upload-time = "2025-01-16T18:57:59.87Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d2/43/9003bd628401797649ecbfc884b9e4bbf54bc9041f3efaed527666e9ee43/adafruit_platformdetect-3.81.0.tar.gz", hash = "sha256:485fce8671db80443954fc47767a042284aeeab48d93e2125846febf7d22f21f", size = 48624, upload-time = "2025-07-02T18:06:42.881Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/30/18/b18e9ff2aee42f03082675c5d18d4eb02411477e07c86d74833d3396792e/Adafruit_PlatformDetect-3.77.0-py3-none-any.whl", hash = "sha256:93f599c21e7db2d92bc32ac69ba5063876404c4af87d11358863e62f407409be", size = 25542, upload-time = "2025-01-16T18:57:57.354Z" }, + { url = "https://files.pythonhosted.org/packages/49/5d/7759035c26cdc63c8f961a5e9c3a38aa4c0889cc4f3266c5735bc79a1f9f/adafruit_platformdetect-3.81.0-py3-none-any.whl", hash = "sha256:e63c6cbddaff05cadae4385adbfa44cc68a5b04c3c5171cff6db746ffc6d8d17", size = 26180, upload-time = "2025-07-02T18:06:41.487Z" }, ] [[package]] @@ -122,29 +122,29 @@ wheels = [ [[package]] name = "distlib" -version = "0.3.9" +version = "0.4.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0d/dd/1bec4c5ddb504ca60fc29472f3d27e8d4da1257a854e1d96742f15c1d02d/distlib-0.3.9.tar.gz", hash = "sha256:a60f20dea646b8a33f3e7772f74dc0b2d0772d2837ee1342a00645c81edf9403", size = 613923, upload-time = "2024-10-09T18:35:47.551Z" } +sdist = { url = "https://files.pythonhosted.org/packages/96/8e/709914eb2b5749865801041647dc7f4e6d00b549cfe88b65ca192995f07c/distlib-0.4.0.tar.gz", hash = "sha256:feec40075be03a04501a973d81f633735b4b69f98b05450592310c0f401a4e0d", size = 614605, upload-time = "2025-07-17T16:52:00.465Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/91/a1/cf2472db20f7ce4a6be1253a81cfdf85ad9c7885ffbed7047fb72c24cf87/distlib-0.3.9-py2.py3-none-any.whl", hash = "sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87", size = 468973, upload-time = "2024-10-09T18:35:44.272Z" }, + { url = "https://files.pythonhosted.org/packages/33/6b/e0547afaf41bf2c42e52430072fa5658766e3d65bd4b03a563d1b6336f57/distlib-0.4.0-py2.py3-none-any.whl", hash = "sha256:9659f7d87e46584a30b5780e43ac7a2143098441670ff0a49d5f9034c54a6c16", size = 469047, upload-time = "2025-07-17T16:51:58.613Z" }, ] [[package]] name = "filelock" -version = "3.17.0" +version = "3.18.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/dc/9c/0b15fb47b464e1b663b1acd1253a062aa5feecb07d4e597daea542ebd2b5/filelock-3.17.0.tar.gz", hash = "sha256:ee4e77401ef576ebb38cd7f13b9b28893194acc20a8e68e18730ba9c0e54660e", size = 18027, upload-time = "2025-01-21T20:04:49.099Z" } +sdist = { url = "https://files.pythonhosted.org/packages/0a/10/c23352565a6544bdc5353e0b15fc1c563352101f30e24bf500207a54df9a/filelock-3.18.0.tar.gz", hash = "sha256:adbc88eabb99d2fec8c9c1b229b171f18afa655400173ddc653d5d01501fb9f2", size = 18075, upload-time = "2025-03-14T07:11:40.47Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/89/ec/00d68c4ddfedfe64159999e5f8a98fb8442729a63e2077eb9dcd89623d27/filelock-3.17.0-py3-none-any.whl", hash = "sha256:533dc2f7ba78dc2f0f531fc6c4940addf7b70a481e269a5a3b93be94ffbe8338", size = 16164, upload-time = "2025-01-21T20:04:47.734Z" }, + { url = "https://files.pythonhosted.org/packages/4d/36/2a115987e2d8c300a974597416d9de88f2444426de9571f4b59b2cca3acc/filelock-3.18.0-py3-none-any.whl", hash = "sha256:c401f4f8377c4464e6db25fff06205fd89bdd83b65eb0488ed1b160f780e21de", size = 16215, upload-time = "2025-03-14T07:11:39.145Z" }, ] [[package]] name = "identify" -version = "2.6.6" +version = "2.6.12" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/82/bf/c68c46601bacd4c6fb4dd751a42b6e7087240eaabc6487f2ef7a48e0e8fc/identify-2.6.6.tar.gz", hash = "sha256:7bec12768ed44ea4761efb47806f0a41f86e7c0a5fdf5950d4648c90eca7e251", size = 99217, upload-time = "2025-01-20T20:38:02.989Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/88/d193a27416618628a5eea64e3223acd800b40749a96ffb322a9b55a49ed1/identify-2.6.12.tar.gz", hash = "sha256:d8de45749f1efb108badef65ee8386f0f7bb19a7f26185f74de6367bffbaf0e6", size = 99254, upload-time = "2025-05-23T20:37:53.3Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/74/a1/68a395c17eeefb04917034bd0a1bfa765e7654fa150cca473d669aa3afb5/identify-2.6.6-py2.py3-none-any.whl", hash = "sha256:cbd1810bce79f8b671ecb20f53ee0ae8e86ae84b557de31d89709dc2a48ba881", size = 99083, upload-time = "2025-01-20T20:38:00.261Z" }, + { url = "https://files.pythonhosted.org/packages/7a/cd/18f8da995b658420625f7ef13f037be53ae04ec5ad33f9b718240dcfd48c/identify-2.6.12-py2.py3-none-any.whl", hash = "sha256:ad9672d5a72e0d2ff7c5c8809b62dfa60458626352fb0eb7b55e69bdc45334a2", size = 99145, upload-time = "2025-05-23T20:37:51.495Z" }, ] [[package]] @@ -158,27 +158,27 @@ wheels = [ [[package]] name = "nodejs-wheel-binaries" -version = "22.15.0" +version = "22.17.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/45/5b/6c5f973765b96793d4e4d03684bcbd273b17e471ecc7e9bec4c32b595ebd/nodejs_wheel_binaries-22.15.0.tar.gz", hash = "sha256:ff81aa2a79db279c2266686ebcb829b6634d049a5a49fc7dc6921e4f18af9703", size = 8054, upload-time = "2025-04-23T16:57:40.338Z" } +sdist = { url = "https://files.pythonhosted.org/packages/48/27/97bf86b124b3e385fa39c22480d7fad934c28e6591c869ee8879260329f5/nodejs_wheel_binaries-22.17.1.tar.gz", hash = "sha256:0a8bf2a9d319988b8fa8b8b7bb5a7d986527672e6d6352735714f768af9828d0", size = 8065, upload-time = "2025-07-27T16:02:29.207Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d3/a8/a32e5bb99e95c536e7dac781cffab1e7e9f8661b8ee296b93df77e4df7f9/nodejs_wheel_binaries-22.15.0-py2.py3-none-macosx_11_0_arm64.whl", hash = "sha256:aa16366d48487fff89446fb237693e777aa2ecd987208db7d4e35acc40c3e1b1", size = 50514526, upload-time = "2025-04-23T16:57:07.478Z" }, - { url = "https://files.pythonhosted.org/packages/05/e8/eb024dbb3a7d3b98c8922d1c306be989befad4d2132292954cb902f43b07/nodejs_wheel_binaries-22.15.0-py2.py3-none-macosx_11_0_x86_64.whl", hash = "sha256:a54bb3fee9170003fa8abc69572d819b2b1540344eff78505fcc2129a9175596", size = 51409179, upload-time = "2025-04-23T16:57:11.599Z" }, - { url = "https://files.pythonhosted.org/packages/3f/0f/baa968456c3577e45c7d0e3715258bd175dcecc67b683a41a5044d5dae40/nodejs_wheel_binaries-22.15.0-py2.py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:867121ccf99d10523f6878a26db86e162c4939690e24cfb5bea56d01ea696c93", size = 57364460, upload-time = "2025-04-23T16:57:15.725Z" }, - { url = "https://files.pythonhosted.org/packages/2f/a2/977f63cd07ed8fc27bc0d0cd72e801fc3691ffc8cd40a51496ff18a6d0a2/nodejs_wheel_binaries-22.15.0-py2.py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ab0fbcda2ddc8aab7db1505d72cb958f99324b3834c4543541a305e02bfe860", size = 57889101, upload-time = "2025-04-23T16:57:19.643Z" }, - { url = "https://files.pythonhosted.org/packages/67/7f/57b9c24a4f0d25490527b043146aa0fdff2d8fdc82f90667cdaf6f00cfc9/nodejs_wheel_binaries-22.15.0-py2.py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:2bde1d8e00cd955b9ce9ee9ac08309923e2778a790ee791b715e93e487e74bfd", size = 59190817, upload-time = "2025-04-23T16:57:23.875Z" }, - { url = "https://files.pythonhosted.org/packages/fd/7f/970acbe33b81c22b3c7928f52e32347030aa46d23d779cf781cf9a9cf557/nodejs_wheel_binaries-22.15.0-py2.py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:acdd4ef73b6701aab9fbe02ac5e104f208a5e3c300402fa41ad7bc7f49499fbf", size = 60220316, upload-time = "2025-04-23T16:57:28.276Z" }, - { url = "https://files.pythonhosted.org/packages/07/4c/030243c04bb60f0de66c2d7ee3be289c6d28ef09113c06ffa417bdfedf8f/nodejs_wheel_binaries-22.15.0-py2.py3-none-win_amd64.whl", hash = "sha256:51deaf13ee474e39684ce8c066dfe86240edb94e7241950ca789befbbbcbd23d", size = 40718853, upload-time = "2025-04-23T16:57:32.651Z" }, - { url = "https://files.pythonhosted.org/packages/1f/49/011d472814af4fabeaab7d7ce3d5a1a635a3dadc23ae404d1f546839ecb3/nodejs_wheel_binaries-22.15.0-py2.py3-none-win_arm64.whl", hash = "sha256:01a3fe4d60477f93bf21a44219db33548c75d7fed6dc6e6f4c05cf0adf015609", size = 36436645, upload-time = "2025-04-23T16:57:36.326Z" }, + { url = "https://files.pythonhosted.org/packages/0d/04/814f76f2e5f27eae05aaa6bb8840f01f378e9a441c5ccdbe7999efa7acae/nodejs_wheel_binaries-22.17.1-py2.py3-none-macosx_11_0_arm64.whl", hash = "sha256:1f4d208c0c087a2909b6e9e6e0735da083dc997aa74e9b302703b0798b2faa4c", size = 51003618, upload-time = "2025-07-27T16:01:57.617Z" }, + { url = "https://files.pythonhosted.org/packages/47/db/d0edcebaa420b1079e180959bc841dce638ccc3e45a76b41c4ea7318aa0d/nodejs_wheel_binaries-22.17.1-py2.py3-none-macosx_11_0_x86_64.whl", hash = "sha256:457ada98c6e3e03c7fd3f7d6a55572b70af7155c8dd908246373c63697226db6", size = 51936048, upload-time = "2025-07-27T16:02:01.357Z" }, + { url = "https://files.pythonhosted.org/packages/72/e2/4dc2362718e880341db1105a56d7a58477c53edd36e8aac83a197ba7152d/nodejs_wheel_binaries-22.17.1-py2.py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a79a87aeb2f1dfc3d36cd595921f7671a7342467f8b224b56e9049771e5ec20b", size = 57928386, upload-time = "2025-07-27T16:02:04.887Z" }, + { url = "https://files.pythonhosted.org/packages/cc/c2/9ef78ae76cfd4540c0b552f499d3f73b35bd9391ecf13bf558e8ea22cd00/nodejs_wheel_binaries-22.17.1-py2.py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05c4eafec348e439d069cd5a114f893c5f7ea898752e34a8aa43aacd39fcf9a3", size = 58461623, upload-time = "2025-07-27T16:02:08.595Z" }, + { url = "https://files.pythonhosted.org/packages/f0/65/7f2adb75571981615a22b4bc3852de1a8cc1cf416de12191665ce5e76119/nodejs_wheel_binaries-22.17.1-py2.py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:fc9690ed95b186ef4bb8dd316e83878d016a0b6072454f8f68fa843c1016f85b", size = 59781116, upload-time = "2025-07-27T16:02:12.181Z" }, + { url = "https://files.pythonhosted.org/packages/5b/a9/d3c28d3626bb8639067d479bc9e30127673ce4bc477a2db2e8a4355cafa9/nodejs_wheel_binaries-22.17.1-py2.py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:8200379c4c5ec957230285d2e7844f94de87ec0e8316b72b7a5f923cf19e88f2", size = 60832038, upload-time = "2025-07-27T16:02:16.516Z" }, + { url = "https://files.pythonhosted.org/packages/6d/aa/189ebcd6ad819dcacba9e117ae13f4a6d30397d12e862c6db261b63b348a/nodejs_wheel_binaries-22.17.1-py2.py3-none-win_amd64.whl", hash = "sha256:dadc1cf0d5dfacb4dbf2f339d8c070c58e48b37328a44f845de1d27fbbf2381f", size = 40120435, upload-time = "2025-07-27T16:02:23.079Z" }, + { url = "https://files.pythonhosted.org/packages/95/9e/6761d5af600a431862d7f8236e0a3ce326d40d3b33358a6e074d97bb53c6/nodejs_wheel_binaries-22.17.1-py2.py3-none-win_arm64.whl", hash = "sha256:fde8e767272620c58cb882df104462d8f62859223dbf9ab50678d9f0c09dbbf5", size = 38864712, upload-time = "2025-07-27T16:02:25.806Z" }, ] [[package]] name = "platformdirs" -version = "4.3.6" +version = "4.3.8" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/13/fc/128cc9cb8f03208bdbf93d3aa862e16d376844a14f9a0ce5cf4507372de4/platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907", size = 21302, upload-time = "2024-09-17T19:06:50.688Z" } +sdist = { url = "https://files.pythonhosted.org/packages/fe/8b/3c73abc9c759ecd3f1f7ceff6685840859e8070c4d947c93fae71f6a0bf2/platformdirs-4.3.8.tar.gz", hash = "sha256:3d512d96e16bcb959a814c9f348431070822a6496326a4be0911c40b5a74c2bc", size = 21362, upload-time = "2025-05-07T22:47:42.121Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/3c/a6/bc1012356d8ece4d66dd75c4b9fc6c1f6650ddd5991e421177d9f8f671be/platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb", size = 18439, upload-time = "2024-09-17T19:06:49.212Z" }, + { url = "https://files.pythonhosted.org/packages/fe/39/979e8e21520d4e47a0bbe349e2713c0aac6f3d853d0e5b34d76206c439aa/platformdirs-4.3.8-py3-none-any.whl", hash = "sha256:ff7059bb7eb1179e2685604f4aaf157cfd9535242bd23742eadc3c13542139b4", size = 18567, upload-time = "2025-05-07T22:47:40.376Z" }, ] [[package]] @@ -293,23 +293,23 @@ sdist = { url = "https://files.pythonhosted.org/packages/0c/d7/5d2f861155e9749f9 [[package]] name = "typing-extensions" -version = "4.12.2" +version = "4.14.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/df/db/f35a00659bc03fec321ba8bce9420de607a1d37f8342eee1863174c69557/typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8", size = 85321, upload-time = "2024-06-07T18:52:15.995Z" } +sdist = { url = "https://files.pythonhosted.org/packages/98/5a/da40306b885cc8c09109dc2e1abd358d5684b1425678151cdaed4731c822/typing_extensions-4.14.1.tar.gz", hash = "sha256:38b39f4aeeab64884ce9f74c94263ef78f3c22467c8724005483154c26648d36", size = 107673, upload-time = "2025-07-04T13:28:34.16Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", size = 37438, upload-time = "2024-06-07T18:52:13.582Z" }, + { url = "https://files.pythonhosted.org/packages/b5/00/d631e67a838026495268c2f6884f3711a15a9a2a96cd244fdaea53b823fb/typing_extensions-4.14.1-py3-none-any.whl", hash = "sha256:d1e1e3b58374dc93031d6eda2420a48ea44a36c2b4766a4fdeb3710755731d76", size = 43906, upload-time = "2025-07-04T13:28:32.743Z" }, ] [[package]] name = "virtualenv" -version = "20.29.1" +version = "20.32.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "distlib" }, { name = "filelock" }, { name = "platformdirs" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a7/ca/f23dcb02e161a9bba141b1c08aa50e8da6ea25e6d780528f1d385a3efe25/virtualenv-20.29.1.tar.gz", hash = "sha256:b8b8970138d32fb606192cb97f6cd4bb644fa486be9308fb9b63f81091b5dc35", size = 7658028, upload-time = "2025-01-17T17:32:23.085Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a9/96/0834f30fa08dca3738614e6a9d42752b6420ee94e58971d702118f7cfd30/virtualenv-20.32.0.tar.gz", hash = "sha256:886bf75cadfdc964674e6e33eb74d787dff31ca314ceace03ca5810620f4ecf0", size = 6076970, upload-time = "2025-07-21T04:09:50.985Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/89/9b/599bcfc7064fbe5740919e78c5df18e5dceb0887e676256a1061bb5ae232/virtualenv-20.29.1-py3-none-any.whl", hash = "sha256:4e4cb403c0b0da39e13b46b1b2476e505cb0046b25f242bee80f62bf990b2779", size = 4282379, upload-time = "2025-01-17T17:32:19.864Z" }, + { url = "https://files.pythonhosted.org/packages/5c/c6/f8f28009920a736d0df434b52e9feebfb4d702ba942f15338cb4a83eafc1/virtualenv-20.32.0-py3-none-any.whl", hash = "sha256:2c310aecb62e5aa1b06103ed7c2977b81e042695de2697d01017ff0f1034af56", size = 6057761, upload-time = "2025-07-21T04:09:48.059Z" }, ]