diff --git a/.flake8 b/.flake8 index ce573e9..597edc1 100644 --- a/.flake8 +++ b/.flake8 @@ -1,3 +1,4 @@ [flake8] ignore = E203, F401, W503 max-line-length = 120 +exclude = .venv,.venv314,__pycache__,.git,.pytest_cache,build,dist,*.egg-info diff --git a/.github/workflows/check-spelling.yml b/.github/workflows/check-spelling.yml index 27f72e7..d5ac2de 100644 --- a/.github/workflows/check-spelling.yml +++ b/.github/workflows/check-spelling.yml @@ -3,9 +3,11 @@ name: Check Spelling on: push: - branches-ignore: [master, main] + branches-ignore: + - main pull_request: - branches: [master, main] + branches: + - main jobs: build: diff --git a/.github/workflows/linter.yml b/.github/workflows/linter.yml index b92a30a..2ff287b 100644 --- a/.github/workflows/linter.yml +++ b/.github/workflows/linter.yml @@ -3,9 +3,11 @@ name: Lint Code Base on: push: - branches-ignore: [main] + branches-ignore: + - main pull_request: - branches: [main] + branches: + - main jobs: build: diff --git a/.github/workflows/pytest.yml b/.github/workflows/pytest.yml index 9086494..0175f41 100644 --- a/.github/workflows/pytest.yml +++ b/.github/workflows/pytest.yml @@ -11,19 +11,20 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: ["3.9", "3.10", "3.11"] + python-version: ["3.12"] steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v1 + uses: actions/setup-python@v4 with: python-version: ${{ matrix.python-version }} + - name: Install uv + uses: astral-sh/setup-uv@v3 - name: Install dependencies run: | - python -m pip install --upgrade pip - pip install pipenv - pipenv install --dev + uv venv + uv pip install -e ".[dev]" - name: Test with pytest run: | - pipenv run python -m pytest -vv + uv run python -m pytest -vv diff --git a/README.md b/README.md index 62b491a..3ba3f2a 100644 --- a/README.md +++ b/README.md @@ -14,31 +14,8 @@ Update the `TankController` code from C++ to Python and run on a Raspberry Pico. To set up and run this project, the system must meet the following requirements: -- **Python**: The project requires Python to run. Python provides the runtime for the scripts and the GUI components. -- **pip**: Python's package installer is needed to install and manage dependencies. -- **pipenv**: Used for managing project dependencies and creating isolated virtual environments. -- **Tkinter**: Required for the GUI components of the application. Tkinter comes with Python (as `python3-tk`) and is used to build and display the UI. +- **uv**: The python project package manager must be installed. Learn more at [https://docs.astral.sh/uv/](https://docs.astral.sh/uv/). -## Windows Developer Instructions - -Test Python version: -- `python -V` -This command prints the installed Python version. - -Upgrade pip: -- `pip install --upgrade pip` -- `pip --version` -The first command upgrades pip to the latest version, and the second verifies the installed version. - -Install pipenv (tool for dependencies and virtual environments): -- `pip install pipenv` -- `pipenv --version` -- `pipenv install` -This installs or updates all dependencies defined in the Pipfile and updates the Pipfile.lock. - -Verify Tkinter installation: -- `python -m tkinter` -A small GUI window should appear if Tkinter is installed correctly. ## Run in Local Environment @@ -48,17 +25,6 @@ To run in a local environment with mocked devices (with the UI State Machine int ./run_gui.sh ``` -### Update Python Virtual Environment - -Run `pipenv install` in the terminal to get the latest dependencies and update the lockfile. - -### Virtual Environment - -```sh -python3 -m venv .venv -source .venv/bin/activate -pip3 install --user pipenv -``` ## Testing diff --git a/arduino/Pi-ArduinoStepStickDriver/Pi-ArduinoStepStickDriver.ino b/arduino/Pi-ArduinoStepStickDriver/Pi-ArduinoStepStickDriver.ino deleted file mode 100644 index feebd32..0000000 --- a/arduino/Pi-ArduinoStepStickDriver/Pi-ArduinoStepStickDriver.ino +++ /dev/null @@ -1,71 +0,0 @@ -#define T_ON 500 -#define STEP 6 // Pins D6 and D5 for STEP and Dir respectively -#define DIR 5 -#define LIM_1 4 // Pins D4 and D3 for LIM_F and LIM_E respectively -#define LIM_0 3 -#define EN 2 // disable stepper when not stepping (enable low) - -byte N_b[4]; // Number turns -byte io[1]; // In - 0 / Out - 1 -uint32_t N_int; - -void setup() { - // put your setup code here, to run once: - pinMode(LED_BUILTIN, OUTPUT); - pinMode(STEP, OUTPUT); - pinMode(DIR, OUTPUT); - pinMode(EN, OUTPUT); - digitalWrite(EN,HIGH); - Serial.begin(9600); - //Serial1.begin(115200); - -} - -void loop() { - - N_int = 0; - N_b[0] = 0; - N_b[1] = 0; - N_b[2] = 0; - N_b[3] = 0; - int i = 0; - if(Serial.available()) { - digitalWrite(EN, LOW); - //digitalWrite(STEP, HIGH); - Serial.readBytes(N_b, 4); - Serial.readBytes(io, 1); - - // convert N_b to N_int: Thank you Jacob Priddy for helping with this - N_int = (uint32_t(N_b[3]) << 24) | (uint32_t(N_b[2]) << 16) | (uint32_t(N_b[1]) << 8) | N_b[0]; - - //Serial.println(N_int); - if(N_int != 0) { - if(io[0] == 0) { - digitalWrite(DIR, HIGH); - } - else { - digitalWrite(DIR, LOW); - } - for(i = 0; i < N_int; i++) { - if(digitalRead(LIM_1) == HIGH && digitalRead(LIM_0) == HIGH) { - break; - } - else { - //digitalWrite(LED_BUILTIN, HIGH); - digitalWrite(STEP, HIGH); - delayMicroseconds(T_ON); - //digitalWrite(LED_BUILTIN, LOW); - digitalWrite(STEP, LOW); - delayMicroseconds(T_ON); - } - } - if(digitalRead(LIM_1) == HIGH || digitalRead(LIM_0) == HIGH){ - Serial.println(N_int - i); - } - else { - Serial.println("DONE"); - } - } - digitalWrite(EN, HIGH); - } -} diff --git a/conftest.py b/conftest.py index 373f2cb..7153a08 100644 --- a/conftest.py +++ b/conftest.py @@ -1,6 +1,7 @@ """ The file to configure testing imports """ + from titration import mock_config # Set MOCK_ENABLED to true to avoid importing Raspberry Pi diff --git a/format.sh b/format.sh new file mode 100755 index 0000000..d61a1bc --- /dev/null +++ b/format.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +# Ensure virtual environment is set up +uv venv --clear +uv pip install -e ".[dev]" + +# Spell check +uv run codespell -f -w . + +# Format Python +uv run black . +uv run isort . +uv run flake8 . + +# Clean up +find . -name ".pytest_cache" -type d -exec /bin/rm -rf {} + +find . -name "__pycache__" -type d -exec /bin/rm -rf {} + diff --git a/main.py b/main.py index ae6cd07..918d8ef 100644 --- a/main.py +++ b/main.py @@ -1,6 +1,7 @@ """ The file to run the program """ + import sys from titration import mock_config diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..506ada8 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,38 @@ +[build-system] +requires = ["setuptools>=45", "wheel"] +build-backend = "setuptools.build_meta" + +[project] +name = "TankControllerPython" +version = "0.1.0" +description = "Tank Controller Python Application" +requires-python = ">=3.12" +dependencies = [ + "adafruit-circuitpython-ads1x15", + "adafruit-circuitpython-lis3dh", + "adafruit-circuitpython-max31865", + "gpiozero", + "pandas", + "click", + "adafruit-ads1x15", + "exceptiongroup", + "numpy", + "adafruit-blinka", +] + +[tool.setuptools.packages.find] +include = ["titration*"] +exclude = ["test*"] + +[project.optional-dependencies] +dev = [ + "black", + "flake8", + "isort", + "pycodestyle", + "pytest", + "pylint", + "pytest-cov", + "pytest-mock", + "codespell", +] diff --git a/run.sh b/run.sh index 87ac733..4239834 100755 --- a/run.sh +++ b/run.sh @@ -1,3 +1,8 @@ #!/bin/sh -pipenv sync -pipenv run python main.py + +# Ensure virtual environment is set up +uv venv --clear +uv pip install -e ".[dev]" + +# Run the GUI application +uv run python main.py diff --git a/run_gui.sh b/run_gui.sh index 5a68332..c4c1892 100755 --- a/run_gui.sh +++ b/run_gui.sh @@ -1,3 +1,8 @@ #!/bin/sh -pipenv sync -d -pipenv run python main.py -gui + +# Ensure virtual environment is set up +uv venv --clear +uv pip install -e ".[dev]" + +# Run the GUI application +uv run python main.py -gui diff --git a/test.sh b/test.sh index c4b2d5b..8a899bb 100755 --- a/test.sh +++ b/test.sh @@ -1,3 +1,8 @@ #!/bin/sh -pipenv sync -d -pipenv run pytest -vv + +# Ensure virtual environment is set up +uv venv --clear +uv pip install -e ".[dev]" + +# Run tests +uv run pytest -vv diff --git a/test/devices/keypad_mock_test.py b/test/devices/keypad_mock_test.py index 7901fdb..e5a767e 100644 --- a/test/devices/keypad_mock_test.py +++ b/test/devices/keypad_mock_test.py @@ -1,6 +1,7 @@ """ The file to test the mock keypad """ + import digitalio from titration.devices.library import Keypad, board diff --git a/test/devices/ph_probe_test.py b/test/devices/ph_probe_test.py index 9d3ee58..0bf818d 100644 --- a/test/devices/ph_probe_test.py +++ b/test/devices/ph_probe_test.py @@ -1,6 +1,7 @@ """ The file to test the pH probe """ + import pytest from titration.devices.library import ADS, PHProbe, board diff --git a/test/devices/stir_control_test.py b/test/devices/stir_control_test.py index 96a923b..e71ebe4 100644 --- a/test/devices/stir_control_test.py +++ b/test/devices/stir_control_test.py @@ -1,6 +1,7 @@ """ The file to test the StirControl class """ + from unittest import mock from unittest.mock import call diff --git a/test/devices/syringe_pump_test.py b/test/devices/syringe_pump_test.py index 0c60dde..8b49dc6 100644 --- a/test/devices/syringe_pump_test.py +++ b/test/devices/syringe_pump_test.py @@ -1,6 +1,7 @@ """ The file to test the syringe pump """ + import pytest from titration.devices.library import SyringePump diff --git a/test/titrator_test.py b/test/titrator_test.py index 6a1dfb9..60b248e 100644 --- a/test/titrator_test.py +++ b/test/titrator_test.py @@ -1,6 +1,7 @@ """ The file to test the Titrator class """ + from unittest import mock from titration.devices.library import Keypad diff --git a/test/ui_state/calibration/calibrate_ph1_test.py b/test/ui_state/calibration/calibrate_ph1_test.py index 5e5c164..e750196 100644 --- a/test/ui_state/calibration/calibrate_ph1_test.py +++ b/test/ui_state/calibration/calibrate_ph1_test.py @@ -1,6 +1,7 @@ """ The file to test the calibration CalibratePh class """ + from unittest import mock from unittest.mock import ANY diff --git a/test/ui_state/calibration/calibrate_temp_test.py b/test/ui_state/calibration/calibrate_temp_test.py index bce1b2d..d41ed85 100644 --- a/test/ui_state/calibration/calibrate_temp_test.py +++ b/test/ui_state/calibration/calibrate_temp_test.py @@ -1,6 +1,7 @@ """ The file to test the CalibrateTemp class """ + from unittest import mock from unittest.mock import ANY diff --git a/test/ui_state/calibration/setup_calibration_test.py b/test/ui_state/calibration/setup_calibration_test.py index 266db93..a6981b7 100644 --- a/test/ui_state/calibration/setup_calibration_test.py +++ b/test/ui_state/calibration/setup_calibration_test.py @@ -1,6 +1,7 @@ """ The file to the SetupCalibration class """ + from unittest import mock from unittest.mock import ANY diff --git a/test/ui_state/demo_mode/demo_mode_menu_test.py b/test/ui_state/demo_mode/demo_mode_menu_test.py index 9afce57..9b25ac7 100644 --- a/test/ui_state/demo_mode/demo_mode_menu_test.py +++ b/test/ui_state/demo_mode/demo_mode_menu_test.py @@ -1,6 +1,7 @@ """ The file to test the DemoModeMenu class """ + from unittest import mock from unittest.mock import ANY diff --git a/test/ui_state/demo_mode/read_values_test.py b/test/ui_state/demo_mode/read_values_test.py index 50f5375..117c8cf 100644 --- a/test/ui_state/demo_mode/read_values_test.py +++ b/test/ui_state/demo_mode/read_values_test.py @@ -1,6 +1,7 @@ """ The file to test the ReadValues class """ + from unittest import mock from unittest.mock import ANY diff --git a/test/ui_state/main_menu_test.py b/test/ui_state/main_menu_test.py index db17f0a..61b01a8 100644 --- a/test/ui_state/main_menu_test.py +++ b/test/ui_state/main_menu_test.py @@ -1,6 +1,7 @@ """ The file to test the MainMenu class """ + from unittest import mock from unittest.mock import ANY diff --git a/test/ui_state/prime_pump/prime_pump_test.py b/test/ui_state/prime_pump/prime_pump_test.py index bc2904d..23f95f3 100644 --- a/test/ui_state/prime_pump/prime_pump_test.py +++ b/test/ui_state/prime_pump/prime_pump_test.py @@ -1,6 +1,7 @@ """ The file to test the PrimePump class """ + from unittest import mock from unittest.mock import ANY diff --git a/test/ui_state/titration/automatic_titration_test.py b/test/ui_state/titration/automatic_titration_test.py index 8377894..c0defd7 100644 --- a/test/ui_state/titration/automatic_titration_test.py +++ b/test/ui_state/titration/automatic_titration_test.py @@ -1,6 +1,7 @@ """ The file to test the AutomaticTitration class """ + from unittest import mock from unittest.mock import ANY diff --git a/test/ui_state/titration/calibrate_ph2_test.py b/test/ui_state/titration/calibrate_ph2_test.py index 9d94b34..538c058 100644 --- a/test/ui_state/titration/calibrate_ph2_test.py +++ b/test/ui_state/titration/calibrate_ph2_test.py @@ -1,6 +1,7 @@ """ The file to test the titration CalibratePh class """ + from unittest import mock from unittest.mock import ANY diff --git a/test/ui_state/titration/initial_titration_test.py b/test/ui_state/titration/initial_titration_test.py index cd846bc..2d4b2d3 100644 --- a/test/ui_state/titration/initial_titration_test.py +++ b/test/ui_state/titration/initial_titration_test.py @@ -1,6 +1,7 @@ """ The file to test the InitialTitration class """ + from unittest import mock from unittest.mock import ANY diff --git a/test/ui_state/titration/manual_titration_test.py b/test/ui_state/titration/manual_titration_test.py index 6ffc339..0e5d97e 100644 --- a/test/ui_state/titration/manual_titration_test.py +++ b/test/ui_state/titration/manual_titration_test.py @@ -1,6 +1,7 @@ """ The file to test the ManualTitration class """ + from unittest import mock from unittest.mock import ANY diff --git a/test/ui_state/titration/setup_titration_test.py b/test/ui_state/titration/setup_titration_test.py index 026190b..80b6879 100644 --- a/test/ui_state/titration/setup_titration_test.py +++ b/test/ui_state/titration/setup_titration_test.py @@ -1,6 +1,7 @@ """ The file to test the SetupTitration class """ + from unittest import mock from unittest.mock import ANY diff --git a/test/ui_state/update_settings/update_settings_test.py b/test/ui_state/update_settings/update_settings_test.py index 834c7c8..dd9a665 100644 --- a/test/ui_state/update_settings/update_settings_test.py +++ b/test/ui_state/update_settings/update_settings_test.py @@ -1,6 +1,7 @@ """ The file to test the UpdateSettings class """ + from unittest import mock from unittest.mock import ANY diff --git a/test/ui_state/user_value/buffer_ph_test.py b/test/ui_state/user_value/buffer_ph_test.py index 0aed3d9..6799c71 100644 --- a/test/ui_state/user_value/buffer_ph_test.py +++ b/test/ui_state/user_value/buffer_ph_test.py @@ -1,6 +1,7 @@ """ The file to test the BufferPH class """ + from unittest import mock from unittest.mock import ANY diff --git a/test/ui_state/user_value/degas_time_test.py b/test/ui_state/user_value/degas_time_test.py index 512abb1..2cada44 100644 --- a/test/ui_state/user_value/degas_time_test.py +++ b/test/ui_state/user_value/degas_time_test.py @@ -1,6 +1,7 @@ """ The file to test the DegasTime class """ + from unittest import mock from unittest.mock import ANY diff --git a/test/ui_state/user_value/pump_volume_test.py b/test/ui_state/user_value/pump_volume_test.py index a95a3d4..4915926 100644 --- a/test/ui_state/user_value/pump_volume_test.py +++ b/test/ui_state/user_value/pump_volume_test.py @@ -1,6 +1,7 @@ """ The file to test the PumpVolume class """ + from unittest import mock from unittest.mock import ANY diff --git a/test/ui_state/user_value/reference_temperature_test.py b/test/ui_state/user_value/reference_temperature_test.py index 0fdb07a..d03b30e 100644 --- a/test/ui_state/user_value/reference_temperature_test.py +++ b/test/ui_state/user_value/reference_temperature_test.py @@ -1,6 +1,7 @@ """ The file to test the ReferenceTemperature class """ + from unittest import mock from unittest.mock import ANY diff --git a/test/ui_state/user_value/solution_salinity_test.py b/test/ui_state/user_value/solution_salinity_test.py index 3d00dd1..1545e80 100644 --- a/test/ui_state/user_value/solution_salinity_test.py +++ b/test/ui_state/user_value/solution_salinity_test.py @@ -1,6 +1,7 @@ """ The file to test the SolutionSalinity class """ + from unittest import mock from unittest.mock import ANY diff --git a/test/ui_state/user_value/solution_weight_test.py b/test/ui_state/user_value/solution_weight_test.py index d8fd95a..eabe6b0 100644 --- a/test/ui_state/user_value/solution_weight_test.py +++ b/test/ui_state/user_value/solution_weight_test.py @@ -1,6 +1,7 @@ """ The file to test the SolutionWeight class """ + from unittest import mock from unittest.mock import ANY diff --git a/test/ui_state/user_value/volume_to_move_test.py b/test/ui_state/user_value/volume_to_move_test.py index e97b5b2..24ed250 100644 --- a/test/ui_state/user_value/volume_to_move_test.py +++ b/test/ui_state/user_value/volume_to_move_test.py @@ -1,6 +1,7 @@ """ The file to test the Volume class """ + from unittest import mock from unittest.mock import ANY diff --git a/titration/devices/keypad_mock.py b/titration/devices/keypad_mock.py index c009545..5922d57 100644 --- a/titration/devices/keypad_mock.py +++ b/titration/devices/keypad_mock.py @@ -1,6 +1,7 @@ """ The file for mock Keypad class """ + import digitalio from titration.devices.library import board diff --git a/titration/devices/liquid_crystal.py b/titration/devices/liquid_crystal.py index ad27235..d4d1167 100644 --- a/titration/devices/liquid_crystal.py +++ b/titration/devices/liquid_crystal.py @@ -1,6 +1,7 @@ """ The file for the Sunfire LCD 20x04 Char Display, LiquidCrystal Class """ + import time import board diff --git a/titration/devices/ph_probe.py b/titration/devices/ph_probe.py index 589b375..d58ecb1 100644 --- a/titration/devices/ph_probe.py +++ b/titration/devices/ph_probe.py @@ -1,6 +1,7 @@ """ The file for the PHProbe class """ + from titration.devices.library import ADS, analog_in, board, busio diff --git a/titration/devices/stir_control.py b/titration/devices/stir_control.py index 8d84fc2..3bf2846 100644 --- a/titration/devices/stir_control.py +++ b/titration/devices/stir_control.py @@ -1,6 +1,7 @@ """ The file for the StirControl class """ + import math import time diff --git a/titration/devices/syringe_pump.py b/titration/devices/syringe_pump.py index e1b0822..669199e 100644 --- a/titration/devices/syringe_pump.py +++ b/titration/devices/syringe_pump.py @@ -1,6 +1,7 @@ """ The file for the SyringePump class """ + from titration.devices.library import Serial ARDUINO_PORT = "/dev/ttyACM0" diff --git a/titration/titrator_driver.py b/titration/titrator_driver.py index 046ea1b..ee21858 100644 --- a/titration/titrator_driver.py +++ b/titration/titrator_driver.py @@ -1,6 +1,7 @@ """ The file for the Alkalinity Titrator driver """ + import threading from titration import mock_config @@ -13,9 +14,11 @@ def run(): The function that sets up threading for the Titrator and GUI """ titrator = Titrator() - + # Always run titrator loop in a background thread - thread = threading.Thread(target=titrator_loop_forever, args=(titrator,), daemon=True) + thread = threading.Thread( + target=titrator_loop_forever, args=(titrator,), daemon=True + ) thread.start() # Run GUI on main thread if mock mode is enabled @@ -29,6 +32,7 @@ def run_gui(titrator): """ GUI(titrator) + def titrator_loop_forever(titrator): """ The function that runs the Titrator loop forever diff --git a/titration/ui_state/calibration/calibrate_temp.py b/titration/ui_state/calibration/calibrate_temp.py index b6e34b0..f234bbc 100644 --- a/titration/ui_state/calibration/calibrate_temp.py +++ b/titration/ui_state/calibration/calibrate_temp.py @@ -1,6 +1,7 @@ """ The file for the CalibrateTemp class """ + from titration.ui_state.ui_state import UIState from titration.ui_state.user_value.reference_temperature import ( ReferenceTemperature, diff --git a/titration/ui_state/calibration/setup_calibration.py b/titration/ui_state/calibration/setup_calibration.py index 7679c07..2d15c53 100644 --- a/titration/ui_state/calibration/setup_calibration.py +++ b/titration/ui_state/calibration/setup_calibration.py @@ -1,6 +1,7 @@ """ The file for the SetupCalibration class """ + from titration.devices.library import Keypad from titration.ui_state.calibration.calibrate_ph import CalibratePh from titration.ui_state.calibration.calibrate_temp import CalibrateTemp diff --git a/titration/ui_state/main_menu.py b/titration/ui_state/main_menu.py index a38e0b1..5a89b34 100644 --- a/titration/ui_state/main_menu.py +++ b/titration/ui_state/main_menu.py @@ -1,6 +1,7 @@ """ The file for the MainMenu class """ + import sys from titration.devices.library import Keypad diff --git a/titration/ui_state/prime_pump/prime_pump.py b/titration/ui_state/prime_pump/prime_pump.py index 223b69c..2ac6be3 100644 --- a/titration/ui_state/prime_pump/prime_pump.py +++ b/titration/ui_state/prime_pump/prime_pump.py @@ -1,6 +1,7 @@ """ The file for the PrimePump class """ + from titration.ui_state.ui_state import UIState diff --git a/titration/ui_state/titration/automatic_titration.py b/titration/ui_state/titration/automatic_titration.py index ea63206..d1f9afd 100644 --- a/titration/ui_state/titration/automatic_titration.py +++ b/titration/ui_state/titration/automatic_titration.py @@ -1,6 +1,7 @@ """ The file for the AutomaticTitration class """ + from titration.ui_state import main_menu from titration.ui_state.ui_state import UIState diff --git a/titration/ui_state/titration/calibrate_ph.py b/titration/ui_state/titration/calibrate_ph.py index a2d9a1e..c532877 100644 --- a/titration/ui_state/titration/calibrate_ph.py +++ b/titration/ui_state/titration/calibrate_ph.py @@ -1,6 +1,7 @@ """ The file to hold the CalibratePh class """ + from titration.ui_state.titration.initial_titration import InitialTitration from titration.ui_state.ui_state import UIState from titration.ui_state.user_value.buffer_ph import BufferPH diff --git a/titration/ui_state/titration/initial_titration.py b/titration/ui_state/titration/initial_titration.py index 64728b7..34069b3 100644 --- a/titration/ui_state/titration/initial_titration.py +++ b/titration/ui_state/titration/initial_titration.py @@ -1,6 +1,7 @@ """ The file for the InitialTitration class """ + from titration.devices.library import Keypad from titration.ui_state.titration.automatic_titration import AutomaticTitration from titration.ui_state.titration.manual_titration import ManualTitration diff --git a/titration/ui_state/titration/manual_titration.py b/titration/ui_state/titration/manual_titration.py index 6873364..51f4f6a 100644 --- a/titration/ui_state/titration/manual_titration.py +++ b/titration/ui_state/titration/manual_titration.py @@ -1,6 +1,7 @@ """ The file for the ManualTitration class """ + from titration.devices.library import Keypad from titration.ui_state import main_menu from titration.ui_state.ui_state import UIState diff --git a/titration/ui_state/titration/setup_titration.py b/titration/ui_state/titration/setup_titration.py index ad91cea..f737991 100644 --- a/titration/ui_state/titration/setup_titration.py +++ b/titration/ui_state/titration/setup_titration.py @@ -1,6 +1,7 @@ """ The file for the SetupTitration class """ + from titration.devices.library import Keypad from titration.ui_state.titration.calibrate_ph import CalibratePh from titration.ui_state.titration.initial_titration import InitialTitration diff --git a/titration/ui_state/update_settings/update_settings.py b/titration/ui_state/update_settings/update_settings.py index 8056113..6934f6b 100644 --- a/titration/ui_state/update_settings/update_settings.py +++ b/titration/ui_state/update_settings/update_settings.py @@ -1,6 +1,7 @@ """ The file to for the UpdateSetting class """ + from titration.ui_state.ui_state import UIState from titration.ui_state.user_value.pump_volume import PumpVolume diff --git a/titration/ui_state/user_value/buffer_ph.py b/titration/ui_state/user_value/buffer_ph.py index 8e8e6ad..3309b11 100644 --- a/titration/ui_state/user_value/buffer_ph.py +++ b/titration/ui_state/user_value/buffer_ph.py @@ -1,6 +1,7 @@ """ The file for the BufferPH class """ + from titration.ui_state.user_value.user_value import UserValue diff --git a/titration/ui_state/user_value/degas_time.py b/titration/ui_state/user_value/degas_time.py index 9db93e8..ce12b4b 100644 --- a/titration/ui_state/user_value/degas_time.py +++ b/titration/ui_state/user_value/degas_time.py @@ -1,6 +1,7 @@ """ The file for the DegasTime class """ + from titration.ui_state.user_value.user_value import UserValue diff --git a/titration/ui_state/user_value/pump_volume.py b/titration/ui_state/user_value/pump_volume.py index 8ef5acc..c42a9c3 100644 --- a/titration/ui_state/user_value/pump_volume.py +++ b/titration/ui_state/user_value/pump_volume.py @@ -1,6 +1,7 @@ """ The file for the PumpVolume class """ + from titration.ui_state.user_value.user_value import UserValue diff --git a/titration/ui_state/user_value/reference_temperature.py b/titration/ui_state/user_value/reference_temperature.py index ea2266d..e5a1098 100644 --- a/titration/ui_state/user_value/reference_temperature.py +++ b/titration/ui_state/user_value/reference_temperature.py @@ -1,6 +1,7 @@ """ The file for the ReferenceTemperature class """ + from titration.ui_state.user_value.user_value import UserValue diff --git a/titration/ui_state/user_value/solution_salinity.py b/titration/ui_state/user_value/solution_salinity.py index fb1eaf4..d52da89 100644 --- a/titration/ui_state/user_value/solution_salinity.py +++ b/titration/ui_state/user_value/solution_salinity.py @@ -1,6 +1,7 @@ """ The file for the SolutionSalinity class """ + from titration.ui_state.user_value.user_value import UserValue diff --git a/titration/ui_state/user_value/solution_weight.py b/titration/ui_state/user_value/solution_weight.py index 6089aed..49498d4 100644 --- a/titration/ui_state/user_value/solution_weight.py +++ b/titration/ui_state/user_value/solution_weight.py @@ -1,6 +1,7 @@ """ The file for the SolutionWeight class """ + from titration.ui_state.user_value.user_value import UserValue diff --git a/titration/ui_state/user_value/user_value.py b/titration/ui_state/user_value/user_value.py index 9e10ed7..434d719 100644 --- a/titration/ui_state/user_value/user_value.py +++ b/titration/ui_state/user_value/user_value.py @@ -1,6 +1,7 @@ """ The file for the UserValue class """ + from titration.ui_state.ui_state import UIState diff --git a/titration/ui_state/user_value/volume_to_move.py b/titration/ui_state/user_value/volume_to_move.py index 1ea0c12..2a5715b 100644 --- a/titration/ui_state/user_value/volume_to_move.py +++ b/titration/ui_state/user_value/volume_to_move.py @@ -1,6 +1,7 @@ """ The file for the Volume class """ + from titration.ui_state.user_value.user_value import UserValue diff --git a/uv.lock b/uv.lock new file mode 100644 index 0000000..96089c2 --- /dev/null +++ b/uv.lock @@ -0,0 +1,689 @@ +version = 1 +revision = 3 +requires-python = ">=3.14" + +[[package]] +name = "adafruit-ads1x15" +version = "1.0.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "adafruit-gpio" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/14/e8/c9935e32f61e6562abea08cb704fcbfbb78b39bd1d20bb9b12eb4c2c820c/Adafruit_ADS1x15-1.0.2.tar.gz", hash = "sha256:2076c114e3ca938ef5de13c608f2b28c517ca3d53407432fd470118556ab3feb", size = 5203, upload-time = "2016-10-19T01:35:40.915Z" } + +[[package]] +name = "adafruit-blinka" +version = "8.66.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "adafruit-circuitpython-typing" }, + { name = "adafruit-platformdetect" }, + { name = "adafruit-pureio" }, + { name = "binho-host-adapter" }, + { name = "pyftdi" }, + { name = "sysv-ipc", marker = "platform_machine != 'mips' and sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/35/2d/7469c26dbeade72709096922db34a75fecb47c6953dba0cd4c14ee2b3b45/adafruit_blinka-8.66.2.tar.gz", hash = "sha256:35f72589aa45d8738922367753f5588700b043b35611510d8efbe818d1a355fd", size = 268839, upload-time = "2025-09-27T20:53:57.753Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/70/c8/49ab498e87d04977a0c706af25825c5051daf2553b41c5b10eb7e9e8b19e/adafruit_blinka-8.66.2-py3-none-any.whl", hash = "sha256:93cfd6df6c523bc1312b731bdb4d51711d3ec6e468f18c8d40e09b7339bb2574", size = 399931, upload-time = "2025-09-27T20:53:56.014Z" }, +] + +[[package]] +name = "adafruit-circuitpython-ads1x15" +version = "3.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "adafruit-blinka" }, + { name = "adafruit-circuitpython-busdevice" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/19/67/03bca7cb16fa648da1285dc3b53c6996ce55cd8d8db6dba2352b5bdd3271/adafruit_circuitpython_ads1x15-3.0.0.tar.gz", hash = "sha256:200b8a4e4c6007805e11f39d8305ef1f7fe32e8d5383ada0f11dd1780ae28a5d", size = 30076, upload-time = "2025-10-09T14:21:37.027Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5f/11/20a2d3390fe9d34bc4ce44110f8fa6b30ee7f8ff3d4f8ef693e05ee5b096/adafruit_circuitpython_ads1x15-3.0.0-py3-none-any.whl", hash = "sha256:c6edde777f3a52204989de008b762701765b5d0fd63b5af5985881a41f747a76", size = 11416, upload-time = "2025-10-09T14:21:35.85Z" }, +] + +[[package]] +name = "adafruit-circuitpython-busdevice" +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/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/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.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "adafruit-blinka" }, +] +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/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-lis3dh" +version = "5.2.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "adafruit-blinka" }, + { name = "adafruit-circuitpython-busdevice" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/07/c8/e4d3c7bd3e9292692cb6b46831b90e1fa723c13d64248a6d1bda78b0eb75/adafruit_circuitpython_lis3dh-5.2.6.tar.gz", hash = "sha256:4fe1d7bfb4f41c6a9818f204d0ae1c5ce146cf98111f3a1a53f368d444fbb365", size = 31299, upload-time = "2025-06-17T16:17:45.003Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c8/f4/a69cd38ba93eb05498a69abf99408299993124cde68e54174310f94e40b6/adafruit_circuitpython_lis3dh-5.2.6-py3-none-any.whl", hash = "sha256:fffba886fbb9f9f8a407bce8e17aca79b95b1cd6bfd7a00878e039a10513376a", size = 8426, upload-time = "2025-06-17T16:17:43.047Z" }, +] + +[[package]] +name = "adafruit-circuitpython-max31865" +version = "2.2.25" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "adafruit-blinka" }, + { name = "adafruit-circuitpython-busdevice" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/86/8d/ca2d3d1c5d93ac3fb66c8b6255035d97f4547469f9142ee7d9d695b854b7/adafruit_circuitpython_max31865-2.2.25.tar.gz", hash = "sha256:acb97ba3a30f3b61c3db429a2d10efed30b27fc66161277eaa18dc6b0699285c", size = 24273, upload-time = "2025-06-17T16:19:22.394Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a4/ad/38d48b7464d08882e8418e4f64abcdbdb6c8417cfc235cb52931d5503205/adafruit_circuitpython_max31865-2.2.25-py3-none-any.whl", hash = "sha256:4a1f00b3ed3f906b6c1739cc22f95d5782e1fbdbc49998cd0f1d11af4914dce9", size = 6677, upload-time = "2025-06-17T16:19:21.324Z" }, +] + +[[package]] +name = "adafruit-circuitpython-requests" +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/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/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]] +name = "adafruit-circuitpython-typing" +version = "1.12.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "adafruit-blinka" }, + { name = "adafruit-circuitpython-busdevice" }, + { name = "adafruit-circuitpython-requests" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/31/12/cd335c0adfdbf836cd6cfc0658238fe1e056481cc9d83d1960acd4af6b0b/adafruit_circuitpython_typing-1.12.2.tar.gz", hash = "sha256:8a38ad064a665f84ce7a89454f0f37fd072f77d1b5b1a207bc54181cdd0d7e26", size = 25358, upload-time = "2025-09-08T19:52:43.56Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/dc/9b/87d9f26652b10250d427f50116c00fa90c80d21c9c6cc361b69692cc29ca/adafruit_circuitpython_typing-1.12.2-py3-none-any.whl", hash = "sha256:d03e20cb86c5daaadd5297b7d729bd9280fae540a86cbe9fdfa687ca5f4b1f45", size = 11014, upload-time = "2025-09-08T19:52:42.414Z" }, +] + +[[package]] +name = "adafruit-gpio" +version = "1.0.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "adafruit-pureio" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/db/1c/2dc8a674514219f287fa344e44cadfd77b3e2878d6ff602a8c2149b50dd8/Adafruit_GPIO-1.0.3.tar.gz", hash = "sha256:d6465b92c866c51ca8f3bc1e8f2ec36f5ccdb46d0fd54101c1109756d4a2dcd0", size = 24522, upload-time = "2017-06-06T18:44:52.234Z" } + +[[package]] +name = "adafruit-platformdetect" +version = "3.84.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1e/52/9641f5de40e9a85e69c01873eaee3e992e3d7dad32cd14fa7a8542994b1f/adafruit_platformdetect-3.84.1.tar.gz", hash = "sha256:2ed292fd292e3487db53c261e2879ae1831c607a8eb947beea20df6b5d24e42b", size = 49166, upload-time = "2025-10-14T18:33:15.526Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a6/78/9f5cd6031452f95b3e159e625a61d20148173db7f18817c52ab67aad3594/adafruit_platformdetect-3.84.1-py3-none-any.whl", hash = "sha256:53a9e34f32c48d7cd4b6a4497a0e4e07e05d5101cea055d60240ba8a3a0f06d8", size = 26628, upload-time = "2025-10-14T18:33:14.091Z" }, +] + +[[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, 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, upload-time = "2023-05-25T19:01:32.397Z" }, +] + +[[package]] +name = "asteroid" +version = "4.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a7/d1/6eee8726a863f28ff50d26c5eacb1a590f96ccbb273ce0a8c047ffb10f5a/astroid-4.0.1.tar.gz", hash = "sha256:0d778ec0def05b935e198412e62f9bcca8b3b5c39fdbe50b0ba074005e477aab", size = 405414, upload-time = "2025-10-11T15:15:42.6Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/47/f4/034361a9cbd9284ef40c8ad107955ede4efae29cbc17a059f63f6569c06a/astroid-4.0.1-py3-none-any.whl", hash = "sha256:37ab2f107d14dc173412327febf6c78d39590fdafcb44868f03b6c03452e3db0", size = 276268, upload-time = "2025-10-11T15:15:40.585Z" }, +] + +[[package]] +name = "binho-host-adapter" +version = "0.1.6" +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, 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, upload-time = "2020-06-04T19:38:10.612Z" }, +] + +[[package]] +name = "black" +version = "25.9.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "mypy-extensions" }, + { name = "packaging" }, + { name = "pathspec" }, + { name = "platformdirs" }, + { name = "pytokens" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4b/43/20b5c90612d7bdb2bdbcceeb53d588acca3bb8f0e4c5d5c751a2c8fdd55a/black-25.9.0.tar.gz", hash = "sha256:0474bca9a0dd1b51791fcc507a4e02078a1c63f6d4e4ae5544b9848c7adfb619", size = 648393, upload-time = "2025-09-19T00:27:37.758Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1b/46/863c90dcd3f9d41b109b7f19032ae0db021f0b2a81482ba0a1e28c84de86/black-25.9.0-py3-none-any.whl", hash = "sha256:474b34c1342cdc157d307b56c4c65bce916480c4a8f6551fdc6bf9b486a7c4ae", size = 203363, upload-time = "2025-09-19T00:27:35.724Z" }, +] + +[[package]] +name = "click" +version = "8.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/46/61/de6cd827efad202d7057d93e0fed9294b96952e188f7384832791c7b2254/click-8.3.0.tar.gz", hash = "sha256:e7b8232224eba16f4ebe410c25ced9f7875cb5f3263ffc93cc3e8da705e229c4", size = 276943, upload-time = "2025-09-18T17:32:23.696Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/db/d3/9dcc0f5797f070ec8edf30fbadfb200e71d9db6b84d211e3b2085a7589a0/click-8.3.0-py3-none-any.whl", hash = "sha256:9b9f285302c6e3064f4330c05f05b81945b2a39544279343e6e7c5f27a9baddc", size = 107295, upload-time = "2025-09-18T17:32:22.42Z" }, +] + +[[package]] +name = "codespell" +version = "2.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/15/e0/709453393c0ea77d007d907dd436b3ee262e28b30995ea1aa36c6ffbccaf/codespell-2.4.1.tar.gz", hash = "sha256:299fcdcb09d23e81e35a671bbe746d5ad7e8385972e65dbb833a2eaac33c01e5", size = 344740, upload-time = "2025-01-28T18:52:39.411Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/01/b394922252051e97aab231d416c86da3d8a6d781eeadcdca1082867de64e/codespell-2.4.1-py3-none-any.whl", hash = "sha256:3dadafa67df7e4a3dbf51e0d7315061b80d265f9552ebd699b3dd6834b47e425", size = 344501, upload-time = "2025-01-28T18:52:37.057Z" }, +] + +[[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, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "colorzero" +version = "2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "setuptools" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b3/ca/688824a06e8c4d04c7d2fd2af2d8da27bed51af20ee5f094154e1d680334/colorzero-2.0.tar.gz", hash = "sha256:e7d5a5c26cd0dc37b164ebefc609f388de24f8593b659191e12d85f8f9d5eb58", size = 25382, upload-time = "2021-03-15T23:42:23.261Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/a6/ddd0f130e44a7593ac6c55aa93f6e256d2270fd88e9d1b64ab7f22ab8fde/colorzero-2.0-py2.py3-none-any.whl", hash = "sha256:0e60d743a6b8071498a56465f7719c96a5e92928f858bab1be2a0d606c9aa0f8", size = 26573, upload-time = "2021-03-15T23:42:21.757Z" }, +] + +[[package]] +name = "coverage" +version = "7.10.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/51/26/d22c300112504f5f9a9fd2297ce33c35f3d353e4aeb987c8419453b2a7c2/coverage-7.10.7.tar.gz", hash = "sha256:f4ab143ab113be368a3e9b795f9cd7906c5ef407d6173fe9675a902e1fffc239", size = 827704, upload-time = "2025-09-21T20:03:56.815Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/23/9c/5844ab4ca6a4dd97a1850e030a15ec7d292b5c5cb93082979225126e35dd/coverage-7.10.7-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:b06f260b16ead11643a5a9f955bd4b5fd76c1a4c6796aeade8520095b75de520", size = 218302, upload-time = "2025-09-21T20:02:42.527Z" }, + { url = "https://files.pythonhosted.org/packages/f0/89/673f6514b0961d1f0e20ddc242e9342f6da21eaba3489901b565c0689f34/coverage-7.10.7-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:212f8f2e0612778f09c55dd4872cb1f64a1f2b074393d139278ce902064d5b32", size = 218578, upload-time = "2025-09-21T20:02:44.468Z" }, + { url = "https://files.pythonhosted.org/packages/05/e8/261cae479e85232828fb17ad536765c88dd818c8470aca690b0ac6feeaa3/coverage-7.10.7-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3445258bcded7d4aa630ab8296dea4d3f15a255588dd535f980c193ab6b95f3f", size = 249629, upload-time = "2025-09-21T20:02:46.503Z" }, + { url = "https://files.pythonhosted.org/packages/82/62/14ed6546d0207e6eda876434e3e8475a3e9adbe32110ce896c9e0c06bb9a/coverage-7.10.7-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:bb45474711ba385c46a0bfe696c695a929ae69ac636cda8f532be9e8c93d720a", size = 252162, upload-time = "2025-09-21T20:02:48.689Z" }, + { url = "https://files.pythonhosted.org/packages/ff/49/07f00db9ac6478e4358165a08fb41b469a1b053212e8a00cb02f0d27a05f/coverage-7.10.7-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:813922f35bd800dca9994c5971883cbc0d291128a5de6b167c7aa697fcf59360", size = 253517, upload-time = "2025-09-21T20:02:50.31Z" }, + { url = "https://files.pythonhosted.org/packages/a2/59/c5201c62dbf165dfbc91460f6dbbaa85a8b82cfa6131ac45d6c1bfb52deb/coverage-7.10.7-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:93c1b03552081b2a4423091d6fb3787265b8f86af404cff98d1b5342713bdd69", size = 249632, upload-time = "2025-09-21T20:02:51.971Z" }, + { url = "https://files.pythonhosted.org/packages/07/ae/5920097195291a51fb00b3a70b9bbd2edbfe3c84876a1762bd1ef1565ebc/coverage-7.10.7-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:cc87dd1b6eaf0b848eebb1c86469b9f72a1891cb42ac7adcfbce75eadb13dd14", size = 251520, upload-time = "2025-09-21T20:02:53.858Z" }, + { url = "https://files.pythonhosted.org/packages/b9/3c/a815dde77a2981f5743a60b63df31cb322c944843e57dbd579326625a413/coverage-7.10.7-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:39508ffda4f343c35f3236fe8d1a6634a51f4581226a1262769d7f970e73bffe", size = 249455, upload-time = "2025-09-21T20:02:55.807Z" }, + { url = "https://files.pythonhosted.org/packages/aa/99/f5cdd8421ea656abefb6c0ce92556709db2265c41e8f9fc6c8ae0f7824c9/coverage-7.10.7-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:925a1edf3d810537c5a3abe78ec5530160c5f9a26b1f4270b40e62cc79304a1e", size = 249287, upload-time = "2025-09-21T20:02:57.784Z" }, + { url = "https://files.pythonhosted.org/packages/c3/7a/e9a2da6a1fc5d007dd51fca083a663ab930a8c4d149c087732a5dbaa0029/coverage-7.10.7-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2c8b9a0636f94c43cd3576811e05b89aa9bc2d0a85137affc544ae5cb0e4bfbd", size = 250946, upload-time = "2025-09-21T20:02:59.431Z" }, + { url = "https://files.pythonhosted.org/packages/ef/5b/0b5799aa30380a949005a353715095d6d1da81927d6dbed5def2200a4e25/coverage-7.10.7-cp314-cp314-win32.whl", hash = "sha256:b7b8288eb7cdd268b0304632da8cb0bb93fadcfec2fe5712f7b9cc8f4d487be2", size = 221009, upload-time = "2025-09-21T20:03:01.324Z" }, + { url = "https://files.pythonhosted.org/packages/da/b0/e802fbb6eb746de006490abc9bb554b708918b6774b722bb3a0e6aa1b7de/coverage-7.10.7-cp314-cp314-win_amd64.whl", hash = "sha256:1ca6db7c8807fb9e755d0379ccc39017ce0a84dcd26d14b5a03b78563776f681", size = 221804, upload-time = "2025-09-21T20:03:03.4Z" }, + { url = "https://files.pythonhosted.org/packages/9e/e8/71d0c8e374e31f39e3389bb0bd19e527d46f00ea8571ec7ec8fd261d8b44/coverage-7.10.7-cp314-cp314-win_arm64.whl", hash = "sha256:097c1591f5af4496226d5783d036bf6fd6cd0cbc132e071b33861de756efb880", size = 220384, upload-time = "2025-09-21T20:03:05.111Z" }, + { url = "https://files.pythonhosted.org/packages/62/09/9a5608d319fa3eba7a2019addeacb8c746fb50872b57a724c9f79f146969/coverage-7.10.7-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:a62c6ef0d50e6de320c270ff91d9dd0a05e7250cac2a800b7784bae474506e63", size = 219047, upload-time = "2025-09-21T20:03:06.795Z" }, + { url = "https://files.pythonhosted.org/packages/f5/6f/f58d46f33db9f2e3647b2d0764704548c184e6f5e014bef528b7f979ef84/coverage-7.10.7-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:9fa6e4dd51fe15d8738708a973470f67a855ca50002294852e9571cdbd9433f2", size = 219266, upload-time = "2025-09-21T20:03:08.495Z" }, + { url = "https://files.pythonhosted.org/packages/74/5c/183ffc817ba68e0b443b8c934c8795553eb0c14573813415bd59941ee165/coverage-7.10.7-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:8fb190658865565c549b6b4706856d6a7b09302c797eb2cf8e7fe9dabb043f0d", size = 260767, upload-time = "2025-09-21T20:03:10.172Z" }, + { url = "https://files.pythonhosted.org/packages/0f/48/71a8abe9c1ad7e97548835e3cc1adbf361e743e9d60310c5f75c9e7bf847/coverage-7.10.7-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:affef7c76a9ef259187ef31599a9260330e0335a3011732c4b9effa01e1cd6e0", size = 262931, upload-time = "2025-09-21T20:03:11.861Z" }, + { url = "https://files.pythonhosted.org/packages/84/fd/193a8fb132acfc0a901f72020e54be5e48021e1575bb327d8ee1097a28fd/coverage-7.10.7-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6e16e07d85ca0cf8bafe5f5d23a0b850064e8e945d5677492b06bbe6f09cc699", size = 265186, upload-time = "2025-09-21T20:03:13.539Z" }, + { url = "https://files.pythonhosted.org/packages/b1/8f/74ecc30607dd95ad50e3034221113ccb1c6d4e8085cc761134782995daae/coverage-7.10.7-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:03ffc58aacdf65d2a82bbeb1ffe4d01ead4017a21bfd0454983b88ca73af94b9", size = 259470, upload-time = "2025-09-21T20:03:15.584Z" }, + { url = "https://files.pythonhosted.org/packages/0f/55/79ff53a769f20d71b07023ea115c9167c0bb56f281320520cf64c5298a96/coverage-7.10.7-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:1b4fd784344d4e52647fd7857b2af5b3fbe6c239b0b5fa63e94eb67320770e0f", size = 262626, upload-time = "2025-09-21T20:03:17.673Z" }, + { url = "https://files.pythonhosted.org/packages/88/e2/dac66c140009b61ac3fc13af673a574b00c16efdf04f9b5c740703e953c0/coverage-7.10.7-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:0ebbaddb2c19b71912c6f2518e791aa8b9f054985a0769bdb3a53ebbc765c6a1", size = 260386, upload-time = "2025-09-21T20:03:19.36Z" }, + { url = "https://files.pythonhosted.org/packages/a2/f1/f48f645e3f33bb9ca8a496bc4a9671b52f2f353146233ebd7c1df6160440/coverage-7.10.7-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:a2d9a3b260cc1d1dbdb1c582e63ddcf5363426a1a68faa0f5da28d8ee3c722a0", size = 258852, upload-time = "2025-09-21T20:03:21.007Z" }, + { url = "https://files.pythonhosted.org/packages/bb/3b/8442618972c51a7affeead957995cfa8323c0c9bcf8fa5a027421f720ff4/coverage-7.10.7-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a3cc8638b2480865eaa3926d192e64ce6c51e3d29c849e09d5b4ad95efae5399", size = 261534, upload-time = "2025-09-21T20:03:23.12Z" }, + { url = "https://files.pythonhosted.org/packages/b2/dc/101f3fa3a45146db0cb03f5b4376e24c0aac818309da23e2de0c75295a91/coverage-7.10.7-cp314-cp314t-win32.whl", hash = "sha256:67f8c5cbcd3deb7a60b3345dffc89a961a484ed0af1f6f73de91705cc6e31235", size = 221784, upload-time = "2025-09-21T20:03:24.769Z" }, + { url = "https://files.pythonhosted.org/packages/4c/a1/74c51803fc70a8a40d7346660379e144be772bab4ac7bb6e6b905152345c/coverage-7.10.7-cp314-cp314t-win_amd64.whl", hash = "sha256:e1ed71194ef6dea7ed2d5cb5f7243d4bcd334bfb63e59878519be558078f848d", size = 222905, upload-time = "2025-09-21T20:03:26.93Z" }, + { url = "https://files.pythonhosted.org/packages/12/65/f116a6d2127df30bcafbceef0302d8a64ba87488bf6f73a6d8eebf060873/coverage-7.10.7-cp314-cp314t-win_arm64.whl", hash = "sha256:7fe650342addd8524ca63d77b2362b02345e5f1a093266787d210c70a50b471a", size = 220922, upload-time = "2025-09-21T20:03:28.672Z" }, + { url = "https://files.pythonhosted.org/packages/ec/16/114df1c291c22cac3b0c127a73e0af5c12ed7bbb6558d310429a0ae24023/coverage-7.10.7-py3-none-any.whl", hash = "sha256:f7941f6f2fe6dd6807a1208737b8a0cbcf1cc6d7b07d24998ad2d63590868260", size = 209952, upload-time = "2025-09-21T20:03:53.918Z" }, +] + +[[package]] +name = "dill" +version = "0.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/12/80/630b4b88364e9a8c8c5797f4602d0f76ef820909ee32f0bacb9f90654042/dill-0.4.0.tar.gz", hash = "sha256:0633f1d2df477324f53a895b02c901fb961bdbf65a17122586ea7019292cbcf0", size = 186976, upload-time = "2025-04-16T00:41:48.867Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/50/3d/9373ad9c56321fdab5b41197068e1d8c25883b3fea29dd361f9b55116869/dill-0.4.0-py3-none-any.whl", hash = "sha256:44f54bf6412c2c8464c14e8243eb163690a9800dbe2c367330883b19c7561049", size = 119668, upload-time = "2025-04-16T00:41:47.671Z" }, +] + +[[package]] +name = "exceptiongroup" +version = "1.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0b/9f/a65090624ecf468cdca03533906e7c69ed7588582240cfe7cc9e770b50eb/exceptiongroup-1.3.0.tar.gz", hash = "sha256:b241f5885f560bc56a59ee63ca4c6a8bfa46ae4ad651af316d4e81817bb9fd88", size = 29749, upload-time = "2025-05-10T17:42:51.123Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/36/f4/c6e662dade71f56cd2f3735141b265c3c79293c109549c1e6933b0651ffc/exceptiongroup-1.3.0-py3-none-any.whl", hash = "sha256:4d111e6e0c13d0644cad6ddaa7ed0261a0b36971f6d23e7ec9b4b9097da78a10", size = 16674, upload-time = "2025-05-10T17:42:49.33Z" }, +] + +[[package]] +name = "flake8" +version = "7.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mccabe" }, + { name = "pycodestyle" }, + { name = "pyflakes" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9b/af/fbfe3c4b5a657d79e5c47a2827a362f9e1b763336a52f926126aa6dc7123/flake8-7.3.0.tar.gz", hash = "sha256:fe044858146b9fc69b551a4b490d69cf960fcb78ad1edcb84e7fbb1b4a8e3872", size = 48326, upload-time = "2025-06-20T19:31:35.838Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9f/56/13ab06b4f93ca7cac71078fbe37fcea175d3216f31f85c3168a6bbd0bb9a/flake8-7.3.0-py2.py3-none-any.whl", hash = "sha256:b9696257b9ce8beb888cdbe31cf885c90d31928fe202be0889a7cdafad32f01e", size = 57922, upload-time = "2025-06-20T19:31:34.425Z" }, +] + +[[package]] +name = "gpiozero" +version = "2.0.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorzero" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e4/47/334b8db8a981eca9a0fb1e7e48e1997a5eaa8f40bb31c504299dcca0e6ff/gpiozero-2.0.1.tar.gz", hash = "sha256:d4ea1952689ec7e331f9d4ebc9adb15f1d01c2c9dcfabb72e752c9869ab7e97e", size = 136176, upload-time = "2024-02-15T11:07:02.919Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/02/eb/6518a1b00488d48995034226846653c382d676cf5f04be62b3c3fae2c6a1/gpiozero-2.0.1-py3-none-any.whl", hash = "sha256:8f621de357171d574c0b7ea0e358cb66e560818a47b0eeedf41ce1cdbd20c70b", size = 150818, upload-time = "2024-02-15T11:07:00.451Z" }, +] + +[[package]] +name = "iniconfig" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f2/97/ebf4da567aa6827c909642694d71c9fcf53e5b504f2d96afea02718862f3/iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7", size = 4793, upload-time = "2025-03-19T20:09:59.721Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760", size = 6050, upload-time = "2025-03-19T20:10:01.071Z" }, +] + +[[package]] +name = "isort" +version = "7.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/63/53/4f3c058e3bace40282876f9b553343376ee687f3c35a525dc79dbd450f88/isort-7.0.0.tar.gz", hash = "sha256:5513527951aadb3ac4292a41a16cbc50dd1642432f5e8c20057d414bdafb4187", size = 805049, upload-time = "2025-10-11T13:30:59.107Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7f/ed/e3705d6d02b4f7aea715a353c8ce193efd0b5db13e204df895d38734c244/isort-7.0.0-py3-none-any.whl", hash = "sha256:1bcabac8bc3c36c7fb7b98a76c8abb18e0f841a3ba81decac7691008592499c1", size = 94672, upload-time = "2025-10-11T13:30:57.665Z" }, +] + +[[package]] +name = "mccabe" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/ff/0ffefdcac38932a54d2b5eed4e0ba8a408f215002cd178ad1df0f2806ff8/mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325", size = 9658, upload-time = "2022-01-24T01:14:51.113Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/27/1a/1f68f9ba0c207934b35b86a8ca3aad8395a3d6dd7921c0686e23853ff5a9/mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e", size = 7350, upload-time = "2022-01-24T01:14:49.62Z" }, +] + +[[package]] +name = "mypy-extensions" +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/6e/371856a3fb9d31ca8dac321cda606860fa4548858c0cc45d9d1d4ca2628b/mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558", size = 6343, upload-time = "2025-04-22T14:54:24.164Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", size = 4963, upload-time = "2025-04-22T14:54:22.983Z" }, +] + +[[package]] +name = "numpy" +version = "2.3.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d0/19/95b3d357407220ed24c139018d2518fab0a61a948e68286a25f1a4d049ff/numpy-2.3.3.tar.gz", hash = "sha256:ddc7c39727ba62b80dfdbedf400d1c10ddfa8eefbd7ec8dcb118be8b56d31029", size = 20576648, upload-time = "2025-09-09T16:54:12.543Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6b/01/342ad585ad82419b99bcf7cebe99e61da6bedb89e213c5fd71acc467faee/numpy-2.3.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:cd052f1fa6a78dee696b58a914b7229ecfa41f0a6d96dc663c1220a55e137593", size = 20951527, upload-time = "2025-09-09T15:57:52.006Z" }, + { url = "https://files.pythonhosted.org/packages/ef/d8/204e0d73fc1b7a9ee80ab1fe1983dd33a4d64a4e30a05364b0208e9a241a/numpy-2.3.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:414a97499480067d305fcac9716c29cf4d0d76db6ebf0bf3cbce666677f12652", size = 14186159, upload-time = "2025-09-09T15:57:54.407Z" }, + { url = "https://files.pythonhosted.org/packages/22/af/f11c916d08f3a18fb8ba81ab72b5b74a6e42ead4c2846d270eb19845bf74/numpy-2.3.3-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:50a5fe69f135f88a2be9b6ca0481a68a136f6febe1916e4920e12f1a34e708a7", size = 5114624, upload-time = "2025-09-09T15:57:56.5Z" }, + { url = "https://files.pythonhosted.org/packages/fb/11/0ed919c8381ac9d2ffacd63fd1f0c34d27e99cab650f0eb6f110e6ae4858/numpy-2.3.3-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:b912f2ed2b67a129e6a601e9d93d4fa37bef67e54cac442a2f588a54afe5c67a", size = 6642627, upload-time = "2025-09-09T15:57:58.206Z" }, + { url = "https://files.pythonhosted.org/packages/ee/83/deb5f77cb0f7ba6cb52b91ed388b47f8f3c2e9930d4665c600408d9b90b9/numpy-2.3.3-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9e318ee0596d76d4cb3d78535dc005fa60e5ea348cd131a51e99d0bdbe0b54fe", size = 14296926, upload-time = "2025-09-09T15:58:00.035Z" }, + { url = "https://files.pythonhosted.org/packages/77/cc/70e59dcb84f2b005d4f306310ff0a892518cc0c8000a33d0e6faf7ca8d80/numpy-2.3.3-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ce020080e4a52426202bdb6f7691c65bb55e49f261f31a8f506c9f6bc7450421", size = 16638958, upload-time = "2025-09-09T15:58:02.738Z" }, + { url = "https://files.pythonhosted.org/packages/b6/5a/b2ab6c18b4257e099587d5b7f903317bd7115333ad8d4ec4874278eafa61/numpy-2.3.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:e6687dc183aa55dae4a705b35f9c0f8cb178bcaa2f029b241ac5356221d5c021", size = 16071920, upload-time = "2025-09-09T15:58:05.029Z" }, + { url = "https://files.pythonhosted.org/packages/b8/f1/8b3fdc44324a259298520dd82147ff648979bed085feeacc1250ef1656c0/numpy-2.3.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d8f3b1080782469fdc1718c4ed1d22549b5fb12af0d57d35e992158a772a37cf", size = 18577076, upload-time = "2025-09-09T15:58:07.745Z" }, + { url = "https://files.pythonhosted.org/packages/f0/a1/b87a284fb15a42e9274e7fcea0dad259d12ddbf07c1595b26883151ca3b4/numpy-2.3.3-cp314-cp314-win32.whl", hash = "sha256:cb248499b0bc3be66ebd6578b83e5acacf1d6cb2a77f2248ce0e40fbec5a76d0", size = 6366952, upload-time = "2025-09-09T15:58:10.096Z" }, + { url = "https://files.pythonhosted.org/packages/70/5f/1816f4d08f3b8f66576d8433a66f8fa35a5acfb3bbd0bf6c31183b003f3d/numpy-2.3.3-cp314-cp314-win_amd64.whl", hash = "sha256:691808c2b26b0f002a032c73255d0bd89751425f379f7bcd22d140db593a96e8", size = 12919322, upload-time = "2025-09-09T15:58:12.138Z" }, + { url = "https://files.pythonhosted.org/packages/8c/de/072420342e46a8ea41c324a555fa90fcc11637583fb8df722936aed1736d/numpy-2.3.3-cp314-cp314-win_arm64.whl", hash = "sha256:9ad12e976ca7b10f1774b03615a2a4bab8addce37ecc77394d8e986927dc0dfe", size = 10478630, upload-time = "2025-09-09T15:58:14.64Z" }, + { url = "https://files.pythonhosted.org/packages/d5/df/ee2f1c0a9de7347f14da5dd3cd3c3b034d1b8607ccb6883d7dd5c035d631/numpy-2.3.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:9cc48e09feb11e1db00b320e9d30a4151f7369afb96bd0e48d942d09da3a0d00", size = 21047987, upload-time = "2025-09-09T15:58:16.889Z" }, + { url = "https://files.pythonhosted.org/packages/d6/92/9453bdc5a4e9e69cf4358463f25e8260e2ffc126d52e10038b9077815989/numpy-2.3.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:901bf6123879b7f251d3631967fd574690734236075082078e0571977c6a8e6a", size = 14301076, upload-time = "2025-09-09T15:58:20.343Z" }, + { url = "https://files.pythonhosted.org/packages/13/77/1447b9eb500f028bb44253105bd67534af60499588a5149a94f18f2ca917/numpy-2.3.3-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:7f025652034199c301049296b59fa7d52c7e625017cae4c75d8662e377bf487d", size = 5229491, upload-time = "2025-09-09T15:58:22.481Z" }, + { url = "https://files.pythonhosted.org/packages/3d/f9/d72221b6ca205f9736cb4b2ce3b002f6e45cd67cd6a6d1c8af11a2f0b649/numpy-2.3.3-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:533ca5f6d325c80b6007d4d7fb1984c303553534191024ec6a524a4c92a5935a", size = 6737913, upload-time = "2025-09-09T15:58:24.569Z" }, + { url = "https://files.pythonhosted.org/packages/3c/5f/d12834711962ad9c46af72f79bb31e73e416ee49d17f4c797f72c96b6ca5/numpy-2.3.3-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0edd58682a399824633b66885d699d7de982800053acf20be1eaa46d92009c54", size = 14352811, upload-time = "2025-09-09T15:58:26.416Z" }, + { url = "https://files.pythonhosted.org/packages/a1/0d/fdbec6629d97fd1bebed56cd742884e4eead593611bbe1abc3eb40d304b2/numpy-2.3.3-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:367ad5d8fbec5d9296d18478804a530f1191e24ab4d75ab408346ae88045d25e", size = 16702689, upload-time = "2025-09-09T15:58:28.831Z" }, + { url = "https://files.pythonhosted.org/packages/9b/09/0a35196dc5575adde1eb97ddfbc3e1687a814f905377621d18ca9bc2b7dd/numpy-2.3.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8f6ac61a217437946a1fa48d24c47c91a0c4f725237871117dea264982128097", size = 16133855, upload-time = "2025-09-09T15:58:31.349Z" }, + { url = "https://files.pythonhosted.org/packages/7a/ca/c9de3ea397d576f1b6753eaa906d4cdef1bf97589a6d9825a349b4729cc2/numpy-2.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:179a42101b845a816d464b6fe9a845dfaf308fdfc7925387195570789bb2c970", size = 18652520, upload-time = "2025-09-09T15:58:33.762Z" }, + { url = "https://files.pythonhosted.org/packages/fd/c2/e5ed830e08cd0196351db55db82f65bc0ab05da6ef2b72a836dcf1936d2f/numpy-2.3.3-cp314-cp314t-win32.whl", hash = "sha256:1250c5d3d2562ec4174bce2e3a1523041595f9b651065e4a4473f5f48a6bc8a5", size = 6515371, upload-time = "2025-09-09T15:58:36.04Z" }, + { url = "https://files.pythonhosted.org/packages/47/c7/b0f6b5b67f6788a0725f744496badbb604d226bf233ba716683ebb47b570/numpy-2.3.3-cp314-cp314t-win_amd64.whl", hash = "sha256:b37a0b2e5935409daebe82c1e42274d30d9dd355852529eab91dab8dcca7419f", size = 13112576, upload-time = "2025-09-09T15:58:37.927Z" }, + { url = "https://files.pythonhosted.org/packages/06/b9/33bba5ff6fb679aa0b1f8a07e853f002a6b04b9394db3069a1270a7784ca/numpy-2.3.3-cp314-cp314t-win_arm64.whl", hash = "sha256:78c9f6560dc7e6b3990e32df7ea1a50bbd0e2a111e05209963f5ddcab7073b0b", size = 10545953, upload-time = "2025-09-09T15:58:40.576Z" }, +] + +[[package]] +name = "packaging" +version = "25.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727, upload-time = "2025-04-19T11:48:59.673Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" }, +] + +[[package]] +name = "pandas" +version = "2.3.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, + { name = "python-dateutil" }, + { name = "pytz" }, + { name = "tzdata" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/33/01/d40b85317f86cf08d853a4f495195c73815fdf205eef3993821720274518/pandas-2.3.3.tar.gz", hash = "sha256:e05e1af93b977f7eafa636d043f9f94c7ee3ac81af99c13508215942e64c993b", size = 4495223, upload-time = "2025-09-29T23:34:51.853Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/fd/74903979833db8390b73b3a8a7d30d146d710bd32703724dd9083950386f/pandas-2.3.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:ee15f284898e7b246df8087fc82b87b01686f98ee67d85a17b7ab44143a3a9a0", size = 11540635, upload-time = "2025-09-29T23:25:52.486Z" }, + { url = "https://files.pythonhosted.org/packages/21/00/266d6b357ad5e6d3ad55093a7e8efc7dd245f5a842b584db9f30b0f0a287/pandas-2.3.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1611aedd912e1ff81ff41c745822980c49ce4a7907537be8692c8dbc31924593", size = 10759079, upload-time = "2025-09-29T23:26:33.204Z" }, + { url = "https://files.pythonhosted.org/packages/ca/05/d01ef80a7a3a12b2f8bbf16daba1e17c98a2f039cbc8e2f77a2c5a63d382/pandas-2.3.3-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6d2cefc361461662ac48810cb14365a365ce864afe85ef1f447ff5a1e99ea81c", size = 11814049, upload-time = "2025-09-29T23:27:15.384Z" }, + { url = "https://files.pythonhosted.org/packages/15/b2/0e62f78c0c5ba7e3d2c5945a82456f4fac76c480940f805e0b97fcbc2f65/pandas-2.3.3-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ee67acbbf05014ea6c763beb097e03cd629961c8a632075eeb34247120abcb4b", size = 12332638, upload-time = "2025-09-29T23:27:51.625Z" }, + { url = "https://files.pythonhosted.org/packages/c5/33/dd70400631b62b9b29c3c93d2feee1d0964dc2bae2e5ad7a6c73a7f25325/pandas-2.3.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c46467899aaa4da076d5abc11084634e2d197e9460643dd455ac3db5856b24d6", size = 12886834, upload-time = "2025-09-29T23:28:21.289Z" }, + { url = "https://files.pythonhosted.org/packages/d3/18/b5d48f55821228d0d2692b34fd5034bb185e854bdb592e9c640f6290e012/pandas-2.3.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6253c72c6a1d990a410bc7de641d34053364ef8bcd3126f7e7450125887dffe3", size = 13409925, upload-time = "2025-09-29T23:28:58.261Z" }, + { url = "https://files.pythonhosted.org/packages/a6/3d/124ac75fcd0ecc09b8fdccb0246ef65e35b012030defb0e0eba2cbbbe948/pandas-2.3.3-cp314-cp314-win_amd64.whl", hash = "sha256:1b07204a219b3b7350abaae088f451860223a52cfb8a6c53358e7948735158e5", size = 11109071, upload-time = "2025-09-29T23:32:27.484Z" }, + { url = "https://files.pythonhosted.org/packages/89/9c/0e21c895c38a157e0faa1fb64587a9226d6dd46452cac4532d80c3c4a244/pandas-2.3.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:2462b1a365b6109d275250baaae7b760fd25c726aaca0054649286bcfbb3e8ec", size = 12048504, upload-time = "2025-09-29T23:29:31.47Z" }, + { url = "https://files.pythonhosted.org/packages/d7/82/b69a1c95df796858777b68fbe6a81d37443a33319761d7c652ce77797475/pandas-2.3.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0242fe9a49aa8b4d78a4fa03acb397a58833ef6199e9aa40a95f027bb3a1b6e7", size = 11410702, upload-time = "2025-09-29T23:29:54.591Z" }, + { url = "https://files.pythonhosted.org/packages/f9/88/702bde3ba0a94b8c73a0181e05144b10f13f29ebfc2150c3a79062a8195d/pandas-2.3.3-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a21d830e78df0a515db2b3d2f5570610f5e6bd2e27749770e8bb7b524b89b450", size = 11634535, upload-time = "2025-09-29T23:30:21.003Z" }, + { url = "https://files.pythonhosted.org/packages/a4/1e/1bac1a839d12e6a82ec6cb40cda2edde64a2013a66963293696bbf31fbbb/pandas-2.3.3-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2e3ebdb170b5ef78f19bfb71b0dc5dc58775032361fa188e814959b74d726dd5", size = 12121582, upload-time = "2025-09-29T23:30:43.391Z" }, + { url = "https://files.pythonhosted.org/packages/44/91/483de934193e12a3b1d6ae7c8645d083ff88dec75f46e827562f1e4b4da6/pandas-2.3.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:d051c0e065b94b7a3cea50eb1ec32e912cd96dba41647eb24104b6c6c14c5788", size = 12699963, upload-time = "2025-09-29T23:31:10.009Z" }, + { url = "https://files.pythonhosted.org/packages/70/44/5191d2e4026f86a2a109053e194d3ba7a31a2d10a9c2348368c63ed4e85a/pandas-2.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:3869faf4bd07b3b66a9f462417d0ca3a9df29a9f6abd5d0d0dbab15dac7abe87", size = 13202175, upload-time = "2025-09-29T23:31:59.173Z" }, +] + +[[package]] +name = "pathspec" +version = "0.12.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ca/bc/f35b8446f4531a7cb215605d100cd88b7ac6f44ab3fc94870c120ab3adbf/pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712", size = 51043, upload-time = "2023-12-10T22:30:45Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", size = 31191, upload-time = "2023-12-10T22:30:43.14Z" }, +] + +[[package]] +name = "platformdirs" +version = "4.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/61/33/9611380c2bdb1225fdef633e2a9610622310fed35ab11dac9620972ee088/platformdirs-4.5.0.tar.gz", hash = "sha256:70ddccdd7c99fc5942e9fc25636a8b34d04c24b335100223152c2803e4063312", size = 21632, upload-time = "2025-10-08T17:44:48.791Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/73/cb/ac7874b3e5d58441674fb70742e6c374b28b0c7cb988d37d991cde47166c/platformdirs-4.5.0-py3-none-any.whl", hash = "sha256:e578a81bb873cbb89a41fcc904c7ef523cc18284b7e3b3ccf06aca1403b7ebd3", size = 18651, upload-time = "2025-10-08T17:44:47.223Z" }, +] + +[[package]] +name = "pluggy" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, +] + +[[package]] +name = "pycodestyle" +version = "2.14.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/11/e0/abfd2a0d2efe47670df87f3e3a0e2edda42f055053c85361f19c0e2c1ca8/pycodestyle-2.14.0.tar.gz", hash = "sha256:c4b5b517d278089ff9d0abdec919cd97262a3367449ea1c8b49b91529167b783", size = 39472, upload-time = "2025-06-20T18:49:48.75Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d7/27/a58ddaf8c588a3ef080db9d0b7e0b97215cee3a45df74f3a94dbbf5c893a/pycodestyle-2.14.0-py2.py3-none-any.whl", hash = "sha256:dd6bf7cb4ee77f8e016f9c8e74a35ddd9f67e1d5fd4184d86c3b98e07099f42d", size = 31594, upload-time = "2025-06-20T18:49:47.491Z" }, +] + +[[package]] +name = "pyflakes" +version = "3.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/45/dc/fd034dc20b4b264b3d015808458391acbf9df40b1e54750ef175d39180b1/pyflakes-3.4.0.tar.gz", hash = "sha256:b24f96fafb7d2ab0ec5075b7350b3d2d2218eab42003821c06344973d3ea2f58", size = 64669, upload-time = "2025-06-20T18:45:27.834Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c2/2f/81d580a0fb83baeb066698975cb14a618bdbed7720678566f1b046a95fe8/pyflakes-3.4.0-py2.py3-none-any.whl", hash = "sha256:f742a7dbd0d9cb9ea41e9a24a918996e8170c799fa528688d40dd582c8265f4f", size = 63551, upload-time = "2025-06-20T18:45:26.937Z" }, +] + +[[package]] +name = "pyftdi" +version = "0.57.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyserial" }, + { name = "pyusb" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/16/cd/0731490946e037e954ef83719f07c7672cf32bc90dd9c75201c40b827664/pyftdi-0.57.1-py3-none-any.whl", hash = "sha256:efd3f5a7d43202dc883ff261a7b1cb4dcbbe65b19628f8603a8b1183a7bc2841", size = 146180, upload-time = "2025-08-14T15:59:16.164Z" }, +] + +[[package]] +name = "pygments" +version = "2.19.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b0/77/a5b8c569bf593b0140bde72ea885a803b82086995367bf2037de0159d924/pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", size = 4968631, upload-time = "2025-06-21T13:39:12.283Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload-time = "2025-06-21T13:39:07.939Z" }, +] + +[[package]] +name = "pylint" +version = "4.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "asteroid" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "dill" }, + { name = "isort" }, + { name = "mccabe" }, + { name = "platformdirs" }, + { name = "tomlkit" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b6/2f/e80cc4301c81c41a8836d726377daeebf5901a33c06ba8c2d5afb94f7612/pylint-4.0.0.tar.gz", hash = "sha256:62da212808c0681e49ffb125f0a994c685d912cf19ae373075649ebb5870ec28", size = 1567676, upload-time = "2025-10-12T15:21:15.165Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/42/af/068a0b92c49927ada0e177561244157dc9d122eeea5987e34c423172a296/pylint-4.0.0-py3-none-any.whl", hash = "sha256:196b92a85204bb0c0a416a6bb324f6185e59ff1d687ee1d614bf0abf34a348e8", size = 535836, upload-time = "2025-10-12T15:21:13.041Z" }, +] + +[[package]] +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, upload-time = "2020-11-23T03:59:15.045Z" } +wheels = [ + { 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 = "pytest" +version = "8.4.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "iniconfig" }, + { name = "packaging" }, + { name = "pluggy" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a3/5c/00a0e072241553e1a7496d638deababa67c5058571567b92a7eaa258397c/pytest-8.4.2.tar.gz", hash = "sha256:86c0d0b93306b961d58d62a4db4879f27fe25513d4b969df351abdddb3c30e01", size = 1519618, upload-time = "2025-09-04T14:34:22.711Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a8/a4/20da314d277121d6534b3a980b29035dcd51e6744bd79075a6ce8fa4eb8d/pytest-8.4.2-py3-none-any.whl", hash = "sha256:872f880de3fc3a5bdc88a11b39c9710c3497a547cfa9320bc3c5e62fbf272e79", size = 365750, upload-time = "2025-09-04T14:34:20.226Z" }, +] + +[[package]] +name = "pytest-cov" +version = "7.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "coverage" }, + { name = "pluggy" }, + { name = "pytest" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5e/f7/c933acc76f5208b3b00089573cf6a2bc26dc80a8aece8f52bb7d6b1855ca/pytest_cov-7.0.0.tar.gz", hash = "sha256:33c97eda2e049a0c5298e91f519302a1334c26ac65c1a483d6206fd458361af1", size = 54328, upload-time = "2025-09-09T10:57:02.113Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ee/49/1377b49de7d0c1ce41292161ea0f721913fa8722c19fb9c1e3aa0367eecb/pytest_cov-7.0.0-py3-none-any.whl", hash = "sha256:3b8e9558b16cc1479da72058bdecf8073661c7f57f7d3c5f22a1c23507f2d861", size = 22424, upload-time = "2025-09-09T10:57:00.695Z" }, +] + +[[package]] +name = "pytest-mock" +version = "3.15.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pytest" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/68/14/eb014d26be205d38ad5ad20d9a80f7d201472e08167f0bb4361e251084a9/pytest_mock-3.15.1.tar.gz", hash = "sha256:1849a238f6f396da19762269de72cb1814ab44416fa73a8686deac10b0d87a0f", size = 34036, upload-time = "2025-09-16T16:37:27.081Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5a/cc/06253936f4a7fa2e0f48dfe6d851d9c56df896a9ab09ac019d70b760619c/pytest_mock-3.15.1-py3-none-any.whl", hash = "sha256:0a25e2eb88fe5168d535041d09a4529a188176ae608a6d249ee65abc0949630d", size = 10095, upload-time = "2025-09-16T16:37:25.734Z" }, +] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload-time = "2024-03-01T18:36:20.211Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" }, +] + +[[package]] +name = "pytokens" +version = "0.1.10" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/30/5f/e959a442435e24f6fb5a01aec6c657079ceaca1b3baf18561c3728d681da/pytokens-0.1.10.tar.gz", hash = "sha256:c9a4bfa0be1d26aebce03e6884ba454e842f186a59ea43a6d3b25af58223c044", size = 12171, upload-time = "2025-02-19T14:51:22.001Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/60/e5/63bed382f6a7a5ba70e7e132b8b7b8abbcf4888ffa6be4877698dcfbed7d/pytokens-0.1.10-py3-none-any.whl", hash = "sha256:db7b72284e480e69fb085d9f251f66b3d2df8b7166059261258ff35f50fb711b", size = 12046, upload-time = "2025-02-19T14:51:18.694Z" }, +] + +[[package]] +name = "pytz" +version = "2025.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f8/bf/abbd3cdfb8fbc7fb3d4d38d320f2441b1e7cbe29be4f23797b4a2b5d8aac/pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3", size = 320884, upload-time = "2025-03-25T02:25:00.538Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00", size = 509225, upload-time = "2025-03-25T02:24:58.468Z" }, +] + +[[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, 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, upload-time = "2025-01-08T23:45:00.029Z" }, +] + +[[package]] +name = "setuptools" +version = "80.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/18/5d/3bf57dcd21979b887f014ea83c24ae194cfcd12b9e0fda66b957c69d1fca/setuptools-80.9.0.tar.gz", hash = "sha256:f36b47402ecde768dbfafc46e8e4207b4360c654f1f3bb84475f0a28628fb19c", size = 1319958, upload-time = "2025-05-27T00:56:51.443Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl", hash = "sha256:062d34222ad13e0cc312a4c02d73f059e86a4acbfbdea8f8f76b28c99f306922", size = 1201486, upload-time = "2025-05-27T00:56:49.664Z" }, +] + +[[package]] +name = "six" +version = "1.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, +] + +[[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, upload-time = "2021-01-17T19:07:44.217Z" } + +[[package]] +name = "tankcontrollerpython" +version = "0.1.0" +source = { editable = "." } +dependencies = [ + { name = "adafruit-ads1x15" }, + { name = "adafruit-blinka" }, + { name = "adafruit-circuitpython-ads1x15" }, + { name = "adafruit-circuitpython-lis3dh" }, + { name = "adafruit-circuitpython-max31865" }, + { name = "click" }, + { name = "exceptiongroup" }, + { name = "gpiozero" }, + { name = "numpy" }, + { name = "pandas" }, +] + +[package.optional-dependencies] +dev = [ + { name = "black" }, + { name = "codespell" }, + { name = "flake8" }, + { name = "isort" }, + { name = "pycodestyle" }, + { name = "pylint" }, + { name = "pytest" }, + { name = "pytest-cov" }, + { name = "pytest-mock" }, +] + +[package.metadata] +requires-dist = [ + { name = "adafruit-ads1x15" }, + { name = "adafruit-blinka" }, + { name = "adafruit-circuitpython-ads1x15" }, + { name = "adafruit-circuitpython-lis3dh" }, + { name = "adafruit-circuitpython-max31865" }, + { name = "black", marker = "extra == 'dev'" }, + { name = "click" }, + { name = "codespell", marker = "extra == 'dev'" }, + { name = "exceptiongroup" }, + { name = "flake8", marker = "extra == 'dev'" }, + { name = "gpiozero" }, + { name = "isort", marker = "extra == 'dev'" }, + { name = "numpy" }, + { name = "pandas" }, + { name = "pycodestyle", marker = "extra == 'dev'" }, + { name = "pylint", marker = "extra == 'dev'" }, + { name = "pytest", marker = "extra == 'dev'" }, + { name = "pytest-cov", marker = "extra == 'dev'" }, + { name = "pytest-mock", marker = "extra == 'dev'" }, +] +provides-extras = ["dev"] + +[[package]] +name = "tomlkit" +version = "0.13.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cc/18/0bbf3884e9eaa38819ebe46a7bd25dcd56b67434402b66a58c4b8e552575/tomlkit-0.13.3.tar.gz", hash = "sha256:430cf247ee57df2b94ee3fbe588e71d362a941ebb545dec29b53961d61add2a1", size = 185207, upload-time = "2025-06-05T07:13:44.947Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bd/75/8539d011f6be8e29f339c42e633aae3cb73bffa95dd0f9adec09b9c58e85/tomlkit-0.13.3-py3-none-any.whl", hash = "sha256:c89c649d79ee40629a9fda55f8ace8c6a1b42deb912b2a8fd8d942ddadb606b0", size = 38901, upload-time = "2025-06-05T07:13:43.546Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.15.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" }, +] + +[[package]] +name = "tzdata" +version = "2025.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/95/32/1a225d6164441be760d75c2c42e2780dc0873fe382da3e98a2e1e48361e5/tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9", size = 196380, upload-time = "2025-03-23T13:54:43.652Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8", size = 347839, upload-time = "2025-03-23T13:54:41.845Z" }, +]