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 GIL-enabled CPython 3.10-3.14 installations use a prebuilt ABI3 wheel and do not need a Rust toolchain. Free-threaded CPython and PyPy wheel coverage is narrower and currently targets the release workflow's Linux platforms; an interpreter/platform pair without a matching wheel falls back to the source distribution and therefore needs Rust 1.95 or newer.

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.1.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.1-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.1-pp311-pypy311_pp73-musllinux_1_2_i686.whl (6.1 MB view details)

Uploaded PyPymusllinux: musl 1.2+ i686

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

Uploaded PyPymusllinux: musl 1.2+ ARMv7l

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

Uploaded PyPymusllinux: musl 1.2+ ARM64

citry_core-1.6.1-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.1-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.1-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.1-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.1-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.1-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.1-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.1-cp314-cp314t-musllinux_1_2_i686.whl (6.1 MB view details)

Uploaded CPython 3.14tmusllinux: musl 1.2+ i686

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

Uploaded CPython 3.14tmusllinux: musl 1.2+ ARMv7l

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

Uploaded CPython 3.14tmusllinux: musl 1.2+ ARM64

citry_core-1.6.1-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.1-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.1-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.1-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.1-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.1-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.1-cp314-cp314-pyemscripten_2026_0_wasm32.whl (4.5 MB view details)

Uploaded CPython 3.14PyEmscripten 2026.0 wasm32

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

Uploaded CPython 3.10+Windows x86-64

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

Uploaded CPython 3.10+Windows x86

citry_core-1.6.1-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.1-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.1-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.1-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.1-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.1-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.1-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.1-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.1-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.1-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.1-cp310-abi3-macosx_11_0_arm64.whl (5.6 MB view details)

Uploaded CPython 3.10+macOS 11.0+ ARM64

citry_core-1.6.1-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.1.tar.gz.

File metadata

  • Download URL: citry_core-1.6.1.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.1.tar.gz
Algorithm Hash digest
SHA256 2f1d4b096494c738e7a5aa0fa9d4f86cfd6727aa006ec99a277167ec78b3c438
MD5 3c1beeda1c721b83c6bc21467c3085dc
BLAKE2b-256 b07e7bde3f7df9512e51a53532ae652a287ab41769c12f5a887e3204f267d060

See more details on using hashes here.

Provenance

The following attestation bundles were made for citry_core-1.6.1.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.1-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for citry_core-1.6.1-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 84ddae93440d1988a8f68920dd6e80f163ad0e0301dcf1338fee33205d8ac418
MD5 077c11db42d355cf0af7f7d11566007c
BLAKE2b-256 f4b811a61cb6a5693ea1c75167f760f2a1e43ce7db412c90c6762131b77011c6

See more details on using hashes here.

Provenance

The following attestation bundles were made for citry_core-1.6.1-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.1-pp311-pypy311_pp73-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for citry_core-1.6.1-pp311-pypy311_pp73-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 d2fac64d8e5e76cd1d17df6a586d3088b8a295544a6c2c5f1ec8d54a97cae959
MD5 318301d9eb4a2f1a6267f509f79fc2c6
BLAKE2b-256 4e936d08ec06cbf0d807dfc944440cf4b093621cdf41724d930abf92f2850132

See more details on using hashes here.

Provenance

The following attestation bundles were made for citry_core-1.6.1-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.1-pp311-pypy311_pp73-musllinux_1_2_armv7l.whl.

File metadata

File hashes

Hashes for citry_core-1.6.1-pp311-pypy311_pp73-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 9541edb94a0c6a170d0670851fca2eb0159e2fd9544fb8ec8506b8128da886b5
MD5 b21b0f9f3d5b8be6adfd58a4cdb4b15f
BLAKE2b-256 daac4629f0a8397355b293ea8e4409e5ec77c4feab3918e757c0a08e09a959c3

See more details on using hashes here.

Provenance

