Skip to main content

pyribbon

CI

Ribbon filters for Python. A ribbon filter answers "is this key in the set?" for a fixed set of keys. It never says "no" for a key that is in the set. For a key that is not, it says "yes" with a probability you choose (2**-fp_bits). It needs fewer bits per key than a Bloom filter at the same false-positive rate. The core is C11, the Python layer is a thin extension, and there are no runtime dependencies.

Build a filter from your keys with RibbonFilter(keys) and ask it with key in f. examples/01_quickstart.py is the shortest complete program.

Space, build time and lookup time against the number of keys, measured on one machine against pyfusefilter and rbloom (lower is better in every panel; the numbers behind the plots, and the caveats, are under How it compares):

Space per key, build time and lookup time against the number of keys for pyribbon, Fuse8, Xor8 and rbloom

Install

pip install pyribbon

It needs Python 3.10 or newer. The wheels workflow (.github/workflows/wheels.yml) uses cibuildwheel, but no wheel has been published.

Examples

Start with 01_quickstart.py and read them in order. Each script in examples/ runs on its own (python examples/01_quickstart.py), and make example runs them all.

Script What it shows
01_quickstart.py Build a filter, ask it about keys, look at its size
02_key_types.py Which keys are accepted and how b"a", "a" and 97 stay different
03_choosing_fp_bits.py Designed against measured false-positive rate, and the cost in bits
04_save_and_load.py to_bytes, loading from a memory-mapped file, and a damaged file
05_batches_and_arrays.py contains_many with lists, array.array and numpy
06_errors.py Every error a caller can get, and what causes it
07_threads.py Querying one filter from several threads

Usage

Keys

A key can be bytes, bytearray or memoryview (hashed by content), str (as UTF-8) or int (any size; numpy integers work). b"a", "a" and 97 are three different keys. Anything else, such as a float, None or a tuple, raises TypeError, because there is no implicit str(). Python's hash() is never used, so a saved filter can be loaded in any process on any platform. DESIGN.md (section 3.1) specifies the exact mapping. examples/02_key_types.py tries each case.

Choosing fp_bits

The false-positive rate is 2**-fp_bits, with fp_bits from 1 to 32 (default 8). The table below was measured on this project's test machine at 1,000,000 keys and includes the 64-byte header. A Bloom filter needs 1.44 * fp_bits bits per key.

fp_bits false-positive rate bits per key
4 6.25% 4.50
8 0.39% 8.99
12 0.024% 13.49
16 0.0015% 17.99
20 0.000095% 22.48

The measured false-positive rate matches the designed one. Each dot below is one test case (int, str and bytes keys, fp_bits 1 to 16, up to 100 million negative probes each); docs/measurements.md lists them all.

Measured false-positive rate divided by the designed rate 2^-r for every test case: all dots lie on 1.0 within their 95% intervals

examples/03_choosing_fp_bits.py measures the rate and the size for a few values of fp_bits on your own machine.

Saving and loading

to_bytes() produces a versioned, little-endian format with a magic number and checksums. from_buffer() queries the bytes where they are, without copying them, so a memory-mapped file uses no memory beyond the pages you touch:

The whole round trip, including a memory-mapped file and a damaged one, is in examples/04_save_and_load.py.

from_buffer(buf, verify=False) skips the payload checksum, which would read every byte, so a huge mapped file stays lazy. The header is always validated. The loader treats its input as untrusted: a truncated, corrupted or hostile buffer raises FormatError (a ValueError) and is never read outside its bounds. The checksum detects accidental corruption only. It is not a MAC, so it does not protect against tampering. Do not modify a buffer while a filter is using it.

Batches and arrays

contains_many(keys) returns a list[bool]. A 1-D integer buffer (array.array, numpy) is hashed in C without the GIL, and gives exactly the same results as querying the same ints one at a time:

examples/05_batches_and_arrays.py shows both, with and without numpy.

Errors

A build that finds no solvable system after max_attempts seeds raises ConstructionError; it never returns a broken filter. Bad serialized data raises FormatError. Both are subclasses of RibbonError. Invalid arguments raise ValueError or TypeError.

examples/06_errors.py triggers each of them.

Threads

A filter is immutable, so any number of threads can query the same filter at once. Builds and large batches release the GIL. pickle and copy work. Wheels for the free-threaded build of CPython are not built yet. examples/07_threads.py queries one filter from eight threads.

How it compares

The tables in this section come from make bench and are copied in by benchmarks/update_readme.py; a test fails if a number here differs from the report. docs/benchmark.md has the machine description, method, medians, spreads and caveats, docs/benchmark.json the raw data. The figure above comes from benchmarks/make_figures.py; the full six-panel plot is docs/benchmark.png. The baselines are pyfusefilter (Xor8, Xor16, Fuse8 and Fuse16; it is the maintained successor of pyxorfilter) and rbloom (a Bloom filter). All numbers come from one machine (an i7-7700, CPython 3.14), pinned to one core.

The first table summarises the largest size, comparing pyribbon with the best other filter of the same fingerprint width:

Where pyribbon wins and loses (int keys, n = 10,000,000):

Class Metric pyribbon Best other Delta Verdict
8-bit bits/key 9.19 9.02 (Fuse8) +2% pyribbon behind
8-bit bits/key above log2(1/FPR) 1.18 1.00 (Fuse8) +17% pyribbon behind
8-bit build ns/key 94 219 (rbloom 2^-8, builtin hash()) -57% pyribbon ahead
8-bit in member ns 91 229 (rbloom 2^-8, builtin hash()) -60% pyribbon ahead
8-bit in non-member ns 93 155 (rbloom 2^-8, builtin hash()) -40% pyribbon ahead
8-bit batch Mkeys/s (50/50 mix) 18.04 5.01 (rbloom 2^-8, builtin hash()) +260% pyribbon ahead
16-bit bits/key 18.39 18.04 (Fuse16) +2% pyribbon behind
16-bit bits/key above log2(1/FPR) 2.36 1.95 (Fuse16) +21% pyribbon behind
16-bit build ns/key 109 441 (rbloom 2^-16, builtin hash()) -75% pyribbon ahead
16-bit in member ns 138 431 (rbloom 2^-16, builtin hash()) -68% pyribbon ahead
16-bit in non-member ns 113 169 (rbloom 2^-16, builtin hash()) -33% pyribbon ahead
16-bit batch Mkeys/s (50/50 mix) 10.81 3.24 (rbloom 2^-16, builtin hash()) +234% pyribbon ahead

Delta is relative to the best other filter of the same fingerprint class, including rbloom with its builtin hash(); a negative delta means pyribbon is lower. Lower is better except for batch throughput. The 'above log2(1/FPR)' rows move with the measured FPR, whose uncertainty is in the notes. The batch row compares contains_many with the other libraries' per-key loop, because none of them has a batch API. The table is computed from the raw results of this run.

The next tables show how the results change with the number of keys:

Space, 8-bit class (bits per key including the 64-byte header; last column: pyribbon relative to Fuse8):

n pyribbon Xor8 Fuse8 rbloom 2^-8 pyribbon vs Fuse8
1,000 9.22 10.27 11.58 11.54 -20.4%
10,000 8.65 9.88 10.07 11.54 -14.0%
100,000 8.79 9.84 9.51 11.54 -7.5%
1,000,000 8.99 9.84 9.04 11.54 -0.6%
10,000,000 9.19 9.84 9.02 11.54 +2.0%

Build time (ns per key). pyfusefilter as shipped hashes every key in Python; the last column is its bare C core on pre-hashed keys, which is what a C-to-C comparison would use:

n pyribbon (Python keys) Fuse8 as shipped Fuse8 C core only
1,000 68 549 42
10,000 56 529 28
100,000 57 555 28
1,000,000 71 582 40
10,000,000 94 613 57

Query: key in f in ns (member / non-member) and contains_many throughput (million keys per second, 50/50 mix, from a list and from an array('q')):

n pyribbon in Fuse8 in pyribbon batch (list) pyribbon batch (array)
1,000 46 / 40 685 / 698 21.9 30.7
10,000 46 / 40 727 / 699 22.1 30.7
100,000 47 / 43 729 / 705 21.0 28.9
1,000,000 54 / 52 728 / 737 21.0 28.6
10,000,000 91 / 93 806 / 804 18.0 24.0

On space, pyribbon is the smallest filter up to about a hundred thousand keys, roughly level with Fuse8 at a million, and slightly larger than Fuse8 at ten million. With width 64 the overhead grows with the logarithm of the set size. It stays well below a Bloom filter at every size.

Building from Python keys, pyribbon is several times faster than pyfusefilter as shipped, because that package hashes every key in Python. That says something about the Python wrapper, not the algorithm: on pre-hashed keys the bare C core of Fuse8 builds faster than pyribbon's elimination (last column of the build table). pyribbon also builds faster than rbloom here, which calls Python's hash() per key.

key in f takes tens of nanoseconds in the C extension, and a good part of that is the interpreter's call overhead. pyfusefilter goes through cffi and hashes in Python. The batch API, especially with an integer array, avoids most of the per-key interpreter cost.

The caveats are in docs/benchmark.md. The numbers come from one machine with a powersave governor, so absolute figures do not transfer, only the comparisons within a run. The baselines are measured as shipped, including the Python-side hashing they do.

How it works

Each key becomes one linear equation over GF(2) with a window of 64 consecutive unknowns. The unknowns are r-bit rows, chosen so that every key's equation holds. A query XORs the rows its equation selects and compares the result with the key's r-bit fingerprint. Building is banded Gaussian elimination. If a random key set happens to be unsolvable (a few percent of attempts at the default size), the build retries with a new seed.

The design is the standard Ribbon filter of Dillinger and Walzer, "Ribbon filter: practically smaller than Bloom and Xor" (arXiv:2103.02515), with width 64 and the interleaved column layout. RESEARCH.md has the literature survey and DESIGN.md the decisions, formats and measurements behind this implementation. The C core builds and tests without Python (make -C core test).

Limits

  • A filter is static: nothing can be inserted or deleted after the build. Duplicate keys are harmless and counted by len().
  • It uses about 1.12 * fp_bits bits per key at a million keys, against 1.44 * fp_bits for Bloom filters. With width 64 the overhead grows with the logarithm of the set size, so binary-fuse filters are smaller from about a million keys up (see the tables above). Width 128 or sharding would remove that overhead; both are on the roadmap.
  • Small sets are padded. The minimum is 128 rows: 128 bytes plus a 64-byte header at fp_bits=8. Use a plain set for a few dozen keys.
  • The build uses about 26 bytes per key temporarily (an array of hashes and the elimination state). Its elimination is also slower than the bare C core of the fuse filters (see the build table above).
  • Hashes are 64-bit, so two distinct keys with the same hash are indistinguishable (probability about n**2 / 2**65).
  • The timings here were measured on one Linux x86-64 machine. CI builds wheels and runs the tests on Linux (x86-64 and ARM, manylinux and musllinux), macOS (Intel and Apple silicon) and Windows (MSVC, x64) for Python 3.10 and newer. Nothing has been run on 32-bit or big-endian machines, and wheels for the free-threaded build of CPython are not built.
  • pyribbon is not on PyPI. Nothing has been published.

Development

make venv install-dev   # virtualenv + editable install with the dev tools
make check              # ruff, docstring check, mypy --strict + stubtest, C tests, Python tests
make c-asan c-portable  # C tests under ASan/UBSan, and with the portable bit-op fallbacks
make c-fuzz             # fuzz the loader
make stats              # millions of probes: measured false-positive rates (docs/measurements.md)
make bench              # the benchmark (docs/benchmark.png, docs/benchmark.md) and the README figures
make figures            # redraw docs/img/*.png from the saved results, without measuring again

Licence and credits

pyribbon is MIT licensed (LICENSE). The vendored xxHash header (core/vendor/xxhash.h) is BSD 2-Clause (LICENSES/). The algorithm is by Peter C. Dillinger and Stefan Walzer. This implementation was written from their papers, not from existing code.

Metadata

Release files for pyribbon 0.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for pyribbon 0.1.0
File Size Uploaded Provenance Actions
pyribbon-0.1.0.tar.gz 197.0 kB Without provenance Details for pyribbon-0.1.0.tar.gz

Built distributions (wheels)

Table of built distributions (wheels) for pyribbon 0.1.0
File Actions
pyribbon-0.1.0-cp311-abi3-win_amd64.whl CPython 3.11 abi3 Windows x86-64 Details for pyribbon-0.1.0-cp311-abi3-win_amd64.whl
pyribbon-0.1.0-cp311-abi3-musllinux_1_2_x86_64.whl CPython 3.11 abi3 Linux musl 1.2+ x86-64 Details for pyribbon-0.1.0-cp311-abi3-musllinux_1_2_x86_64.whl
pyribbon-0.1.0-cp311-abi3-musllinux_1_2_aarch64.whl CPython 3.11 abi3 Linux musl 1.2+ ARM64 Details for pyribbon-0.1.0-cp311-abi3-musllinux_1_2_aarch64.whl
pyribbon-0.1.0-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl CPython 3.11 abi3 Linux glibc 2.28+ x86-64, Linux glibc 2.17+ x86-64 Details for pyribbon-0.1.0-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
pyribbon-0.1.0-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl CPython 3.11 abi3 Linux glibc 2.17+ ARM64, Linux glibc 2.28+ ARM64 Details for pyribbon-0.1.0-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
pyribbon-0.1.0-cp311-abi3-macosx_11_0_arm64.whl CPython 3.11 abi3 macOS 11.0+ ARM64 Details for pyribbon-0.1.0-cp311-abi3-macosx_11_0_arm64.whl
pyribbon-0.1.0-cp311-abi3-macosx_10_9_x86_64.whl CPython 3.11 abi3 macOS 10.9+ x86-64 Details for pyribbon-0.1.0-cp311-abi3-macosx_10_9_x86_64.whl
pyribbon-0.1.0-cp310-cp310-win_amd64.whl CPython 3.10 CPython 3.10 Windows x86-64 Details for pyribbon-0.1.0-cp310-cp310-win_amd64.whl
pyribbon-0.1.0-cp310-cp310-musllinux_1_2_x86_64.whl CPython 3.10 CPython 3.10 Linux musl 1.2+ x86-64 Details for pyribbon-0.1.0-cp310-cp310-musllinux_1_2_x86_64.whl
pyribbon-0.1.0-cp310-cp310-musllinux_1_2_aarch64.whl CPython 3.10 CPython 3.10 Linux musl 1.2+ ARM64 Details for pyribbon-0.1.0-cp310-cp310-musllinux_1_2_aarch64.whl
pyribbon-0.1.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl CPython 3.10 CPython 3.10 Linux glibc 2.17+ x86-64, Linux glibc 2.28+ x86-64 Details for pyribbon-0.1.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
pyribbon-0.1.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl CPython 3.10 CPython 3.10 Linux glibc 2.17+ ARM64, Linux glibc 2.28+ ARM64 Details for pyribbon-0.1.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
pyribbon-0.1.0-cp310-cp310-macosx_11_0_arm64.whl CPython 3.10 CPython 3.10 macOS 11.0+ ARM64 Details for pyribbon-0.1.0-cp310-cp310-macosx_11_0_arm64.whl
pyribbon-0.1.0-cp310-cp310-macosx_10_9_x86_64.whl CPython 3.10 CPython 3.10 macOS 10.9+ x86-64 Details for pyribbon-0.1.0-cp310-cp310-macosx_10_9_x86_64.whl

Total release size: 1.2 MB

Release files / pyribbon-0.1.0.tar.gz

Download URL pyribbon-0.1.0.tar.gz
Size 197.0 kB
Tags Source
SHA-256 checksum
How to use checksums
d473c6bacb208362a17e7f078463644926e1c6682b6e37199efecef8f2b17733
BLAKE2b-256 checksum
How to use checksums
72e02d1aea0d2ffdd7e0f97fdf7e9f2ab658e64f7a4c491667ced052f5d5109e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.13.8 {"installer":{"name":"uv","version":"0.13.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / pyribbon-0.1.0-cp311-abi3-win_amd64.whl

Download URL pyribbon-0.1.0-cp311-abi3-win_amd64.whl
Size 37.0 kB
Tags CPython 3.11 Windows x86-64 abi3
SHA-256 checksum
How to use checksums
6ab2aac40698262a5ee7802db8b844c3d1a925596cfdea78933d65c062288da7
BLAKE2b-256 checksum
How to use checksums
868eacc8e9ae8c6f9b14880e52ffb8fe16746f7b689bb6038cdc8129222adfa0
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.13.8 {"installer":{"name":"uv","version":"0.13.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / pyribbon-0.1.0-cp311-abi3-musllinux_1_2_x86_64.whl

Download URL pyribbon-0.1.0-cp311-abi3-musllinux_1_2_x86_64.whl
Size 92.6 kB
Tags CPython 3.11 Linux musl 1.2+ x86-64 abi3
SHA-256 checksum
How to use checksums
d35706310d7f8b8fd61ed1c6a73e9141091a602bdbf95d9f278b9b7a385fcee8
BLAKE2b-256 checksum
How to use checksums
a3ff07c3d13ba552b7fd879cc4391461549272b6a74dc5051285ae9922f608c2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.13.8 {"installer":{"name":"uv","version":"0.13.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / pyribbon-0.1.0-cp311-abi3-musllinux_1_2_aarch64.whl

Download URL pyribbon-0.1.0-cp311-abi3-musllinux_1_2_aarch64.whl
Size 91.4 kB
Tags CPython 3.11 Linux musl 1.2+ ARM64 abi3
SHA-256 checksum
How to use checksums
43ad2ffc13f8f0917cc8b620b748d513a65542e189ec61f07582dbdbd75bb6b9
BLAKE2b-256 checksum
How to use checksums
4588a872e1c5ff4718c1986dbbb6640e7ea7f281fcb53ece6dbe1c8ea62329f3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.13.8 {"installer":{"name":"uv","version":"0.13.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / pyribbon-0.1.0-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl

Download URL pyribbon-0.1.0-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Size 93.9 kB
Tags CPython 3.11 Linux glibc 2.17+ x86-64 Linux glibc 2.28+ x86-64 abi3
SHA-256 checksum
How to use checksums
daca71e7d21105ad8a56666489fe12f61a32f66212e6892efb18dd4550a782d3
BLAKE2b-256 checksum
How to use checksums
d541c76e0b6131c1f9d64b2af6046a230727b4b694701a8f837f78ae0778e54e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.13.8 {"installer":{"name":"uv","version":"0.13.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / pyribbon-0.1.0-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl

Download URL pyribbon-0.1.0-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Size 93.4 kB
Tags CPython 3.11 Linux glibc 2.17+ ARM64 Linux glibc 2.28+ ARM64 abi3
SHA-256 checksum
How to use checksums
8e55d9bc735484517c390c6a22ed3920532335918c389d00198c310fefd53595
BLAKE2b-256 checksum
How to use checksums
1212d710d52e667ec5c22d5544608f392b0f8fe24bd51061959b4a7241a0e40f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.13.8 {"installer":{"name":"uv","version":"0.13.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / pyribbon-0.1.0-cp311-abi3-macosx_11_0_arm64.whl

Download URL pyribbon-0.1.0-cp311-abi3-macosx_11_0_arm64.whl
Size 36.9 kB
Tags CPython 3.11 abi3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
b175dbe45eaa3ee0f751344aa24e7a96cdfa81a15f171793a4777d6701cd3aa4
BLAKE2b-256 checksum
How to use checksums
14ae6d88d24064d421928012f3c99998ebfcac1ba9bc1c78e4eee3523251a828
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.13.8 {"installer":{"name":"uv","version":"0.13.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / pyribbon-0.1.0-cp311-abi3-macosx_10_9_x86_64.whl

Download URL pyribbon-0.1.0-cp311-abi3-macosx_10_9_x86_64.whl
Size 35.2 kB
Tags CPython 3.11 abi3 macOS 10.9+ x86-64
SHA-256 checksum
How to use checksums
73152487e8d98521b1265c4a6896352151878b661386f57f7717cea1e28aabae
BLAKE2b-256 checksum
How to use checksums
edc3169d06af1e5a3eaf3bbbc5ebcf2d8d53c1321577778a159afc3fcb085a6d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.13.8 {"installer":{"name":"uv","version":"0.13.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / pyribbon-0.1.0-cp310-cp310-win_amd64.whl

Download URL pyribbon-0.1.0-cp310-cp310-win_amd64.whl
Size 37.1 kB
Tags CPython 3.10 Windows x86-64
SHA-256 checksum
How to use checksums
9dc75d913a1ab7b0e452eb47ea35348eda1dc9ccf67eb3425e300cedc8af2454
BLAKE2b-256 checksum
How to use checksums
9979d957639d89fdb634f20d66c7eaf31611c9229d44c1ce2f1f40ae8600a97e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.13.8 {"installer":{"name":"uv","version":"0.13.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / pyribbon-0.1.0-cp310-cp310-musllinux_1_2_x86_64.whl

Download URL pyribbon-0.1.0-cp310-cp310-musllinux_1_2_x86_64.whl
Size 96.0 kB
Tags CPython 3.10 Linux musl 1.2+ x86-64
SHA-256 checksum
How to use checksums
e3768b2ce4b295d33ad69d106fd6cfffe9ca432ea787893bbe672e2b6e735baf
BLAKE2b-256 checksum
How to use checksums
66e8b28fb5e19882e2768e8d8022d72a4adb21504e6be998126ade872e633d15
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.13.8 {"installer":{"name":"uv","version":"0.13.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / pyribbon-0.1.0-cp310-cp310-musllinux_1_2_aarch64.whl

Download URL pyribbon-0.1.0-cp310-cp310-musllinux_1_2_aarch64.whl
Size 94.9 kB
Tags CPython 3.10 Linux musl 1.2+ ARM64
SHA-256 checksum
How to use checksums
6127497eeb99371b7598f7ace7a2036639067184c9eaad632ebc986e803567e1
BLAKE2b-256 checksum
How to use checksums
84bfcec5043c120975b2b56b04d2f98caaf820b8b3fd7b119f6bd6852a82bfb8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.13.8 {"installer":{"name":"uv","version":"0.13.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / pyribbon-0.1.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl

Download URL pyribbon-0.1.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Size 97.1 kB
Tags CPython 3.10 Linux glibc 2.17+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
b080ce93bf1290c925884e1105bf22fd35a7b3652952714f5783b93b5a77e05c
BLAKE2b-256 checksum
How to use checksums
a127af8a7ce7bdd19e535f8896043eec14eba342b2767a959385847f57fa62f7
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.13.8 {"installer":{"name":"uv","version":"0.13.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / pyribbon-0.1.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl

Download URL pyribbon-0.1.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Size 96.7 kB
Tags CPython 3.10 Linux glibc 2.17+ ARM64 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
1dda00a3fa420f327094055e87138bbe3dfc3be8e7a5b61749d150f9a7fbc713
BLAKE2b-256 checksum
How to use checksums
ac46a6c04f7e202d5a54e7f6403a35feeefa470411d2db1da6943ac98af8340a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.13.8 {"installer":{"name":"uv","version":"0.13.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / pyribbon-0.1.0-cp310-cp310-macosx_11_0_arm64.whl

Download URL pyribbon-0.1.0-cp310-cp310-macosx_11_0_arm64.whl
Size 36.8 kB
Tags CPython 3.10 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
ed9bdeb47c7ec7d3d56e04a5f47cf4b12285fc102885f1f4bae8b3cb518ddd38
BLAKE2b-256 checksum
How to use checksums
2ebc4ea90b11a89c73e75cd8e805bdd18edcf57a96fd6725855ed22fdfc7d0a4
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.13.8 {"installer":{"name":"uv","version":"0.13.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / pyribbon-0.1.0-cp310-cp310-macosx_10_9_x86_64.whl

Download URL pyribbon-0.1.0-cp310-cp310-macosx_10_9_x86_64.whl
Size 35.2 kB
Tags CPython 3.10 macOS 10.9+ x86-64
SHA-256 checksum
How to use checksums
b05c5590005639a80123bf9e0495f3ef523975fd847177920b17e05cc7183357
BLAKE2b-256 checksum
How to use checksums
c6eda380865bae422c72668f67fca3247f550ab39c0f355806b884952fb32118
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.13.8 {"installer":{"name":"uv","version":"0.13.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Security for pyribbon 0.1.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

0.1.0 This release

15 release files No provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page