Skip to main content

Parquet Metadata Reader

Project description

rugo

License Python Version PyPI Downloads

rugo is a C++17 and Cython powered file reader for Python. It delivers high-throughput reading for both Parquet files (metadata inspection and experimental column reader) and JSON Lines files (with schema inference, projection pushdown, and SIMD optimizations). The data-reading API is evolving rapidly and will change in upcoming releases.

Key Features

  • Parquet: Fast metadata extraction backed by an optimized C++17 parser and thin Python bindings.
  • Parquet: Complete schema and row-group details, including encodings, codecs, offsets, bloom filter pointers, and custom key/value metadata.
  • Parquet: Experimental memory-based data reading for PLAIN and RLE_DICTIONARY encoded columns with UNCOMPRESSED, SNAPPY, and ZSTD codecs.
  • JSON Lines: High-performance columnar reader with schema inference, projection pushdown, and SIMD optimizations (19% faster).
  • JSON Lines: Memory-based processing for zero-copy parsing.
  • Works with file paths, byte strings, and contiguous memoryviews.
  • Optional schema conversion helpers for Orso.
  • No runtime dependencies beyond the Python standard library.

Installation

PyPI

pip install rugo

# Optional extras
pip install rugo[orso]
pip install rugo[dev]

From source

git clone https://github.com/mabel-dev/rugo.git
cd rugo
python -m venv .venv
source .venv/bin/activate
make update
make compile
pip install -e .

Requirements

  • Python 3.9 or newer
  • A C++17 compatible compiler (clang, gcc, or MSVC)
  • Cython and setuptools for source builds (installed by the commands above)
  • On x86-64 platforms, an assembler capable of compiling .S sources (bundled with modern GCC/Clang toolchains)
  • ARM/AArch64 platforms (including Apple Silicon) are fully supported with NEON SIMD optimizations

Quickstart

import rugo.parquet as parquet_meta

metadata = parquet_meta.read_metadata("example.parquet")

print(f"Rows: {metadata['num_rows']}")
print("Schema columns:")
for column in metadata["schema_columns"]:
    print(f"  {column['name']}: {column['physical_type']} ({column['logical_type']})")

first_row_group = metadata["row_groups"][0]
for column in first_row_group["columns"]:
    print(
        f"{column['name']}: codec={column['compression_codec']}, "
        f"nulls={column['null_count']}, range=({column['min']}, {column['max']})"
    )

read_metadata returns dictionaries composed of Python primitives, ready for JSON serialisation or downstream processing.

Returned metadata layout

{
    "num_rows": int,
    "schema_columns": [
        {
            "name": str,
            "physical_type": str,
            "logical_type": str,
            "nullable": bool,
        },
        ...
    ],
    "row_groups": [
        {
            "num_rows": int,
            "total_byte_size": int,
            "columns": [
                {
                    "name": str,
                    "path_in_schema": str,
                    "physical_type": str,
                    "logical_type": str,
                    "num_values": Optional[int],
                    "total_uncompressed_size": Optional[int],
                    "total_compressed_size": Optional[int],
                    "data_page_offset": Optional[int],
                    "index_page_offset": Optional[int],
                    "dictionary_page_offset": Optional[int],
                    "min": Any,
                    "max": Any,
                    "null_count": Optional[int],
                    "distinct_count": Optional[int],
                    "bloom_offset": Optional[int],
                    "bloom_length": Optional[int],
                    "encodings": List[str],
                    "compression_codec": Optional[str],
                    "key_value_metadata": Optional[Dict[str, str]],
                },
                ...
            ],
        },
        ...
    ],
}

Fields that are not present in the source Parquet file are reported as None. Minimum and maximum values are decoded into Python types when possible; otherwise hexadecimal strings are returned.

Parsing options

All entry points share the same keyword arguments:

  • schema_only (default False): return only the top-level schema without row group details.
  • include_statistics (default True): skip min/max/num_values decoding when set to False.
  • max_row_groups (default -1): limit the number of row groups inspected; handy for very large files.
metadata = parquet_meta.read_metadata(
    "large_file.parquet",
    schema_only=False,
    include_statistics=False,
    max_row_groups=2,
)