The following attestation bundles were made for citry_core-1.6.1-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.1-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for citry_core-1.6.1-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 4e2c809db990a157a983f6ffb5efa96871b92b1e5c68b93ef03dd2b9662ddcf7
MD5 4dbd956b51576cb5005e64f85cbae109
BLAKE2b-256 a0595b86a1b109c88d78b800b96c057db98976b76b1d1f537386ad75b68bd5fe

See more details on using hashes here.

Provenance

The following attestation bundles were made for citry_core-1.6.1-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.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for citry_core-1.6.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 4140fd8137d1e1c2b886629114072b383c8020526d2dd0a601cd11b350ad3fed
MD5 8c863bb012be0da23d42477c9ca79ecc
BLAKE2b-256 a439dc05e1f992d54fa34b9bedd5a87ef6201be617e672d6b008e43324fca3d9

See more details on using hashes here.

Provenance

The following attestation bundles were made for citry_core-1.6.1-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.1-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl.

File metadata

File hashes

Hashes for citry_core-1.6.1-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 7d09213e22b75d4fdc69205d8d5dc2c68ba8c2feaff1defb8ae4f67463c8f230
MD5 45a59b665b9a9a9ad2916ab062273673
BLAKE2b-256 04c2062a85df4740c58b8358bfe2ab3168e7309fdcab3fc029a5bdec23bb3226

See more details on using hashes here.

Provenance

The following attestation bundles were made for citry_core-1.6.1-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.1-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl.

File metadata

File hashes

Hashes for citry_core-1.6.1-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 3e83fae4d706bbf30e37404f44ffa55ab8790645d55b954b353b7786f2ea62b3
MD5 fac54e81f077a4e32a048cc06e585874
BLAKE2b-256 7ba47cd629b3d806b4d5608fa2f598a98ae48917d606a5e5ea3dc8c52e40c72c

See more details on using hashes here.

Provenance

The following attestation bundles were made for citry_core-1.6.1-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.1-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl.

File metadata

File hashes

Hashes for citry_core-1.6.1-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 8242fb0d1583aa90f76820f96468127c7dea41f58ea981a5d844a99b7ad5499c
MD5 92b3b8666c6c3b4a0d85586a9e497fe9
BLAKE2b-256 41b7f2b71bff01a88b2518107e9a084cb59622160f1a9bbf35d263de2f53433f

See more details on using hashes here.

Provenance

The following attestation bundles were made for citry_core-1.6.1-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.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for citry_core-1.6.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 3e1a95aa3a56d4f436f8e628fec68a7073a4583ab7f8eeb70746ee7bb5f51b41
MD5 a692702caadcc1fc77cd1aecb7b9dcb5
BLAKE2b-256 f1b00a54766f557796e6b144f72a7880fcf32cd3a61e9a02eb9f5f76da3acad9

See more details on using hashes here.

Provenance

The following attestation bundles were made for citry_core-1.6.1-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.1-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl.

File metadata

File hashes

Hashes for citry_core-1.6.1-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl
Algorithm Hash digest
SHA256 102b38d33398ec216d09f56d3d7eff6d896137db256efa809f584952a16f3139
MD5 a4f049eedf2cdba1ef67aa96dca3eff6
BLAKE2b-256 063173dacb766c09ab1dd3a140e57f87a2eae3fdabad7799bd77af3b9633bf69

See more details on using hashes here.

Provenance

The following attestation bundles were made for citry_core-1.6.1-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.1-cp314-cp314t-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for citry_core-1.6.1-cp314-cp314t-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 27e3be33eca3da4c9e5b3cc79a67579c86b5ba1b326f7d8272ca136dbe832e85
MD5 5ee241ecc7120e2f2508530972da7f2f
BLAKE2b-256 af47a9d297e8f38e9a503f53ca411eb4d204b9041bd1d3f3d2b6b64e23fb152f

See more details on using hashes here.

Provenance

The following attestation bundles were made for citry_core-1.6.1-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.1-cp314-cp314t-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for citry_core-1.6.1-cp314-cp314t-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 10622864f2fb529b4029ab39511cdb397cea21c4655d85a4506aba8cd874a237
MD5 390a6406faa5454745d28cb7a2b23783
BLAKE2b-256 ccd0a34698ce666c93a502d2b12bb8c8a3daaa31b025bce9e21be8631ca57a8c

See more details on using hashes here.

Provenance

The following attestation bundles were made for citry_core-1.6.1-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.1-cp314-cp314t-musllinux_1_2_armv7l.whl.

File metadata

File hashes

Hashes for citry_core-1.6.1-cp314-cp314t-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 210e591314d0261dbc1c5c443793239ff76f6a089151761a935fd5a439daebad
MD5 f9ca2e462d6f46d011c8f83ebc9193c3
BLAKE2b-256 bbf25b2dc411e3a83c88d2bf739231c263256e3f6cf53ac65da112c7cad05e52

See more details on using hashes here.

Provenance

The following attestation bundles were made for citry_core-1.6.1-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.1-cp314-cp314t-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for citry_core-1.6.1-cp314-cp314t-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 4d14171cdb8eb894432c04c4f1bd7c6928554825d7323aa9534350b60d1b15ea
MD5 d1a39c6412f7c06d3230698ee0b30310
BLAKE2b-256 72ee15ef2a58a35955d7a6f4a91913a8b4d78b2a0e148a4eed47d743dc73d929

See more details on using hashes here.

Provenance

The following attestation bundles were made for citry_core-1.6.1-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.1-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for citry_core-1.6.1-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 e61fd0d325496cb2802fbf50d9782caf66c5d2f99b2a866f8ae4e780f343eae9
MD5 b3faa67a0e21c85e28cc7acc87150aa0
BLAKE2b-256 35c999a2d97c5f0601ce17d864b2a3585d6fb7907fb3c04b3b2f30462dcde6f1

See more details on using hashes here.

Provenance

The following attestation bundles were made for citry_core-1.6.1-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.1-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl.

File metadata

File hashes

Hashes for citry_core-1.6.1-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 e2c9ddcdb478c3d888109a478925b77fe034f957f6330f28c93cb5696f28316e
MD5 b04414f5293ecdde875116f586044fc9
BLAKE2b-256 f91059d5da79ce4a4d169705c4dbd6d4fc1a5d25e62c27cd9a327661c2059c91

See more details on using hashes here.

Provenance

The following attestation bundles were made for citry_core-1.6.1-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.1-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl.

File metadata

File hashes

Hashes for citry_core-1.6.1-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 af05f149109e36735b30b4309c2cf757e1b0c3f68c29d22f14233a9850991793
MD5 9593251ccde74933ea98bf9ee9244db5
BLAKE2b-256 c3a50c3761d6771bebb8f74c14a8dd5a352734ea102d8c20a9db316f30c6e7f7

See more details on using hashes here.

Provenance

The following attestation bundles were made for citry_core-1.6.1-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.1-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl.

File metadata

File hashes

Hashes for citry_core-1.6.1-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 5e161024eed6e54c16373e77b692c774aa7e40ea4bb287aa4bf8b517836f95b1
MD5 02cd69811f4b1520c3415a808d628cbb
BLAKE2b-256 e81e2672a5dd9845cd9c24479b8db2b7e83ff2f9fa08b9f9bd4ebd94a2692797

See more details on using hashes here.

Provenance

The following attestation bundles were made for citry_core-1.6.1-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.1-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for citry_core-1.6.1-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 c973596d9c237a5a9380d05e7245271aaef5111aef31090b170946e9fc312312
MD5 590939c65bd942a158c25d47ce082a5f
BLAKE2b-256 c1a16f121e769bb22ffe1b3580b06b21bddc3b6c04b054e3a6822b75a71a404d

See more details on using hashes here.

Provenance

The following attestation bundles were made for citry_core-1.6.1-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.1-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl.

File metadata

File hashes

Hashes for citry_core-1.6.1-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl
Algorithm Hash digest
SHA256 dfb71d803d7fc9bdb712a9537ba3893b040e7c5f0154fe7dd140f5e9acb09fd4
MD5 59b5251c6cdc4922dfe10954a0628a60
BLAKE2b-256 ec863f9430af4fbbf2bf63b844bd6f3c206daba7523559edc29a125b7e44bb6e

