Contributing

July 19, 2026 · View on GitHub

Thanks for your interest in improving the Vulners Python SDK! Issues and pull requests are welcome. For substantial changes, please open an issue to discuss the approach first.

Development setup

The project uses uv for dependency management and builds (the build backend is uv_build).

# install uv: https://docs.astral.sh/uv/getting-started/installation/
uv sync            # create the venv and install the project + dev tools

Everyday commands

make test          # run the full test suite in parallel (pytest -n auto)
make lint          # ruff check + format --check
make typecheck     # mypy + basedpyright
make cov           # branch coverage of the v4 core (gated at 100%)
make check         # lint + typecheck + unasync-check + test
make build         # build sdist + wheel

Project layout

  • src/vulners/ — the package.
    • _*.py, _models/, _types/, _resources/ — the v4 core (private). Async is the source of truth; the sync mirror is generated by unasyncd.
    • base.py, vscanner.py, vulners/ — the v3 legacy API, preserved for 100% backward compatibility.
  • tests/ — unit tests (tests/core/), the v3 suite, and the backward-compat oracle (tests/bc/, read-only baselines recorded from the released v3).
  • documentation/ — the MkDocs site.

Working on the async/sync core

Edit the async source under src/vulners/_resources/_async/ (and _ratelimit_async.py), then regenerate the sync mirror:

make unasync         # regenerate src/vulners/_resources/_sync/ etc.
make unasync-check   # CI gate: fails if the committed mirror drifted

Never edit the generated _resources/_sync/ files by hand.

Backward compatibility

The v3 public surface and its exact on-the-wire requests are pinned by the oracle in tests/bc/ against the released v3 baseline. Any change that removes a v3 symbol, alters a signature, or changes a request will fail these tests. Keep them green.

Before opening a PR

Run make check and make sure everything is green. New code should keep the v4 core at 100% branch coverage and 100% type completeness (basedpyright).

Commit style

Short, lower-case, imperative subject lines (e.g. fix: harden the retry predicate). Keep commits focused.