Skip to main content

Fast, dependency-free Parquet/CSV/JSONL reader and writer (no PyArrow, no NumPy).

Project description

Rugo PyPI License

Thin · light · opinionated for low resource usage

Rugo is the file layer extracted from the Opteryx SQL engine. It was built to keep memory use low by pushing filters as early as possible — skipping columns you don't need and pruning row groups before any data is decoded.


Why Rugo?

Thin by design. Opinionated about what not to load.

Rugo was built as the file layer for the Opteryx SQL engine, where the constraint was simple: read as little data as possible, hold as little in memory as possible. Column projection and row-group pruning happen before any decoding. The result is a library that is fast on selective queries, tiny on disk, and carries no PyArrow, Pandas, or NumPy into your environment.

Metric Rugo PyArrow
Installed footprint 17 MB 124 MB
Runtime dependencies zero Arrow C++ runtime
Cold import time 5 ms 29 ms
Schema read (footer only) 0.02 ms 0.05 ms

Measured on Python 3.14, Apple M-series. Import times on a cold process (first load off disk).


Serverless-first

AWS Lambda and GCP Cloud Functions bill by memory and package size. At 17 MB installed and a 5 ms cold import, Rugo fits where PyArrow's 124 MB footprint doesn't.


Tiny container images

At 16× smaller than PyArrow, Rugo meaningfully shrinks image size, speeds scale-out, and keeps you well clear of AWS Lambda's 250 MB unzipped layer limit.


Read less, go faster

Column projection and row-group pruning are first-class citizens. Skip the columns you don't need. Skip the row groups that can't match. Rugo's advantage grows with selectivity.


No surprise dependencies

The wheel bundles everything it needs — Draken, the columnar substrate, ships inside. pip install rugo is the entire dependency story.

Where PyArrow is faster: full-table scans with no filtering. Rugo does not compete on decode throughput — it competes on how little it has to decode in the first place.


Quickstart

One install, three formats.

Rugo reads and writes Parquet, CSV, and JSONL. The API is the same shape across all three: pass a path or bytes, get columnar data back.

Installation

pip install rugo

Pre-built wheels bundle Draken — there is nothing else to install. Rugo has zero runtime dependencies.

Requirements:

  • Python 3.11+
  • A platform with a published wheel (Linux x86-64/aarch64, macOS arm64). For other platforms, see Building from source.

Data model

Rugo speaks Draken, the bundled columnar substrate:

  • A Vector is a single typed column. Call vector.to_pylist() to get a Python list of its values.
  • A Morsel is a batch of rows across several columns (a chunk of a table). Call morsel.column(b"name") to get a column Vector (note the bytes key), and len(morsel) for the row count.

Readers return Morsels (Parquet) or a result dict whose columns are Vectors (CSV, JSONL). The writers consume a Morsel. A read → write round-trip:

from rugo import parquet
from rugo.csv import write_csv
from rugo.jsonl import write_jsonl

with parquet.read_parquet("planets.parquet") as reader:
    for morsel in reader:                          # one Morsel per row group
        csv_bytes    = write_csv(morsel)           # -> bytes (RFC 4180)
        jsonl_bytes = write_jsonl(morsel)          # -> bytes (one JSON object per row)
        pq_bytes     = parquet.write_parquet(morsel)   # -> bytes (ZSTD)

Parquet

rugo.parquet is the recommended surface: one symmetric module for reading and writing that accepts a filename or an in-memory buffer, streams row-group Morsels, applies predicate pushdown, and writes Morsels back to bytes.

Quick start

from rugo import parquet

# Schema-only metadata (footer parse, no column data). Path OR bytes.
meta = parquet.read_metadata("planets.parquet")
print(meta.num_rows)                      # 9
print([c.name for c in meta.schema_columns])

# Streaming read: one Morsel per row group. `columns` projects; `filters`
# prune whole row groups via footer statistics (rows in surviving groups are
# NOT filtered — apply row-level predicates downstream).
with parquet.read_parquet(
     "planets.parquet",
    columns=["id", "name"],
    filters=[("id", ">", 4)],               # ops: = == != < <= > >= in "not in"
) as reader:
    for morsel in reader:
        print(morsel.column(b"name").to_pylist())