See more details on using hashes here.

Provenance

The following attestation bundles were made for citry_core-1.6.1-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.1-cp314-cp314-pyemscripten_2026_0_wasm32.whl.

File metadata

File hashes

Hashes for citry_core-1.6.1-cp314-cp314-pyemscripten_2026_0_wasm32.whl
Algorithm Hash digest
SHA256 52e512ca1d1f279ab25c88cda30607f563f08ba4883a468b539b7aee2322bb7e
MD5 fc8eb0e0dd23509177b76c96011e47e1
BLAKE2b-256 e9cd3665fce4f684b181c06463f2b993b0e5fc10e00293ff6ee20f973b5e3c1d

See more details on using hashes here.

Provenance

The following attestation bundles were made for citry_core-1.6.1-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.1-cp310-abi3-win_amd64.whl.

File metadata

  • Download URL: citry_core-1.6.1-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.1-cp310-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 f511f9341ac0db48b2ff5f6492f7d07bb46a927aee8f6cef1a2ab56b1256b8cf
MD5 095eeaee50bf7883912a3ad9d05adccb
BLAKE2b-256 47a040086b7fb52ae2aa9a2f92b22caf449a9d5aa37067c72ab827f99ccfce84

See more details on using hashes here.

Provenance

The following attestation bundles were made for citry_core-1.6.1-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.1-cp310-abi3-win32.whl.

File metadata

  • Download URL: citry_core-1.6.1-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.1-cp310-abi3-win32.whl
Algorithm Hash digest
SHA256 9da03f3e4d921bd98ac62d81ebf393c7b97a14094b5fc882d0914248756c553e
MD5 8f06f9ab14d4f083204415eca918a539
BLAKE2b-256 5ed297413773cccf2e4a07c40f5534c25bf76b6e2b994fba861ee083778b8199

See more details on using hashes here.

Provenance

The following attestation bundles were made for citry_core-1.6.1-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.1-cp310-abi3-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for citry_core-1.6.1-cp310-abi3-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 405c1435151aebc5914b4c6722fa97dc343aa99e3192285371d4ae7d0cb5c846
MD5 2784c7eec44fede67b1ead35f5e63b06
BLAKE2b-256 902e4f12e92fecf8aace887f29e6821ee24ac5289fd8c0ed2891c77670b189bb

See more details on using hashes here.

Provenance

The following attestation bundles were made for citry_core-1.6.1-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.1-cp310-abi3-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for citry_core-1.6.1-cp310-abi3-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 3dd0afb705c8de69c73764c88158b1f68dad85101e40c618bdb8a9265977cd78
MD5 308dfedeaaa290184220b02c0655f326
BLAKE2b-256 20f85aac81d2de389a659c27036a72581fa57dc0c95ce078a25ad71acf34c82d

See more details on using hashes here.

Provenance

The following attestation bundles were made for citry_core-1.6.1-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.1-cp310-abi3-musllinux_1_2_armv7l.whl.

File metadata

File hashes

Hashes for citry_core-1.6.1-cp310-abi3-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 681b9c16fa4f3204c210943facd793c9d0ac4b7901151caf2f3eb14d9e39af74
MD5 b3c69d901e4a85541c535cee2473ca1d
BLAKE2b-256 ffae62e9f80fc1107cd1496ec5751ac4ec74291e2dac90b21d31a03dcacff239

See more details on using hashes here.

Provenance

The following attestation bundles were made for citry_core-1.6.1-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.1-cp310-abi3-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for citry_core-1.6.1-cp310-abi3-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 2af7be70d0b280a7604d41288c3d7c15a1aa810b1ed4b09ac93a29ef7ec5ee68
MD5 dc876152b8799ffdbfb72d959b62cc6f
BLAKE2b-256 f2ae462e3aef006343e67ae9bc6bab9c5344f7bd008135ae44d4d8886d9bcc8e

See more details on using hashes here.

Provenance

The following attestation bundles were made for citry_core-1.6.1-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.1-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for citry_core-1.6.1-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 f65febc7526c657f2758db7b3bc188f5b80fa58c2565d7174b047277f2f8ee5b
MD5 f8e1473e60e91dce84a3601d048d6ca5
BLAKE2b-256 126cb3d682260163d6142a9e1a961d49602d6dc7e4daf4df2fa610b1eb20fde6

See more details on using hashes here.

Provenance

The following attestation bundles were made for citry_core-1.6.1-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.1-cp310-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl.

File metadata

File hashes

Hashes for citry_core-1.6.1-cp310-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 616a03de75a7e59cc46059deee787f3f160ea17677a4569f21a019fee3c01384
MD5 c449c66435d6662d3b41fcf0c21162d6
BLAKE2b-256 4c5cda7db73dcb875a11b3164c77d9c85af0325486e03ac5c04c0a18fc903056

See more details on using hashes here.

Provenance

The following attestation bundles were made for citry_core-1.6.1-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.1-cp310-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl.

File metadata

File hashes

Hashes for citry_core-1.6.1-cp310-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 ffa4d0e04e6a0502e8c22570a117545af5a1cd3ef072776aed65d2e2304e31c7
MD5 108cfb26db7e7410e9585b70171ea7b1
BLAKE2b-256 a2294d2f5978861a430107254351298e2d4b416db4521e1e6ac7da8b2c332873

See more details on using hashes here.

Provenance

The following attestation bundles were made for citry_core-1.6.1-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.1-cp310-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl.

File metadata

File hashes

Hashes for citry_core-1.6.1-cp310-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 858341518525cb23490a47eed88b8dfa31c4f363d2e8487577b76366916207af
MD5 da91f767f4987f0e4b1ffb5db662d50d
BLAKE2b-256 84712771910dd0e65cbe684b6e06ea55aa48e53dda8964c27cd275f31e045e89

See more details on using hashes here.

Provenance

The following attestation bundles were made for citry_core-1.6.1-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.1-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for citry_core-1.6.1-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 f76f9ec0d28e7ee5c182b6cffb42f1d9cd64384845a2fe63f78241bdf30edb0e
MD5 c3a0a9e3226ee2ec0327668e2751db5e
BLAKE2b-256 ee6ea7aebe6f4836ca63fd19281682e6d52e5fe744fe7eb6f907f653520be5b1

See more details on using hashes here.

Provenance

The following attestation bundles were made for citry_core-1.6.1-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.1-cp310-abi3-manylinux_2_5_i686.manylinux1_i686.whl.

File metadata

File hashes

Hashes for citry_core-1.6.1-cp310-abi3-manylinux_2_5_i686.manylinux1_i686.whl
Algorithm Hash digest
SHA256 0b4383b5c4c65b682e6f377480d348d5a0638c98eb5bbf2a4c51615580b1dc18
MD5 d999990c576bd739ba562e760804114e
BLAKE2b-256 20bd5923470a813dd79335c9d61e31e427c50b9cc1aa60bd57848cfac8d4f8f7

See more details on using hashes here.

Provenance

The following attestation bundles were made for citry_core-1.6.1-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.1-cp310-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for citry_core-1.6.1-cp310-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 6aacb73ef934d36094d438008449e352d0b8b4f630629a3a7dc0e330bc996c78
MD5 95bdba40cd4a7ab06e7509c8db6e2004
BLAKE2b-256 13525ca809bfbb05cc891e0fc138a84e3cff57dc2d784870901524affc7741ae

See more details on using hashes here.

Provenance

The following attestation bundles were made for citry_core-1.6.1-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.1-cp310-abi3-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for citry_core-1.6.1-cp310-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 c3310d68d30f5deb21a1bc2c1bf7a7231c8cd29f990a07861951e20bc4ebc8d8
MD5 98e47cdbdf162ab0cf4c5c0d09aa54f2
BLAKE2b-256 73e32e9b6f2194a445025f759475ba37d05921033c2c1f3fbf90727f4a63f739

See more details on using hashes here.

Provenance

The following attestation bundles were made for citry_core-1.6.1-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

This release

1.6.1 This release

36 files

1.6.0

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