Skip to main content
https://raw.githubusercontent.com/bojigu/thoipapy/develop/thoipapy/docs/THOIPA_banner.png

THOIPApy

The Transmembrane HOmodimer Interface Prediction Algorithm (THOIPA) is a machine learning method for the analysis of protein-protein-interactions.

THOIPA predicts transmembrane homodimer interface residues from evolutionary sequence information.

THOIPA helps predict potential homotypic transmembrane interface residues, which can then be verified experimentally. THOIPA also aids in the energy-based modelling of transmembrane homodimers.

Important links:

How does thoipapy work?

  • retrieves protein homologues from the ColabFold MSA server, or a local BLAST database

  • extracts residue properties (e.g. residue conservation and polarity)

  • trains a machine learning classifier

  • validates the prediction performance

  • creates heatmaps of residue properties and THOIPA prediction

Installation

THOIPA is on PyPI, but read this before installing it.

pip install "thoipapy>=3.0"

Ask for 3.0 or newer. Releases up to 1.2.0 were published between 2018 and 2021 and no longer work: the model they ship is a scikit-learn 0.23 pickle, which no current scikit-learn can load, so they install without error and then fail on the first prediction. 2.0.0 and 2.1.0 run, but they pass the protein name to a shell and they score the wrong sequence with rate4site whenever that name contains a hyphen; see the 3.0.0 entry in thoipapy/docs/releases.rst.

Install it into a new, empty environment. Every dependency is pinned to an exact version (numpy==2.5.2, pandas==3.0.5, and so on), so pip will almost certainly refuse to install it alongside packages you already have. That is intended, not a defect: THOIPA is not actively maintained, and exact pins are what stop an unattended install from silently resolving to a different numerical result years from now.

The same pinning means that on a future python, where those exact versions have no wheel, the install will fail outright rather than succeed and misbehave. If that happens, use the conda environment below, which also pins the interpreter.

conda env create -f environment.yml
conda activate thoipapy
pip install -e .

This is the supported path, and the only one that pins python itself along with the external command-line tools.

THOIPA has only been tested on Linux, because of its reliance on external programs such as FreeContact, CD-HIT and rate4site.

Working on the code

Install the git hooks once per clone. They are configured in the repository but do not run until installed, so a fresh clone commits with no checks at all.

pre-commit install

The hooks format and lint the code, and refuse a commit that adds a large file, an office document, or a dataset or archive outside the test tree. None of them need an account or a network connection, so this is all an outside contributor has to do.

Secret scanning, strongly recommended for anyone with push access. One more command, once per clone:

pre-commit install -c .pre-commit-config-ggshield.yaml --hook-type pre-push

Those are two different git hooks, .git/hooks/pre-commit and .git/hooks/pre-push, so they coexist. The second scans the commits being pushed and refuses the push if it finds a credential, which is the last point before it becomes permanent and has to be rotated.

It needs a GitGuardian account, which is free for small teams. Create one, then either export GITGUARDIAN_API_KEY or run ggshield auth login once after pipx install ggshield. It is kept out of .pre-commit-config.yaml on purpose: ggshield fails loudly without an account, so a hook there would break the first commit of anyone who clones the repository.

There is no secret-scanning step in CI on this repository, because that needs an API key stored as a repository secret and no one on the project currently has the admin rights to add one. The pre-push hook above is what covers it in the meantime.

Dependencies

THOIPApy requires python 3.12 or newer and is tested on python 3.13.

Every dependency is pinned to an exact version. This is deliberate. THOIPA is scientific software whose output has to stay reproducible, and a version range resolves to something different every time it is installed. The failure that causes is not a helpful error at install time; it is a prediction that quietly differs from the published one. Pinning trades the ability to install alongside arbitrary other packages for the ability to still work in five years. Use a dedicated environment.

Pins live in three places, which are kept in step:

file

pins

pyproject.toml

python packages; what pip install . reads

requirements.txt

the same packages plus their transitive dependencies

environment.yml

the python interpreter and the external command-line tools

The external tools are pinned for the same reason as the python packages: a different rate4site or cd-hit changes the conservation scores and the redundancy reduction, and therefore the features and the prediction.

You are of course free to relax the pins and test a newer combination. Nothing guarantees that it resolves, or that predictions still match. If you do, run the full test suite, including the golden-file regression tests, before trusting the result.

Several pipeline steps call external command-line programs rather than python libraries. blast, cd-hit and rate4site are installed by environment.yml. freecontact is not packaged for conda on any channel, so it is installed separately, either with root:

sudo apt-get install freecontact

or without, into the active conda environment:

./scripts/install_freecontact.sh

Phobius is no longer required. It was needed only for the n_TMDs feature, which was removed in 2.0.0. See docs/n_TMDs_dropped.md.

Getting the data (training sets, models, test data)

If you only want to run predictions, you do not need any of this. The trained model ships inside the package, so pip install thoipapy gives you a working predictor with no data download, no clone, and no DVC. Everything below is for developers who want to retrain the model, re-run the validation, or run the test suite.

The code lives in git; the data does not. data/ is about 128 MB of training sets, homologue alignments, extracted features and prediction outputs, which is too large and too binary to keep in a git repository. It is stored separately and fetched with a tool called DVC (Data Version Control).

If you have not used DVC before, the idea is simple. DVC leaves a small text file in git for each data directory, for example data/features.dvc. That file records a checksum, not the data. When you run dvc pull, DVC reads those checksums and downloads the matching files from a data store into data/. It is, in effect, git clone for large files. You do not need an account, a login, or any credentials to fetch this project’s data.

Full documentation: https://dvc.org/doc . A good short introduction is https://dvc.org/doc/start/data-management/data-versioning .

Step 1: install DVC

If you created the conda environment from environment.yml you already have it, and can skip to step 2. Otherwise, pick whichever you prefer:

# with conda or mamba (recommended, matches environment.yml)
conda install -c conda-forge dvc dvc-http

# or with pip
pip install "dvc[http]"

dvc-http matters: this project’s public data store is served over HTTPS, and plain dvc cannot read an HTTPS remote without it. If you see URL 'https://...' is supported but requires these missing dependencies, this is what is missing.

Check it worked:

dvc --version

Step 2: fetch the data

From the root of your clone:

dvc pull -j 4

Expect roughly 3800 files, 128 MB, and a minute or two on a normal connection.

Use -j 4. The -j flag sets how many files DVC downloads at once. Its default is four times your CPU count, which is enough parallel requests that the data store starts refusing them, and the pull fails with 429 Too Many Requests. -j 4 avoids this. If you still see 429 errors, lower it further with -j 2.

To confirm everything arrived:

dvc status

Data and pipelines are up to date. means the contents of data/ match the checksums recorded in git, so you have exactly the files the authors had.

Fetching only part of the data

The full set is rarely needed. To fetch one directory, name its .dvc file:

dvc pull -j 4 test/regression_data.dvc  # run the test suite                    28 KB
dvc pull -j 4 data/features.dvc         # retrain the model                      18 MB
dvc pull -j 4 data/results.dvc          # trained models and validation output   25 MB
dvc pull -j 4 data/homologues.dvc       # re-extract features from alignments    60 MB

The remaining directories are small: data/Proteins (420 KB), data/Input_data (272 KB) and data/ETRA_data (112 KB). data/Predictions (26 MB) holds the published predictions and is needed only to compare against them.

Common problems

429 Too Many Requests

Too many parallel downloads. Use dvc pull -j 4, or -j 2 on a fast connection.

URL 'https://...' is supported but requires these missing dependencies

dvc-http is not installed. See step 1.

No DVC remote is specified

You are not in the repository root, or .dvc/config is missing. Run dvc remote list; it should print a remote named public.

dvc: command not found

DVC installed into a different environment than the one you have active. Run conda activate thoipapy first.

The pull is slow or stalls

The data store is rate-limited. This is expected and -j 4 handles it. DVC resumes where it stopped, so re-running dvc pull -j 4 after an interruption is safe and will not re-download what you already have.

How old the alignments are, and what that means

The DVC-tracked homologues were downloaded from NCBI nr in May 2020. The modernisation updated the code, not the data. Every alignment-derived feature in data/features/ – conservation, rate4site, the PSSM columns, coevolution, LIPS, and the polarity features that read from the PSSM – descends from that download, and so does the shipped model.

The provenance is recorded per protein and can be checked:

tar -xzOf data/homologues/xml/crystal/1orqC4.surr20.BLAST.xml.tar.gz --wildcards '*details*'
# acc  1orqC4
# download_date  20200518
# database  ncbi_nr

Regenerating the alignments against current databases is a reasonable thing to want, and the pipeline supports it. It has not been shown to produce a better model. Two rebuilds bear on this, one from a September 2026 UniRef90 search and one from the ColabFold MSA server, and neither improved on the 2020 archive. Scores are averaged over the 34 CD-HIT clusters rather than the 40 proteins, because several of the proteins are homologues of each other:

set08 leave-one-out, ROC AUC per cluster

2020 nr

2026 UniRef90

2026 ColabFold

mean

0.656

0.643

0.639

difference from nr

–

-0.012

-0.017

95% confidence interval

–

-0.034,+0.007

-0.049,+0.012

Every interval contains zero, and ColabFold minus UniRef90 is -0.005 [-0.026, +0.016]. A failure to reject is not proof of equivalence, so the honest statement is what the intervals exclude: any ColabFold advantage over UniRef90 above +0.016 AUC, or over nr above +0.012, is ruled out at 95%, while an improvement below about 0.03 AUC would be too small for 40 proteins to detect.

Depth was then tested directly, with everything else held constant: the same server, the same search, the same query and the same folds, differing only in whether the MMseqs2 diversity filter runs. A 2.6x increase in total alignment depth moved ROC AUC by +0.0001 [-0.016, +0.016]. That comparison carries no confound of time or algorithm, and it is the clearest evidence that depth by itself is not the constraint. It does not show that no better alignment exists – a differently built or differently filtered one has not been tried.

The features that disagree most between alignment sources are the coevolution scores, and those are among the features the model relies on most. DImax correlates at Spearman 0.45 between the nr and UniRef90 feature sets and 0.26 between nr and ColabFold, against 1.00 for every sequence-derived feature. A signal that can be rewritten that far without moving accuracy is where the next accuracy work belongs – starting with MI_highest_face, which a review of this comparison found to be a constant heptad mask rather than a coevolution feature at all. The full analysis, including the limits of the comparison, is in docs/homologue_source_comparison.md.

Two consequences worth keeping in mind:

  • Do not assume a refresh is an upgrade. If you regenerate, re-run the validation and compare, rather than adopting the new model because its alignments are deeper.

  • Do not mix vintages. A feature table with some proteins from 2020 nr and others from a current search is not a coherent dataset. Regenerate all of them or none.

scripts/compare_blast_database_depth.py performs the comparison above between any two data directories, and is how those numbers were produced. The full write-up, including a negative result on protein language model embeddings, is in thoipapy/docs/embeddings_and_alignment_depth.rst.

Where the data comes from

dvc pull fetches from a publicly readable Cloudflare R2 bucket, declared in .dvc/config. It is read-only and anonymous by design: anyone can fetch the data, nobody can overwrite it. Maintainers push with a separate credentialed remote configured in .dvc/config.local, which is not tracked by git.

The data originates from the dataset published with the paper, archived at the Open Science Framework: https://osf.io/txjev/. The OSF archive is the citable record of what the paper used and does not change. The DVC store is the working copy the pipeline reads, and it tracks the code. Where the two differ, OSF is authoritative for the published results.

The protein sets

data/sets/ holds the three protein sets published with the paper, matching data/protein_lists/ in the OSF repository:

set

n

contents

set05_ETRA_NMR_crystal_nr.csv

50

all proteins, redundancy-reduced

set07_test.csv

10

blind test set

set08_train.csv

40

training set

set05 is the union of set07 and set08. The copies here carry a few extra annotation columns beyond the OSF versions; the shared columns are identical.

These were Excel workbooks and are now CSV. They are single flat tables, so the workbook format bought nothing and made them undiffable in git and awkward to read without Excel. The same applies to data/protein_names.csv and the ETRA scanning-mutagenesis data in data/ETRA_data/Average_with_interface/. Pipeline outputs under data/results/ remain Excel where a file genuinely holds several tables; the ones that did not are CSV.

Where homologues come from

Recommended: retrieve homologues from the ColabFold MSA server. Searching NCBI is no longer viable for new work, and a local UniRef90 BLAST database is the fallback when the server is unavailable or no third-party service is acceptable.

source

use it for

cost

ColabFold

all new homologue retrieval

none

UniRef90 local

when the MSA server is unavailable, or when nothing outside the machine may be contacted

96 GB, rebuilt per release

NCBI nr

reading the archived 2020 alignments only

hours of queueing

The three are indistinguishable on accuracy, so this is a recommendation about speed, disk and availability rather than about prediction quality. See Which homologue source should THOIPA use? for the measurements behind that.

Why the shipped settings still say homologue_source,ncbi. That setting names the directory the homologue csv files are read from and written to, and the DVC-tracked alignments that reproduce the published results live in data/homologues/ncbi/. Leaving the default alone is what lets a fresh checkout reproduce those numbers. Change it to colabfold for any run that retrieves new homologues; the pipeline refuses to start if the setting and the enabled stages disagree, so the two cannot be mixed by accident.

Why this changed

THOIPA was built in 2017-2020, when a BLAST query to NCBI returned in a few minutes. The sequence databases have grown enormously since: nr now holds over a billion sequences, and NCBI queues automated clients accordingly. A probe of a three-residue query in August 2026 returned RTOE=11165 – NCBI’s own estimate of 3.1 hours before results would be ready. A prediction that took minutes when the paper was published can now take hours, or be refused outright if the same client queries repeatedly.

That is not a fault in THOIPA and it is not something THOIPA can fix from the client side. NCBI also does not archive old nr releases, so the May 2020 snapshot behind the published numbers cannot be recovered by anyone. nr is the historical reference, not an option.

Retrieving homologues from the ColabFold MSA server

The server runs MMseqs2 with three profile iterations against UniRef30 and an environmental database assembled from BFD, MGnify, MetaEuk and SMAG, then expands each matched cluster back to its members. A search takes 10 to 70 seconds per protein against hours of NCBI queue, needs no local database, and returns an archive containing msa.sh – the exact command line and database versions behind the alignment. The BLAST path recorded no equivalent.

export THOIPA_COLABFOLD_CONTACT_EMAIL=you@example.com

Then switch homologue_source to colabfold in the settings CSV and enable the run_retrieve_homologues_from_colabfold and run_parse_colabfold_a3m_into_csv stages. They replace the blastp search and the XML parse; everything downstream is unchanged, because the homologue CSV they write carries the same columns.

The standalone predictor uses the same setting: run_THOIPA_prediction reads homologue_source from thoipapy/setting/standalone_run_settings.csv and takes the same ColabFold path, so a single prediction no longer has to wait on an NCBI queue either.

A deployment selects its source with an environment variable instead of by editing a file inside the installed package:

export THOIPA_HOMOLOGUE_SOURCE=colabfold
export THOIPA_COLABFOLD_CONTACT_EMAIL=you@example.com

THOIPA_HOMOLOGUE_SOURCE overrides the settings file when set. THOIPA_COLABFOLD_CONTACT_EMAIL is required on that path and a prediction refuses to start without it, because the MSA server asks automated clients to identify themselves. The shipped default remains ncbi, so an upgrade does not change what an existing installation returns.

Licensing and attribution

Nothing here restricts commercial use. ColabFold and MMseqs2 are MIT licensed, and the databases distributed at colabfold.mmseqs.com state that “all files are available under a Creative Commons Attribution 4.0 International (CC BY 4.0) License”. UniProt, from which UniRef30 derives, is also CC BY 4.0. All of these permit commercial use provided the sources are attributed, which means citing ColabFold, MMseqs2 and the databases in anything published from THOIPA output.

The public server publishes no terms of service, and the constraint on it is a fair-use expectation rather than a licence: the compute is donated by KOBIC and the Söding Lab, the operators describe it as a limited shared resource, and they reserve the right to limit access case by case. Treat it as a courtesy that can be withdrawn rather than a service with a guarantee, and keep the self-hosting route below available for anything that outgrows it.

api.colabfold.com is a free academic service that processes a few thousand alignments a day and asks for serial queries from a single IP. A 40-protein set is three orders of magnitude inside that, and this webserver’s traffic has never come near it, so the public server is the default rather than a stopgap. THOIPA submits one protein at a time and never searches in parallel. A deployment with steady traffic should host its own MMseqs2 server and point THOIPA_COLABFOLD_HOST at it; nothing else changes. Self-hosting is not a way to save the disk, though: the two ColabFold databases are 103 GB and 118 GB as downloads, and ColabFold’s own setup guidance puts them nearer 1 TB once built with indexes, against 96 GB for the local UniRef90 BLAST database. Self-hosting buys independence from a shared service, and costs roughly an order of magnitude more disk than the thing it replaces.

Fallback: a local UniRef90 BLAST database

Use this if the MSA server is unavailable, or if you need the pipeline to run with no third-party service in the path at all. It costs about 96 GB of disk and a rebuild every UniProt release, and it is indistinguishable from ColabFold on accuracy (-0.005 ROC AUC, see above), so the disk buys availability rather than quality.

Either way this is a breaking change: predictions will not match the published results. A different database yields a different homologue set, a different alignment, and therefore different conservation, coevolution and polarity features. The scores move.

Setting up UniRef90

UniRef90 clusters UniProt at 90% identity: 121 million clusters against nr’s billion-plus sequences, with little practical loss for this pipeline, which collapses exact-duplicate TMD sequences and runs CD-HIT anyway.

Requirements: about 160 GB of free disk and BLAST+. The script keeps the 32 GB download, the decompressed FASTA and the built database side by side, and deletes none of them, so peak usage is all three at once.

mamba install -c bioconda blast

# Downloads UniRef90 and runs makeblastdb. Idempotent: an existing download is not refetched.
# Expect several hours for the download and 1-2 hours to build.
python scripts/build_local_blast_db.py

export THOIPA_LOCAL_BLAST_DB=/mnt/shared/blastdb/uniref90

Or by hand:

wget https://ftp.uniprot.org/pub/databases/uniprot/uniref/uniref90/uniref90.fasta.gz
gunzip uniref90.fasta.gz
makeblastdb -in uniref90.fasta -dbtype prot -out uniref90 -title uniref90 -parse_seqids

With THOIPA_LOCAL_BLAST_DB set, predictions search that database. Unset, they fall back to querying NCBI, which requires THOIPA_NCBI_CONTACT_EMAIL because NCBI expects automated clients to identify themselves. That path is kept for reproducing old runs and is not recommended for new ones: see the queueing times above.

A smaller database for tests

Set DATABASE_TO_BUILD = "swissprot" in the script for a 575k-sequence, ~340 MB database that builds in ten seconds and answers in under one. Use it for tests, CI and development.

Do not use Swiss-Prot for production. It yields roughly a quarter of nr’s alignment depth: 26 hits against 76 unique TMD homologues for 1xioA4, 18 against 101 for 4hksA1, and only 10 survived filtering for glycophorin A. Conservation, rate4site and coevolution rank 4th, 2nd and 6th by mean decrease in impurity, and all derive from that alignment.

A note on database choice

A database filtered to membrane proteins does not help. THOIPA needs homologues of the query protein itself – glycophorin A’s useful hits are glycophorins in other species – so what matters is taxonomic depth within the query’s own family, not enrichment for membrane proteins. Filtering on a transmembrane annotation would also silently drop genuine homologues that merely lack the annotation, and alignment depth is precisely what must not be lost.

NCBI does not host UniRef90, so the remote BLAST path cannot use it. NCBI’s BLAST service offers nr, refseq_protein, swissprot, pdb, env_nr, tsa_nr, landmark and pataa; of those only nr has comparable depth, and it is the one that queues for hours. This is why the homologue search moved to the ColabFold MSA server rather than to another NCBI database.

Reproducing the published results

Versions from 2.0.0 onwards include corrections and improvements made after publication, so their output differs slightly from the numbers in the 2020 paper. The differences are small and do not change the conclusions, but they are real.

To reproduce the results as published, use the state of the repository at the time of publication rather than the current release:

Note that v1.2.0 requires python 3.8 and the dependency versions pinned in its requirements.txt; it will not run on a current scientific python stack.

For any new work, use the current release. The main post-publication corrections are that feature selection is now deterministic (it previously depended on the interpreter’s hash seed, so the selected feature set varied between runs), model training and hyperparameter tuning are seeded, and several ineffective filters and dead assertions were repaired.

Usage as a standalone predictor

  • for local predictions on linux, first install NCBI_BLAST, biopython, freecontact, CD-HIT and rate4site

  • see test/functional/test_standalone_prediction.py for the current run syntax, typically

from thoipapy import run_THOIPA_prediction
from thoipapy.predict import get_md5_checksum
from thoipapy.utils import make_sure_path_exists

protein_name = "ERBB3"
TMD_seq = "MALTVIAGLVVIFMMLGGTFL"
full_seq = "MVQNECRPCHENCTQGCKGPELQDCLGQTLVLIGKTHLTMALTVIAGLVVIFMMLGGTFLYWRGRRIQNKRAMRRYLERGESIEPLDPSEKANKVLA"
out_dir = "/path/to/your/desired/output/folder"
make_sure_path_exists(out_dir)
md5 = get_md5_checksum(TMD_seq, full_seq)
run_THOIPA_prediction(protein_name, md5, TMD_seq, full_seq, out_dir)

Example Output

  • the output includes a csv showing the THOIPA prediction for each residue, as well as a heatmap figure as a summary

  • below is a heatmap showing the THOIPA prediction, and underlying conservation, relative polarity, and coevolution

https://raw.githubusercontent.com/bojigu/thoipapy/develop/thoipapy/docs/standalone_heatmap_example.png

Create your own machine learning predictor

  • THOIPA can be retrained to any dataset of your choice

  • the original set of training sequences and other resources are published via the Open Science Foundation, and are also what dvc pull fetches into data/

  • the THOIPA feature extraction, feature selection, and training pipeline is fully automated

  • open an issue for an introduction to the THOIPA software pipeline and settings

The data, sets and base directories are resolved from the repository itself (see thoipapy/paths.py); they are no longer read from the settings spreadsheet. Protein sets are defined in data/sets/. Because the training data is not shipped inside the installed package, the training pipeline can only be run from a checkout of this repository, not from pip install thoipapy.

Where things are

path

contents

thoipapy/predict.py

standalone prediction for a single sequence

thoipapy/run.py

the training and validation pipeline

thoipapy/features/

one module per feature

thoipapy/homologues/

BLAST search and alignment parsing

thoipapy/ML_model/

training, tuning, and the shipped model

thoipapy/validation/

cross-validation and performance metrics

thoipapy/paths.py

resolves data/, data/sets/ and settings

thoipapy/artefacts.py

ArtefactPaths: the path of every pipeline file

thoipapy/run_settings.py

RunSettings: which pipeline stages run

thoipapy/paper_figures/

2020 paper figures; create_BOcurve_files is live

Settings are CSV. thoipapy/setting/run_settings_example.csv drives a training run, standalone_run_settings.csv a single prediction, and model_features.csv lists the features eligible for the model. Each row of the two run-settings files carries a type column and is converted on load.

Pipeline functions take explicit named parameters rather than a settings dictionary, so a signature states what the function reads:

def lipo_from_pssm_mult_prot(paths, df_set, lipophilicity_scale, logging):

Artefact filenames encode the settings that produced them (surr20.gaps5). ArtefactPaths computes them, so writers and readers cannot disagree when a setting changes.

Run the training pipeline with:

python -m thoipapy.run

The settings path is hardcoded in run.py. To use a different one, import run() and pass your own settings dict.

License

THOIPApy is free software distributed under the permissive MIT License.

Contribute

  • Contributors are welcome.

  • For bug reports, questions and feature requests, please open an issue.

Contact

THOIPA is maintained by Mark Teese. To make contact, open an issue or use LinkedIn.

Citation

Yao Xiao, Bo Zeng, Nicola Berner, Dmitrij Frishman, Dieter Langosch, and Mark George Teese (2020) Experimental determination and data-driven prediction of homotypic transmembrane domain interfaces, Computational and Structural Biotechnology Journal

Release files for thoipapy 3.2.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 thoipapy 3.2.0
File Size Uploaded
thoipapy-3.2.0.tar.gz 308.2 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for thoipapy 3.2.0
File Interpreter ABI Platform
thoipapy-3.2.0-py3-none-any.whl Python 3 none any Details

Total release size: 634.3 kB

Release files / thoipapy-3.2.0.tar.gz

Download URL thoipapy-3.2.0.tar.gz
Size 308.2 kB
Tags Source
SHA-256 checksum
How to use checksums
c59c33765f40a116b8266bb6c96b3fca7c87a08ecfdf8e36c481fce500cd1812
BLAKE2b-256 checksum
How to use checksums
a7cd5cb4e6ea5f55d548ff55e8bc4d27e44c0e550013ecf6e84db62232f08c1f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.15

Release files / thoipapy-3.2.0-py3-none-any.whl

Download URL thoipapy-3.2.0-py3-none-any.whl
Size 326.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
a3a18365094e3b0104bfbf6b6219456d79ebc6a6774ac81e55a61f5a36f6ce78
BLAKE2b-256 checksum
How to use checksums
9348b72e4b4687f2ace2ad46d60ef044ad09a1c1542e8f4e4d3ec63e8ef5f15b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.15

Release history Release notifications | RSS feed

This release

3.2.0 This release

2 release files

3.0.1

2 release files

3.0.0

2 release files

2.1.0

2 release files

2.0.0

2 release files

1.2.0

2 release files

1.1.3

2 release files

1.1.2

2 release files

1.1.0

2 release files

1.0.1

2 release files

1.0.0

2 release files

0.0.7

2 release files

0.0.5

2 release files

0.0.4

2 release files

0.0.3

2 release files

0.0.2

2 release files

0.0.1

2 release files

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