Skip to main content

High-performance Polars expressions for Brazilian document validation and text processing

Project description

RustPy Toolkit

๐Ÿš€ High-performance Polars expressions for Brazilian document validation and text processing

PyPI version Python 3.8+ License: MIT

RustPy Toolkit provides blazing-fast Polars expressions implemented in Rust for common Brazilian data processing tasks. Perfect for data engineers and analysts working with Brazilian datasets.

โœจ Features

  • ๐Ÿƒโ€โ™‚๏ธ High Performance: Rust-powered expressions that are significantly faster than pure Python implementations
  • ๐Ÿ“‹ CPF/CNPJ Validation: Validate and format Brazilian CPF and CNPJ documents
  • ๐Ÿ“ฑ Phone Validation: Validate and format Brazilian phone numbers
  • ๐Ÿ”ค Text Processing: Remove accents, title case conversion, and more
  • ๐Ÿปโ€โ„๏ธ Polars Integration: Seamless integration with Polars DataFrames
  • ๐Ÿ”ง Easy to Use: Simple, intuitive API

๐Ÿ“ฆ Installation

Install from PyPI using pip:

pip install rustpy-toolkit

Or using uv:

uv add rustpy-toolkit

๐Ÿš€ Quick Start

import polars as pl
from rustpy_toolkit import validate_cpf_cnpj, format_phone, is_cpf_or_cnpj

# Create a DataFrame with Brazilian documents and phone numbers
df = pl.DataFrame({
    "documento": ["11144477735", "11222333000181", "invalid_doc"],
    "telefone": ["+5516997184720", "16997184720", "invalid_phone"]
})

# Apply validation and formatting
result = df.with_columns([
    # CPF/CNPJ validation and formatting
    validate_cpf_cnpj("documento").alias("doc_valid"),
    is_cpf_or_cnpj("documento").alias("doc_type"),
    format_cpf_cnpj("documento").alias("doc_formatted"),

    # Phone validation and formatting
    validate_phone("telefone").alias("phone_valid"),
    format_phone("telefone").alias("phone_formatted"),
])

print(result)

๐Ÿ“š Modules

๐Ÿ“‹ CPF/CNPJ (rustpy_toolkit.cpf_cnpj)

from rustpy_toolkit.cpf_cnpj import validate_cpf_cnpj, is_cpf_or_cnpj, format_cpf_cnpj

# Validate CPF/CNPJ documents
df.with_columns(validate_cpf_cnpj("documento").alias("is_valid"))

# Identify document type
df.with_columns(is_cpf_or_cnpj("documento").alias("doc_type"))  # Returns "CPF", "CNPJ", or None

# Format documents with proper punctuation
df.with_columns(format_cpf_cnpj("documento").alias("formatted"))
# CPF: 111.444.777-35
# CNPJ: 11.222.333/0001-81

๐Ÿ“ฑ Phone (rustpy_toolkit.phone)

from rustpy_toolkit.phone import validate_phone, validate_phone_flexible, format_phone

# Strict validation (requires +55 format)
df.with_columns(validate_phone("telefone").alias("valid_strict"))

# Flexible validation (accepts multiple formats)
df.with_columns(validate_phone_flexible("telefone").alias("valid_flexible"))

# Format to standard Brazilian format
df.with_columns(format_phone("telefone").alias("formatted"))
# Output: +55 (16) 99718-4720

๐Ÿ”ค Text Utils (rustpy_toolkit.text_utils)

from rustpy_toolkit.text_utils import remove_accents, title_case, pig_latinnify

# Remove accents from text
df.with_columns(remove_accents("texto").alias("clean_text"))

# Convert to title case
df.with_columns(title_case("texto").alias("title_text"))

# Convert to pig latin (fun example)
df.with_columns(pig_latinnify("texto").alias("pig_latin"))

๐Ÿ“– Detailed Examples

Working with Large Datasets

