From 0a371886d69be20c294eee50bc6d7d6ea0fb2dac Mon Sep 17 00:00:00 2001 From: Eduard Kerkhoven Date: Sat, 24 Oct 2026 12:10:20 +0000 Subject: [PATCH 01/10] refactor: use the shared site scripts, standard file names and logo folder requirements-sphinx.txt is requirements.txt and gen_api_pages_sphinx.py is gen_api_pages.py, the names used by the other sites. The scripts are copies of docs-site/scripts in CompMetEng/skills; names, paths and categories are in scripts/project.yml. The API pages now show signatures and render numpydoc sections, list the same functions as before, and no longer carry the MkDocs icon front matter. conf.py follows the standard: smartquotes off, the cobrapy inventory and the guide linker, and a link check setting. Logos and the favicon are in docs/_static only, with a white logo for dark mode made from the green one (every pixel white, alpha kept, as for gecko-icon-white.png); docs/assets is removed. --- .gitignore | 2 +- .readthedocs.yaml | 2 +- .../gecko-icon.png} | Bin docs/_static/gecko-logo-white.png | Bin 0 -> 82201 bytes docs/assets/gecko-icon-color.png | Bin 39628 -> 0 bytes docs/assets/gecko-icon-white.png | Bin 18023 -> 0 bytes docs/assets/gecko-logo.png | Bin 144125 -> 0 bytes docs/conf.py | 68 +-- requirements-sphinx.txt => requirements.txt | 0 scripts/api_index.py | 285 ++++++------- scripts/autolink.py | 178 ++++++++ scripts/check_names.py | 193 +++++++++ scripts/check_site.py | 396 ++++++++++++++++++ scripts/curated_pairs.yml | 2 +- ...n_api_pages_sphinx.py => gen_api_pages.py} | 287 ++++++------- scripts/known_names.txt | 9 + scripts/project.py | 71 ++++ scripts/project.yml | 45 ++ 18 files changed, 1214 insertions(+), 324 deletions(-) rename docs/{assets/gecko-icon-green.png => _static/gecko-icon.png} (100%) create mode 100644 docs/_static/gecko-logo-white.png delete mode 100644 docs/assets/gecko-icon-color.png delete mode 100644 docs/assets/gecko-icon-white.png delete mode 100644 docs/assets/gecko-logo.png rename requirements-sphinx.txt => requirements.txt (100%) create mode 100644 scripts/autolink.py create mode 100644 scripts/check_names.py create mode 100644 scripts/check_site.py rename scripts/{gen_api_pages_sphinx.py => gen_api_pages.py} (59%) create mode 100644 scripts/known_names.txt create mode 100644 scripts/project.py create mode 100644 scripts/project.yml diff --git a/.gitignore b/.gitignore index 7649c74..8f2b4c3 100644 --- a/.gitignore +++ b/.gitignore @@ -167,7 +167,7 @@ venv.bak/ # mkdocs documentation /site -# Sphinx build: generated at build time by scripts/gen_api_pages_sphinx.py, +# Sphinx build: generated at build time by scripts/gen_api_pages.py, # never checked in. docs/api/matlab/*.md docs/api/python/*.md diff --git a/.readthedocs.yaml b/.readthedocs.yaml index 4f88d33..3e23b4e 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -19,4 +19,4 @@ sphinx: python: install: - - requirements: requirements-sphinx.txt + - requirements: requirements.txt diff --git a/docs/assets/gecko-icon-green.png b/docs/_static/gecko-icon.png similarity index 100% rename from docs/assets/gecko-icon-green.png rename to docs/_static/gecko-icon.png diff --git a/docs/_static/gecko-logo-white.png b/docs/_static/gecko-logo-white.png new file mode 100644 index 0000000000000000000000000000000000000000..b86533820ffd76f953a83fe814a6001572227474 GIT binary patch literal 82201 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 lEO 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
  • #l7^V0laj-^#w% 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%0Ap(=05KTZe*TsWCCfk)~TRcG>NC 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.0.0b1 " @@ -97,18 +99,18 @@ def setup(app): - """Run the API-reference generator before Sphinx reads the source tree. + """Generate the API reference and link the guide pages to it. - Statically extracts full docstrings for both GECKO (MATLAB, via direct - help-block parsing) and geckopy (Python, via griffe used standalone) and - writes plain MyST pages -- there is no maintained Sphinx equivalent of - mkdocstrings / mkdocstrings-matlab (both MkDocs-only live-rendering - plugins), the same conclusion raven-docs reached for RAVEN / raven-toolbox. + The generator collects from the tracked submodules and writes static pages + before Sphinx's own file discovery runs; scripts/autolink.py then links + function names on the guide pages. """ from pathlib import Path import sys sys.path.insert(0, str(Path(__file__).resolve().parent.parent / "scripts")) - import gen_api_pages_sphinx + import autolink + import gen_api_pages - gen_api_pages_sphinx.generate(Path(__file__).resolve().parent) + gen_api_pages.generate(Path(__file__).resolve().parent) + return autolink.setup(app) diff --git a/requirements-sphinx.txt b/requirements.txt similarity index 100% rename from requirements-sphinx.txt rename to requirements.txt diff --git a/scripts/api_index.py b/scripts/api_index.py index 0fde5fd..ab7322b 100644 --- a/scripts/api_index.py +++ b/scripts/api_index.py @@ -1,69 +1,41 @@ """Shared index of the two toolboxes' public APIs, collected from submodule source. -Both the API-reference generator (``gen_api_pages_sphinx.py``) and any future -name checker need to know which functions actually exist in GECKO (MATLAB) -and geckopy (Python). Collecting that in one place means the prose can be -validated against exactly the same index the reference pages are built from, -so a function name that no longer resolves cannot slip through in one while -the other is regenerated. - -Collection is static in both languages: ``.m`` files are read as text and -Python modules are parsed with ``ast``. Neither MATLAB nor an installed -geckopy is required. +The API-reference generator (``gen_api_pages.py``), the linker +(``autolink.py``) and the name checker (``check_names.py``) need to know which +functions exist in the MATLAB toolbox and in the Python package. Collecting that +in one place means the prose is validated against exactly the index the +reference pages are built from, so a function name that no longer resolves +cannot slip through in one while the other is regenerated. + +Collection is static in both languages: ``.m`` files are read as text and Python +modules are parsed with ``ast``. Neither MATLAB nor the installed Python package +is required. The names, paths and categories come from ``project.yml``. """ from __future__ import annotations import ast -import os import re +import sys from pathlib import Path -ROOT = Path(__file__).resolve().parent.parent - -# The submodules are the source of truth for a real build. For local work they -# can be pointed elsewhere -- e.g. at a working checkout of either toolbox -- -# which is useful when a submodule cannot be moved to the tracked commit. -GECKO = Path(os.environ.get("GECKO_DOCS_GECKO_SRC", ROOT / "GECKO" / "src")) -PYPKG = Path( - os.environ.get( - "GECKO_DOCS_PYTHON_SRC", ROOT / "geckopy" / "src" / "geckopy" - ) -) - -# GECKO src categories to document, in nav order: (folder, page title). GECKO -# dropped the src/geckomat nesting level and split what used to be a single -# "utilities" catch-all into several categories. Pruned to existing folders -# at build time; "deprecated" (backward-compat aliases, e.g. selectKcatValue -# for assignKcatValues) and "dlkcat-gecko" (the Python/Docker DLKcat runner, -# not MATLAB) are intentionally excluded. -MATLAB_CATEGORIES = [ - ("change_model", "Build & edit ecModel"), - ("download_databases", "Download databases"), - ("enzyme_usage", "Enzyme usage"), - ("flux_analysis", "Flux analysis"), - ("gather_kcats", "Gather kcats"), - ("get_enzyme_data", "Enzyme & EC data"), - ("io", "Input / output"), - ("kcat_tuning", "kcat sensitivity tuning"), - ("limit_proteins", "Limit proteins"), - ("model_adapter", "Model adapter"), - ("utilities", "Utilities"), -] - -# Friendly titles for geckopy packages. ec_model is geckopy's counterpart to -# change_model; adapter to model_adapter. -PY_PACKAGE_TITLES = { - "ec_model": "Build & edit ecModel", - "gather_kcats": "Gather kcats", - "get_enzyme_data": "Enzyme & EC data", - "kcat_tuning": "kcat sensitivity tuning", - "limit_proteins": "Limit proteins", - "adapter": "Model adapter", - "utilities": "Utilities", - "databases": "Databases", - "_toplevel": "Top-level", -} +sys.path.insert(0, str(Path(__file__).resolve().parent)) + +import project as _project # noqa: E402 + +PROJECT = _project.load() +ROOT = _project.ROOT + +# The submodules are the source of truth for a real build. For local work the +# environment variables DOCS_MATLAB_SRC and DOCS_PYTHON_SRC point at a working +# checkout instead, which is useful when a submodule cannot be moved to the +# tracked commit. +MATLAB = PROJECT.matlab_src +PYPKG = PROJECT.python_src +# Top-level categories to document, in navigation order: (folder, page title). +MATLAB_CATEGORIES = PROJECT.categories +# Titles for the Python sub-packages. +PY_PACKAGE_TITLES = PROJECT.package_titles def norm(name: str) -> str: @@ -88,10 +60,11 @@ def cell(text: str) -> str: def is_matlab_function(path: Path) -> bool: """True if the .m file declares a function (i.e. not a plain script). - Read as utf-8-sig: some of GECKO's .m files carry a UTF-8 byte-order mark, + Read as utf-8-sig: some .m files carry a UTF-8 byte-order mark, and a leading U+FEFF is not whitespace to ``str.strip()``, so the opening ``function`` line would not be recognised and the file would be indexed as - a script -- dropping it from the API reference without any error. + a script -- dropping it from the API reference and from the name checker's + index without any error. """ try: with path.open(encoding="utf-8-sig", errors="ignore") as fh: @@ -108,10 +81,8 @@ def is_matlab_function(path: Path) -> bool: def is_matlab_classdef(path: Path) -> bool: """True if the .m file declares a class rather than a function or script. - GECKO's classdef files (``model_adapter/``) put their help comment - *before* the ``classdef`` line, the reverse of a function's help block, - which is why classdef needs its own detector and its own summary - extractor below rather than reusing :func:`is_matlab_function`. + A classdef file puts its help comment *before* the ``classdef`` line, the + reverse of a function, whose help follows the ``function`` line. """ try: with path.open(encoding="utf-8-sig", errors="ignore") as fh: @@ -125,90 +96,116 @@ def is_matlab_classdef(path: Path) -> bool: return False -def matlab_classdef_summary(path: Path, fname: str) -> str: - """First descriptive line of a classdef's leading MATLAB help block.""" +def _strip_comment(line: str) -> str: + text = line.strip()[1:] + return text[1:] if text.startswith(" ") else text + + +def matlab_classdef_help_block(path: Path) -> list[str]: + """Help lines of a classdef file: the comment block before ``classdef``.""" try: with path.open(encoding="utf-8-sig", errors="ignore") as fh: - lines = fh.readlines() + lines = fh.read().splitlines() except OSError: - return "" - + return [] + i = 0 + while i < len(lines) and not lines[i].strip(): + i += 1 help_lines: list[str] = [] - for line in lines: - stripped = line.strip() - if stripped.startswith("%"): - help_lines.append(stripped.lstrip("%").strip()) - elif stripped == "" and not help_lines: - continue - else: - break + while i < len(lines) and lines[i].strip().startswith("%"): + help_lines.append(_strip_comment(lines[i])) + i += 1 + while help_lines and not help_lines[-1].strip(): + help_lines.pop() + return help_lines - cleaned = [h for h in help_lines if h] - if not cleaned: - return "" - first = cleaned[0] - if first.lower().startswith(fname.lower()): - rest = first[len(fname):].strip(" -:\t") - if rest: - return rest - if len(cleaned) > 1: - return cleaned[1] - return "" - return first +def is_documented_matlab_object(path: Path) -> bool: + """A function, or a class that has a help block (an undocumented class is skipped).""" + if is_matlab_function(path): + return True + return is_matlab_classdef(path) and any(line.strip() for line in matlab_classdef_help_block(path)) -def matlab_summary(path: Path, fname: str) -> str: - """First descriptive line of a function's MATLAB help block.""" + +def matlab_help_block(path: Path) -> tuple[str, list[str]]: + """(signature, help lines) of a MATLAB function file. + + The signature is the ``function`` line, with any ``...`` continuation + lines joined onto it. The help lines are the comment block that follows, + with the ``%`` and the one space after it removed, so the author's + indentation and blank lines are kept. A classdef file has no signature, and + its help block comes before the ``classdef`` line. + """ + if is_matlab_classdef(path): + return "", matlab_classdef_help_block(path) try: with path.open(encoding="utf-8-sig", errors="ignore") as fh: - lines = fh.readlines() + lines = fh.read().splitlines() except OSError: - return "" - + return "", [] + + i = 0 + while i < len(lines) and not lines[i].strip().startswith("function"): + i += 1 + if i == len(lines): + return "", [] + signature = [lines[i].strip()] + while signature[-1].endswith("...") and i + 1 < len(lines): + i += 1 + signature.append(lines[i].rstrip()) + i += 1 + + while i < len(lines) and not lines[i].strip(): + i += 1 help_lines: list[str] = [] - started = False - for line in lines: - stripped = line.strip() - if not started: - if stripped.startswith("function"): - started = True - continue - if stripped.startswith("%"): - help_lines.append(stripped.lstrip("%").strip()) - elif stripped == "" and not help_lines: - continue - else: - break - - cleaned = [h for h in help_lines if h] - if not cleaned: - return "" - # The first help line is often just the function name; strip it. - first = cleaned[0] + while i < len(lines) and lines[i].strip().startswith("%"): + help_lines.append(_strip_comment(lines[i])) + i += 1 + while help_lines and not help_lines[-1].strip(): + help_lines.pop() + return "\n".join(signature), help_lines + + +def matlab_summary_and_body(path: Path, fname: str) -> tuple[str, list[str]]: + """(summary, remaining help lines) of a MATLAB function. + + The first help line is often just the function name, or the name followed + by the summary; the name is stripped, and a line holding nothing else + gives way to the next one. + """ + _signature, help_lines = matlab_help_block(path) + nonblank = [n for n, line in enumerate(help_lines) if line.strip()] + if not nonblank: + return "", [] + first_idx = nonblank[0] + first = help_lines[first_idx].strip() if first.lower().startswith(fname.lower()): rest = first[len(fname):].strip(" -:\t") if rest: - return rest - if len(cleaned) > 1: - return cleaned[1] - return "" - return first + return rest, help_lines[first_idx + 1:] + if len(nonblank) > 1: + return help_lines[nonblank[1]].strip(), help_lines[nonblank[1] + 1:] + return "", [] + return first, help_lines[first_idx + 1:] + + +def matlab_summary(path: Path, fname: str) -> str: + """First descriptive line of a function's MATLAB help block.""" + return matlab_summary_and_body(path, fname)[0] def collect_matlab() -> dict[str, list[dict]]: - """category -> sorted list of {name, summary} for documented functions - and classes.""" + """category -> sorted list of {name, summary} for documented functions.""" cats: dict[str, list[dict]] = {} for folder, _title in MATLAB_CATEGORIES: funcs: dict[str, str] = {} - base = GECKO / folder + base = MATLAB / folder for m in base.rglob("*.m"): if m.stem == "Contents": continue - if is_matlab_function(m): - funcs.setdefault(m.stem, matlab_summary(m, m.stem)) - elif is_matlab_classdef(m): - funcs.setdefault(m.stem, matlab_classdef_summary(m, m.stem)) + if not is_documented_matlab_object(m): + continue + funcs.setdefault(m.stem, matlab_summary(m, m.stem)) cats[folder] = [ {"name": n, "summary": funcs[n]} for n in sorted(funcs, key=str.lower) @@ -217,20 +214,18 @@ def collect_matlab() -> dict[str, list[dict]]: def collect_matlab_all() -> dict[str, str]: - """Every GECKO function or class name -> the category folder it lives in. + """Every function or class name of the MATLAB toolbox -> its category folder. - Unlike :func:`collect_matlab` this also walks the folders that are not - part of the documented category list, so a name checker recognises a - function that exists in the toolbox but has no reference page. + Unlike :func:`collect_matlab` this also walks the folders that are not part + of the documented category list, so the name checker recognises a function + that exists in the toolbox but has no reference page. """ found: dict[str, str] = {} - for m in GECKO.rglob("*.m"): - rel = m.relative_to(GECKO) - if rel.parts[0] in {"dlkcat-gecko"}: - continue - if m.stem == "Contents": + for m in MATLAB.rglob("*.m"): + rel = m.relative_to(MATLAB) + if rel.parts[0] in PROJECT.excluded_folders: continue - if not (is_matlab_function(m) or is_matlab_classdef(m)): + if m.stem == "Contents" or not (is_matlab_function(m) or is_matlab_classdef(m)): continue found.setdefault(m.stem, rel.parts[0]) return found @@ -240,7 +235,7 @@ def collect_matlab_all() -> dict[str, str]: # Collect Python functions and classes # # --------------------------------------------------------------------------- # def module_dotted(path: Path) -> str: - """geckopy/src/geckopy/ec_model/build.py -> geckopy.ec_model.build""" + """/src//io/excel.py -> .io.excel""" rel = path.relative_to(PYPKG.parent) # relative to src/ parts = list(rel.with_suffix("").parts) if parts[-1] == "__init__": @@ -248,6 +243,15 @@ def module_dotted(path: Path) -> str: return ".".join(parts) +def is_deprecated_alias(summary: str) -> bool: + """True for a backward-compatibility alias, whose docstring starts "Deprecated". + + The alias sits next to its replacement. It is left out of the reference, which + also keeps name matching from pairing a MATLAB function with the shim. + """ + return summary.startswith("Deprecated") + + def py_summary(node: ast.AST) -> str: """First non-empty line of a node's docstring.""" doc = ast.get_docstring(node) or "" @@ -273,18 +277,7 @@ def collect_python() -> list[dict]: if node.name.startswith("_"): continue summary = py_summary(node) - # geckopy keeps a backward-compat alias for the original - # MATLAB name alongside its canonical replacement in the same - # module (e.g. get_ec_from_database next to - # fill_eccodes_from_database), each marked with a docstring - # starting "Deprecated alias for ...". MATLAB's own - # backward-compat aliases live in a separate excluded - # deprecated/ folder; Python's have no such physical - # separation, so they are excluded here by convention - # instead. Skipping them also keeps norm()-based matching - # from pairing a MATLAB name with the deprecated shim that - # happens to share its transliterated spelling. - if summary.startswith("Deprecated"): + if is_deprecated_alias(summary): continue ident = f"{dotted}.{node.name}" if dotted else node.name objects.append( diff --git a/scripts/autolink.py b/scripts/autolink.py new file mode 100644 index 0000000..4f5a4f7 --- /dev/null +++ b/scripts/autolink.py @@ -0,0 +1,178 @@ +"""Link function names on the guide pages to their API reference. + +A Sphinx extension. On ``source-read`` it rewrites the inline code spans of +``guide/*`` pages, outside fenced code, headings and existing links: + +* a MATLAB function becomes a link to its entry in the generated MATLAB API + pages (``api/matlab/.md``); +* a Python function or class becomes a link to its entry in the Python + API pages (``api/python/.md``); +* a cobrapy object becomes a link to its entry in cobrapy's documentation, + looked up in cobrapy's intersphinx inventory. Single names such as ``pfba`` + or ``Model`` are only looked up in a table row that carries the cobrapy + badge; elsewhere a cobrapy name has to be dotted (``Model.optimize``) or + snake_case (``read_sbml_model``), so ordinary words are never linked. + +Every span in a table row is linked, so the "Functions on this page" table +links each entry; in prose only the first mention of a name per section is. +The cobrapy badge in a table row points at the first cobrapy object linked in +that row instead of cobrapy's index page. + +The page sources on disk are not changed, so ``scripts/run_examples.py``, which +reads them directly, sees the same code blocks. +""" + +from __future__ import annotations + +import re +import sys +from pathlib import Path + +sys.path.insert(0, str(Path(__file__).resolve().parent)) + +from api_index import PROJECT, collect_matlab, collect_python, slug # noqa: E402 +from project import COBRAPY_URL # noqa: E402 +from sphinx.util import logging # noqa: E402 + +COBRA_INDEX = COBRAPY_URL + +_FENCE = re.compile(r"^\s*(```|~~~)") +_HEADING = re.compile(r"^#{1,6}\s") +# An inline code span that is not the text of a markdown link ([`x`](...)) and +# not the content of a role ({bdg-link-secondary}`...`). +_SPAN = re.compile(r"(?`") +_IDENT = re.compile(r"^[A-Za-z_][A-Za-z0-9_]*(?:\.[A-Za-z_][A-Za-z0-9_]*)*$") +_SNAKE = re.compile(r"^[a-z][a-z0-9]+(?:_[a-z0-9]+)+$") +_COBRA_TYPES = ("py:function", "py:method", "py:class", "py:attribute", "py:property") +# Python names that mean something else on the guide pages: `main` is a +# command-line entry point in the package and a branch name in the prose. +_NOT_LINKED = {"main"} + + +class Linker: + def __init__(self, cobra_inventory: dict | None) -> None: + self.matlab = {f["name"]: folder for folder, funcs in collect_matlab().items() for f in funcs} + packages: dict[str, set[str]] = {} + for obj in collect_python(): + packages.setdefault(obj["name"], set()).add(obj["package"]) + # A name defined in two packages has no single target: leave it unlinked. + self.python = {name: next(iter(pk)) for name, pk in packages.items() if len(pk) == 1} + self.cobra = self._cobra_index(cobra_inventory or {}) + self.counts = {"matlab": 0, "python": 0, "cobrapy": 0, "badges": 0} + + @staticmethod + def _cobra_index(inventory: dict) -> dict[str, str]: + """Every dotted suffix of a cobrapy object's full name -> its URL. + + ``cobra.core.model.Model.optimize`` is reachable as ``optimize``, + ``Model.optimize``, ``model.Model.optimize`` and so on. Where two + objects share a suffix, the one with the shorter full name wins. + """ + best: dict[str, tuple[int, str, str]] = {} + for role in _COBRA_TYPES: + for full, entry in inventory.get(role, {}).items(): + url = getattr(entry, "uri", None) or entry[2] + parts = full.split(".") + for i in range(len(parts)): + key = ".".join(parts[i:]) + rank = (len(parts), full, url) + if key not in best or rank < best[key]: + best[key] = rank + return {key: url for key, (_n, _f, url) in best.items()} + + def target(self, token: str, in_badged_row: bool) -> tuple[str, str] | None: + """(kind, href) for a code span, or None to leave it as it is.""" + if token in _NOT_LINKED: + return None + if token in self.matlab: + return "matlab", f"../api/matlab/{self.matlab[token]}.md#{slug(token)}" + if token in self.python: + return "python", f"../api/python/{self.python[token]}.md#{slug(token)}" + if not _IDENT.match(token): + return None + bare = token.removeprefix("cobra.") + if "." in bare or _SNAKE.match(bare) or in_badged_row: + url = self.cobra.get(bare) or self.cobra.get(token) + if url: + return "cobrapy", url + return None + + def link_page(self, text: str) -> str: + out: list[str] = [] + in_fence = False + seen: set[str] = set() + for line in text.split("\n"): + if _FENCE.match(line): + in_fence = not in_fence + out.append(line) + continue + if in_fence: + out.append(line) + continue + if _HEADING.match(line): + seen = set() + out.append(line) + continue + out.append(self._link_line(line, seen)) + return "\n".join(out) + + def _link_line(self, line: str, seen: set[str]) -> str: + if "`" not in line: + return line + in_table = line.lstrip().startswith("|") + badged = in_table and bool(_BADGE.search(line)) + first_cobra: list[str] = [] + + def replace(m: re.Match) -> str: + raw = m.group(1) + token = raw.strip() + token = token[:-2] if token.endswith("()") else token + found = self.target(token, badged) + if found is None: + return m.group(0) + kind, href = found + if not in_table: + if token in seen: + return m.group(0) + seen.add(token) + if kind == "cobrapy" and not first_cobra: + first_cobra.append(href) + self.counts[kind] += 1 + return f"[`{raw}`]({href})" + + line = _SPAN.sub(replace, line) + if badged and first_cobra: + line = _BADGE.sub( + lambda _m: f"{{bdg-link-secondary}}`cobrapy <{first_cobra[0]}>`", line, count=1 + ) + self.counts["badges"] += 1 + return line + + +def _cobra_inventory(app) -> dict | None: + named = getattr(app.env, "intersphinx_named_inventory", None) or {} + return named.get("cobra") + + +def setup(app): + state: dict[str, Linker] = {} + + def on_source_read(app, docname, source): + if not docname.startswith("guide/"): + return + if "linker" not in state: + state["linker"] = Linker(_cobra_inventory(app)) + source[0] = state["linker"].link_page(source[0]) + + def on_build_finished(app, exception): + if "linker" in state: + c = state["linker"].counts + logging.getLogger(__name__).info( + "autolink: %d %s, %d %s and %d cobrapy links; %d cobrapy badges", + c["matlab"], PROJECT.matlab_name, c["python"], PROJECT.python_name, c["cobrapy"], c["badges"], + ) + + app.connect("source-read", on_source_read) + app.connect("build-finished", on_build_finished) + return {"parallel_read_safe": True, "parallel_write_safe": True} diff --git a/scripts/check_names.py b/scripts/check_names.py new file mode 100644 index 0000000..54f9a3e --- /dev/null +++ b/scripts/check_names.py @@ -0,0 +1,193 @@ +"""Report prose that names a function that does not exist. + +The hand-written pages describe two moving APIs, and names drift in by analogy: +`camelCase` rewritten as `snake_case` on the assumption that the Python function +must be called that. This script resolves every function-shaped identifier in +the hand-written pages against the same index the API reference is generated +from (:mod:`api_index`) and lists anything that does not resolve. Generated +pages are skipped: they come from the index by construction. + +Two kinds of identifier are checked: + +* **inline code spans** -- ``camelCase`` tokens must be MATLAB functions, + ``snake_case`` tokens must be Python functions; +* **calls inside ```python blocks** -- every called name must be a + Python function, a known cobrapy name, or allow-listed. + +Anything that is legitimately not a function -- model struct fields +(``metDeltaG``), cobrapy names (``read_sbml_model``), reaction ids, file names -- +belongs in ``known_names.txt`` next to this file, one per line. Keep that list +short: every entry is a name nothing can verify for you. + +Run it with: + + python scripts/check_names.py +""" + +from __future__ import annotations + +import ast +import re +import sys +from pathlib import Path + +sys.path.insert(0, str(Path(__file__).resolve().parent)) + +from api_index import PROJECT, collect_matlab_all, collect_python # noqa: E402 + +HERE = Path(__file__).resolve().parent +ALLOWLIST_FILE = HERE / "known_names.txt" + +# Pages generated at build time from the API index; validating them against the +# same index would be circular. +GENERATED_PREFIXES = ("api/",) +GENERATED_FILES = {"matlab-vs-python.md"} + +_INLINE_CODE = re.compile(r"`([^`\n]+)`") +_FENCE = re.compile(r"^([ \t]*)```", re.M) +_PY_BLOCK = re.compile(r"```python\n(.*?)^[ \t]*```", re.S | re.M) + +# camelCase: starts lower, contains an uppercase run, no separators. +_CAMEL = re.compile(r"^[a-z][A-Za-z0-9]*[A-Z][A-Za-z0-9]*$") +# snake_case: at least two alphanumeric characters before the first underscore, +# so reaction ids such as r_4041 and s_0584 are not mistaken for functions. +_SNAKE = re.compile(r"^[a-z][a-z0-9]+(?:_[a-z0-9]+)+$") + +_BUILTINS = { + "print", "len", "open", "sorted", "list", "dict", "set", "str", "int", + "float", "range", "enumerate", "zip", "sum", "min", "max", "abs", "round", +} + + +def load_allowlist() -> set[str]: + """Names that are legitimately not functions of either toolbox.""" + if not ALLOWLIST_FILE.is_file(): + return set() + entries = set() + for line in ALLOWLIST_FILE.read_text(encoding="utf-8").splitlines(): + line = line.split("#", 1)[0].strip() + if line: + entries.add(line) + return entries + + +class Index: + """The names that exist, collected once per build.""" + + def __init__(self) -> None: + self.matlab = set(collect_matlab_all()) + self.python = {obj["name"] for obj in collect_python()} + self.allowed = load_allowlist() + + def is_generated(self, src_path: str) -> bool: + rel = src_path.replace("\\", "/") + return rel in GENERATED_FILES or rel.startswith(GENERATED_PREFIXES) + + def problems(self, markdown: str, src_path: str) -> list[str]: + if self.is_generated(src_path): + return [] + found: list[str] = [] + found += self._check_inline(markdown) + found += self._check_python_blocks(markdown) + return found + + # -- inline code spans -------------------------------------------------- # + def _check_inline(self, markdown: str) -> list[str]: + problems = [] + for token in _INLINE_CODE.findall(_strip_fences(markdown)): + token = token.strip() + if token.endswith("()"): + token = token[:-2] + if not token or token in self.allowed: + continue + if _CAMEL.match(token): + if token not in self.matlab: + problems.append( + f"`{token}` looks like a {PROJECT.matlab_name} function but no such .m " + f"file exists on the tracked branch" + ) + elif _SNAKE.match(token): + if token not in self.python: + problems.append( + f"`{token}` looks like a {PROJECT.python_name} function but is " + f"not defined in the package" + ) + return problems + + # -- python code blocks ------------------------------------------------- # + def _check_python_blocks(self, markdown: str) -> list[str]: + problems = [] + for block in _PY_BLOCK.findall(markdown): + code = _dedent_block(block) + try: + tree = ast.parse(code) + except SyntaxError: + continue # illustrative fragment, not runnable code + for node in ast.walk(tree): + if not isinstance(node, ast.Call): + continue + func = node.func + # Only bare calls are checked. A method call belongs to whatever + # object is on the left (a cobra.Model, a DataFrame, a Path), not + # to the package namespace, so there is nothing here that + # could verify it -- and allow-listing every .items(), .replace() + # and .rglob() the examples use would dilute the check that does + # work. The failure this exists to catch, an invented function + # imported and called (``from .io import + # import_model``), is a bare call and is still caught. + name = func.id if isinstance(func, ast.Name) else None + if name is None or name in _BUILTINS or name in self.allowed: + continue + if name not in self.python: + problems.append( + f"`{name}(...)` is called in a Python example but is " + f"neither a {PROJECT.python_name} function nor an allow-listed name" + ) + return problems + + +def _strip_fences(markdown: str) -> str: + """Remove fenced code blocks so only prose code spans are inspected.""" + out, inside = [], False + for line in markdown.splitlines(): + if _FENCE.match(line): + inside = not inside + continue + if not inside: + out.append(line) + return "\n".join(out) + + +def _dedent_block(block: str) -> str: + """Undo the indentation a fenced block carries inside a content tab.""" + lines = block.splitlines() + bodies = [ln for ln in lines if ln.strip()] + if not bodies: + return block + pad = min(len(ln) - len(ln.lstrip()) for ln in bodies) + return "\n".join(ln[pad:] if len(ln) >= pad else ln for ln in lines) + + +# --------------------------------------------------------------------------- # +# Standalone # +# --------------------------------------------------------------------------- # +def main() -> int: + index = Index() + docs = HERE.parent / "docs" + total = 0 + for md in sorted(docs.rglob("*.md")): + rel = md.relative_to(docs).as_posix() + problems = index.problems(md.read_text(encoding="utf-8"), rel) + for problem in problems: + print(f"{rel}: {problem}") + total += len(problems) + print( + f"\n{total} problem(s); index holds {len(index.matlab)} {PROJECT.matlab_name} and " + f"{len(index.python)} {PROJECT.python_name} names, plus {len(index.allowed)} " + f"allow-listed." + ) + return 1 if total else 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/scripts/check_site.py b/scripts/check_site.py new file mode 100644 index 0000000..f38e86b --- /dev/null +++ b/scripts/check_site.py @@ -0,0 +1,396 @@ +#!/usr/bin/env python3 +"""Check a documentation site against the docs-site standard. + +Usage: check_site.py [SITE_DIR] [--against PLUGIN_SCRIPTS_DIR] + +With --against, the scripts in SITE_DIR/scripts that also exist in the plugin are +compared with the plugin copies, and a difference is an error. + +Prints one finding per line as ``CODE severity path[:line] message`` and exits +with 1 when there is an error. Warnings do not change the exit code. + +Codes: L layout, N name, C configuration, D design file, S style, P page. +""" + +from __future__ import annotations + +import configparser +import re +import subprocess +import sys +from dataclasses import dataclass +from pathlib import Path + +REQUIRED_FILES = [ + ".gitmodules", + ".readthedocs.yaml", + "CONTRIBUTING.md", + "DESIGN.md", + "README.md", + "requirements.txt", + "docs/conf.py", + "docs/index.md", + "docs/_static/custom.css", + "scripts/gen_api_pages.py", + "scripts/project.yml", +] + +# Scripts that every site copies unchanged from the plugin. +SHARED_SCRIPTS = [ + "project.py", "api_index.py", "gen_api_pages.py", "autolink.py", + "check_names.py", "run_examples.py", "check_site.py", +] + +WRONG_NAMES = { + "requirements-sphinx.txt": "requirements.txt", + "scripts/gen_api_pages_sphinx.py": "scripts/gen_api_pages.py", +} + +GENERATED = ["docs/api/matlab", "docs/api/python", "docs/matlab-vs-python.md"] + +DESIGN_HEADINGS = ["Purpose", "Decisions log"] + +TEXT_SUFFIXES = {".md", ".py", ".yml", ".yaml", ".css", ".cff", ".txt", ".toml"} +SKIP_DIRS = {".git", ".venv", "_build", "__pycache__", "node_modules"} + +EM_DASH = chr(0x2014) +AI_WORDS = re.compile(r"\b(claude|anthropic|chatgpt|copilot|co-authored-by)\b", re.I) +AI_BRANCH = re.compile(r"\b(claude|anthropic|codex|copilot|chatgpt)/", re.I) +# Files that state the rules or implement the check name what they forbid. +RULE_FILES = {"scripts/check_site.py", "CONTRIBUTING.md"} + +GUIDE_EXPECTED = ["Functions on this page", "What can go wrong", "See also"] +# A page that explains a concept instead of a task opts out of the anatomy. +CONCEPT_MARKER = "" + + +@dataclass +class Finding: + code: str + severity: str + path: str + message: str + line: int | None = None + + def __str__(self) -> str: + where = f"{self.path}:{self.line}" if self.line else self.path + return f"{self.code} {self.severity} {where} {self.message}" + + +def tracked_files(site: Path) -> list[Path]: + """Files of the site, excluding submodules and build output.""" + try: + out = subprocess.run( + ["git", "-C", str(site), "ls-files", "-z"], + check=True, capture_output=True, text=True, + ).stdout + files = [site / p for p in out.split("\0") if p] + except (subprocess.CalledProcessError, FileNotFoundError): + files = [p for p in site.rglob("*") if p.is_file()] + submodules = set(submodule_paths(site)) + keep = [] + for p in files: + rel = p.relative_to(site) + if any(part in SKIP_DIRS for part in rel.parts): + continue + if rel.parts and rel.parts[0] in submodules: + continue + if p.is_file(): + keep.append(p) + return keep + + +def submodule_paths(site: Path) -> list[str]: + cfg = read_gitmodules(site) + return [cfg[s].get("path", "") for s in cfg.sections() if cfg.has_option(s, "path")] + + +def read_gitmodules(site: Path) -> configparser.RawConfigParser: + cfg = configparser.RawConfigParser() + path = site / ".gitmodules" + if path.is_file(): + cfg.read(path, encoding="utf-8") + return cfg + + +def check_layout(site: Path) -> list[Finding]: + out = [] + for rel in REQUIRED_FILES: + if not (site / rel).exists(): + out.append(Finding("L", "error", rel, "required file is missing")) + for old, new in WRONG_NAMES.items(): + if (site / old).exists(): + out.append(Finding("N", "error", old, f"rename to {new}")) + return out + + +def check_generated(site: Path, files: list[Path]) -> list[Finding]: + out = [] + rels = {str(p.relative_to(site)).replace("\\", "/") for p in files} + for gen in GENERATED: + hit = sorted(r for r in rels if r == gen or r.startswith(gen + "/")) + if hit: + out.append(Finding("L", "error", gen, f"generated at build time but committed ({len(hit)} file(s))")) + gitignore = site / ".gitignore" + text = gitignore.read_text(encoding="utf-8") if gitignore.is_file() else "" + for gen in GENERATED: + if gen not in text and gen + "/" not in text: + out.append(Finding("L", "warning", ".gitignore", f"does not list the generated path {gen}")) + return out + + +def check_gitmodules(site: Path) -> list[Finding]: + out = [] + cfg = read_gitmodules(site) + for section in cfg.sections(): + name = section + if not cfg.has_option(section, "branch"): + out.append(Finding("C", "error", ".gitmodules", f"{name}: no branch is set")) + if cfg.get(section, "shallow", fallback="").lower() != "true": + out.append(Finding("C", "error", ".gitmodules", f"{name}: shallow = true is not set")) + return out + + +def find_line(text: str, pattern: str) -> int | None: + for i, line in enumerate(text.splitlines(), 1): + if re.search(pattern, line): + return i + return None + + +def check_readthedocs(site: Path) -> list[Finding]: + path = site / ".readthedocs.yaml" + if not path.is_file(): + return [] + text = path.read_text(encoding="utf-8") + out = [] + if not re.search(r"^submodules:\s*\n\s+include:\s*all", text, re.M): + out.append(Finding("C", "error", ".readthedocs.yaml", "submodules.include must be all")) + if not re.search(r"^\s+recursive:\s*true", text, re.M): + out.append(Finding("C", "error", ".readthedocs.yaml", "submodules.recursive must be true")) + if not re.search(r"^\s+fail_on_warning:\s*true", text, re.M): + out.append(Finding("C", "error", ".readthedocs.yaml", "sphinx.fail_on_warning must be true")) + if not re.search(r"requirements:\s*requirements\.txt", text): + out.append(Finding("C", "error", ".readthedocs.yaml", "python.install must use requirements.txt")) + return out + + +def check_conf(site: Path) -> list[Finding]: + path = site / "docs" / "conf.py" + if not path.is_file(): + return [] + text = path.read_text(encoding="utf-8") + out = [] + expected = { + r"^smartquotes\s*=\s*False": "smartquotes = False", + r"^html_show_sourcelink\s*=\s*False": "html_show_sourcelink = False", + r'^html_theme\s*=\s*"pydata_sphinx_theme"': 'html_theme = "pydata_sphinx_theme"', + r'"collapse_navigation":\s*True': '"collapse_navigation": True', + r'"default_mode":\s*"auto"': '"default_mode": "auto"', + } + for pattern, label in expected.items(): + if not re.search(pattern, text, re.M): + out.append(Finding("C", "error", "docs/conf.py", f"{label} is not set")) + for ext in ("myst_parser", "sphinx_design", "sphinx_copybutton"): + if f'"{ext}"' not in text: + out.append(Finding("C", "error", "docs/conf.py", f"extension {ext} is not enabled")) + if re.search(r"html_(logo|favicon)\s*=\s*\"assets/", text) or re.search(r'"image_(light|dark)":\s*"assets/', text): + out.append(Finding("C", "error", "docs/conf.py", "logo and favicon paths are relative to _static/, not assets/")) + logo = re.search(r'"image_light":\s*"([^"]+)"\s*,\s*"image_dark":\s*"([^"]+)"', text, re.S) + if logo and logo.group(1) == logo.group(2): + out.append(Finding("C", "error", "docs/conf.py", "the dark-mode logo is the same file as the light-mode logo")) + return out + + +def check_css(site: Path) -> list[Finding]: + path = site / "docs" / "_static" / "custom.css" + if not path.is_file(): + return [] + text = path.read_text(encoding="utf-8") + out = [] + for cls in ("site-hero", "site-logo-row", "site-tag", "site-tagline", "site-logo-light", "site-logo-dark"): + if f".{cls}" not in text: + out.append(Finding("C", "error", "docs/_static/custom.css", f"class .{cls} is not defined")) + for var in ("--site-accent", "--pst-color-primary", "--pst-color-link"): + if var not in text: + out.append(Finding("C", "error", "docs/_static/custom.css", f"{var} is not set")) + for m in re.finditer(r"--pst-color-(?:primary|link)\s*:\s*([^;]+);", text): + value = m.group(1).strip() + if re.fullmatch(r"\d+\s*,\s*\d+\s*,\s*\d+", value): + out.append(Finding("C", "error", "docs/_static/custom.css", f"colour value '{value}' is a list of numbers, not a colour")) + return out + + +def check_design(site: Path) -> list[Finding]: + path = site / "DESIGN.md" + if not path.is_file(): + return [] + text = path.read_text(encoding="utf-8") + headings = [re.sub(r"^[#\s\d.]+", "", h).strip().lower() for h in re.findall(r"^#{1,3} .*$", text, re.M)] + out = [] + for want in DESIGN_HEADINGS: + if not any(h.startswith(want.lower()) for h in headings): + out.append(Finding("D", "error", "DESIGN.md", f"no section '{want}'")) + return out + + +def check_text(site: Path, files: list[Path]) -> list[Finding]: + out = [] + for p in files: + rel = str(p.relative_to(site)).replace("\\", "/") + if p.suffix not in TEXT_SUFFIXES: + continue + if rel.startswith("docs/api/") or rel.endswith("known_names.txt"): + continue + try: + text = p.read_text(encoding="utf-8") + except UnicodeDecodeError: + continue + for i, line in enumerate(text.splitlines(), 1): + if EM_DASH in line: + out.append(Finding("S", "error", rel, "em dash", i)) + if rel in RULE_FILES: + continue + m = AI_WORDS.search(line) + if m and p.suffix != ".txt": + out.append(Finding("S", "error", rel, f"mentions '{m.group(0)}'", i)) + if AI_BRANCH.search(line): + out.append(Finding("S", "error", rel, "branch name with a tool name", i)) + return out + + +def hard_wrapped_paragraphs(text: str) -> int: + """Count prose paragraphs of three or more consecutive lines.""" + count = 0 + run = 0 + in_code = False + for raw in text.splitlines() + [""]: + line = raw.rstrip() + if line.lstrip().startswith(("```", ":::")): + in_code = not in_code if line.lstrip().startswith("```") else in_code + run = 0 + continue + prose = ( + bool(line.strip()) + and not in_code + and not line.lstrip().startswith(("|", "#", "-", "*", "+", ">", "<", ":", "{", "!")) + and not re.match(r"\s*\d+[.)] ", line) + and not re.match(r"\s*\[.*\]:", line) + ) + if prose: + run += 1 + else: + if run >= 3: + count += 1 + run = 0 + return count + + +def heading_skips(text: str) -> tuple[int, int, int] | None: + """(line, previous level, level) of the first heading that skips a level.""" + prev = 0 + in_code = False + for i, line in enumerate(text.splitlines(), 1): + if line.lstrip().startswith("```"): + in_code = not in_code + continue + m = re.match(r"(#{1,6}) \S", line) + if in_code or not m: + continue + level = len(m.group(1)) + if prev and level > prev + 1: + return i, prev, level + prev = level + return None + + +def check_pages(site: Path, files: list[Path]) -> list[Finding]: + out = [] + for p in files: + rel = str(p.relative_to(site)).replace("\\", "/") + if p.suffix != ".md" or not rel.startswith("docs/") or rel.startswith("docs/api/"): + continue + text = p.read_text(encoding="utf-8") + n = hard_wrapped_paragraphs(text) + if n: + out.append(Finding("S", "warning", rel, f"{n} hard-wrapped paragraph(s); one line per paragraph")) + skip = heading_skips(text) + if skip: + out.append(Finding("P", "error", rel, f"heading level jumps from H{skip[1]} to H{skip[2]} (strict build warns)", skip[0])) + if rel.startswith("docs/guide/") and p.name != "index.md" and CONCEPT_MARKER not in text: + for h in GUIDE_EXPECTED: + if not re.search(rf"^#+ {re.escape(h)}", text, re.M): + out.append(Finding("P", "warning", rel, f"no '{h}' section")) + return out + + +def aggregate(findings: list[Finding], examples: int = 3) -> list[str]: + """One line per kind of warning, so a site-wide habit is one line, not one per page.""" + lines = [] + groups: dict[tuple[str, str], list[Finding]] = {} + for f in findings: + if f.severity == "error": + lines.append(str(f)) + else: + key = (f.code, re.sub(r"\d+ hard-wrapped paragraph\(s\)", "hard-wrapped paragraphs", f.message)) + groups.setdefault(key, []).append(f) + for (code, message), group in groups.items(): + if len(group) == 1: + lines.append(str(group[0])) + continue + shown = ", ".join(f.path for f in group[:examples]) + more = f" and {len(group) - examples} more" if len(group) > examples else "" + lines.append(f"{code} warning {len(group)} files: {message} ({shown}{more})") + return lines + + +def check_shared_scripts(site: Path, plugin_scripts: Path) -> list[Finding]: + out = [] + for name in SHARED_SCRIPTS: + mine, theirs = site / "scripts" / name, plugin_scripts / name + if not mine.is_file() or not theirs.is_file(): + continue + if mine.read_bytes() != theirs.read_bytes(): + out.append(Finding("N", "error", f"scripts/{name}", "differs from the plugin copy")) + return out + + +def run(site: Path, plugin_scripts: Path | None = None) -> list[Finding]: + files = tracked_files(site) + findings: list[Finding] = [] + findings += check_layout(site) + findings += check_generated(site, files) + findings += check_gitmodules(site) + findings += check_readthedocs(site) + findings += check_conf(site) + findings += check_css(site) + findings += check_design(site) + findings += check_text(site, files) + findings += check_pages(site, files) + if plugin_scripts is not None: + findings += check_shared_scripts(site, plugin_scripts) + return findings + + +def main(argv: list[str]) -> int: + args = argv[1:] + plugin_scripts = None + if "--against" in args: + i = args.index("--against") + plugin_scripts = Path(args[i + 1]).resolve() + del args[i:i + 2] + site = Path(args[0] if args else ".").resolve() + if not site.is_dir(): + print(f"{site} is not a directory", file=sys.stderr) + return 2 + findings = run(site, plugin_scripts) + for line in aggregate(findings): + print(line) + errors = sum(1 for f in findings if f.severity == "error") + warnings = len(findings) - errors + print(f"{errors} error(s), {warnings} warning(s)") + return 1 if errors else 0 + + +if __name__ == "__main__": + sys.exit(main(sys.argv)) diff --git a/scripts/curated_pairs.yml b/scripts/curated_pairs.yml index 774a81f..b4a2b65 100644 --- a/scripts/curated_pairs.yml +++ b/scripts/curated_pairs.yml @@ -1,6 +1,6 @@ # Hand-curated half of the MATLAB <-> Python function mapping. # -# gen_api_pages_sphinx.py pairs functions automatically when the two names +# gen_api_pages.py pairs functions automatically when the two names # normalise to the same string (loadEcModel <-> load_ec_model). That only # catches the mechanical cases: geckopy renamed part of the API, so some real # counterparts do not match by name and have to be recorded here. diff --git a/scripts/gen_api_pages_sphinx.py b/scripts/gen_api_pages.py similarity index 59% rename from scripts/gen_api_pages_sphinx.py rename to scripts/gen_api_pages.py index 1dbee17..b258124 100644 --- a/scripts/gen_api_pages_sphinx.py +++ b/scripts/gen_api_pages.py @@ -1,18 +1,11 @@ -"""API reference generator for the Sphinx/pydata-sphinx-theme build. - -Run from ``docs/conf.py`` (Sphinx's ``setup()`` hook), before Sphinx reads the -source tree. - -**No live rendering plugin.** MkDocs-material's version of this reference -would defer per-function help text to live plugins: mkdocstrings' Python -handler (griffe) and a separate mkdocstrings-matlab handler (tree-sitter). -Neither has a drop-in Sphinx equivalent verified to work the same way -- the -MATLAB one in particular is a bespoke handler with no direct autodoc-family -counterpart. Rather than depend on an unverified third-party extension, this -generator extracts the *full* help text itself (the collection layer already -reads the source; ``api_index.py`` just discards everything past the first -line) and writes fully static pages. No live directive, no package install, -no MATLAB runtime. +"""API reference generator. + +Runs from ``docs/conf.py`` (Sphinx's ``setup()`` hook), before Sphinx reads +the source tree. It extracts the full help text of every function from the +MATLAB and Python submodules (the collection layer is shared with +``api_index.py``) and writes static pages: no live directive, no package +install, no MATLAB runtime. Names, paths and categories come from +``project.yml``. """ from __future__ import annotations @@ -24,101 +17,38 @@ import yaml +from project import COBRAPY_URL # noqa: E402 + from api_index import ( # noqa: E402 - GECKO as MATLAB, + MATLAB, MATLAB_CATEGORIES, + PROJECT, PY_PACKAGE_TITLES, PYPKG, cell, - is_matlab_classdef, - is_matlab_function, + is_deprecated_alias, + is_documented_matlab_object, + matlab_help_block, + matlab_summary_and_body, module_dotted, norm, slug, ) import ast +import re +import textwrap # --------------------------------------------------------------------------- # # Full-text collection (api_index.py's matlab_summary / py_summary keep only # the first line; these keep everything). # # --------------------------------------------------------------------------- # -def matlab_help(path: Path, fname: str) -> tuple[str, str]: - """(summary, full help text) for one MATLAB function.""" - try: - lines = path.read_text(encoding="utf-8-sig", errors="ignore").splitlines() - except OSError: - return "", "" - - help_lines: list[str] = [] - started = False - for line in lines: - stripped = line.strip() - if not started: - if stripped.startswith("function"): - started = True - continue - if stripped.startswith("%"): - help_lines.append(stripped.lstrip("%").strip()) - elif stripped == "" and not help_lines: - continue - else: - break - - cleaned = [h for h in help_lines if h] - if not cleaned: - return "", "" - first = cleaned[0] - if first.lower().startswith(fname.lower()): - rest = first[len(fname):].strip(" -:\t") - if rest: - summary, body = rest, cleaned[1:] - elif len(cleaned) > 1: - summary, body = cleaned[1], cleaned[2:] - else: - summary, body = "", [] - else: - summary = first - body = cleaned[1:] - return summary, "\n".join(body) - - -def matlab_classdef_help(path: Path, fname: str) -> tuple[str, str]: - """(summary, full help text) for one MATLAB classdef, from its leading - comment block (before the ``classdef`` line), the reverse of a - function's trailing help block; see ``is_matlab_classdef``.""" - try: - lines = path.read_text(encoding="utf-8-sig", errors="ignore").splitlines() - except OSError: - return "", "" - - help_lines: list[str] = [] - for line in lines: - stripped = line.strip() - if stripped.startswith("%"): - help_lines.append(stripped.lstrip("%").strip()) - elif stripped == "" and not help_lines: - continue - else: - break - - cleaned = [h for h in help_lines if h] - if not cleaned: - return "", "" - first = cleaned[0] - if first.lower().startswith(fname.lower()): - rest = first[len(fname):].strip(" -:\t") - if rest: - summary, body = rest, cleaned[1:] - elif len(cleaned) > 1: - summary, body = cleaned[1], cleaned[2:] - else: - summary, body = "", [] - else: - summary = first - body = cleaned[1:] - return summary, "\n".join(body) +def matlab_help(path: Path, fname: str) -> tuple[str, str, str]: + """(signature, summary, rest of the help text) for one MATLAB function.""" + signature, _lines = matlab_help_block(path) + summary, body = matlab_summary_and_body(path, fname) + return signature, summary, "\n".join(body) def py_help(node: ast.AST) -> tuple[str, str]: @@ -146,15 +76,13 @@ def collect_matlab_full() -> dict[str, list[dict]]: if not base.is_dir(): continue for m in base.rglob("*.m"): - if m.stem == "Contents": - continue - if is_matlab_function(m): - summary, body = matlab_help(m, m.stem) - elif is_matlab_classdef(m): - summary, body = matlab_classdef_help(m, m.stem) - else: + if m.stem == "Contents" or not is_documented_matlab_object(m): continue - funcs.setdefault(m.stem, {"name": m.stem, "summary": summary, "body": body, "path": m}) + signature, summary, body = matlab_help(m, m.stem) + funcs.setdefault( + m.stem, + {"name": m.stem, "signature": signature, "summary": summary, "body": body, "path": m}, + ) cats[folder] = [funcs[n] for n in sorted(funcs, key=str.lower)] return cats @@ -175,15 +103,10 @@ def collect_python_full() -> list[dict]: if isinstance(node, (ast.FunctionDef, ast.AsyncFunctionDef, ast.ClassDef)): if node.name.startswith("_"): continue + ident = f"{dotted}.{node.name}" if dotted else node.name summary, rest = py_help(node) - # See the matching skip in api_index.py's collect_python(): - # geckopy's backward-compat aliases for the original MATLAB - # names live inline next to their canonical replacements, not - # in a separate excluded folder as on the MATLAB side, and - # are marked with a "Deprecated alias for ..." docstring. - if summary.startswith("Deprecated"): + if is_deprecated_alias(summary): continue - ident = f"{dotted}.{node.name}" if dotted else node.name sig = "" if isinstance(node, (ast.FunctionDef, ast.AsyncFunctionDef)): sig = f"({ast.unparse(node.args)})" if hasattr(ast, "unparse") else "" @@ -201,14 +124,91 @@ def collect_python_full() -> list[dict]: return objects +# --------------------------------------------------------------------------- # +# Help-text rendering # +# --------------------------------------------------------------------------- # +# The MATLAB % help blocks and the structured Python docstrings both use +# numpydoc section headers ("Parameters" over a dashed underline), so one +# parser serves both. Parameter sections become definition lists, Examples a +# code block, and anything else passes through as prose. Help text without any +# section header is kept as the author laid it out: in a text block for MATLAB, +# whose help is written for the command window, and as prose for Python. +PARAM_SECTIONS = { + "Parameters", "Name-Value Arguments", "Other Parameters", "Returns", + "Yields", "Raises", "Attributes", +} +_SECTION_HEADER = re.compile(r"^([A-Z][A-Za-z -]+)\n(-{3,})$", re.M) +_RST_ROLE = re.compile(r":(?:py:)?(?:func|class|meth|attr|mod|data|obj|exc):`~?([^`]+)`") + + +def myst_inline(text: str) -> str: + """RST roles and double-backtick literals as MyST code spans.""" + text = _RST_ROLE.sub(lambda m: f"`{m.group(1)}`", text) + return re.sub(r"``([^`]+)``", r"`\1`", text) + + +def split_sections(doc: str) -> list[tuple[str | None, str]]: + parts: list[tuple[str | None, str]] = [] + pos, title = 0, None + for m in _SECTION_HEADER.finditer(doc): + if len(m.group(2)) < len(m.group(1).strip()) - 1: + continue # a dashed line too short to underline this title + parts.append((title, doc[pos:m.start()])) + title, pos = m.group(1).strip(), m.end() + parts.append((title, doc[pos:])) + return parts + + +def param_entries(body: str) -> list[tuple[str, str, str]]: + entries: list[list] = [] + for line in body.strip("\n").splitlines(): + if line and not line[0].isspace(): + name, _, typ = line.partition(" : ") + entries.append([name.strip(), typ.strip(), []]) + elif entries: + entries[-1][2].append(line) + return [(n, t, textwrap.dedent("\n".join(d)).strip()) for n, t, d in entries] + + +def render_help(doc: str, lang: str) -> list[str]: + """Markdown lines for a help text's body (everything after the summary).""" + doc = textwrap.dedent(doc).strip("\n") + if not doc.strip(): + return [] + sections = split_sections(doc) + if all(title is None for title, _ in sections): + if lang == "matlab": + return ["```text", doc, "```", ""] + return [myst_inline(doc), ""] + out: list[str] = [] + for title, body in sections: + body = textwrap.dedent(body).strip("\n") + if title is None: + if body.strip(): + out += [myst_inline(body), ""] + continue + out += [f":::{{rubric}} {title}", ":::", ""] + if title in PARAM_SECTIONS: + for name, typ, desc in param_entries(body): + term = f"`{name}`" + (f" : *{typ}*" if typ else "") + lines = myst_inline(desc).splitlines() or [""] + out += [term, f": {lines[0]}"] + [f" {line}" if line else "" for line in lines[1:]] + [""] + elif title == "Examples": + fence = "pycon" if ">>>" in body else lang + out += [f"```{fence}", body, "```", ""] + else: + out += [myst_inline(body), ""] + return out + + # --------------------------------------------------------------------------- # # Page rendering # # --------------------------------------------------------------------------- # def render_matlab_page(title: str, folder: str, funcs: list[dict]) -> str: - out = [f"# {title}", "", f"MATLAB functions in `GECKO/src/{folder}` of the GECKO toolbox.", "", + out = [f"# {title}", "", f"MATLAB functions in `{PROJECT.matlab_rel}/{folder}` of the {PROJECT.matlab_name} toolbox.", "", "## Functions", "", "| Function | Summary |", "|---|---|"] for f in funcs: - out.append(f"| [`{f['name']}`](#{slug(f['name'])}) | {cell(f['summary'])} |") + out.append(f"| [`{f['name']}`](#{slug(f['name'])}) | {cell(myst_inline(f['summary']))} |") out += ["", "## Reference", ""] for f in funcs: # A cross-document markdown link with a #fragment resolves against @@ -216,18 +216,19 @@ def render_matlab_page(title: str, folder: str, funcs: list[dict]) -> str: # must auto-slug to exactly `slug(name)` -- true here since it is a # bare MATLAB identifier, nothing an explicit target would improve. out += [f"### {f['name']}", ""] + if f["signature"]: + out += ["```matlab", f["signature"], "```", ""] if f["summary"]: - out += [f["summary"], ""] - if f["body"]: - out += ["```text", f["body"], "```", ""] + out += [myst_inline(f["summary"]), ""] + out += render_help(f["body"], "matlab") return "\n".join(out) + "\n" def render_python_page(title: str, dotted: str, objs: list[dict]) -> str: - out = [f"# {title} (Python)", "", f"`geckopy` objects in `{dotted}`.", "", + out = [f"# {title} (Python)", "", f"`{PROJECT.python_name}` objects in `{dotted}`.", "", "## Functions", "", "| Function | Summary |", "|---|---|"] for o in objs: - out.append(f"| [`{o['name']}`](#{slug(o['name'])}) | {cell(o['summary'])} |") + out.append(f"| [`{o['name']}`](#{slug(o['name'])}) | {cell(myst_inline(o['summary']))} |") out += ["", "## Reference", ""] for o in objs: # The heading is the bare name, not name+signature: a cross-document @@ -239,15 +240,14 @@ def render_python_page(title: str, dotted: str, objs: list[dict]) -> str: if o["signature"]: out += [f"`{o['name']}{o['signature']}`", ""] if o["summary"]: - out += [o["summary"], ""] - if o["body"]: - out += ["```text", o["body"], "```", ""] + out += [myst_inline(o["summary"]), ""] + out += render_help(o["body"], "python") return "\n".join(out) + "\n" def render_group_index(title: str, intro: str, links: list[tuple[str, str]]) -> str: stems = [href.rsplit(".", 1)[0] for _title, href in links] - out = ["---", "icon: material/folder-open", "---", "", f"# {title}", "", intro, "", + out = [f"# {title}", "", intro, "", "```{toctree}", ":hidden:"] out += stems out += ["```", ""] @@ -277,7 +277,9 @@ def generate(docs_root: Path) -> None: ) matlab_links.append((title, f"{folder}.md")) (api_dir / "matlab" / "index.md").write_text( - render_group_index("MATLAB API (GECKO)", "GECKO's MATLAB functions, by category.", matlab_links), + render_group_index( + f"MATLAB API ({PROJECT.matlab_name})", f"{PROJECT.matlab_name}'s MATLAB functions, by category.", matlab_links + ), encoding="utf-8", ) @@ -288,42 +290,39 @@ def generate(docs_root: Path) -> None: for package in sorted(by_package, key=lambda p: (p == "_toplevel", PY_PACKAGE_TITLES.get(p, p).lower())): objs = sorted(by_package[package], key=lambda o: o["name"].lower()) title = PY_PACKAGE_TITLES.get(package, package) - dotted = "geckopy" if package == "_toplevel" else f"geckopy.{package}" + dotted = PROJECT.python_package if package == "_toplevel" else f"{PROJECT.python_package}.{package}" (api_dir / "python" / f"{package}.md").write_text( render_python_page(title, dotted, objs), encoding="utf-8" ) python_links.append((title, f"{package}.md")) (api_dir / "python" / "index.md").write_text( render_group_index( - "Python API (geckopy)", "geckopy's packages, by category.", python_links + f"Python API ({PROJECT.python_name})", f"{PROJECT.python_name}'s packages, by category.", python_links ), encoding="utf-8", ) - # --- matlab-vs-python.md: static write, generated at build time. - # NOTE for Guide-page authors (docs/stage*.md etc.): where a Guide page - # points a reader at a cobrapy function instead of a geckopy one (see the - # "Box 2" callouts), link to this page rather than duplicating the - # mapping in prose -- this generator, not the Guide, owns that table. + # --- matlab-vs-python.md matlab_all = {f["name"]: folder for folder, _t in MATLAB_CATEGORIES for f in matlab.get(folder, [])} py_by_name = {obj["name"]: obj for obj in python_objs} curated = yaml.safe_load((Path(__file__).resolve().parent / "curated_pairs.yml").read_text(encoding="utf-8")) + M, P = PROJECT.matlab_name, PROJECT.python_name unresolved: list[str] = [] for m_name, p_name in curated["aliases"].items(): if m_name not in matlab_all: - unresolved.append(f"aliases: GECKO function '{m_name}' is not on the tracked branch") + unresolved.append(f"aliases: {M} function '{m_name}' is not on the tracked branch") if p_name not in py_by_name: - unresolved.append(f"aliases: geckopy function '{p_name}' (for {m_name}) does not exist") + unresolved.append(f"aliases: {P} function '{p_name}' (for {m_name}) does not exist") for section in ("cobrapy", "not_ported"): for m_name in curated[section]: if m_name not in matlab_all: - unresolved.append(f"{section}: GECKO function '{m_name}' is not on the tracked branch") + unresolved.append(f"{section}: {M} function '{m_name}' is not on the tracked branch") if unresolved: listed = "\n - ".join(unresolved) - raise SystemExit(f"gen_api_pages_sphinx: scripts/curated_pairs.yml is out of date:\n - {listed}") + raise SystemExit(f"gen_api_pages: scripts/curated_pairs.yml is out of date:\n - {listed}") - cobrapy_docs_url = "https://cobrapy.readthedocs.io/en/latest/autoapi/cobra/index.html" + cobrapy_docs_url = COBRAPY_URL # Each row: (matlab name, matlab folder, python-column markdown, summary text). rows: list[tuple[str, str, str, str]] = [] @@ -357,25 +356,29 @@ def generate(docs_root: Path) -> None: seen_matlab.add(m_name) n_cobrapy += 1 + badge_note = ( + f"and marked with a {{bdg-link-secondary}}`cobrapy <{cobrapy_docs_url}>` badge where cobrapy " + f"covers the function instead of {P}. " + if PROJECT.cobrapy else "" + ) + cobrapy_count = f", {n_cobrapy} covered by cobrapy instead of {P}" if PROJECT.cobrapy else "" lines = [ "# MATLAB vs Python", "", - "GECKO ships as a MATLAB toolbox and as the Python package **geckopy**. " + f"{M} ships as a MATLAB toolbox and as the Python package **{P}**. " "This page is generated from the source of both toolboxes at build time. " "Pairs are found automatically where the names match, completed from a " - "curated list where they do not, and marked with a " - f"{{bdg-link-secondary}}`cobrapy <{cobrapy_docs_url}>` badge where cobrapy " - "covers the function instead of geckopy. Every name is verified to exist.", + f"curated list where they do not, {badge_note}" + "Every name is verified to exist.", "", "## Paired functions", "", - f"**{len(rows)}** GECKO functions listed: {n_auto} matched automatically, " - f"{n_curated} from a curated list, {n_cobrapy} covered by cobrapy instead of " - "geckopy.", - "", "| GECKO (MATLAB) | geckopy (Python) | Summary |", "|---|---|---|", + f"**{len(rows)}** {M} functions listed: {n_auto} matched automatically, " + f"{n_curated} from a curated list{cobrapy_count}.", + "", f"| {M} (MATLAB) | {P} (Python) | Summary |", "|---|---|---|", ] for m_name, m_folder, p_cell, text in sorted(rows, key=lambda r: r[0].lower()): m_link = f"[`{m_name}`](api/matlab/{m_folder}.md#{slug(m_name)})" lines.append(f"| {m_link} | {p_cell} | {cell(text)} |") - lines += ["", "## Deliberately not ported", "", "| GECKO (MATLAB) | Why not |", "|---|---|"] + lines += ["", "## Deliberately not ported", "", f"| {M} (MATLAB) | Why not |", "|---|---|"] for m_name, reason in sorted(curated["not_ported"].items(), key=lambda kv: kv[0].lower()): folder = matlab_all[m_name] m_link = f"[`{m_name}`](api/matlab/{folder}.md#{slug(m_name)})" @@ -385,7 +388,7 @@ def generate(docs_root: Path) -> None: unmapped = sorted((n for n in matlab_all if n not in accounted), key=str.lower) if unmapped: lines += ["", "## Not yet mapped", "", - f"**{len(unmapped)}** GECKO functions are not yet recorded here.", ""] + f"**{len(unmapped)}** {M} functions are not yet recorded here.", ""] for chunk_start in range(0, len(unmapped), 6): row = unmapped[chunk_start:chunk_start + 6] lines.append(", ".join(f"`{n}`" for n in row) + ("," if chunk_start + 6 < len(unmapped) else "")) diff --git a/scripts/known_names.txt b/scripts/known_names.txt new file mode 100644 index 0000000..14a5cbe --- /dev/null +++ b/scripts/known_names.txt @@ -0,0 +1,9 @@ +# Names that look like functions but are not functions of either toolbox. +# +# check_names.py resolves every camelCase / snake_case identifier in the +# hand-written pages against the toolbox sources. Anything listed here is exempt. +# Keep the list short and grouped: each entry is a name that nothing can verify +# for you, so an entry added carelessly re-opens the hole this check closes. + +# -- prose terms ------------------------------------------------------------ +camelCase diff --git a/scripts/project.py b/scripts/project.py new file mode 100644 index 0000000..e7f37b3 --- /dev/null +++ b/scripts/project.py @@ -0,0 +1,71 @@ +"""Project settings of a documentation site, read from ``scripts/project.yml``. + +The scripts of the docs-site plugin (``api_index.py``, ``gen_api_pages.py``, +``autolink.py``, ``check_names.py``) contain no project name, path or category +list. Everything that differs between sites is in ``project.yml``; see +``templates/scripts/project.yml`` for the keys. +""" + +from __future__ import annotations + +import os +from dataclasses import dataclass +from pathlib import Path + +import yaml + +HERE = Path(__file__).resolve().parent +ROOT = HERE.parent + +COBRAPY_URL = "https://cobrapy.readthedocs.io/en/latest/autoapi/cobra/index.html" + +# Folders of a MATLAB toolbox that hold no API. +DEFAULT_EXCLUDED = ("legacy", "external", "software", "testing", "doc") + + +@dataclass(frozen=True) +class Project: + matlab_name: str + matlab_src: Path + categories: list[tuple[str, str]] + excluded_folders: frozenset[str] + python_name: str + python_package: str + python_src: Path + package_titles: dict[str, str] + cobrapy: bool + examples: dict + + @property + def matlab_rel(self) -> str: + """The MATLAB source folder as written in page text, e.g. ``RAVEN/src``.""" + try: + return self.matlab_src.relative_to(ROOT).as_posix() + except ValueError: + return self.matlab_src.name + + +def load(config: Path | None = None) -> Project: + path = config or HERE / "project.yml" + data = yaml.safe_load(path.read_text(encoding="utf-8")) or {} + matlab, python = data["matlab"], data["python"] + + matlab_src = Path(os.environ.get("DOCS_MATLAB_SRC", ROOT / matlab["path"])) + subdir = matlab.get("src_subdir") + if subdir and (matlab_src / subdir).is_dir(): + matlab_src = matlab_src / subdir + python_src = Path(os.environ.get("DOCS_PYTHON_SRC", ROOT / python["path"])) + + categories = [(c["folder"], c["title"]) for c in matlab["categories"]] + return Project( + matlab_name=matlab["name"], + matlab_src=matlab_src, + categories=categories, + excluded_folders=frozenset(matlab.get("excluded_folders", DEFAULT_EXCLUDED)), + python_name=python["name"], + python_package=python["package"], + python_src=python_src, + package_titles=dict(python.get("package_titles", {})), + cobrapy=bool(data.get("cobrapy", True)), + examples=dict(data.get("examples") or {}), + ) diff --git a/scripts/project.yml b/scripts/project.yml new file mode 100644 index 0000000..9cb8654 --- /dev/null +++ b/scripts/project.yml @@ -0,0 +1,45 @@ +# Settings of this documentation site that the scripts in this folder read. +# Nothing else in scripts/ names the project. +cobrapy: true +matlab: + name: GECKO + path: GECKO/src + categories: + - folder: change_model + title: Build & edit ecModel + - folder: download_databases + title: Download databases + - folder: enzyme_usage + title: Enzyme usage + - folder: flux_analysis + title: Flux analysis + - folder: gather_kcats + title: Gather kcats + - folder: get_enzyme_data + title: Enzyme & EC data + - folder: io + title: Input / output + - folder: kcat_tuning + title: kcat sensitivity tuning + - folder: limit_proteins + title: Limit proteins + - folder: model_adapter + title: Model adapter + - folder: utilities + title: Utilities + excluded_folders: + - dlkcat-gecko +python: + name: geckopy + package: geckopy + path: geckopy/src/geckopy + package_titles: + ec_model: Build & edit ecModel + gather_kcats: Gather kcats + get_enzyme_data: Enzyme & EC data + kcat_tuning: kcat sensitivity tuning + limit_proteins: Limit proteins + adapter: Model adapter + utilities: Utilities + databases: Databases + _toplevel: Top-level From 88a53b72c4e2be210bc7bc77cb26853412a349e8 Mon Sep 17 00:00:00 2001 From: Eduard Kerkhoven Date: Sat, 24 Oct 2026 12:11:21 +0000 Subject: [PATCH 02/10] refactor: use the shared stylesheet of the docs-site plugin The home page classes are site-* instead of gd-*, and the home page has one logo per colour scheme. The two greens in use (#43684B for tabs and borders, #2D6E3B for links and the badge, with the dark-mode values) are set as --pst-color-primary, --pst-color-link and --site-accent. --- docs/_static/custom.css | 108 ++++++++++++++++++---------------------- docs/index.md | 11 ++-- 2 files changed, 55 insertions(+), 64 deletions(-) diff --git a/docs/_static/custom.css b/docs/_static/custom.css index 69847cd..bed30da 100644 --- a/docs/_static/custom.css +++ b/docs/_static/custom.css @@ -1,42 +1,38 @@ -/* ===== GECKO brand palette (green) ===================================== - Sourced from GECKO.png -- a flat single-tone gecko icon + wordmark, - RGB(67,104,75). Shades below are HSL adjustments of that exact color - (same hue), not eyeballed. Carried over from the MkDocs build's - docs/stylesheets/extra.css. */ +/* ===== PROJECT COLOURS: the only block that differs between sites ====== + Take the brand colour from the logo. The primary colour is the brand colour + itself (tab and border colour); the accent is used for links and the language + badge, and is the same as the primary colour when the brand colour is dark + enough for text. The dark value keeps a contrast ratio + of at least 4.5:1 on the dark page background. The theme reads the + --pst-color-* variables as plain colours (for example + `border: .125rem solid var(--pst-color-primary)`), so a list of numbers + makes every rule that uses them invalid. */ html[data-theme="light"] { - --gecko-green: #43684B; - --gecko-green-dark: #273D2C; - --gecko-green-light: #5F936A; - --gecko-accent: #2D6E3B; - /* pydata-sphinx-theme reads these as plain CSS colors (e.g. `border: .125rem - solid var(--pst-color-primary)`), not as an rgb()-triplet to compose -- - a bare "67, 104, 75" here makes every rule that uses it invalid, which is - what silently dropped the tab-content border (see below) in the first - place. Real color values only. */ + --site-accent: #2D6E3B; + --site-accent-bg: rgba(67,104,75, .12); --pst-color-primary: #43684B; --pst-color-link: #2D6E3B; } html[data-theme="dark"] { - --gecko-green: #5F936A; - --gecko-accent: #87d398; + --site-accent: #87d398; + --site-accent-bg: rgba(67,104,75, .12); --pst-color-primary: #5F936A; --pst-color-link: #87d398; } /* ===== Inline links: visible as links in body text ===================== */ -/* pydata-sphinx-theme's default gives body links a colour change but no - underline, so they read as normal prose unless a reader is specifically - scanning for them. External-reference icons already carry their own cue, - so they are excluded. */ +/* The theme gives body links a colour change but no underline. External + references carry their own icon, so they are excluded. */ .bd-article a:not(.reference.external) { text-decoration: underline; text-underline-offset: 2px; } -/* ===== Home page: a real "# GECKO" H1 keeps the document structure valid - (and helps a screen reader / search engine), but the logo image beneath it - already carries the visible title -- "gecko" is the id Sphinx slugifies - that exact heading text to, and is unique site-wide. ==================== */ +/* ===== Home page title ================================================ + The page keeps a real H1 for the document structure, search engines and + screen readers. The logo beneath it carries the visible title. Sphinx + slugifies the heading "# GECKO" to the section id "gecko", which is + unique in the site. */ #gecko > h1 { position: absolute; width: 1px; height: 1px; @@ -47,10 +43,9 @@ html[data-theme="dark"] { border: 0; } -/* ===== Tables: fit the article column instead of forcing a horizontal - scrollbar. table-layout:auto sizes a table from its content's preferred - width with no upper bound; capping it at the container's width makes long - cells wrap instead of pushing the table wider than the page. ============ */ +/* ===== Tables: fit the article column ================================= */ +/* table-layout:auto has no upper bound on the width; a fixed layout capped at + the container makes long cells wrap. */ .bd-article table { table-layout: fixed; width: 100%; @@ -60,54 +55,49 @@ html[data-theme="dark"] { .bd-article table th { overflow-wrap: break-word; } -/* Sphinx wraps inline code in a single white-space:nowrap span, which is - right in prose but lets one long identifier list force a table cell wide. - Table cells are the one place breaking a code token mid-word is better - than the cell (and the whole table) overflowing. */ +/* Sphinx wraps inline code in a nowrap span. In table cells a long identifier + list would widen the table, so there a code token may break. */ .bd-article table code .pre { white-space: normal; overflow-wrap: break-word; } /* ===== Home page hero ================================================= */ -.gd-hero { text-align: center; padding: 1.5rem 0 1rem; } -/* Logo and badge share a row, bottom edges level; wraps to stacked/centered - on narrow viewports instead of squeezing side by side. */ -.gd-hero-top { +.site-hero { text-align: center; padding: 1.5rem 0 1rem; } +/* align-items:flex-end puts the badge's bottom edge on the logo's bottom + edge, whatever the rendered height of the logo is. */ +.site-logo-row { display: flex; align-items: flex-end; justify-content: center; flex-wrap: wrap; gap: .6rem; - margin-bottom: .9rem; + margin-bottom: .8rem; } -.gd-hero img.gd-hero-logo { - max-width: 380px; width: 100%; height: auto; - /* pydata-sphinx-theme gives content images a white backing (right for a - transparent screenshot on a dark background, wrong for this logo, - which is already transparent and reads fine on either theme). */ - background-color: transparent !important; -} -.gd-tag { - /* margin: 0, not just an absent margin-bottom: the theme's own paragraph - spacing (`.bd-article p`) outranks a bare `.gd-tag` margin-bottom that - isn't set at all, and any bottom margin here would shift the badge up - off the logo's bottom edge in the flex row below (.gd-hero-top, - align-items: flex-end). */ +.site-tag { display: inline-block; font-size: .7rem; font-weight: 700; letter-spacing: .07em; text-transform: uppercase; - color: var(--gecko-green); - background: rgba(67,104,75,.12); + color: var(--site-accent); + background: var(--site-accent-bg); border-radius: 20px; padding: .2rem .75rem; + /* margin 0: the theme's paragraph spacing would lift the badge off the + bottom edge of the logo. */ margin: 0; } -.gd-tagline { +.site-tagline { font-size: .95rem; color: var(--pst-color-text-muted); - max-width: 560px; margin: 0 auto .9rem; line-height: 1.65; + max-width: 560px; margin: 0 auto; line-height: 1.65; } -/* ===== MATLAB / Python tab-set ======================================== - No custom rule for .sd-tab-content: pydata-sphinx-theme's own stylesheet - already borders it in --pst-color-primary (the invalid-format bug above - was what made that look like it needed restoring). Same tab-set styling - as raven-docs, which doesn't touch this either. */ +/* ===== Home page logo: one image per colour scheme ==================== */ +.site-logo-light, .site-logo-dark { + max-width: 340px; + width: 100%; + height: auto; + /* The theme gives content images a white backing. The logos are + transparent and read on either background. */ + background-color: transparent !important; +} +.site-logo-dark { display: none; } +html[data-theme="dark"] .site-logo-light { display: none; } +html[data-theme="dark"] .site-logo-dark { display: inline; } diff --git a/docs/index.md b/docs/index.md index 7c35cfc..2e6d141 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,11 +1,12 @@ # GECKO -
    -
    - -

    MATLAB & Python

    +
    +
    + GECKO + GECKO +

    MATLAB & Python

    -

    Reconstruction, simulation and analysis of enzyme-constrained metabolic models (ecModels): a MATLAB toolbox built on RAVEN, and geckopy, a Python port built on cobrapy.

    +

    Reconstruction, simulation and analysis of enzyme-constrained metabolic models (ecModels): a MATLAB toolbox built on RAVEN, and geckopy, a Python port built on cobrapy.

    ## Install From c8dfbc1454a458fe9d89551dab636eff2686c283 Mon Sep 17 00:00:00 2001 From: Eduard Kerkhoven Date: Sat, 24 Oct 2026 12:11:27 +0000 Subject: [PATCH 03/10] ci: build with warnings as errors, check the site and the function names docs-build.yml runs scripts/check_site.py, a build with -W, the function name check and a link check on pull requests, on pushes to main and weekly. Read the Docs fails on warnings too. The name check and the link check do not block yet: 124 distinct names on the guide pages are unresolved and the external links were not checked. The submodule update opens a pull request instead of pushing to main; this needs the repository setting that allows GitHub Actions to create pull requests. --- .github/workflows/docs-build.yml | 52 +++++++++++++++++++++++++ .github/workflows/update-submodules.yml | 48 ++++++++++++++--------- .readthedocs.yaml | 1 + 3 files changed, 82 insertions(+), 19 deletions(-) create mode 100644 .github/workflows/docs-build.yml diff --git a/.github/workflows/docs-build.yml b/.github/workflows/docs-build.yml new file mode 100644 index 0000000..5ef9268 --- /dev/null +++ b/.github/workflows/docs-build.yml @@ -0,0 +1,52 @@ +name: Docs build + +# Builds the site with warnings as errors and checks it against the docs-site +# standard. The weekly run finds a change in a submodule, a dependency or an +# external page that nobody pushed. + +on: + push: + branches: [main] + pull_request: + schedule: + - cron: "0 6 * * 1" + workflow_dispatch: + +permissions: + contents: read + +jobs: + build: + runs-on: ubuntu-latest + timeout-minutes: 20 + steps: + - uses: actions/checkout@v5 + with: + submodules: recursive + + - uses: actions/setup-python@v6 + with: + python-version: "3.12" + + - name: Install + run: python -m pip install -r requirements.txt + + - name: Check the site against the standard + run: python scripts/check_site.py . + + # Not yet blocking: 124 distinct names on the guide pages resolve to neither + # toolbox, and scripts/known_names.txt is empty. Remove continue-on-error + # after the names are checked and the real ones allow-listed. + - name: Check names on the guide pages + continue-on-error: true + run: python scripts/check_names.py + + - name: Build with warnings as errors + run: sphinx-build -W --keep-going -b html docs docs/_build/html + + # Not yet blocking: the state of the external links of this site was not + # known when the check was added. Remove continue-on-error after a run + # that is clean, or list the links that reject crawlers in linkcheck_ignore. + - name: Check external links + continue-on-error: true + run: sphinx-build -b linkcheck docs docs/_build/linkcheck diff --git a/.github/workflows/update-submodules.yml b/.github/workflows/update-submodules.yml index e7424f5..b25937a 100644 --- a/.github/workflows/update-submodules.yml +++ b/.github/workflows/update-submodules.yml @@ -1,14 +1,19 @@ name: Update submodules +# Moves each submodule to the tip of the branch set in .gitmodules and opens a +# pull request. The pull request build checks that the new source still builds +# and that the documented examples still hold; nothing is pushed to main. + on: schedule: - - cron: '0 4 * * *' # daily at 04:00 UTC - workflow_dispatch: {} # adds a "Run workflow" button for manual runs + - cron: "0 4 * * *" + workflow_dispatch: {} permissions: - contents: write # needed to push the pointer commit + contents: write + pull-requests: write -concurrency: # avoid overlapping runs racing on a commit +concurrency: group: update-submodules cancel-in-progress: false @@ -16,19 +21,16 @@ jobs: update: runs-on: ubuntu-latest steps: - - name: Checkout gecko-docs - uses: actions/checkout@v5 + - uses: actions/checkout@v5 with: submodules: true fetch-depth: 1 - - name: Bump submodules to their tracked branches + - name: Move submodules to their tracked branches run: | - # Fetch each submodule's tracked branch (from .gitmodules) and check - # it out at its tip. Done explicitly because the submodules are - # `shallow = true`, so only the pinned commit is present and - # `git submodule update --remote` can't resolve the remote branch ref. - # (GECKO -> develop4, geckopy -> develop) + # The submodules are `shallow = true`: only the pinned commit is + # present, so `git submodule update --remote` cannot resolve the + # remote branch. Each branch tip is fetched explicitly. git submodule sync --recursive git submodule foreach ' branch=$(git config -f "$toplevel/.gitmodules" "submodule.$name.branch" || echo main) @@ -37,14 +39,22 @@ jobs: git checkout -B "$branch" FETCH_HEAD ' - - name: Commit & push if anything changed + - name: Open or update the pull request + env: + GH_TOKEN: ${{ github.token }} run: | - git config user.name "github-actions[bot]" - git config user.email "41898282+github-actions[bot]@users.noreply.github.com" if git diff --quiet; then echo "No submodule updates." - else - git add -A - git commit -m "chore: update submodules to latest tracked branches" - git push + exit 0 + fi + git config user.name "github-actions[bot]" + git config user.email "41898282+github-actions[bot]@users.noreply.github.com" + git switch -C chore/update-submodules + git add -A + git commit -m "chore: update submodules to latest tracked branches" + git push --force-with-lease origin chore/update-submodules + if [ -z "$(gh pr list --head chore/update-submodules --state open --json number --jq '.[].number')" ]; then + gh pr create --base main --head chore/update-submodules \ + --title "chore: update submodules to latest tracked branches" \ + --body "Moves each submodule to the tip of the branch set in .gitmodules." fi diff --git a/.readthedocs.yaml b/.readthedocs.yaml index 3e23b4e..52bff90 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -16,6 +16,7 @@ build: sphinx: configuration: docs/conf.py + fail_on_warning: true python: install: From 0f7e1b8a8011b6c26e6bafad7765728c9a573cc9 Mon Sep 17 00:00:00 2001 From: Eduard Kerkhoven Date: Sat, 24 Oct 2026 12:11:27 +0000 Subject: [PATCH 04/10] doc: use the shared CONTRIBUTING.md, add a pull request template and Dependabot CONTRIBUTING.md has the same writing rules as before plus the build commands and the reference to the docs-site standard. Dependabot updates the pip and GitHub Actions dependencies weekly. --- .github/PULL_REQUEST_TEMPLATE.md | 11 +++++++ .github/dependabot.yml | 10 ++++++ CONTRIBUTING.md | 54 ++++++++++++-------------------- 3 files changed, 41 insertions(+), 34 deletions(-) create mode 100644 .github/PULL_REQUEST_TEMPLATE.md create mode 100644 .github/dependabot.yml diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..3886744 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,11 @@ +Closes # + +- [ ] The pull request is for `main`. + +### Main changes + +- + +### Pages that changed + +- diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..00c2dfb --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,10 @@ +version: 2 +updates: + - package-ecosystem: pip + directory: / + schedule: + interval: weekly + - package-ecosystem: github-actions + directory: / + schedule: + interval: weekly diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 949a04e..f6b3638 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,39 +1,25 @@ # Contributing to gecko-docs -## Documentation prose style +The standard for this site is the `docs-site` plugin of [CompMetEng/skills](https://github.com/CompMetEng/skills), and the intent of this site is in [DESIGN.md](DESIGN.md). Prose follows the `writing` skill of the `craft` plugin. The rules most often broken: -Many readers are not native English speakers. Prose must be direct and -literal, not just factually correct. +1. No em dashes anywhere: not in prose, headings, table cells or generated strings. Use the punctuation the sentence calls for: a comma where the clause continues, a semicolon where it is independent, a colon where what follows defines or lists what precedes it, parentheses around an aside. +2. Check every sentence while writing it: + - Can the subject perform the verb? A file, function or table can return, raise, contain or default to. It cannot want, know or prefer, and it does nothing quietly or conveniently. + - Does the sentence state a behaviour and its condition, or does it tell the reader what is worth doing? State the fact and leave the judgement to the reader. + - Is the sentence about the software or about the document? Remove "this page is about" and "as mentioned above". + - Does a word minimise something? Remove "just", "simply", "merely", "only", "of course" when the claim does not change. + - Would a non-native English reader parse it on the first read? No idioms, figures of speech or headlines that drop the subject or verb. +3. Established technical shorthand (a domain term, a standard abbreviation) stays. +4. No mention of AI tools or AI authorship in the repository: not in commits, pull requests, code comments or pages. Branch names do not contain a tool name. -1. No em dashes, anywhere: not in prose, headings, table cells, or generated - strings. Use the punctuation the sentence actually calls for: a comma - where the clause continues, a semicolon where it is independent, a colon - where what follows defines or enumerates what precedes it, parentheses - for a matched pair around an aside. -2. Apply these five checks to every sentence while writing it, not as a - later sweep: - - Can the subject perform the verb? A file, function, or table can - return, raise, contain, default to. It cannot want, know, prefer, or - do anything "quietly," "conveniently," or "simply." A manner adverb on - an inanimate subject is the most common violation. - - Does the sentence state a behavior and its condition, or does it tell - the reader what's "worth" doing? No "worth using," "the usual way," - "best practice." State the fact; leave the judgment to the reader. - - Is the sentence about the software, or about the document? Cut "this - page is about," "as mentioned above," "the point of this example." - - Does a word minimize something? "just," "simply," "merely," "only," - "of course." If removing it doesn't change the claim, remove it. - - Would a non-native English reader parse this correctly on first read? - No idioms, figures of speech, or headline-style fragments that drop - the subject or verb for effect (example of what to avoid: "same - verdicts, very different cost" as a heading). Rewrite as a complete, - literal sentence. This is not the same as dumbing content down: keep - the technical precision, drop only the cleverness. -3. No AI/Claude/Anthropic attribution anywhere in the repository: not in - commit messages, PR text, code comments, or the docs themselves. +## Building and checking -One exception worth stating explicitly: established, consistently-used -technical shorthand (a real domain term, a standard abbreviation) is not -the same as a one-off clever phrase, and doesn't need to be purged just -because it isn't perfectly literal. Reserve the rewrite effort for genuine -idiom and headline compression, especially on pages newcomers read first. +```bash +git submodule update --init --recursive +python -m venv .venv && source .venv/bin/activate +pip install -r requirements.txt +python scripts/check_site.py . +sphinx-build -W -b html docs docs/_build/html +``` + +Pages are written as described in the `docs-page` skill. A guide example is run before it is committed, and the output under it is the output of that run. From 8db49be195ee455006979fef115a55ca312de888 Mon Sep 17 00:00:00 2001 From: Eduard Kerkhoven Date: Sat, 24 Oct 2026 12:13:03 +0000 Subject: [PATCH 05/10] refactor: update api_index.py and check_names.py from the docs-site plugin The name check keeps deprecated Python aliases, which the reference pages leave out, so the guide pages can name an alias on purpose. The scripts were copied before that change. --- scripts/api_index.py | 11 ++++++++--- scripts/check_names.py | 2 +- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/scripts/api_index.py b/scripts/api_index.py index ab7322b..193799b 100644 --- a/scripts/api_index.py +++ b/scripts/api_index.py @@ -261,8 +261,13 @@ def py_summary(node: ast.AST) -> str: return "" -def collect_python() -> list[dict]: - """List of {name, ident, package, summary} for public top-level objects.""" +def collect_python(include_deprecated: bool = False) -> list[dict]: + """List of {name, ident, package, summary} for public top-level objects. + + Deprecated aliases are left out unless ``include_deprecated`` is set. The + reference pages leave them out; the name checker keeps them, because a page + may name an alias on purpose. + """ objects: list[dict] = [] for py in PYPKG.rglob("*.py"): try: @@ -277,7 +282,7 @@ def collect_python() -> list[dict]: if node.name.startswith("_"): continue summary = py_summary(node) - if is_deprecated_alias(summary): + if is_deprecated_alias(summary) and not include_deprecated: continue ident = f"{dotted}.{node.name}" if dotted else node.name objects.append( diff --git a/scripts/check_names.py b/scripts/check_names.py index 54f9a3e..ad60939 100644 --- a/scripts/check_names.py +++ b/scripts/check_names.py @@ -76,7 +76,7 @@ class Index: def __init__(self) -> None: self.matlab = set(collect_matlab_all()) - self.python = {obj["name"] for obj in collect_python()} + self.python = {obj["name"] for obj in collect_python(include_deprecated=True)} self.allowed = load_allowlist() def is_generated(self, src_path: str) -> bool: From b75bc27ae77247648dcb0ca02bbb3d2102fea799 Mon Sep 17 00:00:00 2001 From: Eduard Kerkhoven Date: Sat, 24 Oct 2026 12:13:03 +0000 Subject: [PATCH 06/10] doc: add DESIGN.md, update the README, mark the concept pages DESIGN.md records the purpose, structure, differences from the standard (mathjax), open items and the decisions of this alignment. The README names the new files and scripts, describes the strict build and drops the em dashes and the link to the old raven-docs location. Four guide pages that explain a concept or a format are marked as concept pages, so they need no function table. --- .github/workflows/docs-build.yml | 2 +- DESIGN.md | 67 +++++++++++++++++++ README.md | 89 ++++++++++---------------- docs/guide/data-folder-files.md | 2 + docs/guide/introduction.md | 2 + docs/guide/model-adapter-parameters.md | 2 + docs/guide/yaml-format.md | 2 + 7 files changed, 109 insertions(+), 57 deletions(-) create mode 100644 DESIGN.md diff --git a/.github/workflows/docs-build.yml b/.github/workflows/docs-build.yml index 5ef9268..859c584 100644 --- a/.github/workflows/docs-build.yml +++ b/.github/workflows/docs-build.yml @@ -34,7 +34,7 @@ jobs: - name: Check the site against the standard run: python scripts/check_site.py . - # Not yet blocking: 124 distinct names on the guide pages resolve to neither + # Not yet blocking: 121 distinct names on the guide pages resolve to neither # toolbox, and scripts/known_names.txt is empty. Remove continue-on-error # after the names are checked and the real ones allow-listed. - name: Check names on the guide pages diff --git a/DESIGN.md b/DESIGN.md new file mode 100644 index 0000000..c4842f0 --- /dev/null +++ b/DESIGN.md @@ -0,0 +1,67 @@ +# GECKO documentation: design and content guide + +This document is the source of intent. It describes how the site should be designed and what it should contain, not the current state of `main`. When the site and this document disagree, the site is brought in line, or the decision is recorded here first. New decisions go in the decisions log; resolved items leave "Open questions". + +The site follows the `docs-site` standard of [CompMetEng/skills](https://github.com/CompMetEng/skills). Differences from the standard are listed in section 6. + +Before any work in this repository, fetch all remotes of the repository and of every submodule. The submodules are updated often and automatically, so a local checkout becomes stale quickly: + +```bash +git fetch --all --prune +git checkout main && git pull --ff-only +git submodule sync --recursive +git submodule update --init --recursive +``` + +## 1. Purpose + +One documentation site for **GECKO**, the MATLAB toolbox, and **geckopy**, its Python port, for reconstructing, simulating and analyzing enzyme-constrained genome-scale metabolic models (ecModels). A user learns a task once and applies it in either language. Readers are researchers who build ecModels from a genome-scale model, and many of them are not native English speakers. + +## 2. Principles + +- **Both languages together.** MATLAB and Python are presented side by side: paired API entries and linked code tabs. +- **Single source of truth.** The API reference is generated from the function help in the toolbox sources, which are git submodules tracking the branches in `.gitmodules`. +- **Low maintenance.** What can be generated is generated at build time. Prose pages are short and have one job. +- **Curated content.** A small set of correct pages is preferred to a large set of stale ones. +- **Literal prose.** The writing rules of `CONTRIBUTING.md` apply to every page, because many readers are not native English speakers. + +## 3. Technical foundation + +- Sphinx, MyST Markdown, PyData theme, `sphinx-design`, `sphinx-copybutton`. Read the Docs builds with warnings as errors. +- Submodules: `GECKO` (branch `develop`) and `geckopy` (branch `develop`). +- The API reference is generated at build time by `scripts/gen_api_pages.py`, called from `docs/conf.py`. The scripts in `scripts/` are copies of `docs-site/scripts` in CompMetEng/skills; what is specific to this site is in `scripts/project.yml`, `scripts/curated_pairs.yml` and `scripts/known_names.txt`. A change to a script is made in the plugin first. +- `.github/workflows/docs-build.yml` runs `scripts/check_site.py`, the build with `-W`, the name check and the link check. + +## 4. Site structure + +- **Home** (`docs/index.md`): one sentence on GECKO and geckopy, the install tabs for both languages, key features, quick start, links to the papers. +- **Installation** (`docs/installation/`). +- **Guide** (`docs/guide/`): *Start* (Introduction, Installation), *Guide* (ten task pages from getting started to enzyme usage and bottlenecks), *Background* (GECKO light, the YAML format, the files of the data folder, the model adapter parameters). The Introduction and the Background pages explain a concept or a format and are marked ``, so they need no function table. +- **Migration**: `migrate.md`, `gecko3-to-gecko4.md` and `gecko-to-geckopy.md`. +- **API reference** (`docs/api/`): a hand-written index, then generated MATLAB pages by folder and Python pages by package, and `docs/matlab-vs-python.md`. +- **References** (`docs/references.md`): the papers to cite. + +## 5. Conventions + +- Code tabs are labelled MATLAB and Python, linked, with MATLAB first. +- MATLAB `camelCase` and Python `snake_case` are paired by normalised name; pairs that differ are in `scripts/curated_pairs.yml`. +- Functions that resolve to cobrapy are marked with the cobrapy badge. +- Prose follows `CONTRIBUTING.md`. No mention of AI tools. + +## 6. Differences from the standard + +| Difference | Reason | +| --- | --- | +| `sphinx.ext.mathjax` in `extensions` | the Introduction contains equations | + +## 7. Open questions + +- **Unresolved names.** `scripts/check_names.py` reports 121 distinct names on the guide pages that are neither a top-level function or class of the toolboxes nor in `scripts/known_names.txt`. Most are keyword arguments, struct fields, YAML keys and variables of the examples; four (`cap_usage`, `from_folder`, `shadow_price`, `upper_bound`) are methods or properties. Someone who knows the pages has to sort them, and allow-list the ones that are not functions, before the check can block CI. +- **Link check.** `docs-build.yml` does not fail on the link check yet; the state of the external links was not known when the check was added. +- **Logos.** `docs/_static/gecko-logo-white.png` was made from `gecko-logo.png` by making every pixel white and keeping the alpha channel, the way `gecko-icon-white.png` was made from the green icon. A designer may want to replace it. The unused `gecko-icon-color.png` and `gecko-icon-white.png` of the former `docs/assets` folder were removed and are in the history. +- **Guide page sections.** Most guide pages have no "What can go wrong" section and no function table; `scripts/check_site.py` reports this as a warning. + +## 8. Decisions log + +- 2026-10-24: the site follows the `docs-site` standard. `requirements-sphinx.txt` is `requirements.txt` and `gen_api_pages_sphinx.py` is `gen_api_pages.py`. The brand colours are `#43684B` for tabs and borders and `#2D6E3B` for links, with `#5F936A` and `#87d398` in dark mode, set as `--pst-color-primary`, `--pst-color-link` and `--site-accent`. Logos and the favicon are in `docs/_static` only, with a white logo for dark mode. The API pages use the numpydoc rendering and show signatures. +- 2026-10-24: Read the Docs and CI build with `-W`. The submodule update opens a pull request instead of pushing to `main`. diff --git a/README.md b/README.md index 6e8aab7..268fa5c 100644 --- a/README.md +++ b/README.md @@ -1,40 +1,36 @@ # GECKO Documentation -Documentation for GECKO, a MATLAB toolbox, and geckopy, its Python port, for -reconstructing, simulating and analyzing enzyme-constrained genome-scale -metabolic models (ecModels). Built with [Sphinx](https://www.sphinx-doc.org/), -[MyST](https://myst-parser.readthedocs.io/) and -[pydata-sphinx-theme](https://pydata-sphinx-theme.readthedocs.io/), matching -the [raven-docs](https://github.com/edkerk/raven-docs) setup for RAVEN and -raven-toolbox. - -Alongside the Guide, the site includes an auto-generated **API reference** -that documents both implementations side by side, statically extracted at -build time from each toolbox's source (pulled in as git submodules). See -[API reference (MATLAB + Python)](#api-reference-matlab--python) below. +Documentation for GECKO, a MATLAB toolbox, and geckopy, its Python port, for reconstructing, simulating and analyzing enzyme-constrained genome-scale metabolic models (ecModels). Built with [Sphinx](https://www.sphinx-doc.org/), [MyST](https://myst-parser.readthedocs.io/) and [pydata-sphinx-theme](https://pydata-sphinx-theme.readthedocs.io/), following the `docs-site` standard of [CompMetEng/skills](https://github.com/CompMetEng/skills), which [raven-docs](https://github.com/CompMetEng/raven-docs) follows for RAVEN and raven-toolbox. The intent of the site is in [DESIGN.md](DESIGN.md). + +Alongside the Guide, the site includes an auto-generated **API reference** that documents both implementations side by side, statically extracted at build time from each toolbox's source (pulled in as git submodules). See [API reference (MATLAB + Python)](#api-reference-matlab--python) below. ## Repository layout ``` gecko-docs/ -├── .readthedocs.yaml # Read the Docs build configuration (incl. submodules) +├── .readthedocs.yaml # Read the Docs build configuration (incl. submodules) ├── .gitmodules # GECKO + geckopy submodule definitions -├── requirements-sphinx.txt # Python build dependencies +├── .github/ # workflows (build, submodule updates), Dependabot, pull request template +├── requirements.txt # Python build dependencies +├── DESIGN.md # what the site should be, and the decisions log +├── CONTRIBUTING.md # writing rules and build commands ├── README.md # This file ├── GECKO/ # submodule: CompMetEng/GECKO (MATLAB source) -├── geckopy/ # submodule: CompMetEng/geckopy (Python source) +├── geckopy/ # submodule: CompMetEng/geckopy (Python source) ├── scripts/ -│ ├── api_index.py # shared MATLAB/Python source-collection helpers -│ ├── gen_api_pages_sphinx.py # generates docs/api/ and docs/matlab-vs-python.md -│ └── curated_pairs.yml # hand-curated name pairs the generator can't match automatically +│ ├── project.yml # names, paths and categories of this site, read by the scripts +│ ├── curated_pairs.yml # hand-curated name pairs the generator can't match automatically +│ ├── known_names.txt # names the name checker accepts that are not functions +│ └── *.py # copies of docs-site/scripts: API generator, linker, name and site checks └── docs/ - ├── conf.py # Sphinx configuration - ├── index.md # Landing page + ├── conf.py # Sphinx configuration + ├── index.md # Landing page ├── migrate.md, gecko3-to-gecko4.md, gecko-to-geckopy.md - ├── references.md # Citations + ├── references.md # Citations ├── installation/index.md - ├── guide/ # Introduction, Getting started, and the task pages - └── api/ # auto-generated bilingual API reference (not checked in) + ├── guide/ # Introduction, Getting started, and the task pages + ├── _static/ # stylesheet, logos, favicon + └── api/ # index.md is hand-written; matlab/ and python/ are generated (not checked in) ``` ## Building locally @@ -44,47 +40,32 @@ gecko-docs/ git submodule update --init --recursive # fetch the GECKO + geckopy sources python -m venv .venv source .venv/bin/activate # on Windows: .venv\Scripts\activate -pip install -r requirements-sphinx.txt -sphinx-build -b html docs docs/_build/html +pip install -r requirements.txt +sphinx-build -W -b html docs docs/_build/html ``` -The `git submodule update --init` step is required: without it the `GECKO/` -and `geckopy/` source trees are empty and the API reference builds with no -functions in it. +The `git submodule update --init` step is required: without it the `GECKO/` and `geckopy/` source trees are empty and the API reference builds with no functions in it. -Open `docs/_build/html/index.html` in a browser. There is no live-reload dev -server configured; re-run `sphinx-build` after editing. +Open `docs/_build/html/index.html` in a browser. There is no live-reload dev server configured; re-run `sphinx-build` after editing. The build uses `-W`, so a warning fails it, as on Read the Docs. Before a pull request, run `python scripts/check_site.py .` as well. ## Hosting on Read the Docs 1. Push this folder to a GitHub, GitLab or Bitbucket repository. 2. Sign in at https://readthedocs.org/ and import the repository. -3. Read the Docs detects `.readthedocs.yaml` and builds the site - automatically on every push. +3. Read the Docs detects `.readthedocs.yaml` and builds the site automatically on every push. In the project settings, enable "Build pull requests for this project" to get a preview of each pull request. -Read the Docs initializes the git submodules automatically because -`.readthedocs.yaml` sets `submodules.include: all`, so the API reference is -built on every push without any extra configuration. +Read the Docs initializes the git submodules automatically because `.readthedocs.yaml` sets `submodules.include: all`, so the API reference is built on every push without any extra configuration. The build fails on warnings (`fail_on_warning: true`). ## API reference (MATLAB + Python) -`docs/api/` documents both toolboxes side by side, plus -`docs/matlab-vs-python.md`, a generated table pairing every function that -exists in both. All of it is written by `scripts/gen_api_pages_sphinx.py` -at build time (run from `docs/conf.py`'s `setup()` hook), which extracts -MATLAB help blocks and Python docstrings directly from source: no MATLAB -runtime, no installed geckopy package, and no live-rendering plugin -involved. Nothing under `docs/api/` or `docs/matlab-vs-python.md` is -checked into the repository or should be hand-edited; regenerate by -rebuilding. Function pairs that don't match by name alone (geckopy renamed -part of the API during the port) are recorded in `scripts/curated_pairs.yml`, -which is validated against the live source at build time. +`docs/api/` documents both toolboxes side by side, plus `docs/matlab-vs-python.md`, a generated table pairing every function that exists in both. All of it, except `docs/api/index.md`, is written by `scripts/gen_api_pages.py` at build time (run from `docs/conf.py`'s `setup()` hook), which extracts MATLAB help blocks and Python docstrings directly from source: no MATLAB runtime, no installed geckopy package, and no live-rendering plugin involved. Nothing under `docs/api/matlab/`, `docs/api/python/` or `docs/matlab-vs-python.md` is checked into the repository or should be hand-edited; regenerate by rebuilding. Function pairs that don't match by name alone (geckopy renamed part of the API during the port) are recorded in `scripts/curated_pairs.yml`, which is validated against the live source at build time. + +The scripts in `scripts/` are copies of `docs-site/scripts` in [CompMetEng/skills](https://github.com/CompMetEng/skills). What is specific to this site is in `scripts/project.yml`. A change to a script is made there first. -Sources are git submodules pinned to each project's tracked development -branch (see `.gitmodules`): +Sources are git submodules pinned to each project's tracked development branch (see `.gitmodules`): -- `GECKO/` — [CompMetEng/GECKO](https://github.com/CompMetEng/GECKO) (MATLAB) -- `geckopy/` — [CompMetEng/geckopy](https://github.com/CompMetEng/geckopy) (Python) +- `GECKO/`: [CompMetEng/GECKO](https://github.com/CompMetEng/GECKO) (MATLAB) +- `geckopy/`: [CompMetEng/geckopy](https://github.com/CompMetEng/geckopy) (Python) To refresh the reference against the latest upstream code: @@ -94,12 +75,8 @@ git add GECKO geckopy git commit -m "chore: update submodules to latest tracked branches" ``` -(`.github/workflows/update-submodules.yml` does this automatically on a -daily schedule.) +`.github/workflows/update-submodules.yml` does this daily and opens a pull request, whose build checks that the new sources still build. ## License and attribution -The GECKO source code is released under the MIT license at -https://github.com/CompMetEng/GECKO. The scientific content summarized -in these pages is the work of the original authors; see -[Citations](docs/references.md) for the papers to cite. +The GECKO source code is released under the MIT license at https://github.com/CompMetEng/GECKO. The scientific content summarized in these pages is the work of the original authors; see [Citations](docs/references.md) for the papers to cite. diff --git a/docs/guide/data-folder-files.md b/docs/guide/data-folder-files.md index abe5221..f2a6103 100644 --- a/docs/guide/data-folder-files.md +++ b/docs/guide/data-folder-files.md @@ -1,5 +1,7 @@ # Files in the data folder + + Every file a project's `data` folder can hold, and where each one gets used or produced. File formats (TSV, JSON) are the same in both languages, so a `data` folder built with one toolbox can be reused with the other; see diff --git a/docs/guide/introduction.md b/docs/guide/introduction.md index 437f3cd..415c141 100644 --- a/docs/guide/introduction.md +++ b/docs/guide/introduction.md @@ -1,5 +1,7 @@ # Introduction to ecModels + + Genome-scale metabolic models (GEMs) let you explore metabolism mathematically, and have accelerated work in biotechnology, biomedicine and fundamental biology. A conventional GEM reconstructs all known metabolic diff --git a/docs/guide/model-adapter-parameters.md b/docs/guide/model-adapter-parameters.md index e223d2f..941b8b3 100644 --- a/docs/guide/model-adapter-parameters.md +++ b/docs/guide/model-adapter-parameters.md @@ -1,5 +1,7 @@ # Model adapter parameters + + The core `obj.params` entries in the MATLAB model adapter, and the corresponding TOML key in the Python `model_adapter.toml` (dotted keys are `[section]` tables). Example values come from the `full_ecModel` tutorial; diff --git a/docs/guide/yaml-format.md b/docs/guide/yaml-format.md index 54160a2..c64f220 100644 --- a/docs/guide/yaml-format.md +++ b/docs/guide/yaml-format.md @@ -1,5 +1,7 @@ # ecModel YAML format + + This page defines the YAML format GECKO and geckopy use to save and load ecModels. It is reference material, not a task: both toolboxes read and write the same file, so there is no MATLAB-vs-Python distinction to draw From 1a3cfaecbee64a61c91645378b65a363fc826a4d Mon Sep 17 00:00:00 2001 From: Eduard Kerkhoven Date: Sat, 24 Oct 2026 12:39:23 +0000 Subject: [PATCH 07/10] doc: record that the white logo is accepted The dark-mode logo is a decision in the log and no longer an open question. --- DESIGN.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DESIGN.md b/DESIGN.md index c4842f0..f0539ca 100644 --- a/DESIGN.md +++ b/DESIGN.md @@ -58,10 +58,10 @@ One documentation site for **GECKO**, the MATLAB toolbox, and **geckopy**, its P - **Unresolved names.** `scripts/check_names.py` reports 121 distinct names on the guide pages that are neither a top-level function or class of the toolboxes nor in `scripts/known_names.txt`. Most are keyword arguments, struct fields, YAML keys and variables of the examples; four (`cap_usage`, `from_folder`, `shadow_price`, `upper_bound`) are methods or properties. Someone who knows the pages has to sort them, and allow-list the ones that are not functions, before the check can block CI. - **Link check.** `docs-build.yml` does not fail on the link check yet; the state of the external links was not known when the check was added. -- **Logos.** `docs/_static/gecko-logo-white.png` was made from `gecko-logo.png` by making every pixel white and keeping the alpha channel, the way `gecko-icon-white.png` was made from the green icon. A designer may want to replace it. The unused `gecko-icon-color.png` and `gecko-icon-white.png` of the former `docs/assets` folder were removed and are in the history. - **Guide page sections.** Most guide pages have no "What can go wrong" section and no function table; `scripts/check_site.py` reports this as a warning. ## 8. Decisions log - 2026-10-24: the site follows the `docs-site` standard. `requirements-sphinx.txt` is `requirements.txt` and `gen_api_pages_sphinx.py` is `gen_api_pages.py`. The brand colours are `#43684B` for tabs and borders and `#2D6E3B` for links, with `#5F936A` and `#87d398` in dark mode, set as `--pst-color-primary`, `--pst-color-link` and `--site-accent`. Logos and the favicon are in `docs/_static` only, with a white logo for dark mode. The API pages use the numpydoc rendering and show signatures. - 2026-10-24: Read the Docs and CI build with `-W`. The submodule update opens a pull request instead of pushing to `main`. +- 2026-10-24: `docs/_static/gecko-logo-white.png`, the logo for dark mode, was made from `gecko-logo.png` by making every pixel white and keeping the alpha channel, the way `gecko-icon-white.png` was made. The maintainer accepted it. The unused `gecko-icon-color.png` and `gecko-icon-white.png` of the former `docs/assets` folder were removed and are in the history. From 3e081ef553bae6907f06996c70740701a160b2be Mon Sep 17 00:00:00 2001 From: Eduard Kerkhoven Date: Sat, 24 Oct 2026 13:42:09 +0000 Subject: [PATCH 08/10] feat: remember the language of the code tabs across pages, browser tabs and visits sphinx-design links the tabs of a page and carries the choice to the next page, but keeps it in sessionStorage, so a new browser tab or a later visit started in MATLAB again. language-sync.js stores the language in localStorage, applies it to every tab set when a page loads and when the reader switches, and follows a switch made in another open tab. The install tabs, which have no sync key, select the first tab named after the language. --- docs/_static/language-sync.js | 85 +++++++++++++++++++++++++++++++++++ docs/conf.py | 2 + 2 files changed, 87 insertions(+) create mode 100644 docs/_static/language-sync.js diff --git a/docs/_static/language-sync.js b/docs/_static/language-sync.js new file mode 100644 index 0000000..5926b0c --- /dev/null +++ b/docs/_static/language-sync.js @@ -0,0 +1,85 @@ +/* Language of the code tabs: MATLAB or Python. + * + * sphinx-design links the tabs that have the same sync key on one page and + * remembers the choice for the next page, but in sessionStorage, which a new + * browser tab or a later visit does not see. This script stores the choice in + * localStorage and applies it to every tab set of the page when the page loads + * and when the reader changes the language. Tab sets that have no sync key, such + * as the install tabs ("Python (pip)", "MATLAB (Add-Ons)"), follow the language + * too: the first tab whose label names the language is selected. A tab set + * that already shows a tab of the language is left as it is, and a tab set that + * has no tab of the language is not touched. + */ +(function () { + "use strict"; + + var KEY = "docs-language"; + + function languageOf(label) { + var text = label.getAttribute("data-sync-id") || label.textContent; + if (/python/i.test(text)) return "python"; + if (/matlab/i.test(text)) return "matlab"; + return null; + } + + function read() { + try { + return window.localStorage.getItem(KEY); + } catch (error) { + return null; + } + } + + function write(language) { + try { + window.localStorage.setItem(KEY, language); + } catch (error) { + /* storage is blocked: the language still applies to the open page */ + } + } + + function labelsOf(tabSet) { + return Array.prototype.filter.call(tabSet.children, function (element) { + return element.classList.contains("sd-tab-label"); + }); + } + + function apply(language, keep) { + document.querySelectorAll(".sd-tab-set").forEach(function (tabSet) { + if (tabSet === keep) return; + var labels = labelsOf(tabSet); + var matches = labels.filter(function (label) { + return languageOf(label) === language; + }); + if (!matches.length) return; + var shown = labels.filter(function (label) { + return label.previousElementSibling && label.previousElementSibling.checked; + })[0]; + if (shown && languageOf(shown) === language) return; + matches[0].previousElementSibling.checked = true; + }); + } + + document.addEventListener("click", function (event) { + var label = event.target.closest && event.target.closest(".sd-tab-label"); + if (!label) return; + var language = languageOf(label); + if (!language) return; + write(language); + apply(language, label.closest(".sd-tab-set")); + }); + + /* The language was changed in another tab of the site. */ + window.addEventListener("storage", function (event) { + if (event.key === KEY && event.newValue) apply(event.newValue); + }); + + /* After the listeners of sphinx-design, which restores its own choice from + * sessionStorage, so that the stored language wins. */ + document.addEventListener("DOMContentLoaded", function () { + window.setTimeout(function () { + var language = read(); + if (language) apply(language); + }, 0); + }); +})(); diff --git a/docs/conf.py b/docs/conf.py index b9a36ca..c2e156e 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -56,6 +56,8 @@ html_favicon = "_static/gecko-icon.png" html_static_path = ["_static"] html_css_files = ["custom.css"] +# Remembers the language of the code tabs across pages, browser tabs and visits. +html_js_files = ["language-sync.js"] # The source pages are generated MyST files, not something a reader can edit. html_show_sourcelink = False From 255d2c51f5e18101791defafbc8af9b5ea2f8b5f Mon Sep 17 00:00:00 2001 From: Eduard Kerkhoven Date: Sat, 24 Oct 2026 13:42:29 +0000 Subject: [PATCH 09/10] refactor: update check_site.py from the docs-site plugin The site check now requires language-sync.js and its entry in conf.py. --- scripts/check_site.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/scripts/check_site.py b/scripts/check_site.py index f38e86b..91853f9 100644 --- a/scripts/check_site.py +++ b/scripts/check_site.py @@ -31,6 +31,7 @@ "docs/conf.py", "docs/index.md", "docs/_static/custom.css", + "docs/_static/language-sync.js", "scripts/gen_api_pages.py", "scripts/project.yml", ] @@ -196,6 +197,8 @@ def check_conf(site: Path) -> list[Finding]: out.append(Finding("C", "error", "docs/conf.py", f"extension {ext} is not enabled")) if re.search(r"html_(logo|favicon)\s*=\s*\"assets/", text) or re.search(r'"image_(light|dark)":\s*"assets/', text): out.append(Finding("C", "error", "docs/conf.py", "logo and favicon paths are relative to _static/, not assets/")) + if not re.search(r"html_js_files\s*=\s*\[[^\]]*[\"']language-sync\.js[\"']", text): + out.append(Finding("C", "error", "docs/conf.py", "html_js_files does not list language-sync.js")) logo = re.search(r'"image_light":\s*"([^"]+)"\s*,\s*"image_dark":\s*"([^"]+)"', text, re.S) if logo and logo.group(1) == logo.group(2): out.append(Finding("C", "error", "docs/conf.py", "the dark-mode logo is the same file as the light-mode logo")) From 5d69b63f33e63cd574a25cfbb9d930b07f080e62 Mon Sep 17 00:00:00 2001 From: Eduard Kerkhoven Date: Sat, 24 Oct 2026 13:42:45 +0000 Subject: [PATCH 10/10] doc: record the remembered code tab language in DESIGN.md --- DESIGN.md | 1 + 1 file changed, 1 insertion(+) diff --git a/DESIGN.md b/DESIGN.md index f0539ca..2bfe0c2 100644 --- a/DESIGN.md +++ b/DESIGN.md @@ -65,3 +65,4 @@ One documentation site for **GECKO**, the MATLAB toolbox, and **geckopy**, its P - 2026-10-24: the site follows the `docs-site` standard. `requirements-sphinx.txt` is `requirements.txt` and `gen_api_pages_sphinx.py` is `gen_api_pages.py`. The brand colours are `#43684B` for tabs and borders and `#2D6E3B` for links, with `#5F936A` and `#87d398` in dark mode, set as `--pst-color-primary`, `--pst-color-link` and `--site-accent`. Logos and the favicon are in `docs/_static` only, with a white logo for dark mode. The API pages use the numpydoc rendering and show signatures. - 2026-10-24: Read the Docs and CI build with `-W`. The submodule update opens a pull request instead of pushing to `main`. - 2026-10-24: `docs/_static/gecko-logo-white.png`, the logo for dark mode, was made from `gecko-logo.png` by making every pixel white and keeping the alpha channel, the way `gecko-icon-white.png` was made. The maintainer accepted it. The unused `gecko-icon-color.png` and `gecko-icon-white.png` of the former `docs/assets` folder were removed and are in the history. +- 2026-10-24: the language of the code tabs (MATLAB or Python) is remembered in `localStorage` by `docs/_static/language-sync.js`, so it applies to every tab on a page, to the next pages, to new browser tabs and to later visits, and install tabs follow it. sphinx-design alone keeps the choice in `sessionStorage` for one browser tab.
  • =g`qYJ*@Snj{Q%}D?Q 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 VLnebeEe90kRplz)nEszN0RYPUbglpZ diff --git a/docs/assets/gecko-logo.png b/docs/assets/gecko-logo.png deleted file mode 100644 index 267e9cc59682daf57bdc37c4174c8b8955f3d342..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 144125 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