diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 77145f7..70752c3 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -14,6 +14,13 @@ jobs: - name: Lint run: | make fmt + typecheck: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Typecheck + run: | + make typecheck archive: runs-on: ubuntu-latest steps: @@ -21,8 +28,13 @@ jobs: - name: Build run: | make build - - name: Archive + - name: Archive Flight Software + uses: actions/upload-artifact@v4 + with: + name: proveskit-flight-software + path: artifacts/proves/flight-software + - name: Archive Ground Station uses: actions/upload-artifact@v4 with: - name: proves - path: artifacts/proves.zip + name: proveskit-ground-station + path: artifacts/proves/ground-station diff --git a/.gitignore b/.gitignore index 053d20e..6dc7fd5 100644 --- a/.gitignore +++ b/.gitignore @@ -11,5 +11,6 @@ venv **/*.mpy # libs -/lib/* -!/lib/requirements.txt +src/*/lib/* +!src/*/lib/requirements.txt +!src/flight-software/lib/proveskit_rp2350_v5a/ diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 84e38cd..e830218 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -7,6 +7,9 @@ repos: - id: check-yaml - id: check-json - id: check-added-large-files + - id: pretty-format-json + args: [--autofix] + exclude: '.vscode/.*' #- id: mixed-line-ending # args: [ --fix=lf ] diff --git a/Makefile b/Makefile index 91fb16d..a3828dd 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -PYSQUARED_VERSION ?= v2.0.0-alpha-25w20 +PYSQUARED_VERSION ?= v2.0.0-alpha-25w26-2 PYSQUARED ?= git+https://github.com/proveskit/pysquared@$(PYSQUARED_VERSION) .PHONY: all @@ -14,16 +14,19 @@ help: ## Display this help. @echo "Creating virtual environment..." @$(MAKE) uv @$(UV) venv - @$(UV) pip install --requirement pyproject.toml + @$(UV) sync .PHONY: download-libraries -download-libraries: uv .venv ## Download the required libraries - @echo "Downloading libraries..." - @$(UV) pip install --requirement lib/requirements.txt --target lib --no-deps --upgrade --quiet - @$(UV) pip --no-cache install $(PYSQUARED) --target lib --no-deps --upgrade --quiet +download-libraries: download-libraries-flight-software download-libraries-ground-station - @rm -rf lib/*.dist-info - @rm -rf lib/.lock +.PHONY: download-libraries-% +download-libraries-%: uv .venv ## Download the required libraries + @echo "Downloading libraries for $*..." + @$(UV) pip install --requirement src/$*/lib/requirements.txt --target src/$*/lib --no-deps --upgrade --quiet + @$(UV) pip --no-cache install $(PYSQUARED) --target src/$*/lib --no-deps --upgrade --quiet + + @rm -rf src/$*/lib/*.dist-info + @rm -rf src/$*/lib/.lock .PHONY: pre-commit-install pre-commit-install: uv @@ -38,17 +41,20 @@ sync-time: uv ## Syncs the time from your computer to the PROVES Kit board fmt: pre-commit-install ## Lint and format files $(UVX) pre-commit run --all-files +typecheck: .venv download-libraries ## Run type check + @$(UV) run -m pyright . + BOARD_MOUNT_POINT ?= "" VERSION ?= $(shell git tag --points-at HEAD --sort=-creatordate < /dev/null | head -n 1) .PHONY: install -install: build ## Install the project onto a connected PROVES Kit use `make install BOARD_MOUNT_POINT=/my_board_destination/` to specify the mount point +install-%: build-% ## Install the project onto a connected PROVES Kit use `make install-flight-software BOARD_MOUNT_POINT=/my_board_destination/` to specify the mount point ifeq ($(OS),Windows_NT) rm -rf $(BOARD_MOUNT_POINT) - cp -r artifacts/proves/* $(BOARD_MOUNT_POINT) + cp -r artifacts/proves/$*/* $(BOARD_MOUNT_POINT) else @rm $(BOARD_MOUNT_POINT)/code.py > /dev/null 2>&1 || true - $(call rsync_to_dest,artifacts/proves,$(BOARD_MOUNT_POINT)) + $(call rsync_to_dest,artifacts/proves/$*,$(BOARD_MOUNT_POINT)) endif # install-firmware @@ -63,15 +69,18 @@ clean: ## Remove all gitignored files such as downloaded libraries and artifacts ##@ Build .PHONY: build -build: download-libraries mpy-cross ## Build the project, store the result in the artifacts directory - @echo "Creating artifacts/proves" - @mkdir -p artifacts/proves - @echo "__version__ = '$(VERSION)'" > artifacts/proves/version.py - $(call compile_mpy) - $(call rsync_to_dest,.,artifacts/proves/) - @$(UV) run python -c "import os; [os.remove(os.path.join(root, file)) for root, _, files in os.walk('artifacts/proves/lib') for file in files if file.endswith('.py')]" - @echo "Creating artifacts/proves.zip" - @zip -r artifacts/proves.zip artifacts/proves > /dev/null +build: build-flight-software build-ground-station ## Build all projects + +.PHONY: build-* +build-%: download-libraries-% mpy-cross ## Build the project, store the result in the artifacts directory + @echo "Creating artifacts/proves/$*" + @mkdir -p artifacts/proves/$* + @echo "__version__ = '$(VERSION)'" > artifacts/proves/$*/version.py + $(call compile_mpy,$*) + $(call rsync_to_dest,src/$*,artifacts/proves/$*/) + @$(UV) run python -c "import os; [os.remove(os.path.join(root, file)) for root, _, files in os.walk('artifacts/proves/$*/lib') for file in files if file.endswith('.py')]" + @echo "Creating artifacts/proves/$*.zip" + @zip -r artifacts/proves/$*.zip artifacts/proves/$* > /dev/null define rsync_to_dest @if [ -z "$(1)" ]; then \ @@ -84,7 +93,7 @@ define rsync_to_dest exit 1; \ fi - @rsync -avh $(1)/config.json artifacts/proves/version.py $(1)/*.py $(1)/lib --exclude=".*" --exclude='requirements.txt' --exclude='__pycache__' $(2) --delete --times --checksum + @rsync -avh ./config.json $(2)/version.py $(1)/*.py $(1)/lib --exclude=".*" --exclude='requirements.txt' --exclude='__pycache__' $(2) --delete --times --checksum endef ##@ Build Tools @@ -93,7 +102,7 @@ $(TOOLS_DIR): mkdir -p $(TOOLS_DIR) ### Tool Versions -UV_VERSION ?= 0.5.24 +UV_VERSION ?= 0.7.13 MPY_CROSS_VERSION ?= 9.0.5 UV_DIR ?= $(TOOLS_DIR)/uv-$(UV_VERSION) @@ -133,5 +142,5 @@ endif endif define compile_mpy - @$(UV) run python -c "import os, subprocess; [subprocess.run(['$(MPY_CROSS)', os.path.join(root, file)]) for root, _, files in os.walk('lib') for file in files if file.endswith('.py')]" || exit 1 + @$(UV) run python -c "import os, subprocess; [subprocess.run(['$(MPY_CROSS)', os.path.join(root, file)]) for root, _, files in os.walk('src/$(1)/lib') for file in files if file.endswith('.py')]" || exit 1 endef diff --git a/config.json b/config.json index b0dfc53..62f94f9 100644 --- a/config.json +++ b/config.json @@ -1,87 +1,84 @@ { -"cubesat_name": "Orpheus", -"last_battery_temp": 20.0, -"sleep_duration": 30, -"detumble_enable_z": true, -"detumble_enable_x":true, -"detumble_enable_y": true, -"jokes": [ - "Hey it is pretty cold up here, did someone forget to pay the electric bill?", - "sudo rf - rf*", - "Why did the astronaut break up with his girlfriend? He needed space.", - "Why did the sun go to school? To get a little brighter.", - "why is the mall called the mall? because instead of going to one store you go to them all", - "Alien detected. Blurring photo...", - "Wait it is all open source? Always has been... www.github.com/proveskit", - "What did 0 say to 1? You're a bit too much.", - "Pleiades - Orpheus has been recently acquired by the Onion News Network", - "This jokesat was brought to you by the Bronco Space Ministry of Labor and Job Placement", - "Catch you on the next pass!", - "Pleiades - Orpheus was not The Impostor", - "Sorry for messing with your long-exposure astrophoto!", - "Better buy a telescope. Wanna see me. Buy a telescope. Gonna be in space.", - "According to all known laws of aviation, there is no way bees should be able to fly...", - "You lost the game ", - "Bobby Tables is a good friend of mine", - "Why did the computer cross the road? To get a byte to eat!", - "Why are the astronauts not hungry when they got to space? They had a big launch.", - "Why did the computer get glasses? To improve its web sight!", - "What are computers favorite snacks? Chips!", - "Wait! I think I see a White 2019 Subaru Crosstrek 2.0i Premium", - "IS THAT A SUPRA?!", - "Finally escpaed the LA Traffic", - "My CubeSat is really good at jokes, but its delivery is always delayed.", - "exec order 66", - "I had a joke about UDP, but I am not sure if you'd get it.", - "I am not saying FSK modulation is the best way to send jokes, but at least it is never monotone!", - "I am sorry David, I am afrain I can not do that.", - "My memory is volatile like RAM, so it only makes sense that I forget things.", - "Imagine it gets stuck and just keeps repeating this joke every 2 mins", - "Check Engine: Error Code 404: Joke Not Found", - "CQ CQ KN6NAQ ... KN6NAT are you out there?", - "Woah is that the Launcher Orbiter?????", - "Everything in life is a spring if you think hard enough!" - ], -"debug": true, -"heating": false, -"normal_temp": 20, -"normal_battery_temp": 1, -"normal_micro_temp": 20, -"normal_charge_current": 0.5, -"normal_battery_voltage": 6.9, -"critical_battery_voltage": 6.6, -"battery_voltage": 5.2, -"current_draw": 240.5, -"reboot_time": 3600, -"longest_allowable_sleep_time": 360, -"turbo_clock": false, -"radio": { - "license": "", - "receiver_id": 250, - "sender_id": 251, - "start_time": 80000, - "transmit_frequency": 437.4, + "battery_voltage": 5.2, + "critical_battery_voltage": 6.6, + "cubesat_name": "PROVES-MY_SATELLITE_NAME", + "current_draw": 240.5, + "debug": true, + "detumble_enable_x": true, + "detumble_enable_y": true, + "detumble_enable_z": true, + "heating": false, + "jokes": [ + "Hey it is pretty cold up here, did someone forget to pay the electric bill?", + "sudo rf - rf*", + "Why did the astronaut break up with his girlfriend? He needed space.", + "Why did the sun go to school? To get a little brighter.", + "why is the mall called the mall? because instead of going to one store you go to them all", + "Alien detected. Blurring photo...", + "Wait it is all open source? Always has been... www.github.com/proveskit", + "What did 0 say to 1? You're a bit too much.", + "Pleiades - Orpheus has been recently acquired by the Onion News Network", + "This jokesat was brought to you by the Bronco Space Ministry of Labor and Job Placement", + "Catch you on the next pass!", + "Pleiades - Orpheus was not The Impostor", + "Sorry for messing with your long-exposure astrophoto!", + "Better buy a telescope. Wanna see me. Buy a telescope. Gonna be in space.", + "According to all known laws of aviation, there is no way bees should be able to fly...", + "You lost the game ", + "Bobby Tables is a good friend of mine", + "Why did the computer cross the road? To get a byte to eat!", + "Why are the astronauts not hungry when they got to space? They had a big launch.", + "Why did the computer get glasses? To improve its web sight!", + "What are computers favorite snacks? Chips!", + "Wait! I think I see a White 2019 Subaru Crosstrek 2.0i Premium", + "IS THAT A SUPRA?!", + "Finally escpaed the LA Traffic", + "My CubeSat is really good at jokes, but its delivery is always delayed.", + "exec order 66", + "I had a joke about UDP, but I am not sure if you'd get it.", + "I am not saying FSK modulation is the best way to send jokes, but at least it is never monotone!", + "I am sorry David, I am afrain I can not do that.", + "My memory is volatile like RAM, so it only makes sense that I forget things.", + "Imagine it gets stuck and just keeps repeating this joke every 2 mins", + "Check Engine: Error Code 404: Joke Not Found", + "CQ CQ KN6NAQ ... KN6NAT are you out there?", + "Woah is that the Launcher Orbiter?????", + "Everything in life is a spring if you think hard enough!", + "Your Mom", + "Your Mum", + "Your Face", + "not True lol", + "I have brought peace, freedom, justice, and security to my new empire! Your New Empire?" + ], + "last_battery_temp": 20.0, + "longest_allowable_sleep_time": 360, + "normal_battery_temp": 1, + "normal_battery_voltage": 6.9, + "normal_charge_current": 0.5, + "normal_micro_temp": 20, + "normal_temp": 20, + "radio": { + "fsk": { + "broadcast_address": 255, + "modulation_type": 0, + "node_address": 1 + }, + "license": "KK4PDM", "lora": { - "ack_delay": 0.2, - "coding_rate": 8, - "cyclic_redundancy_check": true, - "max_output": true, - "spreading_factor": 8, - "transmit_power": 23 + "ack_delay": 0.2, + "coding_rate": 8, + "cyclic_redundancy_check": true, + "max_output": true, + "spreading_factor": 8, + "transmit_power": 23 }, - "fsk": { - "broadcast_address": 255, - "node_address": 1, - "modulation_type": 0 - } -}, -"super_secret_code": "ABCD", -"repeat_code": "RP", -"joke_reply": [ - "Your Mom", - "Your Mum", - "Your Face", - "not True lol", - "I have brought peace, freedom, justice, and security to my new empire! Your New Empire?" - ] + "modulation": "LoRa", + "start_time": 80000, + "transmit_frequency": 437.4 + }, + "reboot_time": 3600, + "repeat_code": "RP", + "sleep_duration": 30, + "super_secret_code": "ABCD", + "turbo_clock": false } diff --git a/pyproject.toml b/pyproject.toml index 21ec336..6b7d79a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,13 +4,14 @@ version = "1.0.0" description = "Flight Software for the PROVES Kit RP2350 v5A" readme = "README.md" requires-python = ">=3.13" -dependencies = [ - "adafruit-circuitpython-typing==1.11.2", - "circuitpython-stubs==9.2.5", - "coverage==7.6.10", - "pre-commit==4.0.1", - "pyright[nodejs]==1.1.399", - "pytest==8.3.2", +dependencies = [] + +[dependency-groups] +dev = [ + "adafruit-circuitpython-typing==1.12.1", + "circuitpython-stubs==9.2.8", + "pre-commit==4.2.0", + "pyright[nodejs]==1.1.402", ] [tool.ruff.format] @@ -18,13 +19,23 @@ dependencies = [ line-ending = "lf" [tool.pyright] -include = ["main.py", "boot.py", "repl.py", "safemode.py"] +include = [ + "src/flight-software/boot.py", + "src/flight-software/main.py", + "src/flight-software/repl.py", + "src/flight-software/safemode.py", + "src/flight-software/lib/proveskit_rp2040_v4/*", + "src/ground_station/boot.py", + "src/ground_station/main.py", + "src/ground_station/repl.py", + "src/ground_station/safemode.py", +] exclude = [ "**/__pycache__", ".venv", ".git", "artifacts", - "lib", + "src/*/lib", "typings", ] stubPath = "./typings" diff --git a/boot.py b/src/flight-software/boot.py similarity index 100% rename from boot.py rename to src/flight-software/boot.py diff --git a/src/flight-software/lib/proveskit_rp2350_v5a/__init__.py b/src/flight-software/lib/proveskit_rp2350_v5a/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/flight-software/lib/proveskit_rp2350_v5a/register.py b/src/flight-software/lib/proveskit_rp2350_v5a/register.py new file mode 100644 index 0000000..ce5d29e --- /dev/null +++ b/src/flight-software/lib/proveskit_rp2350_v5a/register.py @@ -0,0 +1,3 @@ +class Register: + boot_count = 0 + error_count = 1 diff --git a/lib/requirements.txt b/src/flight-software/lib/requirements.txt similarity index 100% rename from lib/requirements.txt rename to src/flight-software/lib/requirements.txt diff --git a/main.py b/src/flight-software/main.py similarity index 53% rename from main.py rename to src/flight-software/main.py index 07d85fb..016c919 100644 --- a/main.py +++ b/src/flight-software/main.py @@ -15,29 +15,33 @@ import board import digitalio import microcontroller - -import lib.pysquared.functions as functions -import lib.pysquared.nvm.register as register +from lib.proveskit_rp2350_v5a.register import Register +from lib.pysquared.beacon import Beacon from lib.pysquared.cdh import CommandDataHandler from lib.pysquared.config.config import Config 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.magnetometer.manager.lis2mdl import LIS2MDLManager +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.logger import Logger from lib.pysquared.nvm.counter import Counter -from lib.pysquared.nvm.flag import Flag from lib.pysquared.rtc.manager.microcontroller import MicrocontrollerManager -from lib.pysquared.satellite import Satellite from lib.pysquared.sleep_helper import SleepHelper from lib.pysquared.watchdog import Watchdog from version import __version__ +boot_time: float = time.time() + rtc = MicrocontrollerManager() +(boot_count := Counter(index=Register.boot_count)).increment() +error_count: Counter = Counter(index=Register.error_count) + logger: Logger = Logger( - error_counter=Counter(index=register.ERRORCNT), + error_counter=error_count, colorized=False, ) @@ -47,9 +51,9 @@ software_version=__version__, ) -loiter_time: int = 5 try: + loiter_time: int = 5 for i in range(loiter_time): logger.info(f"Code Starting in {loiter_time-i} seconds") time.sleep(1) @@ -60,6 +64,10 @@ logger.debug("Initializing Config") config: Config = Config("config.json") + mux_reset = initialize_pin( + logger, board.MUX_RESET, digitalio.Direction.OUTPUT, False + ) + # TODO(nateinaction): fix spi init spi0 = _spi_init( logger, @@ -75,19 +83,16 @@ board.SPI1_MISO, ) - use_fsk_flag = Flag(index=register.FLAG, bit_index=7) - - radio = SX1280Manager( + sband_radio = SX1280Manager( logger, config.radio, - use_fsk_flag, spi1, initialize_pin(logger, board.SPI1_CS0, digitalio.Direction.OUTPUT, True), initialize_pin(logger, board.RF2_RST, digitalio.Direction.OUTPUT, True), initialize_pin(logger, board.RF2_IO0, digitalio.Direction.OUTPUT, True), 2.4, - initialize_pin(logger, board.RF2_TX_EN, digitalio.Direction.OUTPUT, True), - initialize_pin(logger, board.RF2_RX_EN, digitalio.Direction.OUTPUT, True), + initialize_pin(logger, board.RF2_TX_EN, digitalio.Direction.OUTPUT, False), + initialize_pin(logger, board.RF2_RX_EN, digitalio.Direction.OUTPUT, False), ) i2c1 = initialize_i2c_bus( @@ -97,123 +102,61 @@ 100000, ) - c = Satellite(logger, config) - - sleep_helper = SleepHelper(c, logger, watchdog, config) + sleep_helper = SleepHelper(logger, config, watchdog) - # radio = RFM9xManager( - # logger, - # config.radio, - # Flag(index=register.FLAG, bit_index=7), - # spi0, - # initialize_pin(logger, board.SPI0_CS0, digitalio.Direction.OUTPUT, True), - # initialize_pin(logger, board.RF1_RST, digitalio.Direction.OUTPUT, True), - # ) + uhf_radio = RFM9xManager( + logger, + config.radio, + spi0, + initialize_pin(logger, board.SPI0_CS0, digitalio.Direction.OUTPUT, True), + initialize_pin(logger, board.RF1_RST, digitalio.Direction.OUTPUT, True), + ) magnetometer = LIS2MDLManager(logger, i2c1) imu = LSM6DSOXManager(logger, i2c1, 0x6B) - cdh = CommandDataHandler(config, logger, radio) - - f = functions.functions( - c, + uhf_packet_manager = PacketManager( logger, - config, - sleep_helper, - radio, - magnetometer, - imu, - watchdog, - cdh, + uhf_radio, + config.radio.license, + 0.2, ) - def initial_boot(): - watchdog.pet() - f.beacon() - watchdog.pet() - f.listen() - watchdog.pet() + cdh = CommandDataHandler(logger, config, uhf_packet_manager) - try: - c.boot_count.increment() + beacon = Beacon( + logger, + config.cubesat_name, + uhf_packet_manager, + boot_time, + imu, + magnetometer, + uhf_radio, + sband_radio, + error_count, + boot_count, + ) - logger.info( + def nominal_power_loop(): + logger.debug( "FC Board Stats", bytes_remaining=gc.mem_free(), - boot_number=c.boot_count.get(), ) - initial_boot() + uhf_packet_manager.send(config.radio.license.encode("utf-8")) - except Exception as e: - logger.error("Error in Boot Sequence", e) + beacon.send() - finally: - pass + cdh.listen_for_commands(10) - def send_imu_data(): - logger.info("Looking to get imu data...") - IMUData = [] - watchdog.pet() - logger.info("IMU has baton") - IMUData = imu.get_gyro_data() - watchdog.pet() - radio.send(IMUData) + sleep_helper.safe_sleep(config.sleep_duration) - def main(): - f.beacon() - - f.listen_loiter() - - f.state_of_health() - - f.listen_loiter() - - watchdog.pet() - - f.listen_loiter() - - send_imu_data() - - f.listen_loiter() - - f.joke() - - f.listen_loiter() - - def critical_power_operations(): - initial_boot() - watchdog.pet() - - sleep_helper.long_hibernate() - - def minimum_power_operations(): - initial_boot() - watchdog.pet() - - sleep_helper.short_hibernate() - - ######################### MAIN LOOP ############################## try: + logger.info("Entering main loop") while True: - # L0 automatic tasks no matter the battery level - c.check_reboot() - - if c.power_mode == "critical": - critical_power_operations() - - elif c.power_mode == "minimum": - minimum_power_operations() - - elif c.power_mode == "normal": - main() - - elif c.power_mode == "maximum": - main() - - else: - f.listen() + # TODO(nateinaction): Modify behavior based on power state + nominal_power_loop() except Exception as e: logger.critical("Critical in Main Loop", e) diff --git a/repl.py b/src/flight-software/repl.py similarity index 87% rename from repl.py rename to src/flight-software/repl.py index b7fd17a..8f27206 100644 --- a/repl.py +++ b/src/flight-software/repl.py @@ -25,8 +25,6 @@ import os -import lib.pysquared.functions as functions -import lib.pysquared.nvm.register as register 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### @@ -36,6 +34,7 @@ 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 from lib.pysquared.cdh import CommandDataHandler from lib.pysquared.config.config import Config from lib.pysquared.hardware.busio import _spi_init, initialize_i2c_bus @@ -44,11 +43,10 @@ from lib.pysquared.hardware.magnetometer.manager.lis2mdl import LIS2MDLManager 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.logger import Logger from lib.pysquared.nvm.counter import Counter -from lib.pysquared.nvm.flag import Flag from lib.pysquared.rtc.manager.microcontroller import MicrocontrollerManager -from lib.pysquared.satellite import Satellite from lib.pysquared.sleep_helper import SleepHelper from lib.pysquared.watchdog import Watchdog from version import __version__ @@ -56,7 +54,7 @@ rtc = MicrocontrollerManager() logger: Logger = Logger( - error_counter=Counter(index=register.ERRORCNT), + error_counter=Counter(0), colorized=False, ) @@ -89,11 +87,16 @@ board.SPI1_MISO, ) -i2c0 = initialize_i2c_bus( +sband_radio = SX1280Manager( logger, - board.SCL0, - board.SDA0, - 100000, + config.radio, + spi1, + initialize_pin(logger, board.SPI1_CS0, digitalio.Direction.OUTPUT, True), + initialize_pin(logger, board.RF2_RST, digitalio.Direction.OUTPUT, True), + initialize_pin(logger, board.RF2_IO0, digitalio.Direction.OUTPUT, True), + 2.4, + initialize_pin(logger, board.RF2_TX_EN, digitalio.Direction.OUTPUT, False), + initialize_pin(logger, board.RF2_RX_EN, digitalio.Direction.OUTPUT, False), ) i2c1 = initialize_i2c_bus( @@ -103,14 +106,11 @@ 100000, ) -c = Satellite(logger, config) +sleep_helper = SleepHelper(logger, config, watchdog) -sleep_helper = SleepHelper(c, logger, watchdog, config) - -radio = RFM9xManager( +uhf_radio = RFM9xManager( logger, config.radio, - Flag(index=register.FLAG, bit_index=7), spi0, initialize_pin(logger, board.SPI0_CS0, digitalio.Direction.OUTPUT, True), initialize_pin(logger, board.RF1_RST, digitalio.Direction.OUTPUT, True), @@ -120,41 +120,26 @@ imu = LSM6DSOXManager(logger, i2c1, 0x6B) -cdh = CommandDataHandler(config, logger, radio) - -f = functions.functions( - c, +uhf_packet_manager = PacketManager( logger, - config, - sleep_helper, - radio, - magnetometer, - imu, - watchdog, - cdh, + uhf_radio, + config.radio.license, + 0.2, ) -### This is Hacky V5a Devel Stuff### - -## Initialize the Second Radio ## +cdh = CommandDataHandler(logger, config, uhf_packet_manager) -use_fsk_flag = Flag(index=register.FLAG, bit_index=7) - -radio2 = SX1280Manager( +beacon = Beacon( logger, - config.radio, - use_fsk_flag, - spi1, - initialize_pin(logger, board.SPI1_CS0, digitalio.Direction.OUTPUT, True), - initialize_pin(logger, board.RF2_RST, digitalio.Direction.OUTPUT, True), - initialize_pin(logger, board.RF2_IO0, digitalio.Direction.OUTPUT, True), - 2.4, - initialize_pin(logger, board.RF2_TX_EN, digitalio.Direction.OUTPUT, True), - initialize_pin(logger, board.RF2_RX_EN, digitalio.Direction.OUTPUT, True), + config.cubesat_name, + uhf_packet_manager, + time.monotonic(), + imu, + magnetometer, + uhf_radio, + sband_radio, ) -radio2.send("Hello World") -print("Radio2 sent Hello World") ## Initializing the Burn Wire ## ENABLE_BURN_A = initialize_pin( @@ -275,8 +260,6 @@ def __init__(self, add: int, pos: str, tca: TCA9548A, logger: Logger) -> None: self.position: str = pos self.logger: Logger = logger - # Use tuple instead of list for immutable data - self.senlist: tuple = () # Define sensors based on position using a dictionary lookup instead of if-elif chain sensor_map: dict[str, tuple[str, ...]] = { "x+": ("MCP", "VEML", "DRV"), @@ -285,34 +268,36 @@ def __init__(self, add: int, pos: str, tca: TCA9548A, logger: Logger) -> None: "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 = None - self.veml = None - self.drv = 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 = MCP9808(self.tca[address], address=27) + 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 = VEML7700(self.tca[address]) + 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 = DRV2605(self.tca[address]) + self.drv = DRV2605(self.tca[address]) self.sensors["DRV"] = True except Exception as e: self.logger.error("Error Initializing Motor Driver", e) @@ -343,14 +328,14 @@ def face_test_all(self) -> list[list[float]]: if face: try: temp: Union[float, None] = ( - face.mcp.temperature if face.sensors.get("MCP") else 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 + face.veml.lux if face.sensors.get("VEML") else None # type: ignore ) - results.append([temp, light]) + results.append([temp, light]) # type: ignore except Exception: - results.append([None, None]) + results.append([None, None]) # type: ignore return results diff --git a/safemode.py b/src/flight-software/safemode.py similarity index 100% rename from safemode.py rename to src/flight-software/safemode.py diff --git a/version.py b/src/flight-software/version.py similarity index 100% rename from version.py rename to src/flight-software/version.py diff --git a/src/ground-station/boot.py b/src/ground-station/boot.py new file mode 100644 index 0000000..e69de29 diff --git a/src/ground-station/lib/requirements.txt b/src/ground-station/lib/requirements.txt new file mode 100644 index 0000000..a35aa5d --- /dev/null +++ b/src/ground-station/lib/requirements.txt @@ -0,0 +1,5 @@ +adafruit-circuitpython-asyncio @ git+https://github.com/adafruit/adafruit_circuitpython_asyncio@1.3.3 +adafruit-circuitpython-rfm==1.0.3 +adafruit-circuitpython-ticks==1.1.1 +proveskit-ground-station @ git+https://github.com/proveskit/circuitpython_ground_station@0.0.1 +proves-circuitpython-sx1280 @ git+https://github.com/proveskit/CircuitPython_SX1280@1.0.3 diff --git a/src/ground-station/main.py b/src/ground-station/main.py new file mode 100644 index 0000000..9e7d61e --- /dev/null +++ b/src/ground-station/main.py @@ -0,0 +1,5 @@ +import time + +while True: + print("CTRL + C to start the ground station") + time.sleep(1) diff --git a/src/ground-station/repl.py b/src/ground-station/repl.py new file mode 100644 index 0000000..266c99e --- /dev/null +++ b/src/ground-station/repl.py @@ -0,0 +1,87 @@ +import board +import digitalio +from lib.proveskit_ground_station.proveskit_ground_station import GroundStation +from lib.pysquared.cdh import CommandDataHandler +from lib.pysquared.config.config import Config +from lib.pysquared.hardware.busio import _spi_init +from lib.pysquared.hardware.digitalio import initialize_pin +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.logger import Logger +from lib.pysquared.nvm.counter import Counter + +logger: Logger = Logger( + error_counter=Counter(1), + colorized=False, +) +config: Config = Config("config.json") + +spi0 = _spi_init( + logger, + board.SPI0_SCK, + board.SPI0_MOSI, + board.SPI0_MISO, +) + +spi1 = _spi_init( + logger, + board.SPI1_SCK, + board.SPI1_MOSI, + board.SPI1_MISO, +) + +uhf_radio = RFM9xManager( + logger, + config.radio, + spi0, + initialize_pin(logger, board.SPI0_CS0, digitalio.Direction.OUTPUT, True), + initialize_pin(logger, board.RF1_RST, digitalio.Direction.OUTPUT, True), +) + +uhf_packet_manager = PacketManager( + logger, + uhf_radio, + config.radio.license, + 0.2, +) + +ufh_cdh = CommandDataHandler( + logger, + config, + uhf_packet_manager, +) + +sband_radio = SX1280Manager( + logger, + config.radio, + spi1, + initialize_pin(logger, board.SPI1_CS0, digitalio.Direction.OUTPUT, True), + initialize_pin(logger, board.RF2_RST, digitalio.Direction.OUTPUT, True), + initialize_pin(logger, board.RF2_IO0, digitalio.Direction.OUTPUT, True), + 2.4, + initialize_pin(logger, board.RF2_TX_EN, digitalio.Direction.OUTPUT, False), + initialize_pin(logger, board.RF2_RX_EN, digitalio.Direction.OUTPUT, False), +) + +sband_packet_manager = PacketManager( + logger, + sband_radio, + config.radio.license, + 0.2, +) + +sband_cdh = CommandDataHandler( + logger, + config, + sband_packet_manager, +) + +ground_station = GroundStation( + logger, + config, + uhf_packet_manager, + ufh_cdh, +) + +ground_station.run() diff --git a/src/ground-station/safemode.py b/src/ground-station/safemode.py new file mode 100644 index 0000000..0d4496a --- /dev/null +++ b/src/ground-station/safemode.py @@ -0,0 +1,8 @@ +import time + +import microcontroller + +print("I am in safemode. Help!") + +time.sleep(10) +microcontroller.reset() diff --git a/src/ground-station/version.py b/src/ground-station/version.py new file mode 100644 index 0000000..5b2ad39 --- /dev/null +++ b/src/ground-station/version.py @@ -0,0 +1,3 @@ +# Empty string as the contents of this file is provided by the Makefile +# (Either a version number or an empty string if running an unknown version) +__version__ = "" diff --git a/uv.lock b/uv.lock index a91556e..c255b72 100644 --- a/uv.lock +++ b/uv.lock @@ -1,4 +1,5 @@ version = 1 +revision = 2 requires-python = ">=3.13" [[package]] @@ -13,9 +14,9 @@ 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 } +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" } wheels = [ - { url = "https://files.pythonhosted.org/packages/29/78/1325d33bd9bc7270124d1e8315a226e42a7dd195543a78e775be69daa2ed/Adafruit_Blinka-8.51.0-py3-none-any.whl", hash = "sha256:f01635f4fb5c5255167dea5c0b8feb20cc162f8e8d0140696e236796f897a834", size = 364720 }, + { 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" }, ] [[package]] @@ -26,9 +27,9 @@ 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 } +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" } 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 }, + { 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" }, ] [[package]] @@ -38,9 +39,9 @@ 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 } +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" } 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 }, + { 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" }, ] [[package]] @@ -51,14 +52,14 @@ 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 } +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" } 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 }, + { 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" }, ] [[package]] name = "adafruit-circuitpython-typing" -version = "1.11.2" +version = "1.12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "adafruit-blinka" }, @@ -66,27 +67,27 @@ dependencies = [ { name = "adafruit-circuitpython-requests" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/24/80/8c280fa7d42a23dce40b2fe64f708d18fa32b384adbf6934955d2c2ebecf/adafruit_circuitpython_typing-1.11.2.tar.gz", hash = "sha256:c7ac8532a9ad7e4a65d5588764b7483c0b6967d305c37faebcc0c5356d677e33", size = 29277 } +sdist = { url = "https://files.pythonhosted.org/packages/77/d6/cb9a842dd89afcc53d21327cef5d3ee0149cfd3d90677c9dd68274b0bfae/adafruit_circuitpython_typing-1.12.1.tar.gz", hash = "sha256:e4b06e07cb385dc098574f2479cd77d07e0a06987c814eab33b9f525ac83a935", size = 26001, upload-time = "2025-05-30T17:46:34.679Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/dd/d5/76a6bca9cf08907b48dfc8ccbccbd190155353f521876e02d6b7bb244003/adafruit_circuitpython_typing-1.11.2-py3-none-any.whl", hash = "sha256:e1401a09bbfdf67e43875cc6755b3af0eda8381b12c9c8f759bd7676b7425e1c", size = 11101 }, + { url = "https://files.pythonhosted.org/packages/6c/d9/fe145e99e1251a0dcdace585477875eef8db915f04647197aa3aa50c51d6/adafruit_circuitpython_typing-1.12.1-py3-none-any.whl", hash = "sha256:f1e511f48a76cb4467050db9334fed6761cc1f05921e9edddce7fd3a0b69b459", size = 11627, upload-time = "2025-05-30T17:46:33.322Z" }, ] [[package]] name = "adafruit-platformdetect" version = "3.77.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 } +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" } wheels = [ - { url = "https://files.pythonhosted.org/packages/30/18/b18e9ff2aee42f03082675c5d18d4eb02411477e07c86d74833d3396792e/Adafruit_PlatformDetect-3.77.0-py3-none-any.whl", hash = "sha256:93f599c21e7db2d92bc32ac69ba5063876404c4af87d11358863e62f407409be", size = 25542 }, + { 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" }, ] [[package]] name = "adafruit-pureio" version = "1.1.11" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e5/b7/f1672435116822079bbdab42163f9e6424769b7db778873d95d18c085230/Adafruit_PureIO-1.1.11.tar.gz", hash = "sha256:c4cfbb365731942d1f1092a116f47dfdae0aef18c5b27f1072b5824ad5ea8c7c", size = 35511 } +sdist = { url = "https://files.pythonhosted.org/packages/e5/b7/f1672435116822079bbdab42163f9e6424769b7db778873d95d18c085230/Adafruit_PureIO-1.1.11.tar.gz", hash = "sha256:c4cfbb365731942d1f1092a116f47dfdae0aef18c5b27f1072b5824ad5ea8c7c", size = 35511, upload-time = "2023-05-25T19:01:34.654Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/19/9d/28e9d12f36e13c5f2acba3098187b0e931290ecd1d8df924391b5ad2db19/Adafruit_PureIO-1.1.11-py3-none-any.whl", hash = "sha256:281ab2099372cc0decc26326918996cbf21b8eed694ec4764d51eefa029d324e", size = 10678 }, + { url = "https://files.pythonhosted.org/packages/19/9d/28e9d12f36e13c5f2acba3098187b0e931290ecd1d8df924391b5ad2db19/Adafruit_PureIO-1.1.11-py3-none-any.whl", hash = "sha256:281ab2099372cc0decc26326918996cbf21b8eed694ec4764d51eefa029d324e", size = 10678, upload-time = "2023-05-25T19:01:32.397Z" }, ] [[package]] @@ -96,157 +97,93 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pyserial" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/68/36/29b7b896e83e195fac6d64ccff95c0f24a18ee86e7437a22e60e0331d90a/binho-host-adapter-0.1.6.tar.gz", hash = "sha256:1e6da7a84e208c13b5f489066f05774bff1d593d0f5bf1ca149c2b8e83eae856", size = 10068 } +sdist = { url = "https://files.pythonhosted.org/packages/68/36/29b7b896e83e195fac6d64ccff95c0f24a18ee86e7437a22e60e0331d90a/binho-host-adapter-0.1.6.tar.gz", hash = "sha256:1e6da7a84e208c13b5f489066f05774bff1d593d0f5bf1ca149c2b8e83eae856", size = 10068, upload-time = "2020-06-04T19:38:11.789Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7b/6b/0f13486003aea3eb349c2946b7ec9753e7558b78e35d22c938062a96959c/binho_host_adapter-0.1.6-py3-none-any.whl", hash = "sha256:f71ca176c1e2fc1a5dce128beb286da217555c6c7c805f2ed282a6f3507ec277", size = 10540 }, + { url = "https://files.pythonhosted.org/packages/7b/6b/0f13486003aea3eb349c2946b7ec9753e7558b78e35d22c938062a96959c/binho_host_adapter-0.1.6-py3-none-any.whl", hash = "sha256:f71ca176c1e2fc1a5dce128beb286da217555c6c7c805f2ed282a6f3507ec277", size = 10540, upload-time = "2020-06-04T19:38:10.612Z" }, ] [[package]] name = "cfgv" version = "3.4.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/11/74/539e56497d9bd1d484fd863dd69cbbfa653cd2aa27abfe35653494d85e94/cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560", size = 7114 } +sdist = { url = "https://files.pythonhosted.org/packages/11/74/539e56497d9bd1d484fd863dd69cbbfa653cd2aa27abfe35653494d85e94/cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560", size = 7114, upload-time = "2023-08-12T20:38:17.776Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c5/55/51844dd50c4fc7a33b653bfaba4c2456f06955289ca770a5dbd5fd267374/cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9", size = 7249 }, + { url = "https://files.pythonhosted.org/packages/c5/55/51844dd50c4fc7a33b653bfaba4c2456f06955289ca770a5dbd5fd267374/cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9", size = 7249, upload-time = "2023-08-12T20:38:16.269Z" }, ] [[package]] name = "circuitpython-stubs" -version = "9.2.5" +version = "9.2.8" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/07/d7/ce0a51ba9f6b15bdde6a79cfa96f3c63117dd749465be18980461771cfa9/circuitpython_stubs-9.2.5.tar.gz", hash = "sha256:2b2be4172552bdb9c5a1e9923124ee62f0bed4c0b128d862ad1baf8866e67174", size = 348760 } +sdist = { url = "https://files.pythonhosted.org/packages/7c/ff/dc3b631854ba75d14cdbcb121616e896cc7118211b4cdbf4df1a47c49f12/circuitpython_stubs-9.2.8.tar.gz", hash = "sha256:49250e168a00491719216bd43f8c6431f45ae9a74df5caccde44b1059b0d3c27", size = 348440, upload-time = "2025-05-28T21:30:08.7Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c7/27/72e6715132a325db32ff06475c7da1a217e65082d710b1a7e8ce3c36ca0e/circuitpython_stubs-9.2.5-py3-none-any.whl", hash = "sha256:9b2e8ba04e7fee6a0155e5915b36a1a911e2e3486c795669baa9c2db76102a7c", size = 1006110 }, -] - -[[package]] -name = "colorama" -version = "0.4.6" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 }, -] - -[[package]] -name = "coverage" -version = "7.6.10" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/84/ba/ac14d281f80aab516275012e8875991bb06203957aa1e19950139238d658/coverage-7.6.10.tar.gz", hash = "sha256:7fb105327c8f8f0682e29843e2ff96af9dcbe5bab8eeb4b398c6a33a16d80a23", size = 803868 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/25/6d/31883d78865529257bf847df5789e2ae80e99de8a460c3453dbfbe0db069/coverage-7.6.10-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:05fca8ba6a87aabdd2d30d0b6c838b50510b56cdcfc604d40760dae7153b73d9", size = 208308 }, - { url = "https://files.pythonhosted.org/packages/70/22/3f2b129cc08de00c83b0ad6252e034320946abfc3e4235c009e57cfeee05/coverage-7.6.10-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9e80eba8801c386f72e0712a0453431259c45c3249f0009aff537a517b52942b", size = 208565 }, - { url = "https://files.pythonhosted.org/packages/97/0a/d89bc2d1cc61d3a8dfe9e9d75217b2be85f6c73ebf1b9e3c2f4e797f4531/coverage-7.6.10-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a372c89c939d57abe09e08c0578c1d212e7a678135d53aa16eec4430adc5e690", size = 241083 }, - { url = "https://files.pythonhosted.org/packages/4c/81/6d64b88a00c7a7aaed3a657b8eaa0931f37a6395fcef61e53ff742b49c97/coverage-7.6.10-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ec22b5e7fe7a0fa8509181c4aac1db48f3dd4d3a566131b313d1efc102892c18", size = 238235 }, - { url = "https://files.pythonhosted.org/packages/9a/0b/7797d4193f5adb4b837207ed87fecf5fc38f7cc612b369a8e8e12d9fa114/coverage-7.6.10-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26bcf5c4df41cad1b19c84af71c22cbc9ea9a547fc973f1f2cc9a290002c8b3c", size = 240220 }, - { url = "https://files.pythonhosted.org/packages/65/4d/6f83ca1bddcf8e51bf8ff71572f39a1c73c34cf50e752a952c34f24d0a60/coverage-7.6.10-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4e4630c26b6084c9b3cb53b15bd488f30ceb50b73c35c5ad7871b869cb7365fd", size = 239847 }, - { url = "https://files.pythonhosted.org/packages/30/9d/2470df6aa146aff4c65fee0f87f58d2164a67533c771c9cc12ffcdb865d5/coverage-7.6.10-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2396e8116db77789f819d2bc8a7e200232b7a282c66e0ae2d2cd84581a89757e", size = 237922 }, - { url = "https://files.pythonhosted.org/packages/08/dd/723fef5d901e6a89f2507094db66c091449c8ba03272861eaefa773ad95c/coverage-7.6.10-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:79109c70cc0882e4d2d002fe69a24aa504dec0cc17169b3c7f41a1d341a73694", size = 239783 }, - { url = "https://files.pythonhosted.org/packages/3d/f7/64d3298b2baf261cb35466000628706ce20a82d42faf9b771af447cd2b76/coverage-7.6.10-cp313-cp313-win32.whl", hash = "sha256:9e1747bab246d6ff2c4f28b4d186b205adced9f7bd9dc362051cc37c4a0c7bd6", size = 210965 }, - { url = "https://files.pythonhosted.org/packages/d5/58/ec43499a7fc681212fe7742fe90b2bc361cdb72e3181ace1604247a5b24d/coverage-7.6.10-cp313-cp313-win_amd64.whl", hash = "sha256:254f1a3b1eef5f7ed23ef265eaa89c65c8c5b6b257327c149db1ca9d4a35f25e", size = 211719 }, - { url = "https://files.pythonhosted.org/packages/ab/c9/f2857a135bcff4330c1e90e7d03446b036b2363d4ad37eb5e3a47bbac8a6/coverage-7.6.10-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:2ccf240eb719789cedbb9fd1338055de2761088202a9a0b73032857e53f612fe", size = 209050 }, - { url = "https://files.pythonhosted.org/packages/aa/b3/f840e5bd777d8433caa9e4a1eb20503495709f697341ac1a8ee6a3c906ad/coverage-7.6.10-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:0c807ca74d5a5e64427c8805de15b9ca140bba13572d6d74e262f46f50b13273", size = 209321 }, - { url = "https://files.pythonhosted.org/packages/85/7d/125a5362180fcc1c03d91850fc020f3831d5cda09319522bcfa6b2b70be7/coverage-7.6.10-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2bcfa46d7709b5a7ffe089075799b902020b62e7ee56ebaed2f4bdac04c508d8", size = 252039 }, - { url = "https://files.pythonhosted.org/packages/a9/9c/4358bf3c74baf1f9bddd2baf3756b54c07f2cfd2535f0a47f1e7757e54b3/coverage-7.6.10-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4e0de1e902669dccbf80b0415fb6b43d27edca2fbd48c74da378923b05316098", size = 247758 }, - { url = "https://files.pythonhosted.org/packages/cf/c7/de3eb6fc5263b26fab5cda3de7a0f80e317597a4bad4781859f72885f300/coverage-7.6.10-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f7b444c42bbc533aaae6b5a2166fd1a797cdb5eb58ee51a92bee1eb94a1e1cb", size = 250119 }, - { url = "https://files.pythonhosted.org/packages/3e/e6/43de91f8ba2ec9140c6a4af1102141712949903dc732cf739167cfa7a3bc/coverage-7.6.10-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b330368cb99ef72fcd2dc3ed260adf67b31499584dc8a20225e85bfe6f6cfed0", size = 249597 }, - { url = "https://files.pythonhosted.org/packages/08/40/61158b5499aa2adf9e37bc6d0117e8f6788625b283d51e7e0c53cf340530/coverage-7.6.10-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:9a7cfb50515f87f7ed30bc882f68812fd98bc2852957df69f3003d22a2aa0abf", size = 247473 }, - { url = "https://files.pythonhosted.org/packages/50/69/b3f2416725621e9f112e74e8470793d5b5995f146f596f133678a633b77e/coverage-7.6.10-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6f93531882a5f68c28090f901b1d135de61b56331bba82028489bc51bdd818d2", size = 248737 }, - { url = "https://files.pythonhosted.org/packages/3c/6e/fe899fb937657db6df31cc3e61c6968cb56d36d7326361847440a430152e/coverage-7.6.10-cp313-cp313t-win32.whl", hash = "sha256:89d76815a26197c858f53c7f6a656686ec392b25991f9e409bcef020cd532312", size = 211611 }, - { url = "https://files.pythonhosted.org/packages/1c/55/52f5e66142a9d7bc93a15192eba7a78513d2abf6b3558d77b4ca32f5f424/coverage-7.6.10-cp313-cp313t-win_amd64.whl", hash = "sha256:54a5f0f43950a36312155dae55c505a76cd7f2b12d26abeebbe7a0b36dbc868d", size = 212781 }, + { url = "https://files.pythonhosted.org/packages/c9/1a/34091af39e17f81c9fbcbe3a1336dac99e7297e5931b4803ed9c041515f2/circuitpython_stubs-9.2.8-py3-none-any.whl", hash = "sha256:54be0d8b2f5d4547028e30c96a1b5b60a55033bf382d2cdac2c5c27dffadb0fb", size = 1008714, upload-time = "2025-05-28T21:30:06.231Z" }, ] [[package]] name = "distlib" version = "0.3.9" 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 } +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" } wheels = [ - { url = "https://files.pythonhosted.org/packages/91/a1/cf2472db20f7ce4a6be1253a81cfdf85ad9c7885ffbed7047fb72c24cf87/distlib-0.3.9-py2.py3-none-any.whl", hash = "sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87", size = 468973 }, + { 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" }, ] [[package]] name = "filelock" version = "3.17.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 } +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" } wheels = [ - { url = "https://files.pythonhosted.org/packages/89/ec/00d68c4ddfedfe64159999e5f8a98fb8442729a63e2077eb9dcd89623d27/filelock-3.17.0-py3-none-any.whl", hash = "sha256:533dc2f7ba78dc2f0f531fc6c4940addf7b70a481e269a5a3b93be94ffbe8338", size = 16164 }, + { 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" }, ] [[package]] name = "identify" version = "2.6.6" 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 } +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" } wheels = [ - { url = "https://files.pythonhosted.org/packages/74/a1/68a395c17eeefb04917034bd0a1bfa765e7654fa150cca473d669aa3afb5/identify-2.6.6-py2.py3-none-any.whl", hash = "sha256:cbd1810bce79f8b671ecb20f53ee0ae8e86ae84b557de31d89709dc2a48ba881", size = 99083 }, -] - -[[package]] -name = "iniconfig" -version = "2.0.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d7/4b/cbd8e699e64a6f16ca3a8220661b5f83792b3017d0f79807cb8708d33913/iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3", size = 4646 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374", size = 5892 }, + { 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" }, ] [[package]] name = "nodeenv" version = "1.9.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/43/16/fc88b08840de0e0a72a2f9d8c6bae36be573e475a6326ae854bcc549fc45/nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f", size = 47437 } +sdist = { url = "https://files.pythonhosted.org/packages/43/16/fc88b08840de0e0a72a2f9d8c6bae36be573e475a6326ae854bcc549fc45/nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f", size = 47437, upload-time = "2024-06-04T18:44:11.171Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d2/1d/1b658dbd2b9fa9c4c9f32accbfc0205d532c8c6194dc0f2a4c0428e7128a/nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9", size = 22314 }, + { url = "https://files.pythonhosted.org/packages/d2/1d/1b658dbd2b9fa9c4c9f32accbfc0205d532c8c6194dc0f2a4c0428e7128a/nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9", size = 22314, upload-time = "2024-06-04T18:44:08.352Z" }, ] [[package]] name = "nodejs-wheel-binaries" version = "22.15.0" 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 } +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" } 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 }, - { 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 }, - { 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 }, - { 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 }, - { 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 }, - { 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 }, - { 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 }, - { 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 }, -] - -[[package]] -name = "packaging" -version = "24.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d0/63/68dbb6eb2de9cb10ee4c9c14a0148804425e13c4fb20d61cce69f53106da/packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f", size = 163950 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", size = 65451 }, + { 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" }, ] [[package]] name = "platformdirs" version = "4.3.6" 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 } +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" } wheels = [ - { url = "https://files.pythonhosted.org/packages/3c/a6/bc1012356d8ece4d66dd75c4b9fc6c1f6650ddd5991e421177d9f8f671be/platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb", size = 18439 }, -] - -[[package]] -name = "pluggy" -version = "1.5.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/96/2d/02d4312c973c6050a18b314a5ad0b3210edb65a906f868e31c111dede4a6/pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1", size = 67955 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669", size = 20556 }, + { 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" }, ] [[package]] name = "pre-commit" -version = "4.0.1" +version = "4.2.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cfgv" }, @@ -255,32 +192,32 @@ dependencies = [ { name = "pyyaml" }, { name = "virtualenv" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/2e/c8/e22c292035f1bac8b9f5237a2622305bc0304e776080b246f3df57c4ff9f/pre_commit-4.0.1.tar.gz", hash = "sha256:80905ac375958c0444c65e9cebebd948b3cdb518f335a091a670a89d652139d2", size = 191678 } +sdist = { url = "https://files.pythonhosted.org/packages/08/39/679ca9b26c7bb2999ff122d50faa301e49af82ca9c066ec061cfbc0c6784/pre_commit-4.2.0.tar.gz", hash = "sha256:601283b9757afd87d40c4c4a9b2b5de9637a8ea02eaff7adc2d0fb4e04841146", size = 193424, upload-time = "2025-03-18T21:35:20.987Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/16/8f/496e10d51edd6671ebe0432e33ff800aa86775d2d147ce7d43389324a525/pre_commit-4.0.1-py2.py3-none-any.whl", hash = "sha256:efde913840816312445dc98787724647c65473daefe420785f885e8ed9a06878", size = 218713 }, + { url = "https://files.pythonhosted.org/packages/88/74/a88bf1b1efeae488a0c0b7bdf71429c313722d1fc0f377537fbe554e6180/pre_commit-4.2.0-py2.py3-none-any.whl", hash = "sha256:a009ca7205f1eb497d10b845e52c838a98b6cdd2102a6c8e4540e94ee75c58bd", size = 220707, upload-time = "2025-03-18T21:35:19.343Z" }, ] [[package]] name = "proveskit-rp2350-v5a" version = "1.0.0" source = { virtual = "." } -dependencies = [ + +[package.dev-dependencies] +dev = [ { name = "adafruit-circuitpython-typing" }, { name = "circuitpython-stubs" }, - { name = "coverage" }, { name = "pre-commit" }, { name = "pyright", extra = ["nodejs"] }, - { name = "pytest" }, ] [package.metadata] -requires-dist = [ - { name = "adafruit-circuitpython-typing", specifier = "==1.11.2" }, - { name = "circuitpython-stubs", specifier = "==9.2.5" }, - { name = "coverage", specifier = "==7.6.10" }, - { name = "pre-commit", specifier = "==4.0.1" }, - { name = "pyright", extras = ["nodejs"], specifier = "==1.1.399" }, - { name = "pytest", specifier = "==8.3.2" }, + +[package.metadata.requires-dev] +dev = [ + { name = "adafruit-circuitpython-typing", specifier = "==1.12.1" }, + { name = "circuitpython-stubs", specifier = "==9.2.8" }, + { name = "pre-commit", specifier = "==4.2.0" }, + { name = "pyright", extras = ["nodejs"], specifier = "==1.1.402" }, ] [[package]] @@ -292,20 +229,20 @@ dependencies = [ { name = "pyusb" }, ] wheels = [ - { url = "https://files.pythonhosted.org/packages/5a/96/a8de7b7e5556d4b00d1ca1969fc34c89a1b6d177876c7a31d42631b090fc/pyftdi-0.56.0-py3-none-any.whl", hash = "sha256:3ef0baadbf9031dde9d623ae66fac2d16ded36ce1b66c17765ca1944cb38b8b0", size = 145718 }, + { url = "https://files.pythonhosted.org/packages/5a/96/a8de7b7e5556d4b00d1ca1969fc34c89a1b6d177876c7a31d42631b090fc/pyftdi-0.56.0-py3-none-any.whl", hash = "sha256:3ef0baadbf9031dde9d623ae66fac2d16ded36ce1b66c17765ca1944cb38b8b0", size = 145718, upload-time = "2024-11-23T23:00:50.868Z" }, ] [[package]] name = "pyright" -version = "1.1.399" +version = "1.1.402" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "nodeenv" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/db/9d/d91d5f6d26b2db95476fefc772e2b9a16d54c6bd0ea6bb5c1b6d635ab8b4/pyright-1.1.399.tar.gz", hash = "sha256:439035d707a36c3d1b443aec980bc37053fbda88158eded24b8eedcf1c7b7a1b", size = 3856954 } +sdist = { url = "https://files.pythonhosted.org/packages/aa/04/ce0c132d00e20f2d2fb3b3e7c125264ca8b909e693841210534b1ea1752f/pyright-1.1.402.tar.gz", hash = "sha256:85a33c2d40cd4439c66aa946fd4ce71ab2f3f5b8c22ce36a623f59ac22937683", size = 3888207, upload-time = "2025-06-11T08:48:35.759Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2f/b5/380380c9e7a534cb1783c70c3e8ac6d1193c599650a55838d0557586796e/pyright-1.1.399-py3-none-any.whl", hash = "sha256:55f9a875ddf23c9698f24208c764465ffdfd38be6265f7faf9a176e1dc549f3b", size = 5592584 }, + { url = "https://files.pythonhosted.org/packages/fe/37/1a1c62d955e82adae588be8e374c7f77b165b6cb4203f7d581269959abbc/pyright-1.1.402-py3-none-any.whl", hash = "sha256:2c721f11869baac1884e846232800fe021c33f1b4acb3929cff321f7ea4e2982", size = 5624004, upload-time = "2025-06-11T08:48:33.998Z" }, ] [package.optional-dependencies] @@ -317,65 +254,50 @@ nodejs = [ name = "pyserial" version = "3.5" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/1e/7d/ae3f0a63f41e4d2f6cb66a5b57197850f919f59e558159a4dd3a818f5082/pyserial-3.5.tar.gz", hash = "sha256:3c77e014170dfffbd816e6ffc205e9842efb10be9f58ec16d3e8675b4925cddb", size = 159125 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/07/bc/587a445451b253b285629263eb51c2d8e9bcea4fc97826266d186f96f558/pyserial-3.5-py2.py3-none-any.whl", hash = "sha256:c4451db6ba391ca6ca299fb3ec7bae67a5c55dde170964c7a14ceefec02f2cf0", size = 90585 }, -] - -[[package]] -name = "pytest" -version = "8.3.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "colorama", marker = "sys_platform == 'win32'" }, - { name = "iniconfig" }, - { name = "packaging" }, - { name = "pluggy" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/b4/8c/9862305bdcd6020bc7b45b1b5e7397a6caf1a33d3025b9a003b39075ffb2/pytest-8.3.2.tar.gz", hash = "sha256:c132345d12ce551242c87269de812483f5bcc87cdbb4722e48487ba194f9fdce", size = 1439314 } +sdist = { url = "https://files.pythonhosted.org/packages/1e/7d/ae3f0a63f41e4d2f6cb66a5b57197850f919f59e558159a4dd3a818f5082/pyserial-3.5.tar.gz", hash = "sha256:3c77e014170dfffbd816e6ffc205e9842efb10be9f58ec16d3e8675b4925cddb", size = 159125, upload-time = "2020-11-23T03:59:15.045Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0f/f9/cf155cf32ca7d6fa3601bc4c5dd19086af4b320b706919d48a4c79081cf9/pytest-8.3.2-py3-none-any.whl", hash = "sha256:4ba08f9ae7dcf84ded419494d229b48d0903ea6407b030eaec46df5e6a73bba5", size = 341802 }, + { url = "https://files.pythonhosted.org/packages/07/bc/587a445451b253b285629263eb51c2d8e9bcea4fc97826266d186f96f558/pyserial-3.5-py2.py3-none-any.whl", hash = "sha256:c4451db6ba391ca6ca299fb3ec7bae67a5c55dde170964c7a14ceefec02f2cf0", size = 90585, upload-time = "2020-11-23T03:59:13.41Z" }, ] [[package]] name = "pyusb" version = "1.3.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/00/6b/ce3727395e52b7b76dfcf0c665e37d223b680b9becc60710d4bc08b7b7cb/pyusb-1.3.1.tar.gz", hash = "sha256:3af070b607467c1c164f49d5b0caabe8ac78dbed9298d703a8dbf9df4052d17e", size = 77281 } +sdist = { url = "https://files.pythonhosted.org/packages/00/6b/ce3727395e52b7b76dfcf0c665e37d223b680b9becc60710d4bc08b7b7cb/pyusb-1.3.1.tar.gz", hash = "sha256:3af070b607467c1c164f49d5b0caabe8ac78dbed9298d703a8dbf9df4052d17e", size = 77281, upload-time = "2025-01-08T23:45:01.866Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/28/b8/27e6312e86408a44fe16bd28ee12dd98608b39f7e7e57884a24e8f29b573/pyusb-1.3.1-py3-none-any.whl", hash = "sha256:bf9b754557af4717fe80c2b07cc2b923a9151f5c08d17bdb5345dac09d6a0430", size = 58465 }, + { url = "https://files.pythonhosted.org/packages/28/b8/27e6312e86408a44fe16bd28ee12dd98608b39f7e7e57884a24e8f29b573/pyusb-1.3.1-py3-none-any.whl", hash = "sha256:bf9b754557af4717fe80c2b07cc2b923a9151f5c08d17bdb5345dac09d6a0430", size = 58465, upload-time = "2025-01-08T23:45:00.029Z" }, ] [[package]] name = "pyyaml" version = "6.0.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/54/ed/79a089b6be93607fa5cdaedf301d7dfb23af5f25c398d5ead2525b063e17/pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", size = 130631 } +sdist = { url = "https://files.pythonhosted.org/packages/54/ed/79a089b6be93607fa5cdaedf301d7dfb23af5f25c398d5ead2525b063e17/pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", size = 130631, upload-time = "2024-08-06T20:33:50.674Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ef/e3/3af305b830494fa85d95f6d95ef7fa73f2ee1cc8ef5b495c7c3269fb835f/PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", size = 181309 }, - { url = "https://files.pythonhosted.org/packages/45/9f/3b1c20a0b7a3200524eb0076cc027a970d320bd3a6592873c85c92a08731/PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", size = 171679 }, - { url = "https://files.pythonhosted.org/packages/7c/9a/337322f27005c33bcb656c655fa78325b730324c78620e8328ae28b64d0c/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", size = 733428 }, - { url = "https://files.pythonhosted.org/packages/a3/69/864fbe19e6c18ea3cc196cbe5d392175b4cf3d5d0ac1403ec3f2d237ebb5/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", size = 763361 }, - { url = "https://files.pythonhosted.org/packages/04/24/b7721e4845c2f162d26f50521b825fb061bc0a5afcf9a386840f23ea19fa/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", size = 759523 }, - { url = "https://files.pythonhosted.org/packages/2b/b2/e3234f59ba06559c6ff63c4e10baea10e5e7df868092bf9ab40e5b9c56b6/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", size = 726660 }, - { url = "https://files.pythonhosted.org/packages/fe/0f/25911a9f080464c59fab9027482f822b86bf0608957a5fcc6eaac85aa515/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", size = 751597 }, - { url = "https://files.pythonhosted.org/packages/14/0d/e2c3b43bbce3cf6bd97c840b46088a3031085179e596d4929729d8d68270/PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", size = 140527 }, - { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446 }, + { url = "https://files.pythonhosted.org/packages/ef/e3/3af305b830494fa85d95f6d95ef7fa73f2ee1cc8ef5b495c7c3269fb835f/PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", size = 181309, upload-time = "2024-08-06T20:32:43.4Z" }, + { url = "https://files.pythonhosted.org/packages/45/9f/3b1c20a0b7a3200524eb0076cc027a970d320bd3a6592873c85c92a08731/PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", size = 171679, upload-time = "2024-08-06T20:32:44.801Z" }, + { url = "https://files.pythonhosted.org/packages/7c/9a/337322f27005c33bcb656c655fa78325b730324c78620e8328ae28b64d0c/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", size = 733428, upload-time = "2024-08-06T20:32:46.432Z" }, + { url = "https://files.pythonhosted.org/packages/a3/69/864fbe19e6c18ea3cc196cbe5d392175b4cf3d5d0ac1403ec3f2d237ebb5/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", size = 763361, upload-time = "2024-08-06T20:32:51.188Z" }, + { url = "https://files.pythonhosted.org/packages/04/24/b7721e4845c2f162d26f50521b825fb061bc0a5afcf9a386840f23ea19fa/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", size = 759523, upload-time = "2024-08-06T20:32:53.019Z" }, + { url = "https://files.pythonhosted.org/packages/2b/b2/e3234f59ba06559c6ff63c4e10baea10e5e7df868092bf9ab40e5b9c56b6/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", size = 726660, upload-time = "2024-08-06T20:32:54.708Z" }, + { url = "https://files.pythonhosted.org/packages/fe/0f/25911a9f080464c59fab9027482f822b86bf0608957a5fcc6eaac85aa515/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", size = 751597, upload-time = "2024-08-06T20:32:56.985Z" }, + { url = "https://files.pythonhosted.org/packages/14/0d/e2c3b43bbce3cf6bd97c840b46088a3031085179e596d4929729d8d68270/PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", size = 140527, upload-time = "2024-08-06T20:33:03.001Z" }, + { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446, upload-time = "2024-08-06T20:33:04.33Z" }, ] [[package]] name = "sysv-ipc" version = "1.1.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0c/d7/5d2f861155e9749f981e6c58f2a482d3ab458bf8c35ae24d4b4d5899ebf9/sysv_ipc-1.1.0.tar.gz", hash = "sha256:0f063cbd36ec232032e425769ebc871f195a7d183b9af32f9901589ea7129ac3", size = 99448 } +sdist = { url = "https://files.pythonhosted.org/packages/0c/d7/5d2f861155e9749f981e6c58f2a482d3ab458bf8c35ae24d4b4d5899ebf9/sysv_ipc-1.1.0.tar.gz", hash = "sha256:0f063cbd36ec232032e425769ebc871f195a7d183b9af32f9901589ea7129ac3", size = 99448, upload-time = "2021-01-17T19:07:44.217Z" } [[package]] name = "typing-extensions" version = "4.12.2" 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 } +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" } wheels = [ - { url = "https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", size = 37438 }, + { 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" }, ] [[package]] @@ -387,7 +309,7 @@ dependencies = [ { 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 } +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" } wheels = [ - { url = "https://files.pythonhosted.org/packages/89/9b/599bcfc7064fbe5740919e78c5df18e5dceb0887e676256a1061bb5ae232/virtualenv-20.29.1-py3-none-any.whl", hash = "sha256:4e4cb403c0b0da39e13b46b1b2476e505cb0046b25f242bee80f62bf990b2779", size = 4282379 }, + { 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" }, ]