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). JSON Lines reader returns high-performance draken vectors for efficient columnar processing. 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: Returns draken vectors with zero-copy Arrow interoperability for high-performance columnar processing.
  • JSON Lines: Memory-based processing for zero-copy parsing.
  • Works with file paths, byte strings, and contiguous memoryviews.
  • Optional schema conversion helpers for Orso.
  • Runtime dependencies: draken (for JSON Lines reader), pyarrow (for Arrow interoperability).

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

Runtime Dependencies

  • draken: High-performance columnar vector library (for JSON Lines reader)
  • pyarrow: Apache Arrow Python bindings (for Arrow interoperability)

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. Returns data as high-performance draken vectors for efficient columnar processing.

Features

  • ✅ Fast columnar reading with C++17 implementation and SIMD optimizations
  • 19% performance improvement from SIMD optimizations (AVX2/SSE2)
  • Draken vector output - High-performance columnar vectors with zero-copy Arrow interoperability
  • ✅ 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 - returns draken vectors
result = rj.read_jsonl(data)
print(f"Read {result['num_rows']} rows with {len(result['columns'])} columns")
print(f"Column types: {[type(col).__name__ for col in result['columns']]}")
# Output: Column types: ['Int64Vector', 'StringVector', 'Int64Vector', 'Float64Vector']

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

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 - returns draken vectors
result = rj.read_jsonl(jsonl_data, columns=['user_id', 'email', 'score'])

# Access columnar data (vectors support iteration and to_arrow() conversion)
# Convert to Arrow arrays for easy iteration
user_ids = result['columns'][0].to_arrow()
emails = result['columns'][1].to_arrow()
scores = result['columns'][2].to_arrow()

for i in range(result['num_rows']):
    user_id = user_ids[i]
    email = emails[i]
    score = scores[i]
    print(f"User {user_id}: {email} - Score: {score}")

### Orso Integration