Working with in-memory data

with open("example.parquet", "rb") as fh:
    data = fh.read()

from_bytes = parquet_meta.read_metadata_from_bytes(data)
from_view = parquet_meta.read_metadata_from_memoryview(memoryview(data))

read_metadata_from_memoryview performs zero-copy parsing when given a contiguous buffer.

Prototype Data Decoding (Experimental)

API stability: The column-reading functions are experimental and will change without notice while we expand format coverage.

rugo includes a prototype decoder for reading actual column data from Parquet files. This is a limited, experimental feature designed for simple use cases and testing.

Supported Features

  • ✅ UNCOMPRESSED, SNAPPY, and ZSTD codecs
  • ✅ PLAIN encoding
  • ✅ RLE_DICTIONARY encoding
  • int32, int64, float32, float64, boolean, and string (byte_array) types
  • ✅ Memory-based processing (load once, decode multiple times)
  • ✅ Column selection (decode only the columns you need)
  • ✅ Multi-row-group support

Unsupported Features

  • ❌ Other codecs (GZIP, LZ4, LZO, BROTLI, etc.)
  • ❌ Delta encoding, PLAIN_DICTIONARY, other advanced encodings
  • ❌ Nullable columns with definition levels > 0
  • ❌ Other types (int96, fixed_len_byte_array, date, timestamp, complex types)
  • ❌ Nested structures (lists, maps, structs)

Primary API: Memory-Based Reading

The recommended approach loads Parquet data into memory once and performs all operations on the in-memory buffer:

import rugo.parquet as rp

# Load file into memory once
with open("data.parquet", "rb") as f:
    parquet_data = f.read()

# Check if the data can be decoded
if rp.can_decode_from_memory(parquet_data):
    
    # Read ALL columns from all row groups
    table = rp.read_parquet(parquet_data)
    
    # Or read SPECIFIC columns only
    table = rp.read_parquet(parquet_data, ["name", "age", "salary"])
    
    # Access the structured data
    print(f"Columns: {table['column_names']}")
    print(f"Row groups: {len(table['row_groups'])}")
    
    # Iterate through row groups and columns
    for rg_idx, row_group in enumerate(table['row_groups']):
        print(f"Row group {rg_idx}:")
        for col_idx, column_data in enumerate(row_group):
            col_name = table['column_names'][col_idx]
            if column_data is not None:
                print(f"  {col_name}: {len(column_data)} values")
            else:
                print(f"  {col_name}: Failed to decode")

Data Structure

The read_parquet() function returns a dictionary with this structure:

{
    'success': bool,                    # True if reading succeeded
    'column_names': ['col1', 'col2'],   # List of column names
    'row_groups': [                     # List of row groups
        [col1_data, col2_data],         # Row group 0: list of columns
        [col1_data, col2_data],         # Row group 1: list of columns
        # ... more row groups
    ]
}

Each column's data is a Python list containing the decoded values.

Performance Benefits

Traditional Approach (Multiple File I/O):

# Each operation reads the file separately
metadata = rp.read_metadata("file.parquet")       # File I/O #1
col1 = rp.decode_column("file.parquet", "col1")   # File I/O #2  
col2 = rp.decode_column("file.parquet", "col2")   # File I/O #3

Memory-Based Approach (Single File I/O):

# Load once, process multiple times
with open("file.parquet", "rb") as f:
    data = f.read()  # File I/O #1 (only)

table = rp.read_parquet(data, ["col1", "col2"])   # In-memory processing

Legacy File-Based API

For backward compatibility, file-based functions are still available:

# Check if a file can be decoded
if rp.can_decode("data.parquet"):
    # Decode a specific column from first row group only
    values = rp.decode_column("data.parquet", "column_name")
    print(values)  # e.g., [1, 2, 3, 4, 5] or ['a', 'b', 'c']

Use Cases

The memory-based API is optimized for:

  • Query engines with metadata-driven pruning
  • ETL pipelines processing multiple Parquet files
  • Data exploration where you need to examine various columns
  • High-performance scenarios minimizing I/O operations

See examples/memory_based_api_example.py and examples/optional_columns_example.py for complete demonstrations.

