AddressablesToolsPy
Python library for reading Unity Addressables catalog files from JSON or binary catalog data.
Only reading is implemented.
Binary catalog versions 1 through 3 are supported. Version 3 support has not yet been tested against a broad catalog corpus.
Installation
pip install addressablestools
Version 1.1 includes the Python API and Rust accelerator in the same wheel, with
no separate runtime dependency. Standard CPython 3.12+ on the
supported platforms installs a prebuilt wheel without a
Rust toolchain. Building from source requires Rust 1.88+ and a platform linker.
backend="python" still selects the reference parser.
Parse JSON catalogs
from pathlib import Path
from addressablestools import AssetBundleRequestOptions, parse_json
data = Path("tests/samples/catalog.json").read_text(encoding="utf-8")
catalog = parse_json(data)
for key, locations in catalog.resources.items():
if not isinstance(key, str) or not key.endswith(".bundle"):
continue
options = locations[0].data_as(AssetBundleRequestOptions)
print(f"Bundle {key}, Crc: {options.crc}, Hash: {options.hash}")
Parse binary catalogs
from pathlib import Path
from addressablestools import parse_binary
catalog = parse_binary(Path("tests/samples/catalog.bin").read_bytes())
location = catalog.resources["Anim/Network"][0]
print(location.primary_key)
print(location.internal_id)
print(location.provider_id)
print(location.type.class_name if location.type else None)
For reproducible parsing measurements and optimization results, see the catalog benchmarks.
To build the package, including its Rust module, from this checkout:
uv sync --locked
parse(), parse_binary(), and parse_json() use it automatically
for supported calls. Select the backend per call:
from pathlib import Path
from addressablestools import available_backends, parse_json
data = Path("tests/samples/catalog.json").read_text(encoding="utf-8")
print(available_backends("json")) # ("python", "rust") when the JSON accelerator is installed
catalog = parse_json(data, backend="auto")
reference = parse_json(data, backend="python")
auto uses Python when the bundled extension is missing or incompatible.
DecoderRegistry is supported: standard registries keep built-in dispatch in Rust
and call the Python object decoder only for custom
decoders. Calls to register() and alias() invalidate cached dispatch decisions.
rust requires native support and raises
NativeBackendUnavailableError instead of silently falling back. Backend selection
is local to each call. The deprecated API accepts the same keyword; patchers and
handlers use the same registry bridge.
The previous native extra remains accepted as a compatibility alias.
Auto-detect catalog format
parse() dispatches str input to JSON parsing and bytes input to binary parsing.
from pathlib import Path
from addressablestools import parse
json_catalog = parse(Path("tests/samples/catalog.json").read_text(encoding="utf-8"))
binary_catalog = parse(Path("tests/samples/catalog.bin").read_bytes())
print(len(json_catalog.resources))
print(len(binary_catalog.resources))
Query resource locations
Catalog resources are exposed with Python-style names.
from pathlib import Path
from addressablestools import parse_json
catalog = parse_json(Path("tests/samples/catalog.json").read_text(encoding="utf-8"))
asset_key = "Assets/Paripari/AddressableAssets/VFX Texture Assets/ParticleTextures/sparkle.png"
asset_location = catalog.locate(asset_key)[0]
print(asset_location.primary_key)
print(asset_location.internal_id)
print(asset_location.provider_id)
if asset_location.dependency_key is not None:
dependency_location = catalog.locate(asset_location.dependency_key)[0]
print(dependency_location.primary_key)
print(dependency_location.internal_id)
Custom binary object handling
Binary catalogs may contain custom serialized object types. A decoder registry can alias a custom type to a supported built-in type or register a decoder function for that type.
from pathlib import Path
from addressablestools import DecoderRegistry, parse_binary
from addressablestools.decoder import SerializedObjectDecoder
registry = DecoderRegistry()
registry.alias(
"Custom.Assembly; Custom.AssetBundleRequestOptions",
SerializedObjectDecoder.ASSET_BUNDLE_REQUEST_OPTIONS_MATCH_NAME,
)
catalog = parse_binary(Path("catalog.bin").read_bytes(), registry=registry)
Decoder functions receive the exact serialized type together with the object offset.
These calls use the bundled Rust resource traversal automatically. Add
backend="rust" to require it or
backend="python" to use the reference parser. Decoder functions keep running in
Python with the same reader and shared object cache. Registry subclasses and
instance overrides of resolution methods retain the per-object Python bridge.
from dataclasses import dataclass
from pathlib import Path
from addressablestools import BinaryDecodeContext, DecoderRegistry, parse_binary
@dataclass(frozen=True)
class CustomInt32Value:
value: int
registry = DecoderRegistry()
@registry.register("Custom.Assembly; Custom.Int32Value")
def decode_custom_int32(context: BinaryDecodeContext) -> CustomInt32Value:
if context.is_default:
return CustomInt32Value(0)
context.reader.seek(context.offset)
return CustomInt32Value(context.reader.read_int32())
catalog = parse_binary(Path("catalog.bin").read_bytes(), registry=registry)
Changelog
See the changelog for release history and upgrade notes.
Deprecated API
The old AddressablesTools import path is deprecated as of 0.2.0. It remains available as a thin compatibility layer, but new code should import addressablestools directly. Calling AddressablesTools.parse(), AddressablesTools.parse_json(), or AddressablesTools.parse_binary() emits a DeprecationWarning.
Legacy compatibility
Existing callers can keep using the old import path while migrating:
from pathlib import Path
import AddressablesTools
from AddressablesTools.classes import AssetBundleRequestOptions
catalog = AddressablesTools.parse_json(Path("tests/samples/catalog.json").read_text("utf-8"))
for key, locations in catalog.Resources.items():
if isinstance(key, str) and key.endswith(".bundle"):
assert isinstance(locations[0].Data.Object, AssetBundleRequestOptions)
print(locations[0].Data.Object.Crc)
catalog.Resources lazily creates a normal dictionary of legacy location lists
on first access and reuses it afterward. Repeated lookups such as
catalog.Resources[key][0].InternalId no longer rebuild the entire catalog.
The dictionary and lists are a cached snapshot: edits to them persist across
accesses on that wrapper, without changing the underlying modern resource mapping.
Location properties still read the underlying objects' current fields. If you
change the modern resource mapping or want to discard snapshot edits, use
del catalog.Resources; the next access rebuilds it. Separate catalog wrappers
have separate snapshots. For new code, prefer addressablestools and its
catalog.resources mapping.
Within a resource snapshot, aliases for the same underlying location share one
legacy location wrapper; each key still has its own list. location.Dependencies
also caches a list snapshot and automatically rebuilds it if the underlying list
is replaced. After in-place edits to the underlying list, or to discard edits to
the snapshot, use del location.Dependencies to rebuild it on the next access.
When aliases share a location wrapper, they also share this dependency snapshot.
Repeated location.Data.Object, location.Data.Type, location.Type, and bundle
ComInfo reads reuse metadata wrappers. Replacing the underlying data, type, or
common-info object refreshes the relevant wrapper automatically; scalar field
changes remain visible. Lists and dictionaries returned by custom decoders keep
their existing behavior: each access wraps their current contents.
The legacy AddressablesTools.classes module is also provided for existing imports while migration is in progress.
Metadata
Release files for addressablestools 1.1.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| addressablestools-1.1.1.tar.gz | 558.9 kB | With provenance | Details |
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| addressablestools-1.1.1-cp312-abi3-win_amd64.whl | CPython 3.12 | abi3 | Windows x86-64 | Details |
| addressablestools-1.1.1-cp312-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl | CPython 3.12 | abi3 | Linux glibc 2.17+ x86-64 | Details |
| addressablestools-1.1.1-cp312-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl | CPython 3.12 | abi3 | Linux glibc 2.17+ ARM64 | Details |
| addressablestools-1.1.1-cp312-abi3-macosx_11_0_arm64.whl | CPython 3.12 | abi3 | macOS 11.0+ ARM64 | Details |
| addressablestools-1.1.1-cp312-abi3-macosx_10_13_x86_64.whl | CPython 3.12 | abi3 | macOS 10.13+ x86-64 | Details |
Total release size: 1.9 MB
Release files / addressablestools-1.1.1.tar.gz
| Download URL | addressablestools-1.1.1.tar.gz |
|---|---|
| Size | 558.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
fd7ebca12139a9b6dc23463255b2e5214b094a472752bee30cc3f2f626ca31b6
|
|
BLAKE2b-256 checksum How to use checksums |
338d90c0ec233088fa3d8598567000dbad12e18d315ff3810a37c49cef46188c
|
| 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 Sep 10, 2026.
Transparency logRelease files / addressablestools-1.1.1-cp312-abi3-win_amd64.whl
| Download URL | addressablestools-1.1.1-cp312-abi3-win_amd64.whl |
|---|---|
| Size | 188.4 kB |
| Tags | CPython 3.12 Windows x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
ef03bd530c81fccf9a2e138099fa45be552d9ebe4619314ef9d40961706010be
|
|
BLAKE2b-256 checksum How to use checksums |
591ba18e6c2203b582b98724098153ac0a9070b8916b4317e7b14eb753325163
|
| 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 Sep 10, 2026.
Transparency logRelease files / addressablestools-1.1.1-cp312-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | addressablestools-1.1.1-cp312-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 311.9 kB |
| Tags | CPython 3.12 Linux glibc 2.17+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
59741104c28799b8f8e5c7d9ec9a011059fd514492c19854059ca21a64306d81
|
|
BLAKE2b-256 checksum How to use checksums |
26bdf2ba85c6a5410c33e77e0798649f57da995838f9e170a176d1f160f8fee0
|
| 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 Sep 10, 2026.
Transparency logRelease files / addressablestools-1.1.1-cp312-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
| Download URL | addressablestools-1.1.1-cp312-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl |
|---|---|
| Size | 308.5 kB |
| Tags | CPython 3.12 Linux glibc 2.17+ ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
41feafd949a06613a711f61bf43a83f42e606c5670f1ce18daead2bc67a84fa3
|
|
BLAKE2b-256 checksum How to use checksums |
a671a3a0badddf1595c44842401205a9e254ae897de5c94708a74aa470bfc49c
|
| 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 Sep 10, 2026.
Transparency logRelease files / addressablestools-1.1.1-cp312-abi3-macosx_11_0_arm64.whl
| Download URL | addressablestools-1.1.1-cp312-abi3-macosx_11_0_arm64.whl |
|---|---|
| Size | 281.9 kB |
| Tags | CPython 3.12 abi3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
27cbf5977e59c1c56af9d581b643e75b7e40e527f6027c695cfeaa583d43bd68
|
|
BLAKE2b-256 checksum How to use checksums |
068b87eb1a812c23799b525e8cff048dd8fcf5720024ecddd16f38daf7cc96fd
|
| 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 Sep 10, 2026.
Transparency logRelease files / addressablestools-1.1.1-cp312-abi3-macosx_10_13_x86_64.whl
| Download URL | addressablestools-1.1.1-cp312-abi3-macosx_10_13_x86_64.whl |
|---|---|
| Size | 290.4 kB |
| Tags | CPython 3.12 abi3 macOS 10.13+ x86-64 |
|
SHA-256 checksum How to use checksums |
6d6c3b40cd5e0faf1ee360685c916f6cca60f81d2efbdbff578444cd2993aea1
|
|
BLAKE2b-256 checksum How to use checksums |
3e662ec44f65d505d0a1eaf951f56fcb0a137ccaf9de73532863f54f34d5f80f
|
| 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 Sep 10, 2026.
Transparency logSecurity for addressablestools 1.1.1
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.
Full provenance
All 6 files in this release have been uploaded with provenance metadata.
Attestation for addressablestools-1.1.1.tar.gz
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 Sep 10, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.