Python bindings for the genogrove C++ library - a specialized B+ tree for genomic intervals
Project description
pygenogrove
Python bindings for the genogrove C++ library - a specialized B+ tree data structure optimized for genomic interval storage and querying.
Installation
Building from Source
Requirements:
- C++20 compatible compiler
- CMake 3.15+
- Python 3.8+
# Clone with submodules
git clone --recursive https://github.com/genogrove/pygenogrove.git
cd pygenogrove
# Build using CMake
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build
# The built module will be in build/pygenogrove.so (or .pyd on Windows)
Using pip
pip install pygenogrove
Using conda/mamba
Quick Start
import pygenogrove as pg
# Create a grove with order 100 (max 99 keys per node)
grove = pg.Grove(100)
# Create intervals — coordinates are closed [start, end] (both inclusive)
interval1 = pg.Interval(100, 200)
interval2 = pg.Interval(150, 250)
interval3 = pg.Interval(300, 400)
# Insert intervals into different chromosomes
grove.insert("chr1", interval1)
grove.insert("chr1", interval2)
grove.insert("chr2", interval3)
print(f"Total intervals: {len(grove)}") # Output: Total intervals: 3
# Query for overlapping intervals
query = pg.Interval(175, 225)
results = grove.intersect(query, "chr1")
print(f"Found {len(results)} overlapping intervals")
for key in results:
interval = key.value
print(f" {interval.start}-{interval.end}")
Usage Examples
Basic Operations
import pygenogrove as pg
# Create a grove (default order is 3; minimum is 3)
grove = pg.Grove()
# Create and insert intervals
interval = pg.Interval(1000, 2000)
key = grove.insert("chr1", interval)
# Access interval properties (read-only)
print(f"Start: {interval.start}") # Output: Start: 1000
print(f"End: {interval.end}") # Output: End: 2000
Important — do not mutate an inserted interval. Interval.start and
Interval.end are intentionally read-only, and Interval.set_range(start, end)
must only be used on intervals you have NOT yet inserted (e.g. a query
interval you want to reuse). Mutating a stored key silently corrupts B+ tree
ordering — overlap queries will start returning wrong answers with no error.
Querying Intervals
import pygenogrove as pg
grove = pg.Grove(100)
# Insert some intervals
grove.insert("chr1", pg.Interval(100, 200))
grove.insert("chr1", pg.Interval(300, 400))
grove.insert("chr2", pg.Interval(100, 200))
# Query specific chromosome
query = pg.Interval(150, 350)
results = grove.intersect(query, "chr1")
print(f"Found {len(results)} overlaps in chr1")
for key in results:
print(f" Interval: {key.value}")
# Query across all chromosomes
all_results = grove.intersect(query)
print(f"Found {len(all_results)} overlaps across all chromosomes")
Overlap Detection
import pygenogrove as pg
# Static method for checking overlap
interval1 = pg.Interval(100, 200)
interval2 = pg.Interval(150, 250)
interval3 = pg.Interval(300, 400)
print(pg.Interval.overlaps(interval1, interval2)) # True (they overlap)
print(pg.Interval.overlaps(interval1, interval3)) # False (no overlap)
API Reference
Interval
Interval(start: int, end: int)
A genomic interval with closed [start, end] coordinates (0-based, both inclusive).
Attributes (read-only):
start: Start position (inclusive)end: End position (inclusive)
Methods:
set_range(start, end): Atomically set both endpoints. Only safe on intervals not yet inserted into a Grove (mutating a stored key corrupts B+ tree ordering).Interval.overlaps(a, b): Static method to check if two intervals overlap
Grove
Grove(order: int = 3)
A B+ tree container for genomic intervals with multi-index support.
Parameters:
order: Maximum branching factor (max keys per node = order - 1). Minimum 3.
Methods:
len(grove)/size()/indexed_vertex_count(): Number of indexed intervals across all indicesget_order(): Get the order (branching factor) of the treeinsert(index: str, interval: Interval) -> Key: Insert an interval at the specified indexintersect(query: Interval) -> QueryResult: Find overlapping intervals across all indicesintersect(query: Interval, index: str) -> QueryResult: Find overlapping intervals in specific indexflanking(query: Interval, index: str) -> FlankingResult: Find the nearest non-overlapping keys on either side of the query (predecessor / successor)
FlankingResult (returned by flanking):
predecessor: the closest key entirely before the query (aKey), orNonesuccessor: the closest key entirely after the query (aKey), orNone
Keys overlapping the query are excluded; for nested intervals the predecessor is
the one with the largest end (smallest gap). Compute the gap distance from the
returned key, e.g. query.start - result.predecessor.value.end - 1 (closed
coordinates). BedGrove/GffGrove expose flanking too (their results' keys
carry .data).
Graph overlay (directed edges between keys):
add_edge(source: Key, target: Key): Add a directed edge (raisesValueErrorif a key isNone)remove_edge(source: Key, target: Key) -> bool: Remove an edge;Trueif one was removedhas_edge(source: Key, target: Key) -> bool: Test whether an edge existsget_neighbors(source: Key) -> list[Key]: Keys directly reachable fromsourceout_degree(source: Key) -> int: Number of outgoing edges fromsourceedge_count() -> int: Total number of edges in the overlayvertex_count_with_edges() -> int: Number of keys with at least one outgoing edgeadd_external_key(interval: Interval) -> Key: Add a key outside the index that can still participate in the graph (not returned byintersect)
Serialization (zlib-compressed .gg binary):
serialize(path: str): Write the grove (intervals + graph overlay) topathdeserialize(path: str) -> Grove(static): Load a grove written byserialize
Key
Wrapper object for intervals stored in the grove. Returned by insert operations.
Attributes:
value: The interval value of this key
QueryResult
Result object containing matching intervals from a query.
Attributes:
query: The query interval used for the searchkeys: List of matching keys
Methods:
__len__(): Number of results__iter__(): Iterate over matching keys
BedGrove (interval grove with BED data)
BedGrove is the data-carrying counterpart of Grove: each indexed interval
also carries an associated BedEntry payload, so prebuilt .gg files that
store BED records can be loaded, queried, and traversed from Python.
import pygenogrove as pg
g = pg.BedGrove(100)
# insert(index, interval, data) — the interval is the key, BedEntry is the payload
entry = pg.BedEntry("chr1", 1000, 2000) # BED-native coords (0-based, half-open)
entry.name = "BRCA1"
entry.score = 900
entry.strand = "+"
key = g.insert("chr1", pg.Interval(1000, 1999), entry)
# the returned key exposes both the interval value and the BED payload
print(key.value.start, key.data.name) # 1000 BRCA1
for hit in g.intersect(pg.Interval(1500, 1600), "chr1"):
print(hit.data.name, hit.data.score)
# serialize/deserialize preserves the BedEntry data
g.serialize("genes.gg")
reloaded = pg.BedGrove.deserialize("genes.gg")
BedGrove exposes the same surface as Grove (multi-index insert/intersect,
the graph overlay, and serialize/deserialize), with these differences:
insert(index: str, interval: Interval, data: BedEntry) -> BedKeytakes the BED payload.add_external_key(interval: Interval, data: BedEntry) -> BedKeytakes the payload too.- Entry-deriving inserts (no hand-conversion of coordinates):
insert(index, entry) -> BedKey— a 2-argument overload: pass a bareBedEntryand theIntervalkey is derived from its native coordinates (BED's half-open[s, e)→ closed[s, e-1]; GFF's 1-based[s, e]→[s-1, e-1]). This is the foolproof way to load records from a reader.insert_bulk(index, entries, presorted=False) -> list[BedKey]— same idea for a whole list of bare entries.
- Fast-path inserts (data-carrying groves only):
insert_sorted(index, interval, data) -> BedKey— single insert on the rightmost-append path (skips tree traversal).insert_bulk(index, items, presorted=False) -> list[BedKey]— insert many explicit(Interval, BedEntry)records at once (10–20× faster for large datasets; an empty index is built bottom-up in O(n)).presorted=Trueassumes the records are already sorted by interval (skips the internal sort).- Precondition: sorted/bulk inserts require ascending intervals, and when
appending to a non-empty index every new interval must be greater than all
existing ones. Violating this corrupts B+ tree ordering — use plain
insertif unsure. (GffGrovehas all the same methods.)
BedKey is like Key but adds a data attribute:
value: the interval (returned by copy; do not rely on mutating it)data: the associatedBedEntry— a live, mutable reference (unlikevalue, the payload is not part of the B+ tree ordering, so editing it in place is safe)
BedQueryResult is the BedGrove analog of QueryResult (its keys are BedKeys).
BedEntry
A single BED record. Coordinates are BED-native: 0-based, half-open [start, end)
(distinct from the closed [start, end] of Interval used as the grove key).
BedEntry(chrom: str, start: int, end: int)
Attributes (read/write):
chrom(str),start(int),end(int)name:Optional[str](BED4+)score:Optional[int](BED5+)strand:Optional[str]— a single character ('+','-','.'); assigning an empty or multi-character string raisesValueError,Noneclears it (BED6+)thickness:Optional[ThickInfo](BED7+)item_rgb:Optional[RgbColor](BED9+)blocks:Optional[BlockInfo](BED12)
ThickInfo(start, end), RgbColor(red, green, blue) (channels 0–255), and
BlockInfo(count, sizes, starts) (with list[int] sizes/starts) are the
supporting value types. List fields are returned/assigned by copy.
GffGrove (interval grove with GFF/GTF data)
GffGrove is the same data-carrying grove for GFF3/GTF records — identical
surface to BedGrove, with a GffEntry payload instead of BedEntry:
import pygenogrove as pg
g = pg.GffGrove(100)
entry = pg.GffEntry("chr1", 1000, 2000, "gene") # GFF-native coords (1-based, inclusive)
entry.source = "ensembl"
entry.strand = "+"
entry.attributes = {"gene_id": "ENSG1", "gene_name": "BRCA1"}
key = g.insert("chr1", pg.Interval(999, 1999), entry)
print(key.data.type, key.data.get_gene_id()) # gene ENSG1
for hit in g.intersect(pg.Interval(1500, 1600), "chr1"):
print(hit.data.type, dict(hit.data.attributes))
g.serialize("genes.gg")
reloaded = pg.GffGrove.deserialize("genes.gg")
GffKey mirrors BedKey (value is a copy, data is a live mutable GffEntry
reference); GffQueryResult is the GffGrove analog of QueryResult.
GffEntry
A single GFF3/GTF record. Coordinates are GFF-native: 1-based, both endpoints
inclusive (distinct from Interval's 0-based closed and BedEntry's 0-based
half-open).
GffEntry(seqid: str, start: int, end: int, type: str)
Attributes (read/write):
seqid(str),source(str),type(str),start(int),end(int)score:Optional[float]strand:Optional[str]— a single character ('+','-','.','?'); empty or multi-character raisesValueError,Noneclears itphase:Optional[int](CDS phase 0/1/2)attributes:dict[str, str]— the column-9 key/value pairs (returned/assigned by copy)format: aGffFormatenum (GFF3/GTF/UNKNOWN)
Methods: is_gtf(), is_gff3(), get_attribute(key), and the GTF helpers
get_gene_id(), get_transcript_id(), get_exon_number(), get_gene_name(),
get_gene_biotype() (each returns None when the attribute is absent).
BedReader / GffReader (file iterators)
BedReader and GffReader are single-pass iterators over BED and GFF3/GTF
files. Iterate them to get BedEntry / GffEntry records. Plain and
gzip/BGZF-compressed (.gz) files are both accepted (auto-detected).
import pygenogrove as pg
# read records one at a time
for entry in pg.BedReader("peaks.bed"):
print(entry.chrom, entry.start, entry.end, entry.name)
# the common workflow: load a file into a grove. The 2-argument insert derives
# the grove's 0-based closed Interval key from each entry's native coordinates,
# so you don't hand-convert (BED half-open, GFF 1-based) yourself.
g = pg.BedGrove(256)
for e in pg.BedReader("peaks.bed"):
g.insert(e.chrom, e)
gff = pg.GffGrove(256)
for e in pg.GffReader("genes.gff3"):
gff.insert(e.seqid, e)
# bulk-load one chromosome at a time (insert_bulk is per-index):
g2 = pg.BedGrove(256)
g2.insert_bulk("chr1", [e for e in pg.BedReader("peaks.bed") if e.chrom == "chr1"])
BedReader(path: str, skip_invalid_lines: bool = False)
GffReader(path: str, skip_invalid_lines: bool = False, validate_gtf: bool = False)
- A missing/unreadable
pathraises on construction. - With
skip_invalid_lines=False(default) a malformed line raisesRuntimeErrormid-iteration; withTruesuch lines are skipped. The first data record is validated when the reader is constructed, so a malformed first record raises immediately regardless of this flag. GffReader(..., validate_gtf=True)enforces the mandatory GTF2 attributes (gene_id,transcript_id).- Both expose
get_error_message()andget_current_line()for diagnostics. - The readers are single-pass — they own an htslib file handle and cannot be restarted or iterated twice.
Coordinate systems —
Intervalis 0-based closed[start, end];BedEntryis 0-based half-open[start, end);GffEntryis 1-based inclusive[start, end]. Convert deliberately when building grove keys, as shown above.
Current Status
This is an early development version. Currently exposed features:
- Basic grove and interval operations
- Insert and query functionality
- Multi-index support (per chromosome)
- Graph overlay (directed edges, external keys)
- Serialization / deserialization to compressed
.ggfiles - Nearest-neighbour queries:
flanking()(predecessor / successor) - Associated data: the
BedEntry/GffEntryvalue types and the data-carrying grovesBedGrove(grove<interval, bed_entry>) andGffGrove(grove<interval, gff_entry>) - File readers:
BedReaderandGffReader(single-pass iterators over BED / GFF3 / GTF files, including.gz) - Fast-path inserts on data-carrying groves:
insert_sorted/insert_bulk, plus entry-derivinginsert(index, entry)/insert_bulk(index, entries)overloads that compute the key from a BED/GFF record's native coordinates
Not yet exposed (tracked in #1):
- Genomic coordinates with strand information, and other key types — numeric, kmer (#7)
- BAM/SAM and FASTA readers
- Edge metadata,
get_neighbors_if/link_if(require a metadata-carrying grove)
Performance Tips
- Choose appropriate order: Higher order (e.g., 100-500) reduces tree height for large datasets
- Separate by chromosome: Use the index parameter to maintain separate trees per chromosome
- Query specific indices: Query specific chromosomes instead of all indices when possible
License
This project inherits the license from the genogrove C++ library and is therefore licensed under the GPLv3 license.
Related Projects
- genogrove: The underlying C++ library
Citation
If you use pygenogrove in your research, please cite the original genogrove library
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
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pygenogrove-0.2.0.tar.gz.
File metadata
- Download URL: pygenogrove-0.2.0.tar.gz
- Upload date:
- Size: 2.8 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7e7fd2f811be469b247f90a3d5854fa9f1550b7a839f54d5e718e41d10e48bb7
|
|
| MD5 |
65268622066d233599d98faa735cb65f
|
|
| BLAKE2b-256 |
c90386cfe7f26125ad66c07293734831279681985ee942bf3ac06d4355ba44fb
|
Provenance
The following attestation bundles were made for pygenogrove-0.2.0.tar.gz:
Publisher:
release.yml on genogrove/pygenogrove
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pygenogrove-0.2.0.tar.gz -
Subject digest:
7e7fd2f811be469b247f90a3d5854fa9f1550b7a839f54d5e718e41d10e48bb7 - Sigstore transparency entry: 1783230716
- Sigstore integration time:
-
Permalink:
genogrove/pygenogrove@1a9c97559a269bb53cf2a50083a27a4867287230 -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/genogrove
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@1a9c97559a269bb53cf2a50083a27a4867287230 -
Trigger Event:
push
-
Statement type:
File details
Details for the file pygenogrove-0.2.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.
File metadata
- Download URL: pygenogrove-0.2.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
- Upload date:
- Size: 7.5 MB
- Tags: CPython 3.12, manylinux: glibc 2.27+ x86-64, manylinux: glibc 2.28+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b88ef71fe6c39b578fb7e2fb11fa1f6c4a2367377eafee9d8e5001a08043483f
|
|
| MD5 |
ecbb5bd3e53002ed729f58793b788b29
|
|
| BLAKE2b-256 |
5bcfdb4549825e8de08faed7682341346902394636f90f515edfb9328fa9f66e
|
Provenance
The following attestation bundles were made for pygenogrove-0.2.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl:
Publisher:
release.yml on genogrove/pygenogrove
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pygenogrove-0.2.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl -
Subject digest:
b88ef71fe6c39b578fb7e2fb11fa1f6c4a2367377eafee9d8e5001a08043483f - Sigstore transparency entry: 1783231733
- Sigstore integration time:
-
Permalink:
genogrove/pygenogrove@1a9c97559a269bb53cf2a50083a27a4867287230 -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/genogrove
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@1a9c97559a269bb53cf2a50083a27a4867287230 -
Trigger Event:
push
-
Statement type:
File details
Details for the file pygenogrove-0.2.0-cp312-cp312-macosx_14_0_arm64.whl.
File metadata
- Download URL: pygenogrove-0.2.0-cp312-cp312-macosx_14_0_arm64.whl
- Upload date:
- Size: 1.1 MB
- Tags: CPython 3.12, macOS 14.0+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c24581c16e997cdada37d94abd410cf5c963bd16478de76c1bd4bbfc28a9b9e0
|
|
| MD5 |
f8f8f668172231b273965b3c6fce62e3
|
|
| BLAKE2b-256 |
4432ab9b6c57d97ff2b303f38b026d1d9fc230b7cdeecfead179988afa8f1dd8
|
Provenance
The following attestation bundles were made for pygenogrove-0.2.0-cp312-cp312-macosx_14_0_arm64.whl:
Publisher:
release.yml on genogrove/pygenogrove
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pygenogrove-0.2.0-cp312-cp312-macosx_14_0_arm64.whl -
Subject digest:
c24581c16e997cdada37d94abd410cf5c963bd16478de76c1bd4bbfc28a9b9e0 - Sigstore transparency entry: 1783231373
- Sigstore integration time:
-
Permalink:
genogrove/pygenogrove@1a9c97559a269bb53cf2a50083a27a4867287230 -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/genogrove
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@1a9c97559a269bb53cf2a50083a27a4867287230 -
Trigger Event:
push
-
Statement type:
File details
Details for the file pygenogrove-0.2.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.
File metadata
- Download URL: pygenogrove-0.2.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
- Upload date:
- Size: 7.5 MB
- Tags: CPython 3.11, manylinux: glibc 2.27+ x86-64, manylinux: glibc 2.28+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5ed2bb794a4128719f2044907a94b9d18a569e06a8181030abd92778ee36e4a6
|
|
| MD5 |
b857260c078e3930d4df1adfd26cda28
|
|
| BLAKE2b-256 |
226e58bf6b15b030897cbd59812a4235a157dd2a4deccb7bb09a1b1b6d8b108a
|
Provenance
The following attestation bundles were made for pygenogrove-0.2.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl:
Publisher:
release.yml on genogrove/pygenogrove
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pygenogrove-0.2.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl -
Subject digest:
5ed2bb794a4128719f2044907a94b9d18a569e06a8181030abd92778ee36e4a6 - Sigstore transparency entry: 1783231535
- Sigstore integration time:
-
Permalink:
genogrove/pygenogrove@1a9c97559a269bb53cf2a50083a27a4867287230 -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/genogrove
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@1a9c97559a269bb53cf2a50083a27a4867287230 -
Trigger Event:
push
-
Statement type:
File details
Details for the file pygenogrove-0.2.0-cp311-cp311-macosx_14_0_arm64.whl.
File metadata
- Download URL: pygenogrove-0.2.0-cp311-cp311-macosx_14_0_arm64.whl
- Upload date:
- Size: 1.1 MB
- Tags: CPython 3.11, macOS 14.0+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a40f2218493c79c5d9e3ae0624a0d913ab3babbc2afcfa45487b7fbedfe4d82e
|
|
| MD5 |
a54652b7a4dbc5d8c8e6ae0678f9120d
|
|
| BLAKE2b-256 |
d705bf17fc7b92db922f2f87cca372a28448c72140d89bf243d1517e78e57f2f
|
Provenance
The following attestation bundles were made for pygenogrove-0.2.0-cp311-cp311-macosx_14_0_arm64.whl:
Publisher:
release.yml on genogrove/pygenogrove
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pygenogrove-0.2.0-cp311-cp311-macosx_14_0_arm64.whl -
Subject digest:
a40f2218493c79c5d9e3ae0624a0d913ab3babbc2afcfa45487b7fbedfe4d82e - Sigstore transparency entry: 1783230959
- Sigstore integration time:
-
Permalink:
genogrove/pygenogrove@1a9c97559a269bb53cf2a50083a27a4867287230 -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/genogrove
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@1a9c97559a269bb53cf2a50083a27a4867287230 -
Trigger Event:
push
-
Statement type:
File details
Details for the file pygenogrove-0.2.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.
File metadata
- Download URL: pygenogrove-0.2.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
- Upload date:
- Size: 7.5 MB
- Tags: CPython 3.10, manylinux: glibc 2.27+ x86-64, manylinux: glibc 2.28+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9e2f1c1319a89f920023e855b4cf7475381c801de720d438ee5760f2c2bcfff5
|
|
| MD5 |
b7514f4e3aa97bd786f8fbcb450911a5
|
|
| BLAKE2b-256 |
9a141cbd0e818f65778428da32c04eb3da77a3cc9985261d3235db5f273b3a96
|
Provenance
The following attestation bundles were made for pygenogrove-0.2.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl:
Publisher:
release.yml on genogrove/pygenogrove
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pygenogrove-0.2.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl -
Subject digest:
9e2f1c1319a89f920023e855b4cf7475381c801de720d438ee5760f2c2bcfff5 - Sigstore transparency entry: 1783231918
- Sigstore integration time:
-
Permalink:
genogrove/pygenogrove@1a9c97559a269bb53cf2a50083a27a4867287230 -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/genogrove
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@1a9c97559a269bb53cf2a50083a27a4867287230 -
Trigger Event:
push
-
Statement type:
File details
Details for the file pygenogrove-0.2.0-cp310-cp310-macosx_14_0_arm64.whl.
File metadata
- Download URL: pygenogrove-0.2.0-cp310-cp310-macosx_14_0_arm64.whl
- Upload date:
- Size: 1.1 MB
- Tags: CPython 3.10, macOS 14.0+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4d77e05eb432fd5fde9ee8c7b6aa8566a10e71963993d07834f238cc0d4013de
|
|
| MD5 |
12c66ad96e13fd28641b27c55e442f52
|
|
| BLAKE2b-256 |
484c13956f933676a2c3adc54df680279d1cbbe219f96d375edb7a614f8647e8
|
Provenance
The following attestation bundles were made for pygenogrove-0.2.0-cp310-cp310-macosx_14_0_arm64.whl:
Publisher:
release.yml on genogrove/pygenogrove
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pygenogrove-0.2.0-cp310-cp310-macosx_14_0_arm64.whl -
Subject digest:
4d77e05eb432fd5fde9ee8c7b6aa8566a10e71963993d07834f238cc0d4013de - Sigstore transparency entry: 1783232368
- Sigstore integration time:
-
Permalink:
genogrove/pygenogrove@1a9c97559a269bb53cf2a50083a27a4867287230 -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/genogrove
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@1a9c97559a269bb53cf2a50083a27a4867287230 -
Trigger Event:
push
-
Statement type:
File details
Details for the file pygenogrove-0.2.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.
File metadata
- Download URL: pygenogrove-0.2.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
- Upload date:
- Size: 7.5 MB
- Tags: CPython 3.9, manylinux: glibc 2.27+ x86-64, manylinux: glibc 2.28+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
54e4c455a76c2cef8c7c32f7f6c967693f802f371cebd598aa086cfba6fa901c
|
|
| MD5 |
19f97b6d28e85926a2099a995534270c
|
|
| BLAKE2b-256 |
ba0eb6f9c709db3164ea91d8bf72c8c943a1c352521320c7cceb85c777328d44
|
Provenance
The following attestation bundles were made for pygenogrove-0.2.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl:
Publisher:
release.yml on genogrove/pygenogrove
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pygenogrove-0.2.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl -
Subject digest:
54e4c455a76c2cef8c7c32f7f6c967693f802f371cebd598aa086cfba6fa901c - Sigstore transparency entry: 1783231124
- Sigstore integration time:
-
Permalink:
genogrove/pygenogrove@1a9c97559a269bb53cf2a50083a27a4867287230 -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/genogrove
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@1a9c97559a269bb53cf2a50083a27a4867287230 -
Trigger Event:
push
-
Statement type:
File details
Details for the file pygenogrove-0.2.0-cp39-cp39-macosx_14_0_arm64.whl.
File metadata
- Download URL: pygenogrove-0.2.0-cp39-cp39-macosx_14_0_arm64.whl
- Upload date:
- Size: 1.1 MB
- Tags: CPython 3.9, macOS 14.0+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3dd4adfbb0856ecfdab3318bb5227c5a1864bff8cb131903aea972eabccfb088
|
|
| MD5 |
01746bcb8b9e4ff3ca351cb7607d0495
|
|
| BLAKE2b-256 |
4f7fbca3ddc8c5c1422b2d983cabf642dec64ca8c5ed7d34bfe16028ec90f7db
|
Provenance
The following attestation bundles were made for pygenogrove-0.2.0-cp39-cp39-macosx_14_0_arm64.whl:
Publisher:
release.yml on genogrove/pygenogrove
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pygenogrove-0.2.0-cp39-cp39-macosx_14_0_arm64.whl -
Subject digest:
3dd4adfbb0856ecfdab3318bb5227c5a1864bff8cb131903aea972eabccfb088 - Sigstore transparency entry: 1783232135
- Sigstore integration time:
-
Permalink:
genogrove/pygenogrove@1a9c97559a269bb53cf2a50083a27a4867287230 -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/genogrove
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@1a9c97559a269bb53cf2a50083a27a4867287230 -
Trigger Event:
push
-
Statement type: