fix(documents): guard Unix-only resource import for Windows (#877)

`document_processors/_isolation.py` did an unconditional module-level
`import resource`, a POSIX-only stdlib module absent on Windows. It was
pulled into the API startup path via
`server/webdav.py -> utils/document_parser -> document_processors`, so
the MCP server failed to start on Windows since 0.101.2 with
`ModuleNotFoundError: No module named 'resource'`.

- Guard the import behind `sys.platform`; bind `resource = None` on
  win32. `_apply_mem_limit()` degrades to a logged no-op when the module
  is unavailable (the RLIMIT_AS cap is a Linux-pod safety measure, not a
  correctness requirement).
- Make the document-parser import in `server/webdav.py` lazy so server
  startup never loads the ingest document stack
  (document_processors -> pymupdf -> _isolation) at all -- it is only
  needed when a file is actually read and parsed. This both fixes #877
  and decouples the API layer from ingest-only deps.
- Add unit regressions for the no-op path and the win32 import guard.
- Add a cross-platform `package-smoke` CI job (ubuntu + windows) that
  installs the package isolated and runs the CLI, exercising the
  cli -> server -> webdav import chain that crashed in #877.

Fixes #877

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Chris Coutinho
2026-06-08 14:59:03 +02:00
co-authored by Claude Opus 4.8
parent 96c0491f14
commit fc8a4e4dfa
4 changed files with 85 additions and 5 deletions
+21
View File
@@ -29,6 +29,27 @@ jobs:
- name: Run unit tests
run: uv run pytest -v -m unit -o "addopts=-p no:asyncio"
# Cross-platform install smoke test. Installs the package (and its full
# dependency closure) into an isolated environment and runs the CLI
# entrypoint, which exercises the cli -> server -> webdav import chain. This is
# the regression guard for #877, where a Unix-only ``import resource`` in that
# chain crashed Windows startup. Runs on Windows in addition to Linux so any
# platform-specific import regression fails here.
package-smoke:
needs: [linting]
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, windows-latest]
runs-on: ${{ matrix.os }}
name: package-smoke (${{ matrix.os }})
steps:
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
- name: Install the latest version of uv
uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7.6.0
- name: Smoke test CLI (isolated install)
run: uv run --isolated --no-project --with . nextcloud-mcp-server --help
integration-test:
runs-on: ubuntu-latest
needs: [linting]