Add Sphinx documentation generation functionality (#2720)

* Add Sphinx documentation generation functionality

* sphinx-docs -> python/sphinx

* Use ninja instead of make

* Update copyright info in sphinx docs

* Run sphinx-apidoc before building Sphinx docs

* Cleanup Sphinx path insertion

* Don't write build outputs into source; use autoapi

* aqt -> _aqt

* Mention sphinx in development.md

---------

Co-authored-by: Damien Elmes <gpg@ankiweb.net>
This commit is contained in:
Gulshan Singh 2023-10-12 20:03:54 -07:00 committed by GitHub
parent 56c5002848
commit a230c754b9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 104 additions and 0 deletions

View File

@ -28,6 +28,8 @@ use rust::check_rust;
use web::build_and_check_web;
use web::check_sql;
use crate::python::setup_sphix;
fn anki_version() -> String {
std::fs::read_to_string(".version")
.unwrap()
@ -51,6 +53,8 @@ fn main() -> Result<()> {
build_and_check_aqt(build)?;
build_bundle(build)?;
setup_sphix(build)?;
check_rust(build)?;
check_pylib(build)?;
check_python(build)?;

View File

@ -6,6 +6,7 @@ use ninja_gen::action::BuildAction;
use ninja_gen::archives::Platform;
use ninja_gen::build::FilesHandle;
use ninja_gen::command::RunCommand;
use ninja_gen::copy::CopyFiles;
use ninja_gen::glob;
use ninja_gen::hashmap;
use ninja_gen::input::BuildInput;
@ -240,3 +241,42 @@ fn add_pylint(build: &mut Build) -> Result<()> {
Ok(())
}
struct Sphinx {
deps: BuildInput,
}
impl BuildAction for Sphinx {
fn command(&self) -> &str {
"$pip install sphinx sphinx_rtd_theme sphinx-autoapi \
&& $python python/sphinx/build.py"
}
fn files(&mut self, build: &mut impl FilesHandle) {
build.add_inputs("python", inputs![":pyenv:bin"]);
build.add_inputs("pip", inputs![":pyenv:pip"]);
build.add_inputs("", &self.deps);
build.add_output_stamp("python/sphinx/stamp");
}
fn hide_success(&self) -> bool {
false
}
}
pub(crate) fn setup_sphix(build: &mut Build) -> Result<()> {
build.add_action(
"python:sphinx:copy_conf",
CopyFiles {
inputs: inputs![glob!("python/sphinx/{conf.py,index.rst}")],
output_folder: "python/sphinx",
},
)?;
build.add_action(
"python:sphinx",
Sphinx {
deps: inputs![":pylib", ":qt", ":python:sphinx:copy_conf"],
},
)?;
Ok(())
}

View File

@ -173,6 +173,20 @@ Please see [this separate page](./editing.md) for setting up an editor/IDE.
See [this page](./build.md)
## Generating documentation
For Rust:
```
cargo doc --open
```
For Python:
```
./ninja python:sphinx && open out/python/sphinx/html/py-modindex.html
```
## Environmental Variables
If ANKIDEV is set before starting Anki, some extra log messages will be printed on stdout,

7
python/sphinx/build.py Normal file
View File

@ -0,0 +1,7 @@
# Copyright: Ankitects Pty Ltd and contributors
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
import os
import subprocess
os.environ["REPO_ROOT"] = os.path.abspath(".")
subprocess.run(["out/pyenv/bin/sphinx-apidoc", "-o", "out/python/sphinx", "pylib", "qt"], check=True)
subprocess.run(["out/pyenv/bin/sphinx-build", "out/python/sphinx", "out/python/sphinx/html"], check=True)

19
python/sphinx/conf.py Normal file
View File

@ -0,0 +1,19 @@
# Copyright: Ankitects Pty Ltd and contributors
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
# Configuration file for the Sphinx documentation builder.
#
# For the full list of built-in configuration values, see the documentation:
# https://www.sphinx-doc.org/en/master/usage/configuration.html
import os
project = 'Anki'
copyright = '2023, Ankitects Pty Ltd and contributors'
author = 'Ankitects Pty Ltd and contributors'
REPO_ROOT = os.environ["REPO_ROOT"]
extensions = ['sphinx_rtd_theme', 'autoapi.extension']
html_theme = 'sphinx_rtd_theme'
autoapi_python_use_implicit_namespaces = True
autoapi_dirs = [os.path.join(REPO_ROOT, x) for x in ["pylib/anki", "out/pylib/anki", "qt/aqt", "out/qt/_aqt"]]

20
python/sphinx/index.rst Normal file
View File

@ -0,0 +1,20 @@
.. Anki documentation master file, created by
sphinx-quickstart on Tue Sep 26 09:41:18 2023.
You can adapt this file completely to your liking, but it should at least
contain the root `toctree` directive.
Welcome to Anki's documentation!
================================
.. toctree::
:maxdepth: 2
:caption: Contents:
Indices and tables
==================
* :ref:`genindex`
* :ref:`modindex`
* :ref:`search`