The node type fix left the same stale-enum bug in place for edges: create_edge only advertised ethernet/wifi/iot/vlan/virtual, while the frontend EdgeType union also defines cluster, fibre and electrical. The backend's EdgeBase.type is a plain str, so those three were always accepted server-side — only the MCP schema rejected them. - Extract EDGE_TYPES in mcp/app/tools.py and use it for create_edge. - Add mcp/tests/test_edge_types_sync.py, mirroring the NodeType guard: parses EdgeType out of frontend/src/types/index.ts and asserts set equality with EDGE_TYPES. - Add create_edge cases for the three previously-rejected types plus a schema test pinning the enum contents and the ethernet default. - Add an `mcp` job to quality.yml. Both sync guards were unreachable from CI before: quality.yml only ran frontend and backend, so the enums could drift again with nothing to catch it. The job runs from a full checkout because the guards read the frontend sources, which are not in the mcp Docker build context. - Pin mcp[cli]>=1.26,<2. The bound is load-bearing: SDK 2.0 dropped the low-level Server.list_resources/list_tools decorator API that app/resources.py and app/tools.py are built on, so an unbounded spec breaks both the tests and the Docker image at import time. - Move pytest/pytest-anyio/trio into mcp/requirements.txt, matching how backend/requirements.txt carries its own test deps. trio is required because pytest-anyio parametrises every async test over both backends. Tested: 114 passed in mcp/, both in the existing venv and in a clean Python 3.13 venv installed the way the new CI job does. ha-relevant: no
80 lines
2.0 KiB
YAML
80 lines
2.0 KiB
YAML
name: Quality
|
|
|
|
on:
|
|
push:
|
|
branches: [main]
|
|
pull_request:
|
|
branches: [main]
|
|
|
|
permissions:
|
|
contents: read
|
|
|
|
jobs:
|
|
lint-scripts:
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
- name: ShellCheck — lxc-install.sh
|
|
uses: ludeeus/action-shellcheck@2.0.0
|
|
with:
|
|
scandir: './scripts'
|
|
- name: Hadolint — Dockerfile.backend
|
|
uses: hadolint/hadolint-action@v3.1.0
|
|
with:
|
|
dockerfile: Dockerfile.backend
|
|
ignore: DL3008
|
|
- name: Hadolint — Dockerfile.frontend
|
|
uses: hadolint/hadolint-action@v3.1.0
|
|
with:
|
|
dockerfile: Dockerfile.frontend
|
|
ignore: DL3008
|
|
|
|
frontend:
|
|
runs-on: ubuntu-latest
|
|
defaults:
|
|
run:
|
|
working-directory: frontend
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
- uses: actions/setup-node@v4
|
|
with:
|
|
node-version: '20'
|
|
cache: 'npm'
|
|
cache-dependency-path: frontend/package-lock.json
|
|
- run: npm ci
|
|
- run: npm run lint
|
|
- run: npm run typecheck
|
|
- run: npm test -- --run
|
|
|
|
backend:
|
|
runs-on: ubuntu-latest
|
|
defaults:
|
|
run:
|
|
working-directory: backend
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
- uses: actions/setup-python@v5
|
|
with:
|
|
python-version: '3.11'
|
|
- run: pip install -r requirements.txt
|
|
- run: ruff check .
|
|
- run: mypy app/
|
|
- run: pytest
|
|
|
|
# Also guards the NODE_TYPES / EDGE_TYPES enums in mcp/app/tools.py against
|
|
# drift from frontend/src/types/index.ts (test_node_types_sync.py,
|
|
# test_edge_types_sync.py) — those tests need the frontend sources, so this
|
|
# job runs from a full checkout rather than the mcp Docker context.
|
|
mcp:
|
|
runs-on: ubuntu-latest
|
|
defaults:
|
|
run:
|
|
working-directory: mcp
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
- uses: actions/setup-python@v5
|
|
with:
|
|
python-version: '3.13'
|
|
- run: pip install -r requirements.txt
|
|
- run: pytest
|