# Write a Draken Morsel to Parquet bytes (ZSTD by default; "none" to disable).
data = parquet.write_parquet(morsel, compression="zstd")
with open("out.parquet", "wb") as f:
    f.write(data)

rugo.parquet API

Function Returns
read_parquet(source, columns=None, filters=None) context manager yielding one Morsel per surviving row group
read_metadata(source) ParquetMetadata (num_rows, schema_columns)
write_parquet(morsel, compression="zstd") bytes (whole file)
write_parquet_with_bounds(morsel) (bytes, {col_index: (min, max)})

source is a filename (str) or bytes/bytearray/memoryview. filters is a list of (column, op, value); pruning is at row-group granularity.


Low-level API (rugo.parquet_reader)

Most callers should use rugo.parquet above. The low-level module is exposed for fine-grained control.

Metadata

Function Returns
read_metadata(path: str) ParquetMetadata(num_rows, schema_columns) (typed object)
read_metadata_from_bytes(data: bytes) same
read_metadata_from_memoryview(mv: memoryview) same (memoryview must be contiguous)
read_rowgroup_stats(data) list[{num_rows, columns:[{name, physical_type, logical_type, min, max, null_count}]}] — per-row-group stats for pushdown

schema_columns is a tuple of SchemaColumn(name, physical_type, logical_type, nullable). read_rowgroup_stats min/max are raw stat bytes (or None); decode with decode_value.

Decode

read_parquet(data, column_names=None, row_group_mask=None)
  • databytes, bytearray, or memoryview holding the full Parquet file.
  • column_nameslist[str] to project, or None for all columns.
  • row_group_mask — optional iterable, one truthy/falsy entry per row group; a falsy entry skips decoding that row group (predicate pushdown). rugo.parquet's filters= builds this from read_rowgroup_stats.
  • Returns list[Morsel] (one per decoded row group), or None on failure. On partial decode failure an individual column within a Morsel may be None.

Compatibility

Function Returns
can_decode(path: str) bool — quick compatibility signal, not a guarantee
can_decode_from_memory(data) bool — same, for an in-memory buffer

Fine-grained / range decode

Function Description
decode_column_from_chunk(chunk_bytes, col_stats, row_mask=None) Decode a single column chunk to a Draken Vector; row_mask is an optional uint8 bitmap
decode_column_from_chunk_to_python(chunk_bytes, col_stats) Decode a single column chunk to a Python list
decode_column_from_memory(data, column_name, row_group_stats, row_group_index) Decode one column from a full in-memory file, by row-group index
decode_value(physical_type, logical_type, raw, prefer_text) Decode a single raw Parquet value to a Python scalar

col_stats is the per-column stats dict for the matching row group from read_metadata.

Bloom filters

bloom_filter_maybe_contains(path, bloom_offset, bloom_length, value)   # -> bool

Evaluates a column bloom filter at the given byte offset/length for a candidate value. Bloom filter offsets and lengths are exposed in the per-column metadata returned by read_metadata.


Supported decode subset

Area Support
Physical types int32, int64, float32, float64, boolean, byte_array
Compression UNCOMPRESSED, SNAPPY, ZSTD
Encodings PLAIN, dictionary pages (PLAIN_DICTIONARY / RLE_DICTIONARY), DELTA_BINARY_PACKED, DELTA_BYTE_ARRAY
Input Path, or in-memory bytes / memoryview, with column selection

Writing

rugo.parquet_writer (and the rugo.parquet facade) serialize a Draken Morsel to a well-formed, PyArrow-readable Parquet file.

