Skip to content

Development

nParse+ is GPL-3.0, written in Python 3.12 with PySide6, and developed at github.com/prokopto-dev/nparse-plus.

Running from source

Requires uv (which installs Python 3.12+ for you):

git clone https://github.com/prokopto-dev/nparse-plus.git nparseplus && cd nparseplus
uv sync
uv run python -m nparseplus

Development commands

uv run pytest                             # ~2500 tests, a few seconds
uv run pytest --cov=nparseplus --cov-branch --cov-report=term-missing
uv run ruff check . && uv run ruff format .
QT_QPA_PLATFORM=offscreen uv run pytest   # headless (CI does this)
uv run mkdocs serve                       # preview this documentation

Architecture in one paragraph

A log driver tails the newest eqlog_*.txt, a parser chain (one module per EQTool parser, 1:1 ports) turns lines into typed events on an event bus, handlers mutate services (timers, fights, triggers), and the Qt UI reads snapshots on timers. The rule that matters: the core engine never imports Qt — a test enforces it. The full guide lives in CLAUDE.md in the repo; EQTool's C# (pinned commit in CREDITS.md) is the source of truth for ported behavior, and its EQtoolsTests corpus is the golden spec.

Contributing

  • Commits follow Conventional Commits — feat: / fix: determine release versions (see Release flow).
  • Ported parser/handler behavior should match EQTool exactly; port the C# test first when in doubt. Deliberate divergences get a comment.
  • Data files under data/ are generated by tools/convert_*.py — regenerate, don't hand-edit.

Benchmarks

The suite lives in tests/perf/ and is excluded from the default test run (pyproject.toml's addopts), because timing assertions on shared CI runners are noise. Run it directly:

QT_QPA_PLATFORM=offscreen uv run pytest -m benchmark --benchmark-only

It replays solo, group and raid log traffic (tests/perf/profiles.py, composed from the EQtoolsTests line corpus) through the parser chain, and measures EventBus.publish, plugin dispatch at 1/10/50 subscribers, the Qt bridge, and end-to-end latency from a log append to a slot on the GUI thread. A nightly workflow records the results, compares them against a baseline and publishes the Performance dashboard to the dev docs; it never fails a build on a slow number.

To promote a run to the committed baseline in tests/perf/baseline.json:

QT_QPA_PLATFORM=offscreen uv run pytest -m benchmark --benchmark-only \
    --benchmark-json=perf.json
uv run python tools/perf_report.py record perf.json --out run.json
uv run python tools/perf_report.py baseline run.json --out tests/perf/baseline.json

Numbers are hardware-specific, so a baseline recorded on one machine says little about another. The nightly promotes the first run on each CI runner to be that runner's own baseline for exactly this reason.

Roadmap

Planned features and the distribution parking lot live on the Roadmap page; shipped history is in the changelog.