Skip to main content

theoryforge (Python) theoryforge hex logo

CI docs PyPI Python versions License: MIT DOI

Systematic theory development: a rigorous, reproducible workflow for building, developing and testing scientific theories. This is the feature-parity twin of the R package of the same name, which offers the same workflow in R. The two produce identical verdicts and byte-identical diagram intermediate representations.

The rendered documentation site, with the API reference and worked guides, is at https://pablobernabeu.github.io/theoryforge/python/.

The interactive web app runs this package in your browser via Pyodide, with nothing to install. You can load a theory and run the operations it offers, from the rigour checklist through to the literature map, then export the visualisation (SVG/PNG) together with the Python code that reproduces it.

Installation

The package is on PyPI:

pip install theoryforge

The optional render extra adds native diagram rendering (render_diagram(), which wraps the DOT views in a graphviz.Source):

pip install "theoryforge[render]"

The development version installs from the python/ subdirectory of the repository:

pip install "git+https://github.com/pablobernabeu/theoryforge.git#subdirectory=python"

To work on the package itself, install an editable checkout with the development extras, from the python/ directory of a clone:

pip install -e ".[dev]"

Quick start

The example theories live in fixtures/ at the root of the repository, so run the lines below from a clone, with python/ as the working directory.

import theoryforge as tf

# read + check an existing theory
t = tf.read("../fixtures/panic-network.theory.yaml")
t.validate()                       # structural validation against the shared schema
print(t.report("json"))            # 12-item rigour checklist + gate
print(t.diagram("nomological_net"))# Graphviz DOT
# t.render_diagram("nomological_net")  # rendered inline; needs theoryforge[render]
t.redundancy_check()               # lexical jingle-jangle screen

# BUILD a theory programmatically (provenance auto-logged)
b = (tf.new_theory("panic_demo", "A demonstration theory of panic")
       .add_construct("arousal", "Physiological arousal", "bodily signs of sympathetic activation",
                      measurement=["heart_rate", "skin_conductance"], boundary_conditions=["adults"])
       .add_construct("catastrophic_interpretation", "Catastrophic interpretation",
                      "appraisal of bodily sensations as dangerous", measurement=["bsiq"])
       .add_proposition("p1", "arousal", "catastrophic_interpretation", "increases",
                        mechanism="rising arousal is read as evidence of threat")
       .add_prediction("pred1", "higher arousal predicts more catastrophic interpretation",
                       "directional", derives_from=["p1"]))
b.validate(full=True)              # ids are unique and every cross-reference resolves

# DEVELOP: progressive vs degenerating appraisal of an amendment
v1 = tf.read("../fixtures/panic-network.theory.yaml")
v2 = tf.read("../fixtures/panic-network-2026-v2.theory.yaml")
print(v2.appraise_amendment(v1))   # -> {'verdict': 'progressive', ...}

# TEST: operationalised severity + a preregistration document
t.severity()                       # per-prediction risk + computed severity
print(t.preregister())             # markdown prereg

# LITERATURE: map the field, then position the theory against it
corpus = tf.read_corpus("../fixtures/panic-corpus.yaml")
tf.litmap(corpus)                  # keyword co-occurrence, themes, co-citation
t.landscape(corpus)                # -> themes flagged 'under_theorised' / 'crowded' (redundancy risk)
# tf.fetch_corpus("panic disorder theory")  # optional OpenAlex fetch (network call)

The ../fixtures/*.yaml files referenced above are sample theories that live in the project repository. Adjust the paths to your own theory files when running the examples.

Test

The suite is offline and runs from the same directory as the editable install:

pytest

What the package provides

The deterministic core covers theory-object I/O and validation, the 12-item rigour checklist with its weighted aggregate score and blocker gate, ten diagram exporters and a lexical redundancy screen. The three workflow modes sit on the same object. BUILDING is a builder API that logs its own provenance, DEVELOPMENT is the Lakatosian appraisal of an amendment, and TESTING is the operationalised severity rubric with its preregistration export.

The literature layer starts from read_corpus. litmap derives keyword co-occurrence, deterministic connected-component themes and co-citation, and landscape maps a theory and its alternatives onto those themes, flagging under-theorised fronts and redundancy risk. lit_diagram draws the co-occurrence, co-citation and theme-landscape views. Where a network connection is available, the fetch_corpus OpenAlex adapter retrieves a corpus, and new_evidence_dois checks deterministically which candidate DOIs, from any search tool, a theory does not yet cite.

Beyond the modes, compile_sem translates constructs and propositions to lavaan model syntax, and dossier assembles a reviewer-facing audit bundle. Simulation and the outward-facing adapters round the package out. simulate runs the construct network as a deterministic dynamical system, render_report wraps the dossier in a Quarto report, embedding_redundancy adds an opt-in, embedder-dependent screen, and osf_push deposits to OSF, dry-run by default.

Citation

Please cite theoryforge if it contributes to work you publish. The About page carries the citation with a BibTeX entry, and a short note on the developer. The repository also ships CITATION.cff, which drives GitHub's "Cite this repository" button.

Licence

MIT. See LICENSE.

Contributing

Issues and pull requests are welcome. The contributing guide describes the development setup and the conventions the package follows, and everyone taking part is asked to honour the Code of Conduct.

Continuous integration lints, type-checks and tests the package on every push, and the cross-language parity check compares its output against the R twin on every fixture, so a change that breaks parity is caught before it lands.

Metadata

Release files for theoryforge 0.6.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 theoryforge 0.6.0
File Size Uploaded Provenance
theoryforge-0.6.0.tar.gz 127.4 kB With provenance Details

Built distribution (wheel)

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

Total release size: 183.1 kB

Release files / theoryforge-0.6.0.tar.gz

Download URL theoryforge-0.6.0.tar.gz
Size 127.4 kB
Tags Source
SHA-256 checksum
How to use checksums
d5641d76c836684076c3350c36d1b47da2586500b76af8a47e46d1d8a8a5f84a
BLAKE2b-256 checksum
How to use checksums
5ea3bf430eff14158262a5abc4ac52ebfd74acbc579aefb78977a63339f0d8cd
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 27, 2026.

Transparency log

Release files / theoryforge-0.6.0-py3-none-any.whl

Download URL theoryforge-0.6.0-py3-none-any.whl
Size 55.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
fc2b547c682738a3a5492fe72e4a87fe55ba6208833d19d94811176d7c5b1187
BLAKE2b-256 checksum
How to use checksums
079656aa5f2ab3c7a2fc3ed7aa15839861c286ad899bca4da48c1fbce2186e6e
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 27, 2026.

Transparency log

Security for theoryforge 0.6.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 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for theoryforge-0.6.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 27, 2026.

Transparency log

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.

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