```python
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

Draken Vectors Performance Benefits

The JSON Lines reader returns draken vectors instead of Python lists, providing:

  • Faster processing: 2-5x faster for type-specific operations compared to Python lists
  • Lower memory usage: 20-40% reduction in memory footprint
  • Zero-copy Arrow interop: Seamless integration with PyArrow and other Arrow-based tools
  • SIMD optimizations: Automatic vectorization on x86_64 and ARM platforms
  • Type-specialized operations: Optimized kernels for int64, float64, string, and boolean operations

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.20.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.20-cp313-cp313-musllinux_1_2_aarch64.whl (4.8 MB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ ARM64

rugo-0.1.20-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.20-cp312-cp312-musllinux_1_2_aarch64.whl (4.8 MB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ ARM64

rugo-0.1.20-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.20-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.20-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.1 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

rugo-0.1.20-cp312-cp312-macosx_11_0_arm64.whl (426.3 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

rugo-0.1.20-cp311-cp311-musllinux_1_2_aarch64.whl (4.9 MB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ ARM64

rugo-0.1.20-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.20-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl (4.0 MB view details)

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

rugo-0.1.20-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.20-cp311-cp311-macosx_11_0_arm64.whl (426.1 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

rugo-0.1.20-cp310-cp310-musllinux_1_2_aarch64.whl (4.8 MB view details)

Uploaded CPython 3.10musllinux: musl 1.2+ ARM64

rugo-0.1.20-cp310-cp310-musllinux_1_1_x86_64.whl (5.0 MB view details)

Uploaded CPython 3.10musllinux: musl 1.1+ x86-64

rugo-0.1.20-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl (3.9 MB view details)

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

rugo-0.1.20-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.1 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

rugo-0.1.20-cp310-cp310-macosx_11_0_arm64.whl (422.6 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

File details

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

File metadata

  • Download URL: rugo-0.1.20.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.20.tar.gz
Algorithm Hash digest
SHA256 f3df78b4078281c8bd36c8ee6eae337ffdf5383f498c805b1b36799f9f2fdf7c
MD5 905463f29cb1a2344c582c5751e69489
BLAKE2b-256 773110e40daa3e65fb171f853e882363f180ac845fcda3e786aac3af05a6a8ca

See more details on using hashes here.

Provenance

The following attestation bundles were made for rugo-0.1.20.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.20-cp313-cp313-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for rugo-0.1.20-cp313-cp313-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 869e5e699a55aa9191e209b2e3b4b0f16d864d47bcaa8fc132b70395f1ca6f58
MD5 9fad8d3b4e82d1f19419db06851b76ed
BLAKE2b-256 8b2e3b32a292af16c340daa2e5d045acb67212454227d2fca885f712847081f2

See more details on using hashes here.

Provenance

The following attestation bundles were made for rugo-0.1.20-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.20-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for rugo-0.1.20-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 7756db491b475e83bc537be4be50b0670f2bb2f33216f6a059b96589eccc340b
MD5 18b505ac54efb709ed109a6ac12d2df2
BLAKE2b-256 e3928a6692bff42078408c57100f781f6074e5b3ff77f30ba4409a5decfbc39f

See more details on using hashes here.

Provenance

The following attestation bundles were made for rugo-0.1.20-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.20-cp312-cp312-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for rugo-0.1.20-cp312-cp312-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 6001ae3698d232e7816d9fbb8d91b52aa890394ce41ad095f2ec1edb1543794b
MD5 500d438c6772034a593e564411082c05
BLAKE2b-256 44e3b19fb53e4ffebe7fdf8b93881733cd64d886eeda540b5e1e4ddfe55ad16f

See more details on using hashes here.

Provenance

The following attestation bundles were made for rugo-0.1.20-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.20-cp312-cp312-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for rugo-0.1.20-cp312-cp312-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 ba9dc0e49e0d83f8ef54ef2891f6193e14de001f1c29abeb24027040b35b9026
MD5 57b0af98185ac21504303ccfb803a511
BLAKE2b-256 b5541a1020c4025564d17d731c617f169e011d9ca7645cc730db2f5317d2fb74

See more details on using hashes here.

Provenance

The following attestation bundles were made for rugo-0.1.20-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.20-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for rugo-0.1.20-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 e4aeddee58e46d9649874e9c77f94a857b4009385d8613e7e4801075a0cd382b
MD5 5a4b8d360440b032fd8fb5dc8f5dc50a
BLAKE2b-256 95c620e7f5702ad44b8221fc83cd8cb83a2c66379c2815b8424267333fb278f4

See more details on using hashes here.

Provenance

The following attestation bundles were made for rugo-0.1.20-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.20-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for rugo-0.1.20-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 c4bc6ad151b0006731aab552aa05ebf3d3124b41833d627db9159a9055fd34f3
MD5 e9b395e7cf018fedbeb7d475fbe8d658
BLAKE2b-256 ff4b02b309b25b836a664072a2a8b4a5fdbfab0f7f1bfabdf82929863197a4c4

See more details on using hashes here.

Provenance

The following attestation bundles were made for rugo-0.1.20-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.20-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for rugo-0.1.20-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 4cb46e63af8ce4ce9cd17956a84cc122623a96b22a7b50c2e79bcadee764e53a
MD5 b2f4faa22e26055157a4c27529180a9d
BLAKE2b-256 84e6bc6e7b655ec20dd2fc6c1a51daedc4dd199ff5d0b64c007e28ed9188100f

See more details on using hashes here.

Provenance

The following attestation bundles were made for rugo-0.1.20-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.20-cp311-cp311-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for rugo-0.1.20-cp311-cp311-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 058d5e385c3580c82afb0c8f9679a9d67d1d8eaabd2dcde22889f092dc24d233
MD5 d0e6ea0f384d7453e81adcd8bd6ab385
BLAKE2b-256 1873fafe3095e8dfff37685d724d6cf9aaee8918fd63d3f22a805f73cd843acd

See more details on using hashes here.

Provenance

The following attestation bundles were made for rugo-0.1.20-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.20-cp311-cp311-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for rugo-0.1.20-cp311-cp311-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 07b9b383aa437230ed08bf47a67f510e69aa1fc94c54b2d833ba7927a20de7e0
MD5 7d0ddcbe6bea8e98273a7368321ec2e8
BLAKE2b-256 20d295da1724131237d267ed6f7bcb00dda807d599e7df277a34eb94e9135edc

See more details on using hashes here.

Provenance

The following attestation bundles were made for rugo-0.1.20-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.20-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for rugo-0.1.20-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 c571fd33a34f16fd95771aae77141e7f279c59a452205af2eed48f29e9596201
MD5 5e8606bc30ce31b7f2327b3857f59b7c
BLAKE2b-256 c50e5546a3e162ad50b30698934658486455d4ca82bdb5fe159f0ccecb566544

See more details on using hashes here.

Provenance

The following attestation bundles were made for rugo-0.1.20-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.20-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for rugo-0.1.20-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 7a28a929169c037a1f6c093a84f66ed861fef3d8a4dde19db13d8bc0d39f95cd
MD5 5d5df5fe9e245758d286da46efd37ac4
BLAKE2b-256 c14834f50c475c1ea6e2a35f454be64e1a17e9448b968a1274ddcb8a6b5732c6

See more details on using hashes here.

Provenance

The following attestation bundles were made for rugo-0.1.20-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.20-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for rugo-0.1.20-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 396ccfb363e2495b8767dc20702a6d890362e59b7d7f0f51e790c373765a2a05
MD5 b0da24bd8ae1c0309fb24a71b61058af
BLAKE2b-256 fcf60dbbfed573d3ebfc35cf45f190faf1336bc2320dcd7690a6acd4f9335dd1

See more details on using hashes here.

Provenance

The following attestation bundles were made for rugo-0.1.20-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.20-cp310-cp310-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for rugo-0.1.20-cp310-cp310-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 8f3f6ac158f2b053dec6307bbe1e084ee41c1b7f8b542941c551f2390f3f77f8
MD5 fbf9cded284ee9435fbb92278658974a
BLAKE2b-256 999ab45b1cf7dd3a8dae4df28b29e63d319da60ff9a0765b738068906b8a5200

See more details on using hashes here.

Provenance

The following attestation bundles were made for rugo-0.1.20-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.20-cp310-cp310-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for rugo-0.1.20-cp310-cp310-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 0841654eae66697314309abeb4b518aa2a99e8b1488721a40bca184675ad679c
MD5 466ff317815c476aa2cc1937b4859955
BLAKE2b-256 63ad180b72913a56b32f6ae482a744fd77c1640bf40c5fb897de9c3ea99bbdd1

See more details on using hashes here.

Provenance

The following attestation bundles were made for rugo-0.1.20-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.20-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for rugo-0.1.20-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 85401b30ea6454e95d88e77380da38bef287bb3ee4c8138ea323f827fa479a74
MD5 543e5dfffded644ddc5f879073c72103
BLAKE2b-256 0a628917bc70920167364f4e1815b280c796f9077c95cec1bea41046f10b7bb3

See more details on using hashes here.

Provenance

The following attestation bundles were made for rugo-0.1.20-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.20-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for rugo-0.1.20-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 f6f931882e4aeb2069abd92d4b0a2d35ea6671b7cc8d73f474b67ce071925b77
MD5 006c763b741d9e2bb0fc38be6b4c9830
BLAKE2b-256 2b168bc45ecfadef17f8ca654887becc4022a1919962cff6483a240ed309c70b

See more details on using hashes here.

Provenance

The following attestation bundles were made for rugo-0.1.20-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.20-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for rugo-0.1.20-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c93afc6a53ae4c6e9bc90c2d2015cc0a48e9ed5d8949718a99bf2b72eee7e57a
MD5 799af599d7387091c76fbcb885312438
BLAKE2b-256 a17319933f86f57fc0355a77f321cca562b0e12882a69a192c2a049158af8429

See more details on using hashes here.

Provenance

The following attestation bundles were made for rugo-0.1.20-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.

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