Skip to main content

citry_core

Python package that exposes Rust functionality from the twin citry_core_py Rust crate.

Install and quick start

pip install citry-core

The public APIs are namespaced by capability:

from citry_core.template_parser import compile_template, parse_template

template = parse_template("<p>Hello {{ name }}!</p>")
python_source = compile_template(template)

The package also exposes HTML transformation, Fluent i18n, safe expression evaluation, template formatting, and browser-expression analysis.

Build integration

This package is the Python-side twin to the citry_core_py Rust crate. The connection between them is defined in pyproject.toml via the [tool.maturin] section:

[tool.maturin]
manifest-path = "../../../crates/citry_core_py/Cargo.toml"
module-name = "citry_core._rust"

When built with maturin, the Rust crate is compiled into a Python extension module that provides the core functionality, while this package adds Python-side wrappers, type stubs, and additional utilities.

Maturin module-name configuration

Important: The module-name setting is crucial for this package to work correctly.

By default, maturin would create a Python module with the same name as the Rust crate (citry_core_py), but we want to publish this package as citry_core. The module-name = "citry_core._rust" setting tells maturin to:

  1. Create the compiled Rust extension as _rust.cpython.so (instead of citry_core_py.cpython.so)
  2. Place it in the citry_core/ directory (matching our Python package name)
  3. Merge it with our existing citry_core/ Python code

This allows us to:

  • Keep the Rust crate named citry_core_py (useful for potential future bindings like citry_core_js)
  • Publish the Python package as citry_core (the desired public name)
  • Have maturin automatically merge the Rust binary with our Python code

The module-name format is <python_package_name>.<rust_module_name>, where:

  • python_package_name must match the Python package directory (here, ./citry_core/)
  • rust_module_name must match the #[pymodule] function name in the Rust crate's lib.rs (e.g., fn _rust)

See the detailed comments in pyproject.toml for more information about this configuration.

Package structure

The package uses a mixed Rust/Python layout:

packages/py/citry_core/
├── citry_core/               # Package code
│   ├── __init__.py           # Empty - see below
│   ├── _rust                 # Platform extension module generated by maturin
│   │                         # from `crates/citry_core_py` (suffix varies).
│   │                         # Name set by `module-name` setting in `pyproject.toml`
│   ├── _rust.pyi             # Type stubs for Rust API
│   │                         # Filename matches <rust_module_name> from `module-name`
│   │
│   │   # API for individual Rust crates defined
│   │   # as separate submodules / subdirectories
│   │
│   ├── html_transform/      # HTML transformation API
│   │   └── __init__.py      # API for this submodule
│   ├── i18n/                # Fluent compiler and locale runtime API
│   ├── safe_eval/           # Safe eval API
│   ├── template_formatter/  # Authored template formatting API
│   ├── template_parser/     # Template parsing API
│   └── ...
├── tests/                    # Package tests
└── pyproject.toml

Manual API management

By default, maturin auto-generates __init__.py files. However, this package manually manages the Python-side API for several reasons:

  1. Multiple crates: The Rust crate exposes multiple submodules (html_transform, i18n, safe_eval, template_formatter, template_parser). We split these into separate submodules to avoid name conflicts.
  2. Python-side post-processing: Some crates need Python-side code that wraps or extends the Rust API. safe_eval executes transformed code, while template_parser provides Python wrappers around the Rust parser and compiler.

The root __init__.py is intentionally empty because we namespace each Rust crate under its own Python module. Instead, the API for each crate is defined in a separate directory with its own __init__.py file, e.g.:

  • citry_core/html_transform/__init__.py
  • citry_core/i18n/__init__.py
  • citry_core/safe_eval/__init__.py
  • citry_core/template_formatter/__init__.py
  • citry_core/template_parser/__init__.py

This allows clean, namespaced imports:

from citry_core.html_transform import transform_html
from citry_core.i18n import CatalogCompiler, canonicalize_locale
from citry_core.safe_eval import safe_eval
from citry_core.template_formatter import (
    finish_embedded_format,
    format_template,
    prepare_embedded_format,
    python_expression_provider,
)
from citry_core.template_parser import (
    analyze_browser_source,
    compile_template,
    parse_diagnostic,
    parse_template,
)

The i18n API compiles and analyzes Fluent project catalogs and runs their locale-aware messages, formatting, and strict number/date/time input. The parser API also exposes stable diagnostics, JavaScript analysis, and parser-owned syntax inventories for editor and batch tooling.

The formatter includes conservative Citry/HTML structural layout plus the vendored, in-process Python expression adapter. The provider identity function lets tooling report the exact pinned Ruff implementation used for expression output. JavaScript and CSS providers use an opaque two-pass API: prepare_embedded_format() returns immutable, source-bound requests for safe expression-free <script> and <style> bodies, and finish_embedded_format() validates every result before composing one atomic template result. This package discovers regions and enforces Citry boundaries; the caller chooses and invokes the external provider.

Remember: When you import
citry_core.html_transform,
you are directly accessing
citry_core/html_transform/__init__.py
You are NOT accessing
citry_core/__init__.py

Type stubs and runtime access

Issues with type checking

Type checkers (mypy, Pylance/Pyright) cannot pick up signatures and docstrings from the Rust API generated by maturin. The Rust code is compiled into a binary extension module, and type checkers don't have access to the original Rust source code or its PyO3 annotations.

To solve the type checking issue, we define type stubs in _rust.pyi.

The _rust.pyi:

  • Re-defines function signatures and docstrings
  • Enables type checking, IDE autocomplete, hover tooltips, etc
  • Important: The filename _rust.pyi MUST match the second part of the module-name setting in pyproject.toml
    (tool.maturin.module-name = "citry_core._rust").
    This ensures type checkers can find the type stubs for the Rust extension module.

Issues with Pytest and virtual modules

Another issue is with pytest. We define nested Python submodules for each Rust crate to avoid name conflicts in the Rust API. But pytest can't import the nested modules directly using the import keyword. This fails in pytest:

from citry_core._rust.template_parser import parse_template
# ModuleNotFoundError: No module named 'citry_core._rust.template_parser'

The cause is likely because the Rust-generated submodules (like _rust.template_parser) are virtual modules - they don't exist as actual files, but only inside the Rust binary.

To fix the issue with pytest, we have to avoid importing the virtual Python modules using import keyword.

This simply means that, instead of importing the Rust API as:

from citry_core._rust.html_transform import transform_html

transform_html(...)

We have to do:

from citry_core import _rust

_rust.html_transform.transform_html(...)

Development

Installing from the source distribution requires Rust 1.95 or newer. Normal installations use a prebuilt wheel and do not need a Rust toolchain.

Build

Build the package using maturin:

cd packages/py/citry_core
maturin develop  # Development build
maturin build    # Production build

Or with uv:

uv run maturin develop

Test

Important: Before running tests, you must install the package in development mode:

cd packages/py/citry_core
uv run maturin develop

This builds the Rust extension module and installs the package so Python can import it. Without this step, tests will fail with ModuleNotFoundError: No module named 'citry_core'.

After installing, run tests:

# From the package directory
uv run pytest

Adding a new Rust crate

When a new Rust crate / submodule is added to the twin Rust crate citry_core_py:

  1. Add to _rust.pyi: Define the type stubs

    class new_module:
        def new_function(...) -> ...:
            """Docstring"""
            ...
    
  2. Create Python wrapper: Add citry_core/new_module/__init__.py if needed

NOTE: A validator bindings (run by python scripts/check.py) checks that we've added entries to _rust.pyi and that the new_module subdirectory exists.

Type stub maintenance

When updating Rust functions:

  1. Update the function signature and docstring in _rust.pyi
  2. Ensure the filename _rust.pyi matches the second part from module-name in pyproject.toml

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

