From c614a08b7f16852732eb2434095e1ccf8cc7c556 Mon Sep 17 00:00:00 2001 From: Ben Jeffery Date: Wed, 23 Oct 2024 18:10:33 +0100 Subject: [PATCH] Add docs infra --- .github/workflows/docs.yml | 46 ++++++++++++++ .gitignore | 1 + docs/CHANGELOG.md | 1 + docs/Makefile | 16 +++++ docs/_config.yml | 61 +++++++++++++++++++ docs/_toc.yml | 19 ++++++ docs/build.sh | 20 +++++++ docs/contributing.md | 11 ++++ docs/edges.md | 7 +++ docs/example.tsbrowse | Bin 0 -> 73832 bytes docs/index.md | 7 +++ docs/install.md | 5 ++ docs/intro.md | 5 ++ docs/license.md | 8 +++ docs/overview.md | 7 +++ docs/tsbrowse_image_extension.py | 99 +++++++++++++++++++++++++++++++ requirements.txt | 2 + tests/test_ui.py | 2 +- 18 files changed, 316 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/docs.yml create mode 120000 docs/CHANGELOG.md create mode 100644 docs/Makefile create mode 100644 docs/_config.yml create mode 100644 docs/_toc.yml create mode 100755 docs/build.sh create mode 100644 docs/contributing.md create mode 100644 docs/edges.md create mode 100644 docs/example.tsbrowse create mode 100644 docs/index.md create mode 100644 docs/install.md create mode 100644 docs/intro.md create mode 100644 docs/license.md create mode 100644 docs/overview.md create mode 100644 docs/tsbrowse_image_extension.py diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml new file mode 100644 index 0000000..c5fcd9f --- /dev/null +++ b/.github/workflows/docs.yml @@ -0,0 +1,46 @@ +name: Docs + +on: + pull_request: + push: + branches: [main] + tags: + - '*' + +jobs: + build-deploy-docs: + name: Docs + runs-on: ubuntu-latest + steps: + - name: Cancel Previous Runs + uses: styfle/cancel-workflow-action@0.11.0 + with: + access_token: ${{ github.token }} + + - uses: actions/checkout@v3 + with: + submodules: true + + - uses: actions/setup-python@v5 + with: + python-version: "3.11" + cache: "pip" + + + - name: Install deps + run: | + pip install --upgrade pip wheel + pip install -r requirements.txt + + - name: Build Docs + run: | + cd docs + make + + - name: Trigger docs site rebuild + if: github.ref == 'refs/heads/main' + run: | + curl -X POST https://api.github.com/repos/tskit-dev/tskit-site/dispatches \ + -H 'Accept: application/vnd.github.everest-preview+json' \ + -u AdminBot-tskit:${{ secrets.ADMINBOT_TOKEN }} \ + --data '{"event_type":"build-docs"}' \ No newline at end of file diff --git a/.gitignore b/.gitignore index b6e4761..0e5278e 100644 --- a/.gitignore +++ b/.gitignore @@ -70,6 +70,7 @@ instance/ # Sphinx documentation docs/_build/ +docs/_autoimages/ # PyBuilder target/ diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md new file mode 120000 index 0000000..04c99a5 --- /dev/null +++ b/docs/CHANGELOG.md @@ -0,0 +1 @@ +../CHANGELOG.md \ No newline at end of file diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 0000000..6192f64 --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,16 @@ + +# Need to set PYTHONPATH so that we pick up the local tsbrowse +PYPATH=${PWD}/.. +TSBROWSE_VERSION:=$(shell PYTHONPATH=${PYPATH} \ + python3 -c 'import tsbrowse; print(tsbrowse.__version__.split("+")[0])') + +dev: + PYTHONPATH=${PYPATH} ./build.sh + +dist: + @echo Building distribution for tsbrowse version ${TSBROWSE_VERSION} + sed -i s/__TSBROWSE_VERSION__/${TSBROWSE_VERSION}/g _config.yml + PYTHONPATH=${PYPATH} ./build.sh + +clean: + rm -fR _build diff --git a/docs/_config.yml b/docs/_config.yml new file mode 100644 index 0000000..2dc588c --- /dev/null +++ b/docs/_config.yml @@ -0,0 +1,61 @@ +# Book settings +# Learn more at https://jupyterbook.org/customize/config.html + +title: Tsbrowse manual +author: Tsbrowse Developers +copyright: "2024" +only_build_toc_files: true + +execute: + execute_notebooks: cache + +launch_buttons: + binderhub_url: "" + +repository: + url: https://github.com/tskit-dev/tsbrowse + branch: main + path_to_book: docs + +html: + use_issues_button: true + use_repository_button: true + use_edit_page_button: true + +sphinx: + extra_extensions: + - sphinx_copybutton + - sphinx_design + - sphinx.ext.autodoc + - sphinx.ext.autosummary + - sphinx.ext.doctest + - sphinx.ext.viewcode + - sphinx.ext.intersphinx + - sphinx_issues + local_extensions: + tsbrowse_image_extension: . + + config: + html_theme: sphinx_book_theme + myst_enable_extensions: + - colon_fence + - deflist + - dollarmath + issues_github_path: tskit-dev/tsbrowse + intersphinx_mapping: + python: ["https://docs.python.org/3/", null] + matplotlib: ["https://matplotlib.org/stable", null] + numpy: ["https://numpy.org/doc/stable/", null] + pandas: ["https://pandas.pydata.org/pandas-docs/stable", null] + pyslim: ["https://tskit.dev/pyslim/docs/latest/", null] + tskit: ["https://tskit.dev/tskit/docs/stable/", null] + tskit-tutorials: ["https://tskit.dev/tutorials/", null] + msprime: ["https://tskit.dev/msprime/docs/stable/", null] + + autodoc_member_order: bysource + + suppress_warnings: + - etoc.toctree + - ref + + diff --git a/docs/_toc.yml b/docs/_toc.yml new file mode 100644 index 0000000..aef5f2d --- /dev/null +++ b/docs/_toc.yml @@ -0,0 +1,19 @@ +format: jb-book +root: index +parts: +- caption: Getting started + chapters: + - file: intro + - file: install + +- caption: Pages + chapters: + - file: overview + - file: edges + +- caption: Extras + chapters: + - file: contributing + - file: CHANGELOG + - url: https://tskit.dev/community/ + title: Community \ No newline at end of file diff --git a/docs/build.sh b/docs/build.sh new file mode 100755 index 0000000..2417d47 --- /dev/null +++ b/docs/build.sh @@ -0,0 +1,20 @@ +#/bin/bash + +# Jupyter-build doesn't have an option to automatically show the +# saved reports, which makes it difficult to debug the reasons for +# build failures in CI. This is a simple wrapper to handle that. + +REPORTDIR=_build/html/reports + +jupyter-book build -nW --keep-going . +RETVAL=$? +if [ $RETVAL -ne 0 ]; then + if [ -e $REPORTDIR ]; then + echo "Error occured; showing saved reports" + cat $REPORTDIR/* + fi +else + # Clear out any old reports + rm -f $REPORTDIR/* +fi +exit $RETVAL diff --git a/docs/contributing.md b/docs/contributing.md new file mode 100644 index 0000000..85f112a --- /dev/null +++ b/docs/contributing.md @@ -0,0 +1,11 @@ +(contributing)= + +# Contributing to tsbrowse + +All contributions, bug reports, documentation improvements and ideas are welcome. If you think +there is anything missing, please open an [issue](https://github.com/tskit-dev/tsbrowse/issues) +or [pull request](https://github.com/tskit-dev/tsbrowse/pulls) on Github. + +## Quick start + +TODO! Add information for developers here. diff --git a/docs/edges.md b/docs/edges.md new file mode 100644 index 0000000..77434f4 --- /dev/null +++ b/docs/edges.md @@ -0,0 +1,7 @@ +(sec_edges)= + +# Edges page + +TODO! Explain page + +![Edges Page](tsbrowse:example.tsbrowse:edges) \ No newline at end of file diff --git a/docs/example.tsbrowse b/docs/example.tsbrowse new file mode 100644 index 0000000000000000000000000000000000000000..86caf8fad35fcb1c9bc62ed90702634e5cdc9181 GIT binary patch literal 73832 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