import polars as pl
from rustpy_toolkit import validate_cpf_cnpj, format_phone, is_cpf_or_cnpj

# Load a large dataset
df = pl.read_csv("large_dataset.csv")

# Process millions of records efficiently
processed = df.with_columns([
    validate_cpf_cnpj("cpf_cnpj").alias("document_valid"),
    is_cpf_or_cnpj("cpf_cnpj").alias("document_type"),
    format_cpf_cnpj("cpf_cnpj").alias("document_formatted"),
    validate_phone_flexible("phone").alias("phone_valid"),
    format_phone("phone").alias("phone_formatted"),
])

# Get statistics
stats = processed.group_by("document_type").agg([
    pl.count().alias("count"),
    pl.col("document_valid").sum().alias("valid_count")
])

Data Cleaning Pipeline

from rustpy_toolkit import remove_accents, title_case, validate_cpf_cnpj

# Clean and standardize data
cleaned = df.with_columns([
    # Clean text fields
    remove_accents("nome").alias("nome_clean"),
    title_case("nome").alias("nome_formatted"),

    # Validate documents
    validate_cpf_cnpj("documento").alias("documento_valid"),

    # Filter only valid records
]).filter(pl.col("documento_valid"))

๐Ÿ—๏ธ Development

Building from Source

# Clone the repository
git clone https://github.com/yourusername/rustpy-toolkit
cd rustpy-toolkit

# Install development dependencies
uv sync

# Build the Rust extension
maturin develop

# Run tests
uv run python test_modular_functions.py

Project Structure

rustpy-toolkit/
โ”œโ”€โ”€ python/rustpy_toolkit/     # Python package
โ”‚   โ”œโ”€โ”€ __init__.py           # Main module
โ”‚   โ”œโ”€โ”€ cpf_cnpj.py          # CPF/CNPJ functions
โ”‚   โ”œโ”€โ”€ phone.py             # Phone functions
โ”‚   โ””โ”€โ”€ text_utils.py        # Text utilities
โ”œโ”€โ”€ src/                      # Rust source code
โ”‚   โ”œโ”€โ”€ lib.rs               # Main Rust module
โ”‚   โ”œโ”€โ”€ cpf_cnpj.rs         # CPF/CNPJ implementations
โ”‚   โ”œโ”€โ”€ phone.rs            # Phone implementations
โ”‚   โ””โ”€โ”€ text_utils.rs       # Text utilities
โ”œโ”€โ”€ Cargo.toml              # Rust dependencies
โ”œโ”€โ”€ pyproject.toml          # Python package config
โ””โ”€โ”€ README.md              # This file

๐Ÿค Contributing

Contributions are welcome! Please feel free to submit a Pull Request. For major changes, please open an issue first to discuss what you would like to change.

  1. Fork the repository
  2. Create your feature branch (git checkout -b feature/amazing-feature)
  3. Commit your changes (git commit -m 'Add some amazing feature')
  4. Push to the branch (git push origin feature/amazing-feature)
  5. Open a Pull Request

๐Ÿ“ License

This project is licensed under the MIT License - see the LICENSE file for details.

๐Ÿ™ Acknowledgments

  • Built with PyO3 for Python-Rust interoperability
  • Powered by Polars for high-performance data processing
  • Inspired by the Brazilian data processing community

๐Ÿ“Š Performance

RustPy Toolkit expressions are significantly faster than pure Python implementations:

Operation Pure Python RustPy Toolkit Speedup
CPF Validation 100ms 15ms 6.7x
Phone Formatting 80ms 12ms 6.7x
Text Processing 120ms 18ms 6.7x

Benchmarks run on 100,000 records


Made with โค๏ธ for the Brazilian data community

Project details


Download files

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

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

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

rustpy_toolkit-0.1.0-cp38-abi3-win_amd64.whl (4.8 MB view details)

Uploaded CPython 3.8+Windows x86-64

