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 bytools/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.