About:
- Parses CIM RDF/XML data to pandas dataframe with 4 columns [ID, KEY, VALUE, INSTANCE_ID] (triplestore like)
- The solution does not care about CIM version nor namespaces
- Input files can be xml or zip files (containing one or mutiple xml files)
- All files are parsed into one and same Pandas DataFrame, thus if you want single file or single data model, you need to filter on INSTANCE_ID column
Documentation:
https://haigutus.github.io/triplets
Upgrading from 0.0.x? See docs/migration_0.0_to_0.1.md.
To get started:
# Core (python_lxml_pandas engine, no extra deps)
pip install triplets
# With pyarrow (enables python_lxml_arrow + cython_pugixml_arrow engines, ~10x faster)
pip install triplets[arrow]
Install extras by feature:
| Extra | Enables |
|---|---|
arrow |
compiled Arrow parser engines (~10x faster parsing) |
polars |
polars DataFrames (polars.read_rdf, .triplets namespace) |
duckdb |
DuckDB connections (con.read_rdf, SQL over triplets) |
sparql |
SPARQL queries (rdflib reference engine) |
oxigraph |
recommended pip performance path — embedded Rust SPARQL engine (auto-preferred over rdflib) |
validation |
SHACL validation (pyshacl reference engine) |
excel / networkx / visualization |
Excel export / graph export / drawing |
The embedded qlever SPARQL engine (fastest) ships in no wheel — it is a local source build, see docs/building.md.
import pandas
import triplets
path = "CGMES_v2.4.15_RealGridTestConfiguration_v2.zip"
data = pandas.read_RDF([path])
Result:
You can then query a dataframe of all same type elements and its parameters across all [EQ, SSH, TP, SV etc.] instance files, where parameters are columns and index is object ID-s
data.tableview_by_type("ACLineSegment")
Export:
from triplets.export_schema import schemas
from triplets.export import ExportType
data.export_to_cimxml(
rdf_map=schemas.ENTSOE_CGMES_2_4_15_552_ED1,
export_type=ExportType.XML_PER_INSTANCE_ZIP_PER_XML,
)
Export schemas are versioned and shipped per profile. Alongside the CGMES
bundles (schemas.ENTSOE_CGMES_2_4_15_552_ED1,
schemas.ENTSOE_CGMES_3_0_0_552_ED1, …) the versioned NC (Network Code)
profiles are available as schemas.ENTSOE_NC_2_4_1_552_ED1 /
schemas.ENTSOE_NC_2_4_1_552_ED2. The _ED1 / _ED2 suffix selects the
serialization edition; profile resolution is schema-driven, so the right
profile section is matched from the instance header.
Look into examples folders for more
Parser engines
Three parser engines with automatic fallback (fastest available):
| Engine | Install | Speed |
|---|---|---|
python_lxml_pandas |
pip install triplets |
1x baseline, always works |
python_lxml_arrow |
pip install triplets[arrow] |
~1x, better interop |
cython_pugixml_arrow |
pip install triplets[arrow] (included in wheels) |
~10x faster |
The cython_pugixml_arrow engine is a compiled C++ extension included in published wheels.
It requires pyarrow at runtime, so install with triplets[arrow] to enable it.
The cython engine is pre-built in published wheels — no compilation needed.
Engine selection is automatic across the library (parser, exports, SPARQL, validation): installing an extra makes everything that can use it faster, with no code changes. Inspect and steer it globally:
triplets.engines() # what "auto" resolved to, per subsystem
triplets.set_engine(parser_cimxml="python_lxml_pandas", sparql="rdflib")
triplets.set_engine(parser_cimxml="auto") # restore auto-selection
Per-call engine= arguments always win over set_engine. Operations on your
DataFrame itself (filters, tableviews, references) always run in the engine of
the object you call them on — pandas frames stay pandas, polars stays polars.
Polars
import polars
import triplets
data = polars.read_rdf(["grid_EQ.xml", "data.zip"]) # returns polars DataFrame
data.triplets.get_types_count()
data.triplets.tableview_by_type("ACLineSegment")
data.triplets.filter_triplets(KEY="Type", VALUE=".*Generator.*", regex=True)
data.triplets.export_to_csv(export_to_memory=True)
data.triplets.export_to_nquads("/tmp/output.nq")
data = polars.read_nquads("/tmp/output.nq") # round-trips N-Quads back to triplets
read_nquads is registered as pandas.read_nquads / polars.read_nquads and
is also exposed top-level as triplets.read_nquads.
DuckDB
import duckdb
import triplets
data = duckdb.connect() # default table "triplets"
data = duckdb.connect("grid.duckdb", table="grid", schema="cim") # per-connection defaults
# explicit table/schema config is stored in the database file — reopening
# duckdb.connect("grid.duckdb") later resolves cim.grid automatically
data.read_rdf(["grid_EQ.xml", "data.zip"]) # streams into the connection's table
data.read_rdf(["update.zip"], append=True) # adds rows instead of replacing
data.get_types_count() # uses connection table/schema
data.tableview_by_type("ACLineSegment").df()
data.filter_triplets(KEY="Type", VALUE=".*Sub.*", regex=True).df()
data.references_to("some-uuid").df()
data.export_to_nquads("/tmp/output.nq")
# Per-call override; rebind defaults with set_triplets_table(...)
data.types_dict(table="other", schema="main")
# Direct SQL (your identifiers — tools always quote theirs)
data.sql('SELECT VALUE, COUNT(*) FROM "cim"."grid" WHERE KEY = \'Type\' GROUP BY VALUE').df()
# The same tools are also on the `.triplets` namespace (parity with pandas/polars)
data.triplets.tableview_by_type("ACLineSegment").df()
data.triplets.get_types_count()
SPARQL queries
SPARQL 1.1 over the loaded data — SELECT → DataFrame, ASK → bool,
CONSTRUCT → triplet DataFrame. Works on pandas, polars and DuckDB inputs:
PREFIXES = """
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX cim: <http://iec.ch/TC57/CIM100#>
"""
names = data.sparql.query(PREFIXES + "SELECT ?s ?name WHERE { ?s cim:IdentifiedObject.name ?name }")
Three engines behind one API (auto picks the fastest available):
| Engine | Install | Role |
|---|---|---|
qlever |
local source build (docs/building.md) | fastest — embedded C++, persistent on-disk index |
oxigraph |
pip install triplets[oxigraph] |
embedded Rust — ~3x faster import, 2–5x faster queries than rdflib |
rdflib |
pip install triplets[sparql] |
pure-Python reference |
Details and measured numbers: docs/sparql.md.
SHACL validation
Validate against SHACL shape files; the result is a violations DataFrame (empty = conforms) with the same shape across all engines:
from triplets.export_schema import schemas
violations = data.shacl.validate("shapes.ttl", rdf_map=schemas.ENTSOE_CGMES_3_0_0_552_ED1)
# slower optional context pass: source file, object type/name,
# shape sh:name/sh:description, schema attribute/class definitions
violations = data.shacl.validate(shapes, context=True)
# SARIF 2.1.0 for GitHub / SonarQube / any SARIF viewer — grouped by default
# (one result per rule with occurrenceCount + sample instances)
violations.shacl.to_sarif(path="report.sarif")
# standard SHACL sh:ValidationReport — format from path suffix (or format=)
violations.shacl.to_shacl_report(path="report.ttl")
violations.shacl.to_shacl_report(path="report.xml", report_source="model.xml",
report_references=["equipment.ttl"])
Engines: polars (auto, real profiles in ~2 s) → pandas → pyshacl
(reference); duckdb for larger-than-memory data. sh:sparql constraints
ride the SPARQL engine above (minutes → milliseconds with oxigraph/qlever).
Details: docs/validation.md.
Accessor namespace
pandas and polars DataFrames use df.triplets.*; a DuckDB connection uses
con.triplets.*. The same method names are available on both (DuckDB returns
relations — add .df() or .pl() when needed):
# pandas / polars
df.triplets.tableview_by_type("ACLineSegment")
df.triplets.export_to_nquads("/tmp/output.nq")
# DuckDB
con.triplets.tableview_by_type("ACLineSegment").df()
con.triplets.get_types_count()
Root-level methods (df.type_tableview(...), con.filter_triplets(...)) still
work for backwards compatibility.
Cache lifecycle
Engines keep internal state (compiled shapes, SPARQL indexes) cached across
calls. Reset it explicitly with triplets.clear_caches(), or scope it to a
block so it is cleared on exit:
import triplets
with triplets.cache_scope():
... # caches populated here are dropped when the block exits
triplets.clear_caches() # or clear everything manually
CLI tools
cim-spreadsheet -i model.xml -o output.xlsx
cim-diff original.xml modified.xml
Performance (RealGrid, 1.14M rows)
Committed benchmark results live in tests/performance_results/; re-run with
pytest -m performance. Representative numbers (cython parse 1.47s → 0.157s
vs the lxml engine = ~9.4x):
| Operation | pandas | polars | DuckDB |
|---|---|---|---|
| Parse (cython engine) | 157ms | 180ms | streams (see duckdb section) |
| tableview_by_type | 72ms | 15ms | 53ms |
| filter_triplets_by_type | 103ms | 9ms | 50ms |
| get_types_count | 21ms | 11ms | 18ms |
The old rdf_parser.py functions still work but emit deprecation warnings.
See docs/migration_0.0_to_0.1.md for renames and breaking changes.
Metadata
Release files for triplets 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| triplets-0.2.0.tar.gz | 2.7 MB | With provenance | Details for triplets-0.2.0.tar.gz |
Built distributions (wheels)
Total release size: 43.1 MB
Release files / triplets-0.2.0.tar.gz
| Download URL | triplets-0.2.0.tar.gz |
|---|---|
| Size | 2.7 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
5262e7ef618c9cc803560070bffcd4cf259f8c91183c837cf5a694ce8836e6bd
|
|
BLAKE2b-256 checksum How to use checksums |
e2419c5705f83455413c35f7dd366bf66e1aba739869743b2d2784b1a1c79e50
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 26, 2026.
Transparency logRelease files / triplets-0.2.0-cp314-cp314-win_amd64.whl
| Download URL | triplets-0.2.0-cp314-cp314-win_amd64.whl |
|---|---|
| Size | 2.5 MB |
| Tags | CPython 3.14 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
0478f6c749d490c26d3042713b7f4044fc43c21ee95d1e37dd42f3cfc7ebffe1
|
|
BLAKE2b-256 checksum How to use checksums |
06506048bdb03fc9b9e013ca3a36a5206f45fe9595b542a1c7d1beb38f7c1963
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 26, 2026.
Transparency logRelease files / triplets-0.2.0-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
| Download URL | triplets-0.2.0-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 5.1 MB |
| Tags | CPython 3.14 Linux glibc 2.24+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
c084864cc012e597f6ee9f4a7cf099d4b6ead7ce38ed8685e7515bd461414d52
|
|
BLAKE2b-256 checksum How to use checksums |
a92736af754c6b07c1f3e3774f661663db5c1c9522256266baedcfdba15fb6c5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 26, 2026.
Transparency logRelease files / triplets-0.2.0-cp314-cp314-macosx_11_0_arm64.whl
| Download URL | triplets-0.2.0-cp314-cp314-macosx_11_0_arm64.whl |
|---|---|
| Size | 2.5 MB |
| Tags | CPython 3.14 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
6d4fc8481fe521317100be342406fbe53c9f6b2a191171995600d1e9b309991b
|
|
BLAKE2b-256 checksum How to use checksums |
b2adfe0f3fb74868e0b1719e1311e680b731af1727ef14c0b104d68f80b5c6e8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 26, 2026.
Transparency logRelease files / triplets-0.2.0-cp313-cp313-win_amd64.whl
| Download URL | triplets-0.2.0-cp313-cp313-win_amd64.whl |
|---|---|
| Size | 2.5 MB |
| Tags | CPython 3.13 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
d96fffde3d874b20a858177c0ec89ca6e4388f4e8fd23a2b59d7646330a00e4e
|
|
BLAKE2b-256 checksum How to use checksums |
4bdd30cde8e4c55388df5b9c5c10dcecfb5790a2dc884c357cdd1aad9ea80b83
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 26, 2026.
Transparency logRelease files / triplets-0.2.0-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
| Download URL | triplets-0.2.0-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 5.1 MB |
| Tags | CPython 3.13 Linux glibc 2.24+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
131c16bf113a954da82d95501784a4cfa104d02c8f8953205eb9cc43ffa3a1f7
|
|
BLAKE2b-256 checksum How to use checksums |
3df8af81a0bcdbbf68ca2781f3bd4bf926ea528f819df45a1eff62fc6f9b5e07
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 26, 2026.
Transparency logRelease files / triplets-0.2.0-cp313-cp313-macosx_11_0_arm64.whl
| Download URL | triplets-0.2.0-cp313-cp313-macosx_11_0_arm64.whl |
|---|---|
| Size | 2.5 MB |
| Tags | CPython 3.13 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
7a68ec607ebec1451cf98a1465ee1beeeb580f8c77724255e5285c9b439bcbdc
|
|
BLAKE2b-256 checksum How to use checksums |
149f972c876f4f4cd09643a77233aced15b42d4c54d75ca3ace8f2511a1ed9bd
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 26, 2026.
Transparency logRelease files / triplets-0.2.0-cp312-cp312-win_amd64.whl
| Download URL | triplets-0.2.0-cp312-cp312-win_amd64.whl |
|---|---|
| Size | 2.5 MB |
| Tags | CPython 3.12 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
a2acec45809f5c621840f41006e8fd37ccdd22cb3565e8cb782da73033d0a72f
|
|
BLAKE2b-256 checksum How to use checksums |
3d4c255989991b61441116e5acda7c659c050ee72e3eeea371671b7503c9cb40
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 26, 2026.
Transparency logRelease files / triplets-0.2.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
| Download URL | triplets-0.2.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 5.1 MB |
| Tags | CPython 3.12 Linux glibc 2.24+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
75fc30559a1749fd11c2773a3119929b0cbf8c1385f22e98a5cc9cc62474ac2e
|
|
BLAKE2b-256 checksum How to use checksums |
3df0604248f8d7fad08921502d4a60edfb837dcd9aa1a4f8ce5066b04859955c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 26, 2026.
Transparency logRelease files / triplets-0.2.0-cp312-cp312-macosx_11_0_arm64.whl
| Download URL | triplets-0.2.0-cp312-cp312-macosx_11_0_arm64.whl |
|---|---|
| Size | 2.5 MB |
| Tags | CPython 3.12 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
76e22a2de8953c97a30755cb07fc045266360552ebf5c79c2c3885bdb861ad40
|
|
BLAKE2b-256 checksum How to use checksums |
2303d5c37fd0d8932a9abd3d675f50b0d09bbc2d7acfeb7631d2b1266c9d9446
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 26, 2026.
Transparency logRelease files / triplets-0.2.0-cp311-cp311-win_amd64.whl
| Download URL | triplets-0.2.0-cp311-cp311-win_amd64.whl |
|---|---|
| Size | 2.5 MB |
| Tags | CPython 3.11 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
030d9376a389dbf562fb43e001e3cb6707897ffb3132b06dd62ab1716e9cf463
|
|
BLAKE2b-256 checksum How to use checksums |
b4257f7ba977e2cbb37ce04869cfb8f6628b59c19890022948b12506d520edd9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 26, 2026.
Transparency logRelease files / triplets-0.2.0-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
| Download URL | triplets-0.2.0-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 5.2 MB |
| Tags | CPython 3.11 Linux glibc 2.24+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
4df1733d0ea9d448c5e54e5b329e53f70a7f315ab150b4bdfe5d13b0bd9ab15b
|
|
BLAKE2b-256 checksum How to use checksums |
71441e7e9d127024c0725e4008dd1c13ec54c9bdee9aa20d9fac7a8179c40761
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 26, 2026.
Transparency logRelease files / triplets-0.2.0-cp311-cp311-macosx_11_0_arm64.whl
| Download URL | triplets-0.2.0-cp311-cp311-macosx_11_0_arm64.whl |
|---|---|
| Size | 2.5 MB |
| Tags | CPython 3.11 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
b483495a840a42cf658144d35720ef0d80d52d49d3f6902912eac1a9bcf9af00
|
|
BLAKE2b-256 checksum How to use checksums |
523daccece180557899c712c4000d417f16c286b9007c5a53e0bf90f5e03765e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 26, 2026.
Transparency logSecurity for triplets 0.2.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.
Full provenance
All 13 files in this release have been uploaded with provenance metadata.
Attestation for triplets-0.2.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 26, 2026.
Transparency logA 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.