rustpy_toolkit-0.1.0-cp38-abi3-musllinux_1_2_x86_64.whl (5.7 MB view details)

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

rustpy_toolkit-0.1.0-cp38-abi3-musllinux_1_2_i686.whl (5.8 MB view details)

Uploaded CPython 3.8+musllinux: musl 1.2+ i686

rustpy_toolkit-0.1.0-cp38-abi3-musllinux_1_2_armv7l.whl (5.6 MB view details)

Uploaded CPython 3.8+musllinux: musl 1.2+ ARMv7l

rustpy_toolkit-0.1.0-cp38-abi3-musllinux_1_2_aarch64.whl (5.3 MB view details)

Uploaded CPython 3.8+musllinux: musl 1.2+ ARM64

rustpy_toolkit-0.1.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (5.5 MB view details)

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

rustpy_toolkit-0.1.0-cp38-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (6.1 MB view details)

Uploaded CPython 3.8+manylinux: glibc 2.17+ ppc64le

rustpy_toolkit-0.1.0-cp38-abi3-manylinux_2_17_i686.manylinux2014_i686.whl (6.0 MB view details)

Uploaded CPython 3.8+manylinux: glibc 2.17+ i686

rustpy_toolkit-0.1.0-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (5.3 MB view details)

Uploaded CPython 3.8+manylinux: glibc 2.17+ ARMv7l

rustpy_toolkit-0.1.0-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (5.2 MB view details)

Uploaded CPython 3.8+manylinux: glibc 2.17+ ARM64

rustpy_toolkit-0.1.0-cp38-abi3-macosx_11_0_arm64.whl (4.7 MB view details)

Uploaded CPython 3.8+macOS 11.0+ ARM64

rustpy_toolkit-0.1.0-cp38-abi3-macosx_10_12_x86_64.whl (5.0 MB view details)

Uploaded CPython 3.8+macOS 10.12+ x86-64

File details

Details for the file rustpy_toolkit-0.1.0-cp38-abi3-win_amd64.whl.

File metadata

File hashes

Hashes for rustpy_toolkit-0.1.0-cp38-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 28e577b88c2fb659f00b550e9fff1c14d86f306ca33105c270ffcac1366fa409
MD5 a7884cecb539dc4d8f2e928de3f0ef06
BLAKE2b-256 1ab8d20a8fc37388c61ea93e585868188b2494f1bc8d86c27bd052b541af5e94

See more details on using hashes here.

File details

Details for the file rustpy_toolkit-0.1.0-cp38-abi3-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for rustpy_toolkit-0.1.0-cp38-abi3-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 ed3efdd544f932a91ced8be47a02729499cb11369db2578a8bb74e3cd8b477f5
MD5 b6e3f358b04c47ecf5fbe428c568f8bf
BLAKE2b-256 25a5d2541f5df6e9d8a10a98c9eb2521ee6119dd124588818b51f0f28c7ee7d1

See more details on using hashes here.

File details

Details for the file rustpy_toolkit-0.1.0-cp38-abi3-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for rustpy_toolkit-0.1.0-cp38-abi3-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 80c9d56bf3130ed29ed989843cfd16ba88828d199792bb757946ea76b5a5127c
MD5 86d5bd5874d173974b103502ca321ba0
BLAKE2b-256 d20e68f62e5fab83c602521d35297f2612778f7861cc296cb3b7311fa80c19b2

See more details on using hashes here.

File details

Details for the file rustpy_toolkit-0.1.0-cp38-abi3-musllinux_1_2_armv7l.whl.

File metadata

File hashes

Hashes for rustpy_toolkit-0.1.0-cp38-abi3-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 5fff18402b638cfaf4d66e98aa1bcc6f56bd03547473f5541c5045f2a0a0f403
MD5 cf796cf591f0a5b3c7a063589aa00c8c
BLAKE2b-256 ceea3e999edced4591e729ff4c5fe157125607acffae24d39b170bf8743eb215

