Skip to main content

axilog (Python)

Python bindings (PyO3) for axilog's Rust GW2 arcdps WvW parsing core. Every export is a thin wrapper around the same decode → resolve → analyze → build_report pipeline the CLI (axilog-cli) and the Node SDK (crates/axilog-node) drive — see src/lib.rs's module doc for the exact FFI contract (no Rust panic ever crosses the boundary; every fallible step becomes a Python OSError/ValueError carrying the underlying Rust error text).

Build

cd crates/axilog-py
python3 -m venv .venv
.venv/bin/pip install maturin
.venv/bin/maturin develop --release   # builds the extension into .venv

maturin develop compiles this crate to a native extension module and installs it editable into whichever interpreter you point it at (here, .venv). Re-run it after changing src/lib.rs or axilog.pyi.

Usage

import axilog

# Native report (axilog_schema::Report — schema_version, encounter,
# players[], enemies[], timeline, warnings), returned as a plain dict
# with the same snake_case keys the Rust struct serializes (see "Types"
# below for the typed shape).
report = axilog.parse_file("./fight.zevtc")
print(report["schema_version"], len(report["players"]))

squad_damage = sum(p["damage"]["total"] for p in report["players"])
quickness = next(
    b for b in report["players"][0]["boons"] if b["name"] == "Quickness"
)
print(squad_damage, quickness["presence_pct"])

# Same pipeline, from an already-read buffer.
with open("./fight.zevtc", "rb") as f:
    report_from_bytes = axilog.parse_bytes(f.read())

# Elite Insights-compatibility JSON (axilog_ei::to_ei_json) — the shape
# axibridge-style consumers read (players[].account, dpsAll[0].damage,
# support[0].condiCleanse, buffUptimes[], targets[].enemyPlayer,
# wvWMapData.{red,blue,green}TeamID). Returned as `Dict[str, Any]` — see
# "Types" below, this shape isn't fully typed.
ei = axilog.parse_file_ei("./fight.zevtc")

# Rewrite every player's character/account name in a .zevtc to a
# deterministic Anon<N> placeholder (does not mutate metrics — safe for
# producing PII-safe fixtures). Returns the number of player agents
# rewritten.
rewritten = axilog.anonymize_file("./fight.zevtc", "./fight.anon.zevtc")

All four functions raise a real Python exception (never a raw Rust panic) on failure: OSError for a file that can't be read/written, ValueError for bytes that don't decode/parse as an arcdps log.

Types

This crate has no python-source tree — the compiled extension module is the package (see src/lib.rs's #[pymodule] fn axilog). maturin (>=1.5) auto-detects a <module_name>.pyi stub and a py.typed marker sitting next to Cargo.toml/pyproject.toml at the crate root and bundles both into the wheel as axilog/__init__.pyi and axilog/py.typed, alongside the compiled axilog/axilog.abi3.so and the auto-generated axilog/__init__.py — no [tool.maturin] include/ package-data configuration needed (verified directly against this crate: maturin build logs Found type stub file at axilog.pyi, and the built wheel contains axilog/__init__.pyi + axilog/py.typed).

axilog.pyi hand-transcribes every #[derive(Serialize)] struct in crates/axilog-schema/src/lib.rs (the source of truth — keep this file in sync with that one if the schema changes; mirrors crates/axilog-node/types.d.ts's equivalent transcription for the Node SDK) into TypedDicts, with Optional/omitted-key semantics matching each field's serde Option/skip_serializing_if attributes exactly (see the top of axilog.pyi for the precise rule). parse_file/parse_bytes are typed to return Report; parse_file_ei's materially different, larger EI-JSON shape is intentionally left Dict[str, Any] — typing it faithfully is out of scope for this task, mirrors types.d.ts's same call for parseFileEi.

Tests

tests/test_sdk.py (stdlib unittest only, no pytest/other dependencies) covers, against the committed PII-safe fixture fixtures/wvw-small.anon.zevtc (repo-root relative, resolved from the test file's own location so it runs correctly from any cwd):

  • parse_file: schema_version, player count, squad damage total, and the four support-stat squad sums — all pinned to this fixture's exact calibrated values (see crates/axilog-core/tests/golden.rs/ support_golden.rs for how those numbers were derived against a real dps.report EI export). One boon uptime value (Quickness for account :Anon132.5884) is cross-checked live against fixtures/wvw-small.ei.json's players[].boons["1187"].uptime, rather than only pinned to a hardcoded literal.
  • parse_bytes equals parse_file.
  • parse_file_ei: the specific keys axibridge-style consumers read (players[].account, dpsAll[0].damage, support[0].condiCleanse, non-empty buffUptimes, targets[].enemyPlayer booleans, wvWMapData's three team ids).
  • anonymize_file round-trip: writes to a tempfile directory, re-parses, checks player count/metrics are unchanged (anonymization only rewrites names).
  • Error paths: a missing file raises OSError; corrupt bytes raise ValueError — both with a non-empty message.
  • CLI parity: shells out to the already-built CLI (cargo build -p axilog-cli; run that first if target/debug/axilog is missing) and asserts axilog parse <fixture> --format json, json.loaded, exactly equals parse_file's return value — with a small first-N-differing-paths diff helper so a future divergence prints something readable instead of two giant dicts.

Canonical invocation (from the repo root, using the venv interpreter the module was built into — this is the command to wire into CI):

crates/axilog-py/.venv/bin/python -m unittest discover -s crates/axilog-py/tests

Equivalently, from this directory: .venv/bin/python -m unittest discover -s tests.

Metadata

Release files for axilog 0.2.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for axilog 0.2.0
File Size Uploaded
axilog-0.2.0.tar.gz 565.9 kB Details

Built distributions (wheels)

Table of built distributions (wheels) for axilog 0.2.0
File
axilog-0.2.0-cp39-abi3-win_amd64.whl CPython 3.9 abi3 Windows x86-64 Details
axilog-0.2.0-cp39-abi3-manylinux_2_34_x86_64.whl CPython 3.9 abi3 Linux glibc 2.34+ x86-64 Details
axilog-0.2.0-cp39-abi3-macosx_11_0_arm64.whl CPython 3.9 abi3 macOS 11.0+ ARM64 Details
axilog-0.2.0-cp39-abi3-macosx_10_12_x86_64.whl CPython 3.9 abi3 macOS 10.12+ x86-64 Details

Total release size: 3.6 MB

Release files / axilog-0.2.0.tar.gz

Download URL axilog-0.2.0.tar.gz
Size 565.9 kB
Tags Source
SHA-256 checksum
How to use checksums
4964e3969fd968a02f1a24d3c6285067e843801a6cd61cc10afc1806f9fd9394
BLAKE2b-256 checksum
How to use checksums
e930d5a1825587cefe9574a1a0259afcc2ad648c56575425013c337a41bc69c4
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 10, 2026.

Transparency log

Release files / axilog-0.2.0-cp39-abi3-win_amd64.whl

Download URL axilog-0.2.0-cp39-abi3-win_amd64.whl
Size 658.3 kB
Tags CPython 3.9 Windows x86-64 abi3
SHA-256 checksum
How to use checksums
ef28f5ecccb09b7683913cc02395006249c8011950f7d1a306b450c4a0d96cd7
BLAKE2b-256 checksum
How to use checksums
1b0b2d1872bb9baf6dd233458caf3282a1ff4ce3117a6858edc23c0c400c4430
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 10, 2026.

Transparency log

Release files / axilog-0.2.0-cp39-abi3-manylinux_2_34_x86_64.whl

Download URL axilog-0.2.0-cp39-abi3-manylinux_2_34_x86_64.whl
Size 842.1 kB
Tags CPython 3.9 Linux glibc 2.34+ x86-64 abi3
SHA-256 checksum
How to use checksums
fd70bb5e8515d74911701cde95456f554c84d3ffb47a0f3c0a028cd8378545a0
BLAKE2b-256 checksum
How to use checksums
5e08acf704af01744b519cee5d4a4acf5d013d2d9df7891e379b25a904e9e433
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 10, 2026.

Transparency log

Release files / axilog-0.2.0-cp39-abi3-macosx_11_0_arm64.whl

Download URL axilog-0.2.0-cp39-abi3-macosx_11_0_arm64.whl
Size 739.5 kB
Tags CPython 3.9 abi3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
0063d79343ec1a6510021ac9e1d14ab8c60085cc23137cf97eda6009078c752a
BLAKE2b-256 checksum
How to use checksums
62fc7a94e17a2b9dbf97c5d2c7a424f182d5f45952255f6cac7399c94d7533b2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 10, 2026.

Transparency log

Release files / axilog-0.2.0-cp39-abi3-macosx_10_12_x86_64.whl

Download URL axilog-0.2.0-cp39-abi3-macosx_10_12_x86_64.whl
Size 789.9 kB
Tags CPython 3.9 abi3 macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
0ecb8291bc4160bddb6dad1b362df5a54dc83e35b9785db8f3b43575ba5b76a6
BLAKE2b-256 checksum
How to use checksums
e1edafaa33f14015d94039f099889485228775d70667d907516efdd5fa16eef4
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 10, 2026.

Transparency log

Release history Release notifications | RSS feed

1.14.0

5 release files

1.10.2

5 release files

1.10.1

5 release files

1.10.0

5 release files

1.9.0

5 release files

1.8.3

5 release files

1.8.2

5 release files

1.8.1

5 release files

1.8.0

5 release files

1.7.2

5 release files

1.7.1

5 release files

1.7.0

5 release files

1.6.2

5 release files

1.6.1

5 release files

1.6.0

5 release files

1.5.1

5 release files

1.5.0

5 release files

1.4.1

5 release files

1.4.0

5 release files

1.3.0

5 release files

1.2.0

5 release files

1.1.0

5 release files

1.0.0

5 release files

0.3.12

5 release files

0.3.11

5 release files

0.3.10

5 release files

0.3.9

5 release files

0.3.8

5 release files

0.3.7

5 release files

0.3.6

5 release files

0.3.5

5 release files

0.3.4

5 release files

0.3.3

5 release files

0.3.2

5 release files

0.3.1

5 release files

0.3.0

5 release files

This release

0.2.0 This release

5 release files

0.1.1

5 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page