feat(ci & deps): update rns and lxst.

add knip and type checking and improve ci
This commit is contained in:
Ivan 2026-07-04 17:06:44 -05:00
parent 025b948f0b
commit 2b874b0982
No known key found for this signature in database
18 changed files with 6883 additions and 4390 deletions

1638
.basedpyright/baseline.json Normal file

File diff suppressed because it is too large Load diff

View file

@ -1,72 +1,46 @@
# Compatibility shim — Taskfile.yml owns install, lint, test, and build targets.
TASK ?= task
.DEFAULT_GOAL := help
.PHONY: install install-offline run dev dev-fe build lint test test-be-perf clean help dist-linux dist-linux-x64
# Auto-detect offline bundle and configure caches
OFFLINE_BUNDLE := $(shell find vendor/offline -maxdepth 1 -type d -name 'meshchatx-offline-bundle-*' 2>/dev/null | head -n 1)
ifeq ($(MESHCHATX_OFFLINE_BUILD),1)
ifneq ($(OFFLINE_BUNDLE),)
export UV_CACHE_DIR := $(abspath $(OFFLINE_BUNDLE)/uv-cache)
export ELECTRON_BUILDER_CACHE := $(abspath $(OFFLINE_BUNDLE)/electron-builder-cache)
endif
endif
install:
ifeq ($(MESHCHATX_OFFLINE_BUILD),1)
@if [ ! -d "node_modules" ]; then \
echo "Error: node_modules not found for offline build." >&2; \
echo "Run: bash scripts/install-offline.sh" >&2; \
exit 1; \
fi
@echo "Offline build: skipping pnpm install (node_modules present)"
else
pnpm install
endif
uv sync --group dev $(if $(filter 1,$(MESHCHATX_OFFLINE_BUILD)),--offline)
uv run python scripts/patch_lxst_pyogg_ogg_ctypes.py
@$(TASK) install
install-offline:
bash scripts/install-offline.sh
@$(TASK) install:offline
# Python backend only. For HMR, use: make dev OR make run in one terminal and pnpm run dev in another.
run:
uv run python -m meshchatx.meshchat
@$(TASK) run
# Vite dev server (live reload) + backend. Open http://localhost:5173 — proxies /api and /ws to MESHCHAT_PORT (default 8000).
dev:
bash scripts/dev-local.sh
@$(TASK) dev
# Vite only; expects backend already running (e.g. make run on port 8000).
dev-fe:
pnpm run dev -- --host 127.0.0.1 --port 5173
@$(TASK) dev-fe
build:
pnpm run build
# Linux AppImage + deb (see package.json dist:linux).
dist-linux:
pnpm run dist:linux
dist-linux-x64:
pnpm run dist:linux-x64
help:
@echo "make dev - Vite HMR + backend (http://localhost:5173)"
@echo "make run - backend only"
@echo "make dev-fe - Vite only (pair with make run)"
@echo "make dist-linux - AppImage + deb (electron-builder)"
@echo "Env: MESHCHAT_PORT, E2E_BACKEND_PORT (vite proxy; script sets both), VITE_DEV_HOST, VITE_DEV_PORT"
@$(TASK) build
lint:
pnpm run lint
uv run ruff check .
uv run ruff format --check .
@$(TASK) lint:all
test:
pnpm run test
uv run pytest tests/backend -n auto --cov=meshchatx/src/backend
@$(TASK) test:all
test-be-perf:
uv run pytest tests/backend/test_performance_hotpaths.py tests/backend/test_performance_bottlenecks.py
@$(TASK) test:be:perf
clean:
rm -rf node_modules build dist python-dist meshchatx/public build-dir out
@$(TASK) clean
dist-linux:
@$(TASK) dist:linux
dist-linux-x64:
@$(TASK) dist:linux-x64
help:
@echo "Makefile targets delegate to Task (see: task --list)."
@$(TASK) --list

View file