from rugo.parquet_writer import write_parquet, write_parquet_with_bounds
data = write_parquet(morsel, compression="zstd")           # -> bytes
data, bounds = write_parquet_with_bounds(morsel)           # + per-column min/max
Area Support
Column types INT8/16/32/64 (→INT64), FLOAT32 (→DOUBLE), FLOAT64, BOOL, VARCHAR/NVARCHAR/VARBINARY, VARIANT (→STRING), DATE32, TIME32/64, TIMESTAMP64 (µs/ms/ns), INTERVAL (FLBA-12), DECIMAL/DECIMAL128 (FLBA), ARRAY/LIST of those (int/float/bool/string elements), all-null (→INT32). FP16 not yet.
Encoding PLAIN values, RLE definition levels, one data page per column chunk
Compression ZSTD (default) or uncompressed
Statistics per-column min/max/null_count + column_orders (so readers trust them)
Bloom filters split-block (SBBF), XXH64, on equality-friendly columns; bloom_filters=True|False|[names]
Layout single row group per Morsel

Unsupported column types fail loud (no silent skip). Nested LIST/MAP/STRUCT and dictionary-encoded output are not yet implemented.


Limitations

  • Not a full Parquet replacement reader; decode support is intentionally narrow.
  • GZIP, LZO, BROTLI, LZ4, and LZ4_RAW compression codecs are not implemented in the decode path.
  • INT96 is not supported for value decoding in read_parquet(...).
  • FIXED_LEN_BYTE_ARRAY value decoding is not implemented.
  • Decode logic is built around DATA_PAGE (V1); DATA_PAGE_V2 is not handled.
  • Decode reads from a single data-page path per column chunk; files requiring full multi-page streaming decode may return partial or failed column results.
  • Nested, list, and map-heavy files are not a primary decode target; flat primitive columns are the intended shape.
  • On partial decode failure, individual columns may be returned as None.
  • Metadata extraction is broad, but known edge cases remain around list/nested column naming normalisation.

Performance

Metadata reads (schema + row-group stats, no column data) are fast and comparable to PyArrow. The high-level read_parquet() path is correctness-first: it reconstructs Draken vectors from decoded columns and materializes through Python, so it is a serial utility rather than a throughput benchmark. The emphasis is on reading less — projection and row-group pruning — not on raw bulk scan speed.

Wide file (50 cols, 200k rows, 55 MB)

Query shape Rugo PyArrow
SELECT * ~26 ms ~17 ms
SELECT 2 cols ~9 ms ~7 ms
SELECT * WHERE score > P90 (~10% pass) ~13 ms ~27 ms
SELECT * WHERE score > P99 (~1% pass) ~10 ms ~23 ms
SELECT 2 cols WHERE score > P90 ~8 ms ~27 ms

On narrow files PyArrow is faster across the board. On wide files with filtering, Rugo is 2–3×+ faster — the crossover is driven by how many columns can be skipped and how many rows are eliminated before the typed column build.


JSONL

Quick start

from rugo.jsonl import get_jsonl_schema, read_jsonl, write_jsonl

# Infer schema from sample rows
schema = get_jsonl_schema("example.jsonl", sample_size=5)
# -> {"columns": [{"name": str, "type": str, "nullable": True}, ...]}

# Read from a file path with projection and predicate pushdown
result = read_jsonl(
     "example.jsonl",
    columns=["id", "name"],
    predicates=[("status", "==", "active")],
)
if result["success"]:
    print(result["num_rows"])
    for vec in result["columns"]:           # list of Draken Vectors
        print(vec.to_pylist())

# Read from bytes input
with open("example.jsonl", "rb") as f:
    result = read_jsonl(f.read(), columns=["id"])

# Write a Morsel to JSONL bytes (one JSON object per row)
data = write_jsonl(morsel)

read_jsonl

read_jsonl(
    data,                        # file path (str) or buffer (bytes/bytearray/memoryview)
    columns=None,                # list[str] to project, or None for all
    predicates=None,             # list[(column, op, value)]; op in ==, !=, <, <=, >, >=
    explicit_schema=None,        # provide a schema dict instead of inferring
    infer_schema=True,
    infer_sample_size=5,         # rows sampled for type inference
    parse_arrays=True,
    parse_objects=True,
    fail_on_error=True,
    use_threads=True,            # SIMD-accelerated parallel scan/interpret
    min_rows_per_thread=2048,
)

