Skip to main content

Rust-based Python tools for faster processing of data.

Project description

TDI Rust Python Tools

A collection of high-performance Rust-based tools compiled as a Python extension module to speed up common data processing tasks.

🚀 What is This?

This project uses Rust (a fast, compiled language) to implement performance-critical functions, then makes them available to Python through PyO3 and Maturin. Think of it as writing the slow parts of your code in a faster language, while keeping your familiar Python interface.

Key Features:

  • Fast text processing utilities (regex-based transformations)
  • CSV to Excel conversion (convert_to_xlsx)
  • High-performance DictWriter class (faster drop-in replacement for Python's csv.DictWriter)
  • Seamless Python integration with full type hints

📋 Prerequisites

For Development

You'll need to install:

  1. Python 3.13+ - Download here
  2. Rust - Install via rustup:
    curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
    
  3. uv - Modern Python package manager (faster than pip):
    curl -LsSf https://astral.sh/uv/install.sh | sh
    

For Users

Just Python 3.13+ is needed to install the pre-built package:

pip install tdi-rust-python-tools

🛠️ Development Setup

1. Clone and Setup Environment

# Clone the repository
git clone https://github.com/TDI-Data/tdi_rust_python_tools.git
cd tdi_rust_python_tools

# Create virtual environment and install dependencies
uv sync

This creates a .venv/ directory with all dependencies installed.

2. Build the Extension Module

# Build and install in development mode (fast, includes debug symbols)
uv run maturin develop

# OR build optimized version (slower to compile, but faster to run)
uv run maturin develop --release

Note: With uv, you don't need to activate the virtual environment! The uv run command automatically uses the project's .venv/ environment.

After running uv run maturin develop, the Rust code is compiled and installed into your Python environment. You can now import it:

import tdi_rust_python_tools

# Use the fast DictWriter
writer = tdi_rust_python_tools.DictWriter(file, fieldnames=['name', 'age'])

3. Test Your Changes

uv run pytest tests/

🔄 Updating Dependencies

Updating Rust Dependencies

Rust dependencies are defined in Cargo.toml. To update them:

# Update a specific dependency (e.g., regex)
cargo update -p regex

# Update all dependencies to their latest compatible versions
cargo update

# Update to potentially breaking versions (edit Cargo.toml first)
# For example, change: regex = "1.11.1"
# To:                  regex = "1.12.0"
# Then run:
cargo update

Common Rust dependencies in this project:

  • pyo3 - Python bindings (⚠️ keep in sync with Maturin version)
  • regex - Regular expressions
  • csv - CSV reading/writing
  • rust_xlsxwriter - Excel file generation
  • lazy_static - Compile-time regex optimization

After updating, rebuild with uv run maturin develop to test your changes.

Updating Python Dependencies

Python dependencies (managed by uv) are in pyproject.toml:

# Add a new Python dependency
uv add pytest

# Add a development-only dependency
uv add --group dev ruff

# Update all Python dependencies
uv sync -U

# Update a specific package
uv add pytest@latest

📦 Publishing a New Version

Publishing to PyPI (Automated via GitHub Actions)

The easiest way to publish is through GitHub Actions:

  1. Update the version number in both files:

    # Cargo.toml
    [package]
    version = "0.8.3"  # Change this
    
    # pyproject.toml uses dynamic versioning from Cargo.toml
    # No changes needed there
    
  2. Commit your changes:

    git add Cargo.toml
    git commit -m "Bump version to 0.8.3"
    
  3. Create and push a git tag:

    git tag v0.8.3
    git push origin main --tags
    
  4. GitHub Actions takes over:

Manual Publishing (Advanced)

If you need to publish manually:

# Build release wheels for your current platform
maturin build --release

# Wheels are created in target/wheels/
# Upload to PyPI (requires API token)
maturin publish --username __token__ --password $PYPI_TOKEN

Note: Manual publishing only creates wheels for your current OS/architecture. The GitHub Actions workflow is recommended as it builds for all platforms.

📁 Project Structure

tdi_rust_python_tools/
├── src/
│   └── lib.rs                      # All Rust code (functions & classes)
├── shared/
│   └── shared.py                   # Pure Python utilities
├── tests/                          # Python tests (pytest)
├── tdi_rust_python_tools.pyi       # Type stubs for IDE support
├── Cargo.toml                      # Rust dependencies & metadata
├── pyproject.toml                  # Python packaging & dependencies
├── uv.lock                         # Locked dependency versions
└── .github/workflows/CI.yml        # Automated testing & publishing

🐛 Common Issues

"Failed to build extension module"

  • Make sure Rust is installed: rustc --version
  • Try a clean rebuild: cargo clean && uv run maturin develop

"Module not found" after building

  • Ensure you ran uv run maturin develop (not just cargo build)
  • Check the build completed successfully

Version mismatch errors

  • Keep Cargo.toml version in sync with git tags
  • Ensure PyO3 version matches Maturin requirements

📚 Learn More

📄 License

[Add your license here]

🤝 Contributing

  1. Fork the repository
  2. Create a feature branch (git checkout -b feature/amazing-feature)
  3. Make your changes and test (uv run maturin develop && uv run pytest)
  4. Commit your changes (git commit -m 'Add amazing feature')
  5. Push to the branch (git push origin feature/amazing-feature)
  6. Open a Pull Request

Project details


Download files

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

Source Distribution

tdi_rust_python_tools-0.9.3.tar.gz (8.5 MB view details)

Uploaded Source

Built Distributions

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

tdi_rust_python_tools-0.9.3-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.7 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.17+ x86-64

tdi_rust_python_tools-0.9.3-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl (1.8 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.17+ i686

tdi_rust_python_tools-0.9.3-cp313-cp313t-musllinux_1_2_x86_64.whl (1.9 MB view details)

Uploaded CPython 3.13tmusllinux: musl 1.2+ x86-64

tdi_rust_python_tools-0.9.3-cp313-cp313t-musllinux_1_2_i686.whl (1.9 MB view details)

Uploaded CPython 3.13tmusllinux: musl 1.2+ i686

tdi_rust_python_tools-0.9.3-cp313-cp313t-musllinux_1_2_armv7l.whl (1.9 MB view details)

Uploaded CPython 3.13tmusllinux: musl 1.2+ ARMv7l

tdi_rust_python_tools-0.9.3-cp313-cp313t-musllinux_1_2_aarch64.whl (1.9 MB view details)

Uploaded CPython 3.13tmusllinux: musl 1.2+ ARM64

tdi_rust_python_tools-0.9.3-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl (1.8 MB view details)

Uploaded CPython 3.13tmanylinux: glibc 2.17+ s390x

tdi_rust_python_tools-0.9.3-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (2.0 MB view details)

Uploaded CPython 3.13tmanylinux: glibc 2.17+ ppc64le

tdi_rust_python_tools-0.9.3-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (1.7 MB view details)

Uploaded CPython 3.13tmanylinux: glibc 2.17+ ARMv7l

tdi_rust_python_tools-0.9.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.7 MB view details)

Uploaded CPython 3.13tmanylinux: glibc 2.17+ ARM64

tdi_rust_python_tools-0.9.3-cp313-cp313-win_amd64.whl (1.4 MB view details)

Uploaded CPython 3.13Windows x86-64

tdi_rust_python_tools-0.9.3-cp313-cp313-win32.whl (1.3 MB view details)

Uploaded CPython 3.13Windows x86

tdi_rust_python_tools-0.9.3-cp313-cp313-musllinux_1_2_x86_64.whl (1.9 MB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ x86-64

tdi_rust_python_tools-0.9.3-cp313-cp313-musllinux_1_2_i686.whl (1.9 MB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ i686

tdi_rust_python_tools-0.9.3-cp313-cp313-musllinux_1_2_armv7l.whl (1.9 MB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ ARMv7l

tdi_rust_python_tools-0.9.3-cp313-cp313-musllinux_1_2_aarch64.whl (1.9 MB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ ARM64

tdi_rust_python_tools-0.9.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.7 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

tdi_rust_python_tools-0.9.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl (1.8 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ s390x

tdi_rust_python_tools-0.9.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (2.0 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ ppc64le

tdi_rust_python_tools-0.9.3-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl (1.8 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ i686

tdi_rust_python_tools-0.9.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (1.7 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ ARMv7l

tdi_rust_python_tools-0.9.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.7 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ ARM64

File details

Details for the file tdi_rust_python_tools-0.9.3.tar.gz.

File metadata

File hashes

Hashes for tdi_rust_python_tools-0.9.3.tar.gz
Algorithm Hash digest
SHA256 7d573f9eb9a14e707532f669f33e3ff8b21b0f81e9855fd2f528f48648ce8a3e
MD5 d196f031d2f21ea4458348d26e799160
BLAKE2b-256 c28b02bdd90d1cb1b0cedfb2cf7aeb8d72380b92409fcc5b9c63f482dc2a99f5

See more details on using hashes here.

File details

Details for the file tdi_rust_python_tools-0.9.3-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for tdi_rust_python_tools-0.9.3-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 3d713ecac850484e6245031d1211d9503eff7c4455b2ae5886aea6b06a1147e4
MD5 dcb2edb92701d1490b138d912eba374a
BLAKE2b-256 6d260d726a71fbbe43fcd827a873253f3201aee3eaf5988b7b74ea28039c014f

See more details on using hashes here.

File details

Details for the file tdi_rust_python_tools-0.9.3-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for tdi_rust_python_tools-0.9.3-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 1a4c3655d4e00c41f1bcadefd3ee85eaf20a087517263cf8a52facb3d3803612
MD5 0711d989ac1c1619481a813df99943d6
BLAKE2b-256 c2e50ca0ea3c668a3e03925afe39739beec12ac32afc7172e868963b1b9869f5

See more details on using hashes here.

File details

Details for the file tdi_rust_python_tools-0.9.3-cp313-cp313t-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for tdi_rust_python_tools-0.9.3-cp313-cp313t-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 197903b3530a1c01f447e97abbc75ee1d12903c65ba66a6b39b1dc892cb8a806
MD5 c8c2bac389381027c26d1ffdfcd86a67
BLAKE2b-256 e51d32a2d928a7d48fbf717ab2a2ab372fa458dbd46ab4c9fdd1627f12b1d1b7

See more details on using hashes here.

File details

Details for the file tdi_rust_python_tools-0.9.3-cp313-cp313t-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for tdi_rust_python_tools-0.9.3-cp313-cp313t-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 bf65a116c019284d27a983e646b109e65ad241b7d171d49be6f6e96c1b302bdc
MD5 aaa116aea3ed5cbd8cbf64c6b0b4e8bd
BLAKE2b-256 4af3373a4665d2624089e21846a0d86572558ef4844e4e12218cd0f5c02e2b69

See more details on using hashes here.

File details

Details for the file tdi_rust_python_tools-0.9.3-cp313-cp313t-musllinux_1_2_armv7l.whl.

File metadata

File hashes

Hashes for tdi_rust_python_tools-0.9.3-cp313-cp313t-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 b476200236157d6399b1f1f378a4a27cdecdf7f890308a18a1c0ebe53b1b4014
MD5 8071ab68858138bc1a1b066d660af883
BLAKE2b-256 71192dedda0683286e1730c763c71d0035d6f3c35012ff8f24ff2e47f0a3919f

See more details on using hashes here.

File details

Details for the file tdi_rust_python_tools-0.9.3-cp313-cp313t-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for tdi_rust_python_tools-0.9.3-cp313-cp313t-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 423a3b730b30d4db3a78d0c49e4a897d46b6a39bfcd0be19a06dcc8efe97dd02
MD5 fe86f9b4a00f118ef5cbcfc6c76b72f8
BLAKE2b-256 e01375b97065e1fa7d55a3d0cec640eef48ca98051e574f6d97ec45e9a5601c4

See more details on using hashes here.

File details

Details for the file tdi_rust_python_tools-0.9.3-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl.

File metadata

File hashes

Hashes for tdi_rust_python_tools-0.9.3-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 4a1f380ff949569d2a144045b7b1406b92c43d91054303f711676903e369cad5
MD5 eea2bbb7a6c71047e3d4da8d9c445d0b
BLAKE2b-256 4d00161a7beea444ee3c3b6d8060ec8d2e1b3d0b5dbfe9456d7bcea9105280eb

See more details on using hashes here.

File details

Details for the file tdi_rust_python_tools-0.9.3-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl.

File metadata

File hashes

Hashes for tdi_rust_python_tools-0.9.3-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 5e6549182ecf54519498cb0dee07c03124c390e78d972a50d80d1e38a15ba6fd
MD5 2f3e42f4b274d21d1a11f57ea474c85d
BLAKE2b-256 e17afe1c4717b705fff4e01d9497cf4ec0ccf019ec6188fbe3f5bd3fa2075c99

See more details on using hashes here.

File details

Details for the file tdi_rust_python_tools-0.9.3-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl.

File metadata

File hashes

Hashes for tdi_rust_python_tools-0.9.3-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 6b75a0ef955418ed4408d3cbce58315059f468de34f713c3f853cdea78b48346
MD5 195c7c8aabfe2d03758d587151ba6e8a
BLAKE2b-256 b5712be3caa983cc65c6c8ef16059a17d6ebb70268fd3bdc3c64bc84b866c4d3

See more details on using hashes here.

File details

Details for the file tdi_rust_python_tools-0.9.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for tdi_rust_python_tools-0.9.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 f61950bc675635fa9fcf51400010cb8f0f10c783dcb818fab1cb792d537d43a9
MD5 8f05c59a46e378a7d997aa51adffc839
BLAKE2b-256 a8180eb8bf2e693c6a15cbc60b4e1749a9645338ed0df458f5aa10f581a97a4e

See more details on using hashes here.

File details

Details for the file tdi_rust_python_tools-0.9.3-cp313-cp313-win_amd64.whl.

File metadata

File hashes

Hashes for tdi_rust_python_tools-0.9.3-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 7d963b532ecd0d92b9c6b94129554aaf7d9822f06efa3cf30cc8b00645b1d0f9
MD5 13e70f47c6fe6d4978f8a22664810663
BLAKE2b-256 2f12357f5bb48cba6215d382a9322bfbed8a195a45c3c7184598cddd5950e9b6

See more details on using hashes here.

File details

Details for the file tdi_rust_python_tools-0.9.3-cp313-cp313-win32.whl.

File metadata

File hashes

Hashes for tdi_rust_python_tools-0.9.3-cp313-cp313-win32.whl
Algorithm Hash digest
SHA256 e9a724078b85fcfc60cf39065d883988be31788d7606fb22bf16b17a7ac22d32
MD5 8454555f39a7712e1d47014190819dc3
BLAKE2b-256 b62200067bf9a7f68bb8d27af064023e05f7aa2a70ae297f1427e5ffbe7a4fba

See more details on using hashes here.

File details

Details for the file tdi_rust_python_tools-0.9.3-cp313-cp313-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for tdi_rust_python_tools-0.9.3-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 223bc90db5ff8c9360ff2793e6bb3dae2feedfcddf1e5293a0f0712f993197b5
MD5 9a04cd1a6bb8f09de1fa5c8aa7620a39
BLAKE2b-256 941db00b00e5a71b6303af260447907f6a0fee692cca6809e584614967f4cebf

See more details on using hashes here.

File details

Details for the file tdi_rust_python_tools-0.9.3-cp313-cp313-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for tdi_rust_python_tools-0.9.3-cp313-cp313-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 ca3adfde8d40197300fa03eeeb23ed04010b713d5a1327b81e6608e3b1c2c6d6
MD5 2da75f93a958c4cf4f5ca36350caed2a
BLAKE2b-256 37c2d2d490ca8d6d47a9491b3e28f6b1240d7372c9704230bda24bd5e24f67d0

See more details on using hashes here.

File details

Details for the file tdi_rust_python_tools-0.9.3-cp313-cp313-musllinux_1_2_armv7l.whl.

File metadata

File hashes

Hashes for tdi_rust_python_tools-0.9.3-cp313-cp313-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 ffc73b349b1c366b774aa6a18b22af8959af75f111c3e47cbd8c04b778af307d
MD5 e457b19b9016f94126efacb25da332d2
BLAKE2b-256 3f47c50f2c041b948c5eb0ef8a0cb6867c5ccf1cf2bfb56ac7e2a702eda1f51b

See more details on using hashes here.

File details

Details for the file tdi_rust_python_tools-0.9.3-cp313-cp313-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for tdi_rust_python_tools-0.9.3-cp313-cp313-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 d0ba7eb025e4e72bd7067171aff777a7396a95ad6927b3b6c4dfd3c9514d5b60
MD5 101d7993cee0132d5b734e909914de3b
BLAKE2b-256 531d5727fc9e3ae258575a3ba0313686ee331db49ed10949b0a0eb43a9df5b1f

See more details on using hashes here.

File details

Details for the file tdi_rust_python_tools-0.9.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for tdi_rust_python_tools-0.9.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 2fbdfbb5a6b716c940db681bc51448a4eebf774a47ec63a28ce27d3101352de2
MD5 4c5a853b446d0bd937cb2c67fd0cdac5
BLAKE2b-256 de3a11da1a9240543f4e75190857699f610fa996f958e52a7befc7068e57b0be

See more details on using hashes here.

File details

Details for the file tdi_rust_python_tools-0.9.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl.

File metadata

File hashes

Hashes for tdi_rust_python_tools-0.9.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 f80a7a08a08bda23198d4b40bdefb6fcca81a5ed08672c81518af3d382d67877
MD5 38e2c2de8ad7503639b51b8086428743
BLAKE2b-256 b0586a36f53b7d84ca0ef8d00ac6f2b3e5aa25416c364a96fd7c194a8118520e

See more details on using hashes here.

File details

Details for the file tdi_rust_python_tools-0.9.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl.

File metadata

File hashes

Hashes for tdi_rust_python_tools-0.9.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 35951a37d651203b25011bd64081dd30cf3fab41968c536f9e08a13ac7167b4a
MD5 0fe233e88b1f6015050e0248a7744e8a
BLAKE2b-256 c609a03be2b11f98338378846f56ff9103e36a954a80fdaac875ed58af1ee1ad

See more details on using hashes here.

File details

Details for the file tdi_rust_python_tools-0.9.3-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for tdi_rust_python_tools-0.9.3-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 07aecd93c3bfff7f71960995c92f5e427058a712a6810f3575f583c70bbe54a2
MD5 4ee6139f20a1a0163834d713eef9a6fd
BLAKE2b-256 55825227fbeebac7fbcdf841dbd56f44ae3c768f36e5cbc2fa90afa3913f5f94

See more details on using hashes here.

File details

Details for the file tdi_rust_python_tools-0.9.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl.

File metadata

File hashes

Hashes for tdi_rust_python_tools-0.9.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 85c4738b46fc286cf520cc6d31c30ccb9a59aca9d44c01ce3ad45ce0030d4bd7
MD5 c07c4e3cddae2ee03b10e0cc682434f6
BLAKE2b-256 5404af5dccccd5f689f552a7f5750b7d529423417f6c6cece04d1782206ee78d

See more details on using hashes here.

File details

Details for the file tdi_rust_python_tools-0.9.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for tdi_rust_python_tools-0.9.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 303b383dfbc3f4598d920c6fbf1362d9bf1a972d426806dc71ab1e3e87abb40b
MD5 ff109bcdc906ba4ec1285f8c875ea3b2
BLAKE2b-256 80ec71b54029f3964dc7976aea3e950a5e77352ad2742002566adb8b3f1678ae

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page