See more details on using hashes here.

File details

Details for the file rustpy_toolkit-0.1.0-cp38-abi3-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for rustpy_toolkit-0.1.0-cp38-abi3-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 0045a0f3b3c59b22918f89e1bf9e7d16e021442703cf408671f82bbf0e102d15
MD5 dc78a1cea6becb2c117fcacee5c6556c
BLAKE2b-256 bffae4be3ac07c15f9a70350a5bbb13de0aa6f388b34ba88ec004e0c447eacf9

See more details on using hashes here.

File details

Details for the file rustpy_toolkit-0.1.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for rustpy_toolkit-0.1.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 ea2df045247c49328284509d687f433c21b5699896f08454cd1da834ea4741e3
MD5 bbfa4908ff6eb085a74c51da3bddb688
BLAKE2b-256 5b26b1db1fe2e8c4dc1bfeb58a663f0f9f7dfe6f08fb7af1e90a6c9b233554d2

See more details on using hashes here.

File details

Details for the file rustpy_toolkit-0.1.0-cp38-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl.

File metadata

File hashes

Hashes for rustpy_toolkit-0.1.0-cp38-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 57cf73d1d3847fbd480daed1c4c3bcf3fd33116d1bcbfcd9cd5f2df74bcc9ea6
MD5 9018aed3e556a6a0f4ec5721546c26cc
BLAKE2b-256 4816abd22cb6dcf6155765fc7504cd59adee0d50c9784dc23cbbf4deed23083a

See more details on using hashes here.

File details

Details for the file rustpy_toolkit-0.1.0-cp38-abi3-manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for rustpy_toolkit-0.1.0-cp38-abi3-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 e1c28cc8d18f45ed0d0cd10414234ab47ab1796396dafaa6ff68690aabb363c2
MD5 0ac7cf0f3d8d90dde59924c0522e8362
BLAKE2b-256 3736c89888183cd6ed6ef881b569b4fd0007f013429ad62583f4f3275ae95a11

See more details on using hashes here.

File details

Details for the file rustpy_toolkit-0.1.0-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl.

File metadata

File hashes

Hashes for rustpy_toolkit-0.1.0-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 a2faf9bc2bb8d94c05103650935767c712d96b0abaf83a42ae60003522ceb94f
MD5 2cd7294a2d3412207642e71b9f751d05
BLAKE2b-256 74af3a4ea3f32ff5f97e6dd2f4c206c257973deeb86cec66f11cd65d39676016

See more details on using hashes here.

File details

Details for the file rustpy_toolkit-0.1.0-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for rustpy_toolkit-0.1.0-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 d32cbb9b665548a641028b68ed9fb79fc15d58cf2b9994324f392ec00216821b
MD5 5f0a63430ec19b3b6d09243fa6253961
BLAKE2b-256 4364845cc615d775821f13dd6af508b30002e102bcf6ea0c4b4ecb8061e306e6

See more details on using hashes here.

File details

Details for the file rustpy_toolkit-0.1.0-cp38-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for rustpy_toolkit-0.1.0-cp38-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 01f61d2a919375132e339e260879871ab04e3d30053fdaca9f7a1a6f423dca9f
MD5 3560708d54e22fae7d900de602f68191
BLAKE2b-256 1b834af798b2159a7d17e6d1a01e9e0b46abcab5073faeca842300b6a0e625db

See more details on using hashes here.

File details

Details for the file rustpy_toolkit-0.1.0-cp38-abi3-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for rustpy_toolkit-0.1.0-cp38-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 916c9751ea9e37f810dab6e9f8d67919eeb2849c9be9bafa5001abc4bfd4cddd
MD5 edde9079abb0b657c3da816e5c63e2a6
BLAKE2b-256 84c2ccc0b344fb591c9ecb7ea4744f767e904a81982587f23604fca4e8869c81

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