@ -415,16 +415,16 @@ task test:all
task build:all
```
`Makefile` shortcuts are also available:
`Makefile` targets are thin shims that delegate to `task` (same commands as above):
| Command | Description |
| -------------- | --------------------------------------- |
| `make install` | Install pnpm and UV dependencies |
| `make run` | Run MeshChatX via UV |
| `make build` | Build frontend |
| `make lint` | Run eslint and ruff |
| `make test` | Run frontend and backend tests |
| `make clean` | Remove build artifacts and node_modules |
| Command | Delegates to | Description |
| -------------- | --------------- | --------------------------------------------- |
| `make install` | `task install` | Install pnpm and UV dependencies |
| `make run` | `task run` | Run MeshChatX via UV |
| `make build` | `task build` | Build frontend and backend artifacts |
| `make lint` | `task lint:all` | ESLint, vue-tsc, knip, Ruff, and basedpyright |
| `make test` | `task test:all` | Run frontend and backend tests |
| `make clean` | `task clean` | Remove build artifacts and node_modules |
## Versioning

View file

@ -108,10 +108,14 @@ tasks:
- uv run python -m meshchatx.meshchat
dev:
desc: Run in development mode (builds frontend first)
deps: [build:fe]
desc: Vite HMR + backend (http://localhost:5173)
cmds:
- task: run
- bash scripts/dev-local.sh
dev-fe:
desc: Vite dev server only (pair with task run)
cmds:
- "{{.NPM}} run dev -- --host 127.0.0.1 --port 5173"
start:
desc: Run the application via Electron Forge
@ -131,7 +135,7 @@ tasks:
# --- Code Quality ---
lint:
desc: Run all linters
desc: Run all linters (ESLint, vue-tsc, knip, Ruff, basedpyright)
deps: [lint:fe, lint:be]
lint:all:
@ -139,15 +143,18 @@ tasks:
deps: [lint:fe, lint:be]
lint:be:
desc: Lint Python code (ruff)
desc: Lint Python code (ruff + basedpyright)
cmds:
- uv run ruff check .
- uv run ruff format --check .
- uv run basedpyright -p pyrightconfig.json --level error
lint:fe:
desc: Lint frontend code
desc: Lint frontend code (ESLint, vue-tsc, knip)
cmds:
- "{{.NPM}} run lint"
- "{{.NPM}} run typecheck"
- "{{.NPM}} exec knip"
fmt:all:
desc: Format all code
@ -327,6 +334,11 @@ tasks:
cmds:
- "{{.NPM}} run build"
build:
desc: Alias for build:all
cmds:
- task: build:all
build:fe:
desc: Build frontend assets
deps: [deps:fe]
@ -390,6 +402,17 @@ tasks:
cmds:
- "{{.NPM}} run dist:linux"
dist:linux:
desc: Alias for dist:fe:linux (AppImage + deb)
cmds:
- task: dist:fe:linux
dist:linux-x64:
desc: Build Linux x64 AppImage + deb
deps: [build:fe]
cmds:
- "{{.NPM}} run dist:linux-x64"
dist:fe:rpm:
desc: Build RPM package
deps: [build:fe]

View file

@ -9,7 +9,7 @@ def repositoryBundledWheelsDir = new File(meshchatSourceDir, "public/repository-
def chaquopyBuildPython = System.getenv("CHAQUOPY_BUILD_PYTHON")
def pythonTempDir = new File(buildDir, "python-tmp")
def vendorWheelDir = new File(rootProject.projectDir, "vendor")
def lxstPatchedWheel = new File(rootProject.projectDir, "vendor/lxst-0.4.7-py3-none-any.whl")
def lxstPatchedWheel = new File(rootProject.projectDir, "vendor/lxst-0.4.8-py3-none-any.whl")
def bleakPatchedWheel = new File(rootProject.projectDir, "vendor/bleak-3.0.2-py3-none-any.whl")
def allAndroidAbis = ["arm64-v8a", "x86_64", "armeabi-v7a"]
def selectedAndroidAbis = (
@ -227,7 +227,7 @@ chaquopy {
options "--find-links", vendorWheelDir.absolutePath
install "packaging>=23"
install "aiohttp==3.14.1"
install "rns>=1.3.5"
install "rns>=1.3.7"
install "lxmf>=1.0.1"
install "numpy==1.26.2"
install "chaquopy-libcodec2==1.2.0"

35
knip.config.js Normal file
View file

@ -0,0 +1,35 @@
/** @type {import("knip").KnipConfig} */
export default {
entry: [
"meshchatx/src/frontend/index.html",
"electron/main.js",
"electron/main-legacy.js",
"electron/preload.js",
"meshchatx/src/frontend/public/service-worker.js",
"scripts/**/*.{js,mjs,cjs}",
"tests/**/*.{js,cjs,mjs}",
],
project: [
"meshchatx/src/frontend/**/*.{js,vue}",
"electron/**/*.js",
"scripts/**/*.{js,mjs,cjs}",
"tests/**/*.{js,cjs,mjs}",
],
ignore: ["meshchatx/src/frontend/public/**", "electron/assets/**", "**/*.worklet.js"],
ignoreDependencies: ["@electron/fuses", "@tailwindcss/forms", "electron-builder-squirrel-windows"],
ignoreBinaries: ["python3"],
ignoreIssues: {
"meshchatx/src/frontend/js/reticulumPathfinding.js": ["unlisted"],
},
rules: {
binaries: "off",
dependencies: "error",
devDependencies: "off",
duplicates: "error",
exports: "off",
files: "off",
types: "off",
unlisted: "error",
unresolved: "off",
},
};

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -81,5 +81,3 @@ export function renderTerminalOutput(raw) {
})
.join("\n");
}
export default renderTerminalOutput;

View file

@ -23,6 +23,8 @@
"bundle:offline": "bash scripts/create-offline-bundle.sh",
"lint": "eslint .",
"lint:fix": "eslint . --fix",
"typecheck": "vue-tsc --noEmit -p tsconfig.json",
"knip": "knip",
"format": "prettier --write .",
"test": "vitest run --exclude tests/frontend/LoadTimePerformance.test.js && vitest run --config vitest.electron.config.js",
"test:coverage": "vitest run --coverage --exclude tests/frontend/LoadTimePerformance.test.js && vitest run --config vitest.electron.config.js --coverage",
@ -83,14 +85,17 @@
"fake-indexeddb": "^6.2.5",
"globals": "^17.6.0",
"jsdom": "^29.1.1",
"knip": "^6.24.0",
"micron-parser": "github:RFnexus/micron-parser-js",
"prettier": "^3.9.3",
"tailwindcss": "^4.3.0",
"terser": "^5.48.0",
"typescript": "^6.0.3",
"vite": "^8.0.16",
"vite-plugin-vuetify": "^2.1.3",
"vitest": "^4.1.5",
"vue-eslint-parser": "^10.4.1"
"vue-eslint-parser": "^10.4.1",
"vue-tsc": "^3.3.6"
},
"build": {
"appId": "com.quad4.meshchatx",

811
pnpm-lock.yaml generated

File diff suppressed because it is too large Load diff

View file

@ -24,7 +24,7 @@ dependencies = [
"lxmf>=1.0.1",
"psutil>=7.2.2",
"pyserial>=3.5",
"rns>=1.3.5",
"rns>=1.3.7",
"websockets>=16.0",
"bcrypt>=5.0.0,<6.0.0",
"aiohttp-session>=2.12.1,<3.0.0",
@ -32,7 +32,7 @@ dependencies = [
"pycparser>=3.0",
"audioop-lts>=0.2.2; python_version >= '3.13'",
"ply>=3.11,<4.0",
"lxst>=0.4.7",
"lxst>=0.4.8",
"miniaudio (>=1.70,<2.0)",
"cbor2>=6.1.1",
]
@ -74,6 +74,7 @@ dev = [
"pytest-xdist>=3.8.0",
"ruff>=0.14.0",
"mutmut>=3.5.0; python_version < '4.0'",
"basedpyright>=1.39.9",
]
[tool.ruff]

15
pyrightconfig.json Normal file
View file

@ -0,0 +1,15 @@
{
"include": ["meshchatx/src/backend", "meshchatx/src/env_utils.py"],
"exclude": ["**/vendor/**", "**/build/**", "**/node_modules/**", "**/__pycache__/**"],
"extraPaths": ["vendor/lxmfy"],
"pythonVersion": "3.11",
"typeCheckingMode": "basic",
"baselineFile": ".basedpyright/baseline.json",
"reportMissingTypeArgument": "none",
"reportUnknownArgumentType": "none",
"reportUnknownMemberType": "none",
"reportUnknownVariableType": "none",
"reportUnknownParameterType": "none",
"reportMissingTypeStubs": "none",
"reportPrivateImportUsage": "none"
}

View file

@ -510,8 +510,8 @@ lxmf==1.0.1 \
# via
# lxst
# reticulum-meshchatx
lxst==0.4.7 \
--hash=sha256:a582378b56a2762f530eb28308523cfa5d6b6b83227b03d3c0f8c4f9ba084ea6
lxst==0.4.8 \
--hash=sha256:4cdf9c0b5e7fed85805c9716491b0eb9b753c43d15e6c6d7c5c53ebe2a7489b7
# via reticulum-meshchatx
miniaudio==1.71 \
--hash=sha256:06222d80b057ca4beccb6f97a134c2c2bf646ef7890e1759cfc09db7eecec44d \
@ -897,9 +897,9 @@ pyserial==3.5 \
# via
# reticulum-meshchatx
# rns
rns==1.3.5 \
--hash=sha256:1772888c65d03667222b4143d64897074371ea5246f40e1645824124532c340f \
--hash=sha256:63145ea1c0fa526a7914c0a72c4a82279b59719875918b0558d049d29198cee3
rns==1.3.7 \
--hash=sha256:6757db65c0af212b386b7e44b95eda4e36d6b11cae834258bc6d2d11dac6e125 \
--hash=sha256:95d3bab98513e7f4318ea2dc0b743a21ce9e3c94caee2eb587203ca4b61fd9ed
# via
# lxmf
# lxst

View file

@ -26,7 +26,7 @@ Options:
--api-level N Android API level for wheel tag (default: 24)
--pycodec2-version V pycodec2 version to build (default: 4.1.1)
--numpy-version V NumPy version used during pycodec2 build (default: 1.26.2)
--lxst-version V LXST wheel version for metadata patch (default: 0.4.7)
--lxst-version V LXST wheel version for metadata patch (default: 0.4.8)
--bleak-version V bleak pure-python wheel version to vendor (default: 3.0.2)
--no-lxst-patch Skip LXST metadata patch
--only-recipes LIST Comma-separated recipe directory names under
@ -54,7 +54,7 @@ API_LEVEL="24"
PYCODEC2_VERSION="4.1.1"
LIBCODEC2_VERSION="1.2.0"
NUMPY_VERSION="1.26.2"
LXST_VERSION="0.4.7"
LXST_VERSION="0.4.8"
BLEAK_VERSION="3.0.2"
PATCH_LXST="1"
ONLY_RECIPES=""

View file

@ -4,7 +4,6 @@
from __future__ import annotations
import json
import os
import shutil
import subprocess
@ -66,6 +65,9 @@ def test_docker_image_serves_status():
def test_docker_status_json_shape():
"""Lightweight follow-up: status body matches minimal contract when smoke script left output."""
sample = {"status": "ok", "listen_port": 8000, "https_enabled": True}
from tests.backend.api_json_contract_schemas import API_V1_STATUS_SCHEMA, assert_matches_schema
from tests.backend.api_json_contract_schemas import (
API_V1_STATUS_SCHEMA,
assert_matches_schema,
)
assert_matches_schema(sample, API_V1_STATUS_SCHEMA)

39
tsconfig.json Normal file
View file

@ -0,0 +1,39 @@
{
"compilerOptions": {
"target": "ES2022",
"module": "ESNext",
"moduleResolution": "bundler",
"lib": ["ES2022", "DOM", "DOM.Iterable"],
"jsx": "preserve",
"allowJs": true,
"checkJs": false,
"noEmit": true,
"strict": false,
"skipLibCheck": true,
"isolatedModules": true,
"resolveJsonModule": true,
"paths": {
"micron-parser": ["./node_modules/micron-parser/js/micron-parser.js"]
}
},
"include": [
"meshchatx/src/frontend/**/*.vue",
"meshchatx/src/frontend/**/*.js",
"electron/**/*.js",
"vite.config.js"
],
"exclude": [
"node_modules",
"meshchatx/public",
"meshchatx/src/frontend/public",
"build",
"dist",
"vendor",
"android",
"tests"
],
"vueCompilerOptions": {
"target": 3,
"strictTemplates": true
}
}

44
uv.lock generated
View file

@ -242,6 +242,18 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/f6/22/91616fe707a5c5510de2cac9b046a30defe7007ba8a0c04f9c08f27df312/audioop_lts-0.2.2-cp314-cp314t-win_arm64.whl", hash = "sha256:b492c3b040153e68b9fdaff5913305aaaba5bb433d8a7f73d5cf6a64ed3cc1dd", size = 25206, upload-time = "2025-08-05T16:43:16.444Z" },
]
[[package]]
name = "basedpyright"
version = "1.39.9"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "nodejs-wheel-binaries" },
]
sdist = { url = "https://files.pythonhosted.org/packages/7a/4b/c1f4e211e50389304d6af32b9280e026a7133e3ad59bbdf8f7a3250f8bee/basedpyright-1.39.9.tar.gz", hash = "sha256:32cbea5fc8273e89df3db20daea56cb7286e419ccdfdc479c64759d2dc071901", size = 24412216, upload-time = "2026-06-27T02:19:49.834Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/2a/d4/e1fa108710d0498a18c77b1e13897f31eab47c69aa8cfe2d2a4df746541e/basedpyright-1.39.9-py3-none-any.whl", hash = "sha256:6b0837b9eba972c71895167ab9b127e6afdbc17abc92312e3f8d15ca82a5611c", size = 13374276, upload-time = "2026-06-27T02:19:54.431Z" },
]
[[package]]
name = "bcrypt"
version = "5.0.0"
@ -1017,7 +1029,7 @@ wheels = [
[[package]]
name = "lxst"
version = "0.4.7"
version = "0.4.8"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "audioop-lts", marker = "python_full_version >= '3.13'" },
@ -1028,7 +1040,7 @@ dependencies = [
{ name = "rns" },
]
wheels = [
{ url = "https://files.pythonhosted.org/packages/94/6e/13d946563893273853afa5c2a7c035e87a8c9122365882d1877891fd370b/lxst-0.4.7-py3-none-any.whl", hash = "sha256:a582378b56a2762f530eb28308523cfa5d6b6b83227b03d3c0f8c4f9ba084ea6", size = 3676786, upload-time = "2026-06-07T13:03:23.649Z" },
{ url = "https://files.pythonhosted.org/packages/01/43/73bf35870920ee00b0de32fd6c51f2f3f025b8f7ca6d7e68e272587c2fb4/lxst-0.4.8-py3-none-any.whl", hash = "sha256:4cdf9c0b5e7fed85805c9716491b0eb9b753c43d15e6c6d7c5c53ebe2a7489b7", size = 3687968, upload-time = "2026-06-23T22:52:56.649Z" },
]
[[package]]
@ -1247,6 +1259,22 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/4f/23/ac475f6db39643946feb09290a2178d603d2b623034d56d3f5059cddb769/mutmut-3.5.0-py3-none-any.whl", hash = "sha256:f19f2dd2e977eb9dc17255d8cb11e24fbfc3191620fba3108cac25779c9d78c9", size = 34242, upload-time = "2026-02-22T18:46:43.113Z" },
]
[[package]]
name = "nodejs-wheel-binaries"
version = "24.16.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/a3/22/2a5beb4e21417c73233d9f65cf6f3e96e891b80d2f550a8f630ebc6b88c6/nodejs_wheel_binaries-24.16.0.tar.gz", hash = "sha256:c973cb69dc5fd16e6f6dc6e579e2c3d5534e2a1f57619dddf5ba070efa7dde37", size = 8056, upload-time = "2026-05-30T16:52:09.807Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/83/d1/68b43b53cd0fa83ae6fd406705023ca988d9e0ca41c724d82e66fbeb2ef6/nodejs_wheel_binaries-24.16.0-py2.py3-none-macosx_13_0_arm64.whl", hash = "sha256:d9f8f677dcf30e37ac244f07869726abe043f01eb0f45722b1df31cc2af7093c", size = 55666374, upload-time = "2026-05-30T16:51:39.588Z" },
{ url = "https://files.pythonhosted.org/packages/e9/b2/40a989159599080da485de966c4c2d207e852ac7aa7864702626d96c8bf5/nodejs_wheel_binaries-24.16.0-py2.py3-none-macosx_13_0_x86_64.whl", hash = "sha256:3d0370fe7120ce9697a4f60d40480d2bd8808d9f30131458d5afc0040d4e5a51", size = 55838487, upload-time = "2026-05-30T16:51:43.383Z" },
{ url = "https://files.pythonhosted.org/packages/d7/a7/cd42174fb5ff6faff7fa8d326a18914d8f232098ab5de055b57c16fa13ca/nodejs_wheel_binaries-24.16.0-py2.py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:85dc92bbb79c851569c5925dcc2a4c915a034efab375f99e4e7e6bbe9cca8342", size = 60179540, upload-time = "2026-05-30T16:51:47.036Z" },
{ url = "https://files.pythonhosted.org/packages/2b/95/c8a1f9ae140aa28df8744d984d01d4b3af7cdd6555af12127f40ceb45a7d/nodejs_wheel_binaries-24.16.0-py2.py3-none-manylinux_2_28_x86_64.whl", hash = "sha256:2f3036292811514ba847b3708492644764f88a833ac425c5f55007014308ddfd", size = 60716262, upload-time = "2026-05-30T16:51:50.711Z" },
{ url = "https://files.pythonhosted.org/packages/64/c9/7c35b3737f59e36d0249c265397b7bff570519b95301d6e16ea361e904ad/nodejs_wheel_binaries-24.16.0-py2.py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:db8a8a76ebd2b28ecbfc9ad464baa3707241b9e050a30e2efdf6f60c0f886502", size = 62230592, upload-time = "2026-05-30T16:51:55Z" },
{ url = "https://files.pythonhosted.org/packages/04/96/d931255cf9d11a84d6b54d882dba7434646467d568ccf070ea3418638df3/nodejs_wheel_binaries-24.16.0-py2.py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:f1a3d8f7b4491cbbd023ba3fc4e901fcca2d9fb80d57f24ba3890de8b1dbac03", size = 62841759, upload-time = "2026-05-30T16:51:59.407Z" },
{ url = "https://files.pythonhosted.org/packages/a2/7b/8b7a3f41bc255411be30b6d7d288aab8ffd9ea2055db8555ced3548007b9/nodejs_wheel_binaries-24.16.0-py2.py3-none-win_amd64.whl", hash = "sha256:bb136be9944f0662dcf1120f45193a6b75b13fac378971a95cc42c9f879a81aa", size = 42027734, upload-time = "2026-05-30T16:52:03.348Z" },
{ url = "https://files.pythonhosted.org/packages/17/66/1ed71f1f529b8ca727d42c7ceb9db0bef145ce4a13dfc86fb50aa44f3be6/nodejs_wheel_binaries-24.16.0-py2.py3-none-win_arm64.whl", hash = "sha256:8308940b5edd0a50dc5267ea36ba21c9f668e83fe0d9f293937174d3a7e31c36", size = 39714528, upload-time = "2026-05-30T16:52:06.421Z" },
]
[[package]]
name = "numpy"
version = "2.4.6"
@ -1760,6 +1788,7 @@ dependencies = [
[package.dev-dependencies]
dev = [
{ name = "basedpyright" },
{ name = "cx-freeze" },
{ name = "hypothesis" },
{ name = "jsonschema" },
@ -1781,18 +1810,19 @@ requires-dist = [
{ name = "cbor2", specifier = ">=6.1.1" },
{ name = "cryptography", specifier = ">=49.0.0,<50.0.0" },
{ name = "lxmf", specifier = ">=1.0.1" },
{ name = "lxst", specifier = ">=0.4.7" },
{ name = "lxst", specifier = ">=0.4.8" },
{ name = "miniaudio", specifier = ">=1.70,<2.0" },
{ name = "ply", specifier = ">=3.11,<4.0" },
{ name = "psutil", specifier = ">=7.2.2" },
{ name = "pycparser", specifier = ">=3.0" },
{ name = "pyserial", specifier = ">=3.5" },
{ name = "rns", specifier = ">=1.3.5" },
{ name = "rns", specifier = ">=1.3.7" },
{ name = "websockets", specifier = ">=16.0" },
]
[package.metadata.requires-dev]
dev = [
{ name = "basedpyright", specifier = ">=1.39.9" },
{ name = "cx-freeze", specifier = ">=7.0.0" },
{ name = "hypothesis", specifier = ">=6.152.4" },
{ name = "jsonschema", specifier = ">=4.26.0" },
@ -1820,15 +1850,15 @@ wheels = [
[[package]]
name = "rns"
version = "1.3.5"
version = "1.3.7"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "cryptography" },
{ name = "pyserial" },
]
sdist = { url = "https://files.pythonhosted.org/packages/bc/20/8986288f920a20daee9daf691c79096ccc0d41391508b281d2f9f82999e7/rns-1.3.5.tar.gz", hash = "sha256:63145ea1c0fa526a7914c0a72c4a82279b59719875918b0558d049d29198cee3", size = 515435, upload-time = "2026-05-31T22:32:07.547Z" }
sdist = { url = "https://files.pythonhosted.org/packages/8c/ed/2ace4e81951487975f38a16d8b4ee0154dc47b9cb746657b555adc1d7117/rns-1.3.7.tar.gz", hash = "sha256:6757db65c0af212b386b7e44b95eda4e36d6b11cae834258bc6d2d11dac6e125", size = 516648, upload-time = "2026-07-03T16:53:10.722Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/fe/95/d9a639c4e7919703ad1a410c6c925297435ee9e919da00a8a34744d6a82d/rns-1.3.5-py3-none-any.whl", hash = "sha256:1772888c65d03667222b4143d64897074371ea5246f40e1645824124532c340f", size = 602140, upload-time = "2026-05-31T22:32:02.203Z" },
{ url = "https://files.pythonhosted.org/packages/32/3a/d67f42fe877427f3c88a744c39ba32f67fdc48328d3a0d98d1938ed452f8/rns-1.3.7-py3-none-any.whl", hash = "sha256:95d3bab98513e7f4318ea2dc0b743a21ce9e3c94caee2eb587203ca4b61fd9ed", size = 603491, upload-time = "2026-07-03T16:53:06.123Z" },
]
[[package]]