Note: This decoder is a prototype for educational and testing purposes. For production use with full Parquet support, use PyArrow or FastParquet.

JSON Lines Reading

rugo includes a high-performance JSON Lines reader with schema inference, projection pushdown, and SIMD optimizations.

Features

  • ✅ Fast columnar reading with C++17 implementation and SIMD optimizations
  • 19% performance improvement from SIMD optimizations (AVX2/SSE2)
  • ✅ Automatic schema inference from JSON data
  • ✅ Projection pushdown (read only needed columns)
  • ✅ Support for int64, double, string, and boolean types
  • ✅ Native null value handling
  • ✅ Memory-based processing (zero-copy parsing)
  • ✅ Orso schema conversion

Quick Example

import rugo.jsonl as rj

# Sample JSON Lines data
data = b'''{"id": 1, "name": "Alice", "age": 30, "salary": 50000.0}
{"id": 2, "name": "Bob", "age": 25, "salary": 45000.0}
{"id": 3, "name": "Charlie", "age": 35, "salary": 55000.0}'''

# Get schema
schema = rj.get_jsonl_schema(data)
print(f"Columns: {[col['name'] for col in schema]}")
# Output: Columns: ['id', 'name', 'age', 'salary']

# Read all columns
result = rj.read_jsonl(data)
print(f"Read {result['num_rows']} rows with {len(result['columns'])} columns")

# Read with projection (only specific columns)
result = rj.read_jsonl(data, columns=['name', 'salary'])
# Only reads 'name' and 'salary' - projection pushdown!

Working with Files

import rugo.jsonl as rj

# Load file into memory
with open("data.jsonl", "rb") as f:
    jsonl_data = f.read()

# Extract schema
schema = rj.get_jsonl_schema(jsonl_data, sample_size=1000)

# Read specific columns only
result = rj.read_jsonl(jsonl_data, columns=['user_id', 'email', 'score'])

# Access columnar data
for i in range(result['num_rows']):
    user_id = result['columns'][0][i]
    email = result['columns'][1][i]
    score = result['columns'][2][i]
    print(f"User {user_id}: {email} - Score: {score}")

Orso Integration

import rugo.jsonl as rj
from rugo.converters.orso import jsonl_to_orso_schema

# Get JSON Lines schema
jsonl_schema = rj.get_jsonl_schema(data)

# Convert to Orso schema
orso_schema = jsonl_to_orso_schema(jsonl_schema, schema_name="my_table")
print(f"Schema: {orso_schema.name}")
for col in orso_schema.columns:
    print(f"  {col.name}: {col.type}")

Performance

The JSON Lines reader achieves approximately 109K-201K rows/second on wide tables (50 columns), with higher throughput on narrower tables. With SIMD optimizations (AVX2/SSE2), the reader delivers:

  • Full read (50 cols): ~109K rows/second
  • Projection (10 cols): ~174-191K rows/second
  • Projection (5 cols): ~181-201K rows/second
  • Performance improvement: 19% faster with SIMD optimizations

The SIMD implementation uses:

  • AVX2: Processes 32 bytes at once for newline detection and text parsing (preferred)
  • SSE2: Processes 16 bytes at once (fallback)
  • Scalar fallback: Byte-by-byte processing for non-x86 architectures

Comparison with Opteryx

On 50-column datasets, rugo is 2.7-5.6x faster than Opteryx 0.25.1 (release):

  • Full read: 2.7-3.1x faster
  • Projection (10 cols): 3.8-5.4x faster
  • Projection (5 cols): 3.9-5.6x faster

Note: These benchmarks compare against Opteryx 0.25.1 (PyPI release) which uses a Python-based decoder with csimdjson. The main branch (0.26.0+) includes a new Cython-based fast decoder with SIMD optimizations that is expected to be significantly faster.

rugo's advantages:

  • True projection pushdown: Only parse columns you need
  • Memory-based: No file I/O overhead
  • Zero-copy design: Direct memory-to-column conversion
  • Consistent performance: Maintains throughput across dataset sizes