Return dict:

Key Value
success bool
column_names list[str]
num_rows int — rows passing predicates
columns list of Draken Vectors
schema dict[str, str] — column name → inferred type string
error str — present only when success is False

Inferred type strings: int64, double, boolean, string, bytes, object, null, array[T].


get_jsonl_schema

get_jsonl_schema(data, sample_size=5)
# -> {"columns": [{"name": str, "type": str, "nullable": True}, ...]}

Infers the schema from the first sample_size rows. Returns {"columns": []} on failure; does not raise.


Writing

write_jsonl(morsel) returns bytes, one JSON object per row. Value formatting is done in C++: doubles use shortest round-trip (std::to_chars); dates/timestamps render ISO-8601 strings; decimals are JSON numbers; arrays render as JSON arrays (null list / empty list / null element are all distinguished); nulls are null.


Performance

116 MB, 1.5 M rows, 5 cols, versus PyArrow read_json (multithreaded):

Query shape Rugo PyArrow
SELECT * ~67 ms ~53 ms
SELECT one_col ~33 ms ~53 ms
SELECT col WHERE id < 150k (~10% pass) ~15 ms ~53 ms
SELECT col WHERE id < 15k (~1% pass) ~7 ms ~53 ms

Bulk SELECT * is materialiser-bound — PyArrow has an edge. The analytical shapes — project + filter — are 1.2–5×+ faster, and the advantage grows with selectivity and table width.


Caveats

  • String/object-heavy fields are often returned as bytes (binary-preserving), not eagerly decoded Python str/dict values.
  • Mixed or deeply nested array-object content may fall back to raw JSON text/bytes in edge cases.
  • Schema inference is sampled (infer_sample_size rows only); pass explicit_schema when the schema is known to avoid mismatches on heterogeneous files.

CSV

Quick start

from rugo.csv import read_csv, write_csv

result = read_csv("data.csv")                                           # all columns
result = read_csv("data.csv", columns=["col1", "col2"])                 # projection
result = read_csv("data.csv", columns=["name"], predicates=[("age", ">", 30)])
result = read_csv("data.tsv", delimiter="\t")                           # TSV variant

if result["success"]:
    for vec in result["columns"]:           # list of Draken Vectors
        print(vec.to_pylist())

# Write a Morsel to CSV bytes (RFC 4180)
data = write_csv(morsel, delimiter=",", header=True)

read_csv

read_csv(
    data,                # file path (str) or buffer (bytes/bytearray/memoryview)
    columns=None,        # list[str] to project, or None for all
    predicates=None,     # list[(column, op, value)]; op in ==, !=, <, <=, >, >=
    delimiter=",",       # field separator character
    has_header=True,     # whether the first row is a header
    use_threads=True,    # parallel scan
)
Parameter Type Description
data str / bytes / bytearray / memoryview File path or in-memory buffer
columns list[str] or None Columns to project; None returns all
predicates list[tuple] or None Filter predicates applied before typed build
delimiter str Single-character field separator
has_header bool Whether row 0 is a header row
use_threads bool Enable parallel scan

Return dict:

Key Value
success bool
column_names list[str]
num_rows int — rows passing predicates
columns list of Draken Vectors

Type inference cascade per field: int64float64VARCHARnull (empty field).


Writing

write_csv(morsel, delimiter=",", header=True) returns RFC 4180 bytes: fields are quoted when they contain the delimiter/quote/newline (quotes doubled), nulls are empty fields, and ARRAY columns render as a (quoted) JSON array. The CSV and JSONL writers share the same C++ value formatter.


Performance

Measured against pyarrow.csv.read_csv. The expensive step is typed column build; Rugo makes it survivor-only, which pays off when there is something to skip.

Narrow file — 3 cols, 1 M rows, 12.6 MB:

Query shape Rugo PyArrow
SELECT * ~7 ms ~3 ms
SELECT 2 cols ~6 ms ~3 ms
WHERE id > P90 (~10% pass) ~6 ms ~4 ms
WHERE id > P99 (~1% pass) ~5 ms ~3 ms

Wide file — 50 cols, 200 k rows, 55 MB:

Query shape Rugo PyArrow
SELECT * ~26 ms ~17 ms
SELECT 2 cols ~9 ms ~7 ms
SELECT * WHERE score > P90 (~10% pass) ~13 ms ~27 ms
SELECT * WHERE score > P99 (~1% pass) ~10 ms ~23 ms
SELECT 2 cols WHERE score > P90 ~8 ms ~27 ms

On narrow files PyArrow is faster across the board. On wide files with filtering, Rugo is 2–3×+ faster — the crossover is driven by how many columns can be skipped and how many rows are eliminated before the typed column build.


Known limitations

  • Field length is capped at 65,535 bytes (uint16_t index); longer fields are silently truncated.
  • Type inference is speculative from sampled values; there is no schema-override parameter — inferred types may be wrong on heterogeneous columns.
  • Predicate operator set is fixed: ==, !=, <, <=, >, >=.

Design notes

  • No PyArrow, no NumPy. Every read and write path is pure C++/Cython and Draken-native. Output Parquet is still standard and PyArrow-readable.
  • Fail loud. can_decode(...) is a quick compatibility signal, not a guarantee; on partial decode failure a selected column may be returned as None — check, don't assume success.
  • Read less. The advantage over bulk readers comes from projection and predicate/row-group pruning, not raw scan throughput.

Example notebook

space_missions.ipynb walks through a complete workflow on a real dataset:

  • Download a Parquet file and inspect its schema with read_metadata
  • Filter launches by company with row-group pruning and row-level predicate
  • Aggregate total spend per company across streaming morsels
  • Write filtered results to JSONL and read them back

Building from source

End users should pip install rugo and use the published wheels. To build from the opteryx-core source tree (Rugo is developed there alongside Draken and the Opteryx engine):

python rugo/setup.py bdist_wheel     # build the standalone Rugo wheel (from repo root)

For in-place development of the whole tree, use the repository's make compile.


License

Apache-2.0. Rugo is part of the Opteryx project.

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.

rugo-0.4.8-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (26.2 MB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.17+ x86-64

rugo-0.4.8-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl (25.0 MB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.17+ ARM64

rugo-0.4.8-cp314-cp314t-macosx_11_0_arm64.whl (2.9 MB view details)

Uploaded CPython 3.14tmacOS 11.0+ ARM64

rugo-0.4.8-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (25.9 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.17+ x86-64

rugo-0.4.8-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl (24.7 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.17+ ARM64

rugo-0.4.8-cp314-cp314-macosx_11_0_arm64.whl (2.9 MB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

rugo-0.4.8-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (25.9 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

rugo-0.4.8-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl (24.7 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ ARM64

rugo-0.4.8-cp313-cp313-macosx_11_0_arm64.whl (2.9 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

rugo-0.4.8-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (26.0 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

rugo-0.4.8-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl (24.7 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ ARM64

rugo-0.4.8-cp312-cp312-macosx_11_0_arm64.whl (2.9 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

rugo-0.4.8-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (26.0 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

rugo-0.4.8-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl (24.7 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ ARM64

rugo-0.4.8-cp311-cp311-macosx_11_0_arm64.whl (2.9 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

File details

Details for the file rugo-0.4.8-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.

File metadata

File hashes

Hashes for rugo-0.4.8-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 c09e6f893c6c5b1f9e8157c0fa8a8c8cdee0fdde46430b9b07c18f7773cdf4d8
MD5 8c7704d3dc2f399fded1e76691a6c7d4
BLAKE2b-256 257595614e30fd36e902c912911ac6074843547d05f75efcb1bf214cec9fd7b5

See more details on using hashes here.

Provenance

The following attestation bundles were made for rugo-0.4.8-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl:

Publisher: release-rugo.yaml on mabel-dev/opteryx-core

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.4.8-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl.

File metadata

File hashes

Hashes for rugo-0.4.8-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl
Algorithm Hash digest
SHA256 9f4a8f9444b5c4122443da66dd767dcd3151270d68e187a9ba7de6889db552db
MD5 a26edf8420d70524347c7201a763176b
BLAKE2b-256 9a0e3bf004be6c23b6518ac59f8ecc5844fd2b84a4324f8b77a1ed52936bfbe9

See more details on using hashes here.

Provenance

The following attestation bundles were made for rugo-0.4.8-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl:

Publisher: release-rugo.yaml on mabel-dev/opteryx-core

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.4.8-cp314-cp314t-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for rugo-0.4.8-cp314-cp314t-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 edb22da951c15b75f2c05c0c456ef59ab12473ddf082f78a88894bb6e3f04236
MD5 7e1282fcba3faef264b874b555480efa
BLAKE2b-256 635e7c3f9446bce44aa7fa9cf3d287ff903f5875e3feb0c307c615efe96c08be

See more details on using hashes here.

Provenance

The following attestation bundles were made for rugo-0.4.8-cp314-cp314t-macosx_11_0_arm64.whl:

Publisher: release-rugo.yaml on mabel-dev/opteryx-core

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.4.8-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.

File metadata

File hashes

Hashes for rugo-0.4.8-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 fd9be079d18057ead258741dd1dd4a9bf8d0cea5da9ad2b8404fa7e9d225dfa5
MD5 638040e974f0acd8c5cc2638ee9eb9fa
BLAKE2b-256 7b88acf86db490f8080f809f85b0a0d0dbbaac6944259fa60ba9e6de51017e04

See more details on using hashes here.

Provenance

The following attestation bundles were made for rugo-0.4.8-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl:

Publisher: release-rugo.yaml on mabel-dev/opteryx-core

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.4.8-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl.

File metadata

File hashes

Hashes for rugo-0.4.8-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl
Algorithm Hash digest
SHA256 8c3e76abc307830d883266c7c4e494b3af8c66e31e3ac650c09f744b71d2628a
MD5 a1eb7f621d2e3c2cdc940cec2fae5029
BLAKE2b-256 eea282c4cde144ea27a859228d61b83a58e6c5d49d869a83c21c99a9fd892240

See more details on using hashes here.

Provenance

The following attestation bundles were made for rugo-0.4.8-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl:

Publisher: release-rugo.yaml on mabel-dev/opteryx-core

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.4.8-cp314-cp314-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for rugo-0.4.8-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 37dc525d1d51cfb05041901ae2d15659b8a7ad15b7a591e53af7777e07c95eef
MD5 be85e0e3b013af6234c8327166fcc5a8
BLAKE2b-256 029749b6fc48e988b0b3ee222dbc438f68f7f8e0ce6648ec04b19cbc532d28c1

See more details on using hashes here.

Provenance

The following attestation bundles were made for rugo-0.4.8-cp314-cp314-macosx_11_0_arm64.whl:

Publisher: release-rugo.yaml on mabel-dev/opteryx-core

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.4.8-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.

File metadata

File hashes

Hashes for rugo-0.4.8-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 98ba9481edf2c7ebf6c88be0ed55e989d7d7f1cc8d0fc24d18ec7960966299e0
MD5 647899ee417cbb41d868e9f4ffc66d94
BLAKE2b-256 59376537caa98217c463c6a25fc2e6fbe3e81cd671004ddc5fd967b654bafddf

See more details on using hashes here.

Provenance

The following attestation bundles were made for rugo-0.4.8-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl:

Publisher: release-rugo.yaml on mabel-dev/opteryx-core

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.4.8-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl.

File metadata

File hashes

Hashes for rugo-0.4.8-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl
Algorithm Hash digest
SHA256 ebf93014e0585c02a3ebe8f6498f8b6e7153913c280ce66e26f51077f94bcc2b
MD5 9c5b7d5cfcd10ddffdf03660fd1fdbd4
BLAKE2b-256 d22a5f613ed8f5d438e43fc2a2a7a258d6248fe116683f7dd6c9cb068aecec7a

See more details on using hashes here.

Provenance

The following attestation bundles were made for rugo-0.4.8-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl:

Publisher: release-rugo.yaml on mabel-dev/opteryx-core

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.4.8-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for rugo-0.4.8-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 1862153a8b339790a2370a202ca40bce5bff57b6fba086471fbdb178ac82680b
MD5 b834baf1d84e4f87eded642c3db39137
BLAKE2b-256 4b910a6c5295a0ea18082dbd00f72d2ca647d701b10dc571b2ca67a9ad6c9e67

See more details on using hashes here.

Provenance

The following attestation bundles were made for rugo-0.4.8-cp313-cp313-macosx_11_0_arm64.whl:

Publisher: release-rugo.yaml on mabel-dev/opteryx-core

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.4.8-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.

File metadata

File hashes

Hashes for rugo-0.4.8-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 68495f4c2fdc46576de176c4feb3867fbc6e4491ecc8425a0a06a8f5ca688919
MD5 fc9165c162d6b82b14771cb10b737dd0
BLAKE2b-256 f33359d9af4c089ba4ac4f2ae818c9182f28464477d857c2b1c5490411e54998

See more details on using hashes here.

Provenance

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

Publisher: release-rugo.yaml on mabel-dev/opteryx-core

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.4.8-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl.

File metadata

File hashes

Hashes for rugo-0.4.8-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl
Algorithm Hash digest
SHA256 43ad61b793c12adf88fe3907e4d8e4464c1b92691f885ddab7bbb1a6a057ad60
MD5 6285d67e15e19861fa4a1d35092eb588
BLAKE2b-256 dd3de7f86a812b52fe5b3d13ed51a20fd4a87b8a9f071bb24e9d6bdb376ecb91

See more details on using hashes here.

Provenance

The following attestation bundles were made for rugo-0.4.8-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl:

Publisher: release-rugo.yaml on mabel-dev/opteryx-core

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.4.8-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for rugo-0.4.8-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 ee4e1480f9b2a1091fad2d840b4f134095c58f00ec3d7dae3fd0c96d98ac89be
MD5 b7e86227575fd4ac500164be343e78c1
BLAKE2b-256 3338559706a1cfddf1c360f99f1fb341181ddf02c8db64f101a2805d98719649

See more details on using hashes here.

Provenance

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

Publisher: release-rugo.yaml on mabel-dev/opteryx-core

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.4.8-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.

File metadata

File hashes

Hashes for rugo-0.4.8-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 22cb5fe8e8f3b5ef3523d41410680dd17b1ac596608ea2f946f855b81e1edadb
MD5 aa27d75001c8b9217cae4bb9f73dc99f
BLAKE2b-256 974713335460b2b4afe2b5f84f7d829f5cefce7fadeb33ac2eb165a4281bb721

See more details on using hashes here.

Provenance

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

Publisher: release-rugo.yaml on mabel-dev/opteryx-core

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.4.8-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl.

File metadata

File hashes

Hashes for rugo-0.4.8-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl
Algorithm Hash digest
SHA256 aa35e8908deb63ecd4ef6a699fc9c5b76c3bcfae5e96329ea8161edf134791b4
MD5 060cdacb4e36c8b447d3ab4ed3426b92
BLAKE2b-256 0ddbc29236d029655d42eb415ee4e0724df4a907d114ccb4987e1fd207b96cda

See more details on using hashes here.

Provenance

The following attestation bundles were made for rugo-0.4.8-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl:

Publisher: release-rugo.yaml on mabel-dev/opteryx-core

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.4.8-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for rugo-0.4.8-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 06307297e9b543d7f2d63df1d62c7c1d2c7d7ea18c9964a44043c0616fbf3f9f
MD5 049b03f3e4b0e3b7cc4427b23bc49703
BLAKE2b-256 f4c3455553014610567ecac190d401444f0efb70d6c66cdab93010ddc692cb0f

See more details on using hashes here.

Provenance

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

Publisher: release-rugo.yaml on mabel-dev/opteryx-core

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