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

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.1
File Size Uploaded
axilog-0.3.1.tar.gz 743.9 kB Details

Built distributions (wheels)

Table of built distributions (wheels) for axilog 0.3.1
File
axilog-0.3.1-cp39-abi3-win_amd64.whl CPython 3.9 abi3 Windows x86-64 Details
axilog-0.3.1-cp39-abi3-manylinux_2_34_x86_64.whl CPython 3.9 abi3 Linux glibc 2.34+ x86-64 Details
axilog-0.3.1-cp39-abi3-macosx_11_0_arm64.whl CPython 3.9 abi3 macOS 11.0+ ARM64 Details
axilog-0.3.1-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.1.tar.gz

Download URL axilog-0.3.1.tar.gz
Size 743.9 kB
Tags Source
SHA-256 checksum
How to use checksums
cf0419ce733a229156c58a96d787b7f5ecb318c40eccf13ae6e673bca76b7dee
BLAKE2b-256 checksum
How to use checksums
e40a23247090f6d59cd1ffb4d47cdb8dac4f7c8ab324503a69ecf54df438fbd2
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.3.1-cp39-abi3-win_amd64.whl

Download URL axilog-0.3.1-cp39-abi3-win_amd64.whl
Size 825.4 kB
Tags CPython 3.9 Windows x86-64 abi3
SHA-256 checksum
How to use checksums
73501215cc24a7aeca09a2ab6b34527d344023662703e8e2fd0d901fa16f13d5
BLAKE2b-256 checksum
How to use checksums
ce6c53eddda1ba7666ada0560070af4fa5da4ec626699d7897960853073b918a
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.3.1-cp39-abi3-manylinux_2_34_x86_64.whl

Download URL axilog-0.3.1-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
112e9ec1b5d50af153bd86a9a8230b0570ed90d7ababdbdeef852a56c97bce6a
BLAKE2b-256 checksum
How to use checksums
d2c8f271201cc5eed45dadc42f32e25a110fc619c34d08878e79cc3e16d8a495
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.3.1-cp39-abi3-macosx_11_0_arm64.whl

Download URL axilog-0.3.1-cp39-abi3-macosx_11_0_arm64.whl
Size 906.3 kB
Tags CPython 3.9 abi3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
66d457f257b4b6e704a0cea35fdba240be4f45d3fe7d30e9833408ee9c1d6190
BLAKE2b-256 checksum
How to use checksums
118151a1fc54f507b2d488a7ff96dbabce9a9848aa661f8cbd4119b10a0fdbec
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.3.1-cp39-abi3-macosx_10_12_x86_64.whl

Download URL axilog-0.3.1-cp39-abi3-macosx_10_12_x86_64.whl
Size 981.9 kB
Tags CPython 3.9 abi3 macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
a2744073b892c91b7cd22daaddb14f29f99b8115dff0bad58f8d9a45c18a9c9b
BLAKE2b-256 checksum
How to use checksums
94bb43b056f50efca88096e310b14c1fbcec2c2c796aceb6a577732b0b640ff1
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

This release

0.3.1 This release

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