doorstop-vscode-server
A small FastAPI server that wraps the Doorstop Python API directly (instead of shelling out to the doorstop CLI). It is designed to serve exactly one client — the Doorstop VS Code extension — and answers requests strictly one at a time; there is no concurrent request handling.
Install (editable, for development)
pip install -e .[dev]
Run
python -m doorstop_server --project <path-to-doorstop-project-root> --host 127.0.0.1 --port 7867
or, after installing:
doorstop-vscode-server --project <path-to-doorstop-project-root> --host 127.0.0.1 --port 7867
API
See src/doorstop_server/routers/ for the endpoint implementations. GET /health is the only route that is not serialized behind the request lock.
Tests
The test suite exercises the real FastAPI app against a temporary Doorstop project (no mocking of Doorstop itself), so it doubles as a pinned-down contract for the HTTP interface — every request/response shape, status code, and error format a test asserts on is something the extension can rely on.
pip install -e .[dev]
pytest
tests/conftest.py— shared fixtures (client,project_root,document) and aset_item_texthelper for mutating an item directly via the Doorstop API (bypassing the server) to simulate out-of-band edits.tests/test_serialization.py— proves the one-request-at-a-time guarantee black-box: fires concurrent/itemscalls and checks for zero UID collisions/gaps, rather than inspecting the lock directly.tests/test_errors.py— pins down the structured{"error": {"code", "message"}}shape for both expected (DoorstopError) and unexpected exceptions.
Doorstop version coupling
src/doorstop_server/validation_rules.py recognises Doorstop's validation
output by matching its message wording, because Doorstop 3.2 yields issues
as bare DoorstopError / DoorstopWarning / DoorstopInfo objects carrying
nothing but a string - no check id, no item reference, no field.
CHECK_TABLE in that file is therefore pinned to Doorstop 3.2. On a Doorstop
upgrade, re-check it: run the test suite first (several tests assert exact
check ids against real Doorstop output and will fail loudly if the wording
moved), then compare against contracts/validation-api.md section 2 in the
extension repo.
Two things limit the damage of a missed change:
- An unmatched message is never dropped. It is returned as
check: "unknown"withfield: nullat Doorstop's own severity, so the user still sees the problem - only its placement degrades to the item's first line. - The coupling lives in exactly one named file.
GET /validate must also keep running under read_only_validation(). Doorstop's
validation rewrites requirement files with its shipped defaults: a plain
get_issues() pass over a 9-item project rewrote 7 files and silently stamped
away a suspect link instead of reporting it. test_validate_writes_nothing
is the regression test for this.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file doorstop_vscode_server-0.1.2.tar.gz.
File metadata
- Download URL: doorstop_vscode_server-0.1.2.tar.gz
- Upload date:
- Size: 25.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fb25d824d12ad947d265454debed8ceefef4a1e6818d15f4c0efbaf2b1b5a221
|
|
| MD5 |
8cb3cd2031861a265cd8d854fab78a13
|
|
| BLAKE2b-256 |
1a4f35f74cbd1ec36f1136f6f43c64f8bae4c8d8cb53bf8083c50badcfcd7586
|
Provenance
The following attestation bundles were made for doorstop_vscode_server-0.1.2.tar.gz:
Publisher:
publish.yml on simonwalbrun-lab/doorstop-vscode-server
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
doorstop_vscode_server-0.1.2.tar.gz -
Subject digest:
fb25d824d12ad947d265454debed8ceefef4a1e6818d15f4c0efbaf2b1b5a221 - Sigstore transparency entry: 2784910635
- Sigstore integration time:
-
Permalink:
simonwalbrun-lab/doorstop-vscode-server@0a48dd82a336f8b8f67782404c9851c36863ccd3 -
Branch / Tag:
refs/tags/v0.1.2 - Owner: https://github.com/simonwalbrun-lab
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@0a48dd82a336f8b8f67782404c9851c36863ccd3 -
Trigger Event:
push
-
Statement type:
File details
Details for the file doorstop_vscode_server-0.1.2-py3-none-any.whl.
File metadata
- Download URL: doorstop_vscode_server-0.1.2-py3-none-any.whl
- Upload date:
- Size: 18.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5d8974b763a9438625e4cb428bbd85fe51c4fa0548abc66ac1c3b4beb8f414c8
|
|
| MD5 |
2d167fe415056df2c972d62f75bb856c
|
|
| BLAKE2b-256 |
f889cf3ab7b70ba111fb8022154445d7ced5fa82d73a8ca73464fe4e3ba514c7
|
Provenance
The following attestation bundles were made for doorstop_vscode_server-0.1.2-py3-none-any.whl:
Publisher:
publish.yml on simonwalbrun-lab/doorstop-vscode-server
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
doorstop_vscode_server-0.1.2-py3-none-any.whl -
Subject digest:
5d8974b763a9438625e4cb428bbd85fe51c4fa0548abc66ac1c3b4beb8f414c8 - Sigstore transparency entry: 2784910708
- Sigstore integration time:
-
Permalink:
simonwalbrun-lab/doorstop-vscode-server@0a48dd82a336f8b8f67782404c9851c36863ccd3 -
Branch / Tag:
refs/tags/v0.1.2 - Owner: https://github.com/simonwalbrun-lab
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@0a48dd82a336f8b8f67782404c9851c36863ccd3 -
Trigger Event:
push
-
Statement type: