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.3.2

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.3.2
File Size Uploaded
axilog-0.3.2.tar.gz 747.7 kB Details

Built distributions (wheels)

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

Total release size: 4.5 MB

Release files / axilog-0.3.2.tar.gz

Download URL axilog-0.3.2.tar.gz
Size 747.7 kB
Tags Source
SHA-256 checksum
How to use checksums
053bf098a79b26ee820fc521af45a4d147fc17b7cbe0672f0c57323f0520c7f1
BLAKE2b-256 checksum
How to use checksums
467f3743459b1d1cd82457858db921ddf6a71c3fa20cf2af6cf611ed613a02fc
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 11, 2026.

Transparency log

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

Download URL axilog-0.3.2-cp39-abi3-win_amd64.whl
Size 826.4 kB
Tags CPython 3.9 Windows x86-64 abi3
SHA-256 checksum
How to use checksums
122b1ab33e521ff1bca04b9e2f8816634230024bb8ab80453d289772aa50aaf3
BLAKE2b-256 checksum
How to use checksums
09965be9dd2ab1c8573568a0462efc88246b4f5ec2d70c8c4e98c372ab93ff51
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 11, 2026.

Transparency log

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

Download URL axilog-0.3.2-cp39-abi3-manylinux_2_34_x86_64.whl
Size 1.0 MB
Tags CPython 3.9 Linux glibc 2.34+ x86-64 abi3
SHA-256 checksum
How to use checksums
4f86be3c740f9dacd527d953e0e878d9c03a6a58172ec4797d418a09cc888967
BLAKE2b-256 checksum
How to use checksums
3850bf6b44fa14c2925ebb37de5e55aebf6211847f5c53e54961dcc4b500d9a3
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 11, 2026.

Transparency log

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

Download URL axilog-0.3.2-cp39-abi3-macosx_11_0_arm64.whl
Size 907.5 kB
Tags CPython 3.9 abi3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
4e264ccf69d2c00ff6800772573bdea6d00a68e3d5155f1f0b07427d12b803b5
BLAKE2b-256 checksum
How to use checksums
0f4a9aeaa7d9b631b39c3ee534b6b67574960f1cc5a2060e6c16bbc9609102ee
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 11, 2026.

Transparency log

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

Download URL axilog-0.3.2-cp39-abi3-macosx_10_12_x86_64.whl
Size 982.8 kB
Tags CPython 3.9 abi3 macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
c24afd617aad9d6e5298b211c143a521b8bda1a4474d6a49d798f019d7c20b64
BLAKE2b-256 checksum
How to use checksums
652c8cec8ca017a30cb90429201934dcc7fc82fab040dbc62e01c2dc3dd27a82
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 11, 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

This release

0.3.2 This release

5 release files

0.3.1

5 release files

0.3.0

5 release files

0.2.0

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