See PERFORMANCE_COMPARISON.md for detailed benchmark results, JSONL_SIMD_OPTIMIZATIONS.md for SIMD optimization details, and OPTERYX_DECODER_ANALYSIS.md for a technical analysis of Opteryx's Cython decoder and potential improvements.

See examples/read_jsonl.py and benchmarks/compare_opteryx_performance.py for complete demonstrations.

Optional Orso conversion

Install the optional extra (pip install rugo[orso]) to enable Orso helpers:

from rugo.converters.orso import extract_schema_only, rugo_to_orso_schema, jsonl_to_orso_schema

# Parquet to Orso
metadata = parquet_meta.read_metadata("example.parquet")
relation = rugo_to_orso_schema(metadata, "example_table")
schema_info = extract_schema_only(metadata)

# JSON Lines to Orso
import rugo.jsonl as rj
jsonl_schema = rj.get_jsonl_schema(data)
relation = jsonl_to_orso_schema(jsonl_schema, "jsonl_table")

See examples/orso_conversion.py and examples/jsonl_orso_conversion.py for complete walkthroughs.

Development

make update     # install build and test tooling (uses uv under the hood)
make compile    # rebuild the Cython extension with -O3 and C++17 flags
make test       # run pytest-based validation (includes PyArrow comparisons)
make lint       # run ruff, isort, pycln, cython-lint
make mypy       # type checking

make compile clears previous build artefacts before rebuilding the extension in-place.

Project layout

rugo/
├── rugo/__init__.py
├── rugo/parquet/
│   ├── parquet_reader.pyx
│   ├── parquet_reader.pxd
│   ├── parquet_reader.cpp
│   ├── metadata.cpp
│   ├── metadata.hpp
│   ├── bloom_filter.cpp
│   ├── decode.cpp
│   ├── decode.hpp
│   ├── compression.cpp
│   ├── compression.hpp
│   ├── thrift.hpp
│   └── vendor/
├── rugo/jsonl_src/
│   ├── jsonl.pyx
│   ├── jsonl.pxd
│   ├── jsonl_reader.cpp
│   └── jsonl_reader.hpp
├── rugo/converters/orso.py
├── examples/
│   ├── read_parquet_metadata.py
│   ├── read_parquet_data.py
│   ├── read_jsonl.py
│   ├── jsonl_orso_conversion.py
│   ├── create_test_file.py
│   └── orso_conversion.py
├── scripts/
│   ├── generate_test_parquet.py
│   └── vendor_compression_libs.py
├── tests/
│   ├── data/
│   ├── test_all_metadata_fields.py
│   ├── test_bloom_filter.py
│   ├── test_decode.py
│   ├── test_jsonl.py
│   ├── test_jsonl_performance.py
│   ├── test_logical_types.py
│   ├── test_orso_converter.py
│   ├── test_statistics.py
│   └── requirements.txt
├── Makefile
├── pyproject.toml
├── setup.py
└── README.md

Status and limitations

  • Active development status (alpha); APIs are evolving and may change between releases.
  • Parquet: Metadata APIs are largely stable. The column-reading API is experimental and will change.
  • JSON Lines: High-performance reader with SIMD optimizations (19% improvement) and basic type support (int64, double, string, boolean).
  • Requires a C++17 compiler when installing from source or editing the Cython bindings.
  • SIMD optimizations (AVX2/SSE2) are automatically enabled on x86-64 platforms.
  • Bloom filter information is exposed via offsets and lengths; higher-level helpers are planned.

Future Format Support

rugo currently supports Parquet and JSON Lines. We are evaluating additional formats based on optimization opportunities and community demand. See FORMAT_SUPPORT_ANALYSIS.md for a detailed analysis of candidate formats (ORC, Avro, CSV, Arrow IPC) and FORMAT_ROADMAP.md for our planned roadmap. Feedback and feature requests are welcome!

License

Licensed under the Apache License 2.0. See LICENSE for full terms.

Maintainer

Created and maintained by Justin Joyce (@joocer). Contributions are welcome via issues and pull requests.

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

rugo-0.1.19.tar.gz (2.3 MB view details)

Uploaded Source

Built Distributions

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

