equiconc 0.1.0

Equilibrium concentration solver
Documentation
# Default: list available recipes
default:
    @just --list

venv := justfile_directory() / ".venv"

# Rust coverage from Rust tests
coverage-rust:
    #!/usr/bin/env bash
    set -euo pipefail
    source <(cargo llvm-cov show-env --export-prefix --no-cfg-coverage)
    export CARGO_TARGET_DIR=$CARGO_LLVM_COV_TARGET_DIR
    export CARGO_INCREMENTAL=1
    cargo llvm-cov clean --workspace
    cargo test
    cargo llvm-cov --no-run --lcov --output-path coverage-rust.lcov

# Python + Rust coverage from Python tests (instrumented build, both outputs)
coverage-python-full:
    #!/usr/bin/env bash
    set -euo pipefail
    source <(cargo llvm-cov show-env --export-prefix --no-cfg-coverage)
    export CARGO_TARGET_DIR=$CARGO_LLVM_COV_TARGET_DIR
    export CARGO_INCREMENTAL=1
    cargo llvm-cov clean --workspace
    if [ -f .venv/bin/activate ]; then
        source .venv/bin/activate
    else
        source .venv/Scripts/activate
    fi
    maturin develop --uv --profile dev
    pytest --cov equiconc --cov-report term-missing --cov-report xml:coverage-python.xml
    cargo llvm-cov report --lcov --output-path coverage-rust-from-python.lcov

# Combined coverage with HTML report in target/coverage/
coverage-html:
    #!/usr/bin/env bash
    set -euo pipefail
    export VIRTUAL_ENV="{{ venv }}"
    source <(cargo llvm-cov show-env --export-prefix)
    cargo llvm-cov clean --workspace
    cargo test
    maturin develop
    {{ venv }}/bin/pytest tests/test_equiconc.py -v
    cargo llvm-cov report --html --output-dir target/coverage

# Combined coverage with HTML report, opened in browser
coverage-open:
    #!/usr/bin/env bash
    set -euo pipefail
    export VIRTUAL_ENV="{{ venv }}"
    source <(cargo llvm-cov show-env --export-prefix)
    cargo llvm-cov clean --workspace
    cargo test
    maturin develop
    {{ venv }}/bin/pytest tests/test_equiconc.py -v
    cargo llvm-cov report --html --output-dir target/coverage --open

# Serve the HTML coverage report on localhost:8000
coverage-serve: coverage-html
    python3 -m http.server 8000 -d target/coverage/html

# Pre-execute notebooks and convert to markdown
docs-notebooks: 
    {{ venv }}/bin/jupyter nbconvert --to markdown --execute \
        --output-dir docs/notebooks/ \
        docs/notebooks/quickstart.ipynb \
        docs/notebooks/competitive_binding.ipynb

# Build documentation
docs: docs-notebooks
    {{ venv }}/bin/zensical build

# Serve documentation with live reload
docs-serve: docs-notebooks
    {{ venv }}/bin/zensical serve