citry_core-1.6.0.tar.gz (2.2 MB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

citry_core-1.6.0-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl (6.3 MB view details)

Uploaded PyPymusllinux: musl 1.2+ x86-64

citry_core-1.6.0-pp311-pypy311_pp73-musllinux_1_2_i686.whl (6.1 MB view details)

Uploaded PyPymusllinux: musl 1.2+ i686

citry_core-1.6.0-pp311-pypy311_pp73-musllinux_1_2_armv7l.whl (6.0 MB view details)

Uploaded PyPymusllinux: musl 1.2+ ARMv7l

citry_core-1.6.0-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl (6.0 MB view details)

Uploaded PyPymusllinux: musl 1.2+ ARM64

citry_core-1.6.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (6.0 MB view details)

Uploaded PyPymanylinux: glibc 2.17+ x86-64

citry_core-1.6.0-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl (6.4 MB view details)

Uploaded PyPymanylinux: glibc 2.17+ s390x

citry_core-1.6.0-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (6.5 MB view details)

Uploaded PyPymanylinux: glibc 2.17+ ppc64le

citry_core-1.6.0-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (5.7 MB view details)

Uploaded PyPymanylinux: glibc 2.17+ ARMv7l

citry_core-1.6.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (5.9 MB view details)

Uploaded PyPymanylinux: glibc 2.17+ ARM64

citry_core-1.6.0-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl (6.0 MB view details)

Uploaded PyPymanylinux: glibc 2.5+ i686

citry_core-1.6.0-cp314-cp314t-musllinux_1_2_x86_64.whl (6.3 MB view details)

Uploaded CPython 3.14tmusllinux: musl 1.2+ x86-64

citry_core-1.6.0-cp314-cp314t-musllinux_1_2_i686.whl (6.1 MB view details)

Uploaded CPython 3.14tmusllinux: musl 1.2+ i686

citry_core-1.6.0-cp314-cp314t-musllinux_1_2_armv7l.whl (6.0 MB view details)

Uploaded CPython 3.14tmusllinux: musl 1.2+ ARMv7l

citry_core-1.6.0-cp314-cp314t-musllinux_1_2_aarch64.whl (6.0 MB view details)

Uploaded CPython 3.14tmusllinux: musl 1.2+ ARM64

citry_core-1.6.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (6.0 MB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.17+ x86-64

citry_core-1.6.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl (6.4 MB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.17+ s390x

citry_core-1.6.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (6.5 MB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.17+ ppc64le

citry_core-1.6.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (5.7 MB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.17+ ARMv7l

citry_core-1.6.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (5.9 MB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.17+ ARM64

citry_core-1.6.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl (6.0 MB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.5+ i686

citry_core-1.6.0-cp314-cp314-pyemscripten_2026_0_wasm32.whl (4.5 MB view details)

Uploaded CPython 3.14PyEmscripten 2026.0 wasm32

citry_core-1.6.0-cp310-abi3-win_amd64.whl (5.9 MB view details)

Uploaded CPython 3.10+Windows x86-64

citry_core-1.6.0-cp310-abi3-win32.whl (5.6 MB view details)

Uploaded CPython 3.10+Windows x86

citry_core-1.6.0-cp310-abi3-musllinux_1_2_x86_64.whl (6.3 MB view details)

Uploaded CPython 3.10+musllinux: musl 1.2+ x86-64

citry_core-1.6.0-cp310-abi3-musllinux_1_2_i686.whl (6.1 MB view details)

Uploaded CPython 3.10+musllinux: musl 1.2+ i686

citry_core-1.6.0-cp310-abi3-musllinux_1_2_armv7l.whl (6.0 MB view details)

Uploaded CPython 3.10+musllinux: musl 1.2+ ARMv7l

citry_core-1.6.0-cp310-abi3-musllinux_1_2_aarch64.whl (6.0 MB view details)

Uploaded CPython 3.10+musllinux: musl 1.2+ ARM64

citry_core-1.6.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (6.0 MB view details)

Uploaded CPython 3.10+manylinux: glibc 2.17+ x86-64

citry_core-1.6.0-cp310-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl (6.4 MB view details)

Uploaded CPython 3.10+manylinux: glibc 2.17+ s390x

citry_core-1.6.0-cp310-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (6.5 MB view details)

Uploaded CPython 3.10+manylinux: glibc 2.17+ ppc64le

citry_core-1.6.0-cp310-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (5.7 MB view details)

Uploaded CPython 3.10+manylinux: glibc 2.17+ ARMv7l

citry_core-1.6.0-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (5.9 MB view details)

Uploaded CPython 3.10+manylinux: glibc 2.17+ ARM64

citry_core-1.6.0-cp310-abi3-manylinux_2_5_i686.manylinux1_i686.whl (6.0 MB view details)

Uploaded CPython 3.10+manylinux: glibc 2.5+ i686

citry_core-1.6.0-cp310-abi3-macosx_11_0_arm64.whl (5.6 MB view details)

Uploaded CPython 3.10+macOS 11.0+ ARM64

citry_core-1.6.0-cp310-abi3-macosx_10_12_x86_64.whl (5.8 MB view details)

Uploaded CPython 3.10+macOS 10.12+ x86-64

File details

Details for the file citry_core-1.6.0.tar.gz.

File metadata

  • Download URL: citry_core-1.6.0.tar.gz
  • Upload date:
  • Size: 2.2 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for citry_core-1.6.0.tar.gz
Algorithm Hash digest
SHA256 fa3023e807bf6ee44f5991a36d321b1cf111810ebc1e328fb8bf6ee47b62acd6
MD5 e71adc8d7a2e868653ae9e7e87d91fe6
BLAKE2b-256 197affa00f99f468ec31fc30321e77772ddec4f4d2a3c88249aa9b4ebcb9f576

See more details on using hashes here.

Provenance

The following attestation bundles were made for citry_core-1.6.0.tar.gz:

Publisher: py--citry-core--publish.yml on citry-dev/citry

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file citry_core-1.6.0-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for citry_core-1.6.0-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 ff0a1179152ecd85392aba54dd25d2de68d62cbbfddfe11771c8d1d685ffaf10
MD5 d4ce586e28a9fc411e2c93b4f9a47c2b
BLAKE2b-256 7b30e96e46cad6510e3aa776f2318528c246b93c91405243ad5cdb83864ca12c

See more details on using hashes here.

Provenance

The following attestation bundles were made for citry_core-1.6.0-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl:

Publisher: py--citry-core--publish.yml on citry-dev/citry

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file citry_core-1.6.0-pp311-pypy311_pp73-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for citry_core-1.6.0-pp311-pypy311_pp73-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 be4e0355a1d1092af36bb884ae1dd92de98f07979026d744d984e77424ef1912
MD5 4509452f3c51c2004e1225872b34d45c
BLAKE2b-256 64ad62b697049408da82d0b3ec69e24cd96e3262700cd6decaa3083bb37032f3

See more details on using hashes here.

Provenance

The following attestation bundles were made for citry_core-1.6.0-pp311-pypy311_pp73-musllinux_1_2_i686.whl:

Publisher: py--citry-core--publish.yml on citry-dev/citry

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file citry_core-1.6.0-pp311-pypy311_pp73-musllinux_1_2_armv7l.whl.

File metadata

File hashes

Hashes for citry_core-1.6.0-pp311-pypy311_pp73-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 03a6d61abdc31fe254c0fd3f88c60c2cb07bf77ce461ae0cbd4c3be7b8a27d6d
MD5 fc20f5354541a0e3c8f89a6877b34af8
BLAKE2b-256 4d82bc537ace0a4626857268edf98c85909c4e92a9efc56b0f921110d5108de5

See more details on using hashes here.

Provenance

The following attestation bundles were made for citry_core-1.6.0-pp311-pypy311_pp73-musllinux_1_2_armv7l.whl:

Publisher: py--citry-core--publish.yml on citry-dev/citry

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file citry_core-1.6.0-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for citry_core-1.6.0-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 1f14889d426a5eb92fcf3a70b5ac433ae83f7476b77d566b08acdf44c769e99f
MD5 2486f766627a137c034a871eb5d43396
BLAKE2b-256 1d71379c0d72677ebfe57fbe9bb564ef3eca55b81616d072856ad1e86c6c0d66

See more details on using hashes here.

Provenance

The following attestation bundles were made for citry_core-1.6.0-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl:

Publisher: py--citry-core--publish.yml on citry-dev/citry

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file citry_core-1.6.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for citry_core-1.6.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 4edb4d442dfa3d6187497d713d6f413dd7bbd39af72fdd58a4e0d788c393d15c
MD5 e3c7ede66e4ce12218113ffb67a5fc66
BLAKE2b-256 cbb4b8324fa327aef8e98c25581e35e9f176569185fb4102eb5bc3bf64a0fe2c

See more details on using hashes here.

Provenance

The following attestation bundles were made for citry_core-1.6.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: py--citry-core--publish.yml on citry-dev/citry

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file citry_core-1.6.0-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl.

File metadata

File hashes

Hashes for citry_core-1.6.0-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 0792eec98c8c82ab4d4a90dd7558ec9819342c60976ed2a50114d8757e6bd011
MD5 f55c72d923e8bf7442264885e43ada24
BLAKE2b-256 7aeb05c6258b40c64e04d0494985d4860cbd62d7dad1c410a4d1ac4ec20f817f

See more details on using hashes here.

Provenance

The following attestation bundles were made for citry_core-1.6.0-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl:

Publisher: py--citry-core--publish.yml on citry-dev/citry

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file citry_core-1.6.0-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl.

File metadata

File hashes

Hashes for citry_core-1.6.0-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 a277d2fa167db10534f5b0ed840d30c985184172fdaca9dc020cfed566a1d857
MD5 d436931f564a19a5133e1a45a771951e
BLAKE2b-256 b115249eac2186b4a54cc09655dc236802188a0492cbf39111f7d47c39297580

See more details on using hashes here.

Provenance

The following attestation bundles were made for citry_core-1.6.0-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl:

Publisher: py--citry-core--publish.yml on citry-dev/citry

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file citry_core-1.6.0-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl.

File metadata

File hashes

Hashes for citry_core-1.6.0-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 d42ffb1381b01fd082b3131b21d88d17a9b6f9808d5dc1e625e31a599b0ab2d8
MD5 df888eaf3b49ac07aaa895abb52b1d8e
BLAKE2b-256 55130ef90a9861c53237eba3479be76eaf0685e7caff8e9be187c3d6aab004c7

See more details on using hashes here.

Provenance

The following attestation bundles were made for citry_core-1.6.0-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl:

Publisher: py--citry-core--publish.yml on citry-dev/citry

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file citry_core-1.6.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for citry_core-1.6.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 2f26951b6a9fbf8feeafb117c04012ca070527534e667bcb5cb0d7ff049f9b1b
MD5 5160912085217d81799d31d0b3062aeb
BLAKE2b-256 8b89f6ca771a894d764988b22fb29001e1cb7b8a689694c8fb2dc13d0033bf5d

See more details on using hashes here.

Provenance

The following attestation bundles were made for citry_core-1.6.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: py--citry-core--publish.yml on citry-dev/citry

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file citry_core-1.6.0-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl.

File metadata

File hashes

Hashes for citry_core-1.6.0-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl
Algorithm Hash digest
SHA256 db796c8b6cbc807e4265b5b3b2089308eb67e27cb9c31c19fe3d450edb911837
MD5 01b8280ddc5afb149e88d3b26b95c72c
BLAKE2b-256 96cad4b96418482e9a57ca6e3a2b132bac837752844ba8c45e2c77f4e78d773b

See more details on using hashes here.

Provenance

The following attestation bundles were made for citry_core-1.6.0-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl:

Publisher: py--citry-core--publish.yml on citry-dev/citry

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file citry_core-1.6.0-cp314-cp314t-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for citry_core-1.6.0-cp314-cp314t-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 4eee6667ace28c4628be0fc38e216edd1cbe5ce64ca2872a7e5a57127708304a
MD5 4bb1bcfee32c2eece5e1b9e922e7e888
BLAKE2b-256 a99eeac6193f6f0ef9c9ebdf03f233edaceb82e083edaa5dc5098e1f25b39290

See more details on using hashes here.

Provenance

The following attestation bundles were made for citry_core-1.6.0-cp314-cp314t-musllinux_1_2_x86_64.whl:

Publisher: py--citry-core--publish.yml on citry-dev/citry

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file citry_core-1.6.0-cp314-cp314t-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for citry_core-1.6.0-cp314-cp314t-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 cd48ea759473b71d932626e289778169d48bcbbc0d92546afa640a7494b4828a
MD5 44557ec53d62a16c13a7deeb6cb83271
BLAKE2b-256 8e1bc7905c9d0c548e76d7c3c08dab429f3baf9af6273879d19598c0f5a51798

See more details on using hashes here.

Provenance

The following attestation bundles were made for citry_core-1.6.0-cp314-cp314t-musllinux_1_2_i686.whl:

Publisher: py--citry-core--publish.yml on citry-dev/citry

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file citry_core-1.6.0-cp314-cp314t-musllinux_1_2_armv7l.whl.

File metadata

File hashes

Hashes for citry_core-1.6.0-cp314-cp314t-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 7845c18b88a7e34fd6e5dbe6795d8743a23322cb0f80167ce428ee0ce33c3fa3
MD5 ae814588b940df93d429a697f071dc3a
BLAKE2b-256 e74af90944bc8899a021b3eec7965d17969c982cc2034abc51d39755aba6ef3c

See more details on using hashes here.

Provenance

The following attestation bundles were made for citry_core-1.6.0-cp314-cp314t-musllinux_1_2_armv7l.whl:

Publisher: py--citry-core--publish.yml on citry-dev/citry

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file citry_core-1.6.0-cp314-cp314t-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for citry_core-1.6.0-cp314-cp314t-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 6168bff535a5337adb6482e2f2d2eba753db70d9e1a4d337ea47396263027d29
MD5 8305126c3ec8fb97b39b4dd35c0b7470
BLAKE2b-256 80b529a3ee3344aa6182333228aca14466b32996f92dec1f006b6a9f1e28af26

See more details on using hashes here.

Provenance

The following attestation bundles were made for citry_core-1.6.0-cp314-cp314t-musllinux_1_2_aarch64.whl:

Publisher: py--citry-core--publish.yml on citry-dev/citry

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file citry_core-1.6.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for citry_core-1.6.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 3054e75ac42c2ced2f2de335b1ed526e2d1a74d2b068c6efa43aae45dc18a477
MD5 a3334bd4f871ace9979cc541f1c71c50
BLAKE2b-256 a0aedf24c15c8c66e692dde0296668c4f7f66bc4fb36b8d8aa91f9bac157f350

See more details on using hashes here.

Provenance

The following attestation bundles were made for citry_core-1.6.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: py--citry-core--publish.yml on citry-dev/citry

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file citry_core-1.6.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl.

File metadata

File hashes

Hashes for citry_core-1.6.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 6cb849ada60fa06edcc0923435194bfdf85704719be9c803aee1a03df676fdfc
MD5 07531a1493a9448ee138e2d69f4533c4
BLAKE2b-256 976431dbe054b33159ee6acb193f971603284a7f80b1b1ea6d12afa8e54c3746

See more details on using hashes here.

Provenance

The following attestation bundles were made for citry_core-1.6.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl:

Publisher: py--citry-core--publish.yml on citry-dev/citry

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file citry_core-1.6.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl.

File metadata

File hashes

Hashes for citry_core-1.6.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 5aba76ae556befee323597ea42d5a2d63efb9775b63cc2c877cda8e81c4a1405
MD5 084edf4089d838b9874787c2ace1a871
BLAKE2b-256 4cb9d78aefd4dc7489d24ab534ab49df12b6223210a95a3bca1a42e33e651420

See more details on using hashes here.

Provenance

The following attestation bundles were made for citry_core-1.6.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl:

Publisher: py--citry-core--publish.yml on citry-dev/citry

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file citry_core-1.6.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl.

File metadata

File hashes

Hashes for citry_core-1.6.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 51be2dd12023d3063c3e36fa34cf51a47610208e90b82e29c5b64bebd7fbd5d1
MD5 814c2a765946ceebb26afe9ecbd846bc
BLAKE2b-256 a1193db37a85d22fde4b12b9cc1842fb93299eb42b65ec836412254822ba4f63

See more details on using hashes here.

Provenance

The following attestation bundles were made for citry_core-1.6.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl:

Publisher: py--citry-core--publish.yml on citry-dev/citry

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file citry_core-1.6.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for citry_core-1.6.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 891db84a829aef8bad6919af7b755faad212608d125e553cb04eba397bac707d
MD5 685994050c19f58ccf0338aed07c4c26
BLAKE2b-256 4c0ef90445dfa1b9555ad4177362bdfdad74ba0043f5a7c4f72979468e743dcb

See more details on using hashes here.

Provenance

The following attestation bundles were made for citry_core-1.6.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: py--citry-core--publish.yml on citry-dev/citry

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file citry_core-1.6.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl.

File metadata

File hashes

Hashes for citry_core-1.6.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl
Algorithm Hash digest
SHA256 941bc8c505044e4d121b9f7f7827c055c2087770ac3285d3201ee06f5e2a393a
MD5 cd1ad87cdb0cfcd14a27b56b61dd506e
BLAKE2b-256 7bd371cc25dccd5ce1c5dc43c05f5d1a8f6c4a0358f003a583a257265fd0830a

See more details on using hashes here.

Provenance

The following attestation bundles were made for citry_core-1.6.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl:

Publisher: py--citry-core--publish.yml on citry-dev/citry

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file citry_core-1.6.0-cp314-cp314-pyemscripten_2026_0_wasm32.whl.

File metadata

File hashes

Hashes for citry_core-1.6.0-cp314-cp314-pyemscripten_2026_0_wasm32.whl
Algorithm Hash digest
SHA256 43ebcdd9388b9f5949aef002cc42406b83d9bafd6db65a61d2d0eb3a896ccdb1
MD5 670a9c31095ac284c359b773f02031de
BLAKE2b-256 bf7abd790e91a5f28f6431a2fa9a6f819188aad7b69773335562e6ce5037ae87

See more details on using hashes here.

Provenance

The following attestation bundles were made for citry_core-1.6.0-cp314-cp314-pyemscripten_2026_0_wasm32.whl:

Publisher: py--citry-core--publish.yml on citry-dev/citry

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file citry_core-1.6.0-cp310-abi3-win_amd64.whl.

File metadata

  • Download URL: citry_core-1.6.0-cp310-abi3-win_amd64.whl
  • Upload date:
  • Size: 5.9 MB
  • Tags: CPython 3.10+, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for citry_core-1.6.0-cp310-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 d5bbd27e914a176a5662b0c07d1a872ad4acfc124cf08d236916766e25c662a3
MD5 661ecd0046b2ca39cf5e1b80d7c72801
BLAKE2b-256 14e3df4d8032ccff8869af39ddeb6eb0576c5fad3958d2e7168a1a1a26d3545b

See more details on using hashes here.

Provenance

The following attestation bundles were made for citry_core-1.6.0-cp310-abi3-win_amd64.whl:

Publisher: py--citry-core--publish.yml on citry-dev/citry

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file citry_core-1.6.0-cp310-abi3-win32.whl.

File metadata

  • Download URL: citry_core-1.6.0-cp310-abi3-win32.whl
  • Upload date:
  • Size: 5.6 MB
  • Tags: CPython 3.10+, Windows x86
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for citry_core-1.6.0-cp310-abi3-win32.whl
Algorithm Hash digest
SHA256 10f533044661f894431eac27405b87361109239bf6983d5bc19f92d7802d9f07
MD5 469482526e3e473a0181795eb148517b
BLAKE2b-256 6a61065c6cef9fa32532d0c0f5cb06de30495652d734e9ef3839464962874f66

See more details on using hashes here.

Provenance

The following attestation bundles were made for citry_core-1.6.0-cp310-abi3-win32.whl:

Publisher: py--citry-core--publish.yml on citry-dev/citry

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file citry_core-1.6.0-cp310-abi3-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for citry_core-1.6.0-cp310-abi3-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 472adbf3682b7cecb21c03ddc71c14c773f539d7d74dd71b4fe27a466994a617
MD5 a0290d676b77000b74ce12df872810b6
BLAKE2b-256 73f134f9a75905e76f30738cb847345db95687eecf80bc8c4e780c1502f8bd17

See more details on using hashes here.

Provenance

The following attestation bundles were made for citry_core-1.6.0-cp310-abi3-musllinux_1_2_x86_64.whl:

Publisher: py--citry-core--publish.yml on citry-dev/citry

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file citry_core-1.6.0-cp310-abi3-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for citry_core-1.6.0-cp310-abi3-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 c52bc6c92c93135cb3fb8d3d0cbe65bc86cc04e234f9b8d9d3460102e96a108f
MD5 2fe5e674b1ab4d1e042a16cf9fa2b699
BLAKE2b-256 05d453bc14794d23df59cb27a1f7b597ca08f7c3491a8a5b6a72c0c06d21e1d4

See more details on using hashes here.

Provenance

The following attestation bundles were made for citry_core-1.6.0-cp310-abi3-musllinux_1_2_i686.whl:

Publisher: py--citry-core--publish.yml on citry-dev/citry

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file citry_core-1.6.0-cp310-abi3-musllinux_1_2_armv7l.whl.

File metadata

File hashes

Hashes for citry_core-1.6.0-cp310-abi3-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 5bf7fe74741afcfed2fbd25237311b65f18943e07c0be43f5d3d4885522056c9
MD5 7f58a534dafe2b4cf870f72ddef362ac
BLAKE2b-256 9993a6b95a7d84ffb8ae75c55b3d2932951d9271bedefade7d5f17ff747bd2b8

See more details on using hashes here.

Provenance

The following attestation bundles were made for citry_core-1.6.0-cp310-abi3-musllinux_1_2_armv7l.whl:

Publisher: py--citry-core--publish.yml on citry-dev/citry

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file citry_core-1.6.0-cp310-abi3-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for citry_core-1.6.0-cp310-abi3-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 024c3432aa23ab8eb21ece4a1116c81515a6a18a9d4f4f5fe279990adc85d932
MD5 a5f56282a031ccc81a5011283c430ab3
BLAKE2b-256 fd94ba14e5a5d2c047914ca929cbc0a71fee4df65926315b3a46b36375ec1391

See more details on using hashes here.

Provenance

The following attestation bundles were made for citry_core-1.6.0-cp310-abi3-musllinux_1_2_aarch64.whl:

Publisher: py--citry-core--publish.yml on citry-dev/citry

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file citry_core-1.6.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for citry_core-1.6.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 b85ad092b02dc20f01951ae65c1475c5e0d825e679ecc7ba533cc2dc6dc289c0
MD5 f8b723b52cfbe85bbde215807de5a568
BLAKE2b-256 ea0dba030ac0cc1738ba121d13c064a13de3cbd35d0c2c899574ecd453684bcc

See more details on using hashes here.

Provenance

The following attestation bundles were made for citry_core-1.6.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: py--citry-core--publish.yml on citry-dev/citry

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file citry_core-1.6.0-cp310-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl.

File metadata

File hashes

Hashes for citry_core-1.6.0-cp310-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 592d81e6a9c9dfeb1ee6528ca559f3276d03c62d46ee911430b2941a4025a50a
MD5 22869083afe83ac0118bf01f2eb2d17b
BLAKE2b-256 30245898c0e0eb8593427dae4e4ff6392785f3b5fb3ab1084bcab0076779d1fa

See more details on using hashes here.

Provenance

The following attestation bundles were made for citry_core-1.6.0-cp310-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl:

Publisher: py--citry-core--publish.yml on citry-dev/citry

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file citry_core-1.6.0-cp310-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl.

File metadata

File hashes

Hashes for citry_core-1.6.0-cp310-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 74564012062c662475da5182945024be8b77b6053c72d875acc49f793010be4d
MD5 910c7d8e71078343d2d3b86d3665317b
BLAKE2b-256 c65341601a3541170b884bce3cedb61efb713b01fe6c47b3a1c759c551403e45

See more details on using hashes here.

Provenance

The following attestation bundles were made for citry_core-1.6.0-cp310-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl:

Publisher: py--citry-core--publish.yml on citry-dev/citry

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file citry_core-1.6.0-cp310-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl.

File metadata

File hashes

Hashes for citry_core-1.6.0-cp310-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 f1c82cb4e94fa910590af2a55e2394bdeeb50486d575e01a268edfd363ccc741
MD5 5d4a09dec22136e0328e59868d0a6b82
BLAKE2b-256 bc2349dbd9fdcbb2aeb0c29810b0adf23c3f0d465378cbe2797745cff3f39e23

See more details on using hashes here.

Provenance

The following attestation bundles were made for citry_core-1.6.0-cp310-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl:

Publisher: py--citry-core--publish.yml on citry-dev/citry

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file citry_core-1.6.0-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for citry_core-1.6.0-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 57add84fab3f8c860ac8fd298a9ae1fbe9988fb32801d3bceec064d8ba5d3e4d
MD5 ebb891a9d82799f485040dd81e8b2128
BLAKE2b-256 c6f4d2ea2a226b6888013577719a2ca489598ccbfb9fe043ff9216d5706bd1ce

See more details on using hashes here.

Provenance

The following attestation bundles were made for citry_core-1.6.0-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: py--citry-core--publish.yml on citry-dev/citry

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file citry_core-1.6.0-cp310-abi3-manylinux_2_5_i686.manylinux1_i686.whl.

File metadata

File hashes

Hashes for citry_core-1.6.0-cp310-abi3-manylinux_2_5_i686.manylinux1_i686.whl
Algorithm Hash digest
SHA256 24893eaf590203a39d71d4325333535765b30842212c5c865db0f26fb339d45a
MD5 dd8b0308ece19e0d8e39d709d3174813
BLAKE2b-256 aca20ca7557cabb6c30c373c1c0186c19109fadf713c1d0df738ec3daff6b70e

See more details on using hashes here.

Provenance

The following attestation bundles were made for citry_core-1.6.0-cp310-abi3-manylinux_2_5_i686.manylinux1_i686.whl:

Publisher: py--citry-core--publish.yml on citry-dev/citry

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file citry_core-1.6.0-cp310-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for citry_core-1.6.0-cp310-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a24498d10df639533a46c8146ebedc47aa900c878d48ab5f200cc40dc049536e
MD5 64ec06457faf8a0ad111aceae089f677
BLAKE2b-256 ebe56df544542af6160dd4437cbe08f5875b711c4455ee274e6aeac7dd8c538b

See more details on using hashes here.

Provenance

The following attestation bundles were made for citry_core-1.6.0-cp310-abi3-macosx_11_0_arm64.whl:

Publisher: py--citry-core--publish.yml on citry-dev/citry

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file citry_core-1.6.0-cp310-abi3-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for citry_core-1.6.0-cp310-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 2856f5b6888a083ce4ef39904c9d6c91965da1d21dbe85725d5046e4909bec0a
MD5 55f42c41901a89ee063ee82f07603de5
BLAKE2b-256 ee000f3ddf6c72552a5da283dff138f61a3b686afce4ff0038de2d3d9baadfa5

See more details on using hashes here.

Provenance

The following attestation bundles were made for citry_core-1.6.0-cp310-abi3-macosx_10_12_x86_64.whl:

Publisher: py--citry-core--publish.yml on citry-dev/citry

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

1.6.1

36 files

This release

1.6.0 This release

36 files

1.5.1

36 files

1.5.0

92 files

1.4.0

92 files

1.3.0

91 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