rugo-0.1.19-cp313-cp313-musllinux_1_2_aarch64.whl (4.8 MB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ ARM64

rugo-0.1.19-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl (3.9 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.24+ ARM64manylinux: glibc 2.28+ ARM64

rugo-0.1.19-cp312-cp312-musllinux_1_2_aarch64.whl (4.8 MB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ ARM64

rugo-0.1.19-cp312-cp312-musllinux_1_1_x86_64.whl (5.0 MB view details)

Uploaded CPython 3.12musllinux: musl 1.1+ x86-64

rugo-0.1.19-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl (3.9 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.24+ ARM64manylinux: glibc 2.28+ ARM64

rugo-0.1.19-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.0 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

rugo-0.1.19-cp312-cp312-macosx_11_0_arm64.whl (418.7 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

rugo-0.1.19-cp311-cp311-musllinux_1_2_aarch64.whl (4.8 MB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ ARM64

rugo-0.1.19-cp311-cp311-musllinux_1_1_x86_64.whl (5.0 MB view details)

Uploaded CPython 3.11musllinux: musl 1.1+ x86-64

rugo-0.1.19-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl (3.9 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.24+ ARM64manylinux: glibc 2.28+ ARM64

rugo-0.1.19-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.1 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

rugo-0.1.19-cp311-cp311-macosx_11_0_arm64.whl (417.8 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

rugo-0.1.19-cp310-cp310-musllinux_1_2_aarch64.whl (4.7 MB view details)

Uploaded CPython 3.10musllinux: musl 1.2+ ARM64

rugo-0.1.19-cp310-cp310-musllinux_1_1_x86_64.whl (4.9 MB view details)

Uploaded CPython 3.10musllinux: musl 1.1+ x86-64

rugo-0.1.19-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl (3.8 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.24+ ARM64manylinux: glibc 2.28+ ARM64

rugo-0.1.19-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.0 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

rugo-0.1.19-cp310-cp310-macosx_11_0_arm64.whl (414.1 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

rugo-0.1.19-cp39-cp39-musllinux_1_2_aarch64.whl (4.7 MB view details)

Uploaded CPython 3.9musllinux: musl 1.2+ ARM64

rugo-0.1.19-cp39-cp39-musllinux_1_1_x86_64.whl (4.9 MB view details)

Uploaded CPython 3.9musllinux: musl 1.1+ x86-64

rugo-0.1.19-cp39-cp39-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl (3.8 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.24+ ARM64manylinux: glibc 2.28+ ARM64

rugo-0.1.19-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.0 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ x86-64

rugo-0.1.19-cp39-cp39-macosx_11_0_arm64.whl (414.9 kB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

File details

Details for the file rugo-0.1.19.tar.gz.

File metadata

  • Download URL: rugo-0.1.19.tar.gz
  • Upload date:
  • Size: 2.3 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for rugo-0.1.19.tar.gz
Algorithm Hash digest
SHA256 e945341253ec21e7ac8d7c38448903b41ae0fb5a8f7fd8e563f50bf93b112c72
MD5 49c0a04eb2d720cad12422a3a5167e15
BLAKE2b-256 a902f922db88ac43d31a93296e79a19d4a1a5229c414db730c36148a85ab1a75

See more details on using hashes here.

Provenance

The following attestation bundles were made for rugo-0.1.19.tar.gz:

Publisher: release.yml on mabel-dev/rugo

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

File details

Details for the file rugo-0.1.19-cp313-cp313-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for rugo-0.1.19-cp313-cp313-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 ca947599f36ffda1cce7a3d6730e3850c8dfab67ce9a9d92d886e7c1c0d89855
MD5 3cc1a3d18d8ae0b315fe1e50008094d5
BLAKE2b-256 7e72ea498c213ac86f8da919d877952fa8604ec732dd9c89da4053db00d8408b

See more details on using hashes here.

Provenance

The following attestation bundles were made for rugo-0.1.19-cp313-cp313-musllinux_1_2_aarch64.whl:

Publisher: release.yml on mabel-dev/rugo

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

File details

Details for the file rugo-0.1.19-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for rugo-0.1.19-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 062177e4258db1213dbfd36ce0778acb56a33f37c94cec1d2c764426afd33fde
MD5 c42977d1af5a370b9535683167e7646d
BLAKE2b-256 ab19697dce15b8ff2bcdd43e763b64e96bff542ce78a95a8f5cb91f7fdd3f31e

See more details on using hashes here.

Provenance

The following attestation bundles were made for rugo-0.1.19-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl:

Publisher: release.yml on mabel-dev/rugo

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

File details

Details for the file rugo-0.1.19-cp312-cp312-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for rugo-0.1.19-cp312-cp312-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 787c3ca75fb76d6b1c148871cbe17d04533f6b1aaf467840f29721331e8976a5
MD5 3089cd7ec74298b756e79fdcc16467b2
BLAKE2b-256 53e5d02ad6a88051fb820d9dfbea3fa8dcdfe653e64714279af6b582be280055

See more details on using hashes here.

Provenance

The following attestation bundles were made for rugo-0.1.19-cp312-cp312-musllinux_1_2_aarch64.whl:

Publisher: release.yml on mabel-dev/rugo

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

File details

Details for the file rugo-0.1.19-cp312-cp312-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for rugo-0.1.19-cp312-cp312-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 2d976727aaec88549428436b4966f50bd0d33c88f7e9c5a4a6ac7c01cbc2d9c8
MD5 960bc8420b89d79b7ce9e58efe6af8a8
BLAKE2b-256 278ec37bf1cba083ba47e32e2e912ca97280bc60cac5c0818b78c61f13b5aabf

See more details on using hashes here.

Provenance

The following attestation bundles were made for rugo-0.1.19-cp312-cp312-musllinux_1_1_x86_64.whl:

Publisher: release.yml on mabel-dev/rugo

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

File details

Details for the file rugo-0.1.19-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for rugo-0.1.19-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 7be95fa537c398fc382b834281f5c0c85ae4517a8fc29509a1058be25a5312ee
MD5 61a7bdeb882c31050b7dfc495a18be0e
BLAKE2b-256 641f6729b27bc243608430f55484589d76a7468c765cb37421fe3a214cbd4382

See more details on using hashes here.

Provenance

The following attestation bundles were made for rugo-0.1.19-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl:

Publisher: release.yml on mabel-dev/rugo

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

File details

Details for the file rugo-0.1.19-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for rugo-0.1.19-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 39754a994effbf7fe3e2ec90c1e493e717d77102905f952c32d156e4b4b1624b
MD5 5ebcea5b3b71e3ef5efcfac8b247eb30
BLAKE2b-256 a2a7c272ed53a0f7248f4be652b392545e96435982ab640619ae40dbef7f2eba

See more details on using hashes here.

Provenance

The following attestation bundles were made for rugo-0.1.19-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release.yml on mabel-dev/rugo

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

File details

Details for the file rugo-0.1.19-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for rugo-0.1.19-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 5ea6553e691fe2f23c17a785670fa3e7bf511171344dcf8eaf7c808dc325451b
MD5 2b3a6d82f75ce98fe7d3e2c844a0070c
BLAKE2b-256 720083b510c159a5cd5c2ae0cf396e6a617c683d946f7d57a34180db040635a8

See more details on using hashes here.

Provenance

The following attestation bundles were made for rugo-0.1.19-cp312-cp312-macosx_11_0_arm64.whl:

Publisher: release.yml on mabel-dev/rugo

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

File details

Details for the file rugo-0.1.19-cp311-cp311-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for rugo-0.1.19-cp311-cp311-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 4e9462dd6e9d822dbaa89e5c770c230053a7c2b6b4021d286788627c82869dc4
MD5 52f601eae4203e53e13364838dd32008
BLAKE2b-256 00f7ac30dcf5188dabba4b06127f3a311ed38c6b029265aa44fec678fa82fa25

See more details on using hashes here.

Provenance

The following attestation bundles were made for rugo-0.1.19-cp311-cp311-musllinux_1_2_aarch64.whl:

Publisher: release.yml on mabel-dev/rugo

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

File details

Details for the file rugo-0.1.19-cp311-cp311-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for rugo-0.1.19-cp311-cp311-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 f29e379363102157ba7f61083b909cf4bc9fe82a0f288b51703ce4449b86df02
MD5 a3f7146471ff457f50b03146964c35e5
BLAKE2b-256 baaf290aa2116ce7847b0f9c74f80a4ca89b7f29902fa5bae6639e2e4457ed3c

See more details on using hashes here.

Provenance

The following attestation bundles were made for rugo-0.1.19-cp311-cp311-musllinux_1_1_x86_64.whl:

Publisher: release.yml on mabel-dev/rugo

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

File details

Details for the file rugo-0.1.19-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for rugo-0.1.19-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 40547d9421dba5934882c2c77a6f925a0de7cd0d982129d29c3555ab4b1141c0
MD5 e0e2a80df06c35308ebbf0a312cfb232
BLAKE2b-256 596ea0acf4aaaa7169c3ff3980f447ae2d69437fa7fff2ced9b16d220424d67b

See more details on using hashes here.

Provenance

The following attestation bundles were made for rugo-0.1.19-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl:

Publisher: release.yml on mabel-dev/rugo

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

File details

Details for the file rugo-0.1.19-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for rugo-0.1.19-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 bda0d892c2aa8a16aa262cb96614d4b33ae99af6f6b4f6ef2b79ace81ba7ff91
MD5 76a95437f375815d4cbcb5787cc6772e
BLAKE2b-256 ca0cfc5920f87931a51f36c09a70527e302b7d8a2ae14d6afa27f19b8e1e197a

See more details on using hashes here.

Provenance

The following attestation bundles were made for rugo-0.1.19-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release.yml on mabel-dev/rugo

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

File details

Details for the file rugo-0.1.19-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for rugo-0.1.19-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 1529de8b710a00262b80edf024836a31dd9a0b8fd0883828a5c4d76bca84b4d6
MD5 2a5241677c8f238bee944e08d585b7c5
BLAKE2b-256 4086f11ffd6477cde2626cb8754a9edc131e8c347ce89fbfa700dffc41b7bc30

See more details on using hashes here.

Provenance

The following attestation bundles were made for rugo-0.1.19-cp311-cp311-macosx_11_0_arm64.whl:

Publisher: release.yml on mabel-dev/rugo

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

File details

Details for the file rugo-0.1.19-cp310-cp310-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for rugo-0.1.19-cp310-cp310-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 5b6d811b3bfc837eae7c21dd35a2128435c1b5cd8f1815d62d021e2633cee956
MD5 61071973cc279f402493fb999eae64fc
BLAKE2b-256 112b1242572497baa0b3697f3be36448920722f9140a02767a4148c6b148577b

See more details on using hashes here.

Provenance

The following attestation bundles were made for rugo-0.1.19-cp310-cp310-musllinux_1_2_aarch64.whl:

Publisher: release.yml on mabel-dev/rugo

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

File details

Details for the file rugo-0.1.19-cp310-cp310-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for rugo-0.1.19-cp310-cp310-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 de0e986acd866c5111256d6852eacfbf68c53ec5a9afb63a0d939912c9cb2f7e
MD5 12ec2333f0e22a1ca077e3ea7fb9e5a8
BLAKE2b-256 d464e4a5781085c50f7fc17ca1aea678fefbd65e4e561554680903cf10c4a2ed

See more details on using hashes here.

Provenance

The following attestation bundles were made for rugo-0.1.19-cp310-cp310-musllinux_1_1_x86_64.whl:

Publisher: release.yml on mabel-dev/rugo

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

File details

Details for the file rugo-0.1.19-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for rugo-0.1.19-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 019f920e500fb702b6050d5b24fd0c3db0946d93a6f29e4744f8bc08852d4ee0
MD5 e1c2fd3ae5793349f99e2291862c7ff3
BLAKE2b-256 80f2bac19a1a55860a7120b4975bac2f2a1bd0ae4a75075b04e1babf14ddcb07

See more details on using hashes here.

Provenance

The following attestation bundles were made for rugo-0.1.19-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl:

Publisher: release.yml on mabel-dev/rugo

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

File details

Details for the file rugo-0.1.19-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for rugo-0.1.19-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 72f511a095adf9bb4d6d70906dadb514cd5158e65e6f34fc2eb781469ad420a5
MD5 547e194521e94f5ea31e2f6ac036ed58
BLAKE2b-256 aa10854bc0138382ee124b1d05f790297833a715e98272854ce429b8753d3667

See more details on using hashes here.

Provenance

The following attestation bundles were made for rugo-0.1.19-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release.yml on mabel-dev/rugo

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

File details

Details for the file rugo-0.1.19-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for rugo-0.1.19-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 849731a4a5a4d6f2bea636f074a1c8b649becc5a440f28e7cbfc4d015388d17d
MD5 5d994113b67f22c7343abe40ec48a404
BLAKE2b-256 32e76e916595539b440b4e862c4f1f4e11bd59d1634a77c8d6d8fd1bec841d93

See more details on using hashes here.

Provenance

The following attestation bundles were made for rugo-0.1.19-cp310-cp310-macosx_11_0_arm64.whl:

Publisher: release.yml on mabel-dev/rugo

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

File details

Details for the file rugo-0.1.19-cp39-cp39-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for rugo-0.1.19-cp39-cp39-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 3b55a820c9ed8517478c726171a076757f30348b9b361995f3ac2da0c349b959
MD5 6aa78afc2dce20cdf54480197fd93464
BLAKE2b-256 9310c4cb368fa746d1b547a7d37cc50265bb8ae610ab7483c735b87161942849

See more details on using hashes here.

Provenance

The following attestation bundles were made for rugo-0.1.19-cp39-cp39-musllinux_1_2_aarch64.whl:

Publisher: release.yml on mabel-dev/rugo

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

File details

Details for the file rugo-0.1.19-cp39-cp39-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for rugo-0.1.19-cp39-cp39-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 e92c3c004c87fd810cde93556329fd24aed0ccc268eb54459e0e0bea141215fb
MD5 ae8c8e8070b5a3d4f0a94ece1d3c4fc4
BLAKE2b-256 f5d00ea7cc95d198f781dea20b34977c15ac3791290ff80da3e70c540fc90f6c

See more details on using hashes here.

Provenance

The following attestation bundles were made for rugo-0.1.19-cp39-cp39-musllinux_1_1_x86_64.whl:

Publisher: release.yml on mabel-dev/rugo

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

File details

Details for the file rugo-0.1.19-cp39-cp39-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for rugo-0.1.19-cp39-cp39-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 40072c8bc901a23189f7eeb8b058b10d94db1d87d19c6379addee703792e80ce
MD5 fe86080e9c900ae7e94d27a77c1a2a4e
BLAKE2b-256 d6e5861dfe8f189cbde43962a88dccaa783fda866a5ed3c1fe149e2df5cec7e6

See more details on using hashes here.

Provenance

The following attestation bundles were made for rugo-0.1.19-cp39-cp39-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl:

Publisher: release.yml on mabel-dev/rugo

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

File details

Details for the file rugo-0.1.19-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for rugo-0.1.19-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 e92cca7956488370e1186be6bb179b723a295614c2f4b2e892abcf63bb3d92ab
MD5 37e0f3d7b4c786fada1e2321e0889420
BLAKE2b-256 fe7c9293f169fed0258ada97d5c0d9f6d6382581358fbf802d5fbc408d50a8f1

See more details on using hashes here.

Provenance

The following attestation bundles were made for rugo-0.1.19-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release.yml on mabel-dev/rugo

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

File details

Details for the file rugo-0.1.19-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

  • Download URL: rugo-0.1.19-cp39-cp39-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 414.9 kB
  • Tags: CPython 3.9, macOS 11.0+ ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for rugo-0.1.19-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a69f660ab5d578b7388c485ce2640dcb7c1078b3656d160cb7e9b5ee78ee5828
MD5 affe0422d7afb8fd8d1cd302a39da246
BLAKE2b-256 8c2a8fd59cd03a785e04c79ed76ee77883cdc773e8c7d9055a944e964f665c0d

See more details on using hashes here.

Provenance

The following attestation bundles were made for rugo-0.1.19-cp39-cp39-macosx_11_0_arm64.whl:

Publisher: release.yml on mabel-dev/rugo

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

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