Skip to content

Commit 9d3f227

Browse files
authored
Migrate documentation to use Markdown and MkDocs (#1397)
Migrate documentation to use [MkDocs](https://www.mkdocs.org/) with the [Material Theme](https://squidfunk.github.io/mkdocs-material/) for the build. Replaced all use of reStructuredText with Markdown and all use of Sphinx with MkDocs. TODO: - [x] Create MkDocs Material theme basic setup and configuration - [x] Translate reStructuredText docs to Markdown using `pandoc` - [x] Verify MkDocs build and serve are working - [x] Delete Sphinx stuff and make sure GitHub Actions doc build is working - [x] Finish correcting basic translation errors - [x] Get automated API documentation using [mkdocstrings](https://mkdocstrings.github.io/) working nicely - [x] Figure out how to do autodoc references using `mkdocstring` - [x] Final cleanup check of markdown - [x] Make [recommended tweaks](https://docs.readthedocs.io/en/stable/intro/mkdocs.html) for hosting docs on ReadTheDocs - [x] Add example of using [mermaid](https://mermaid.js.org/) to embed diagrams in `scripting.md` - [x] Verify ReadTheDocs build is working properly Closes #1396
1 parent 91fd9b1 commit 9d3f227

File tree

150 files changed

+4704
-7221
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

150 files changed

+4704
-7221
lines changed

Diff for: .github/CODEOWNERS

+1-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ cmd2/table_creator.py @kmvanbrunt
4141
cmd2/transcript.py @kotfu
4242
cmd2/utils.py @tleonhardt @kotfu @kmvanbrunt
4343

44-
# Sphinx documentation
44+
# Documentation
4545
docs/* @tleonhardt @kotfu
4646

4747
# Examples

Diff for: .github/CONTRIBUTING.md

+51-50
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,12 @@ We welcome pull requests from cmd2 users and seasoned Python developers alike! F
1111

1212
Remember to feel free to ask for help by leaving a comment within the Issue.
1313

14-
Working on your first pull request? You can learn how from the
14+
Working on your first pull request? You can learn how from the
1515
[GitHub Docs](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/creating-a-pull-request).
1616

1717
###### If you've found a bug that is not on the board, [follow these steps](../README.md#found-a-bug).
1818

19-
--------------------------------------------------------------------------------
19+
---
2020

2121
## Contribution guidelines
2222

@@ -46,39 +46,38 @@ The tables below list all prerequisites along with the minimum required version
4646
4747
#### Prerequisites to run cmd2 applications
4848

49-
| Prerequisite | Minimum Version |
50-
|------------------------------------------------------|-----------------|
51-
| [python](https://www.python.org/downloads/) | `3.8` |
52-
| [pyperclip](https://github.com/asweigart/pyperclip) | `1.8.2` |
53-
| [wcwidth](https://pypi.python.org/pypi/wcwidth) | `0.2.12` |
49+
| Prerequisite | Minimum Version |
50+
| --------------------------------------------------- | --------------- |
51+
| [python](https://www.python.org/downloads/) | `3.8` |
52+
| [pyperclip](https://github.com/asweigart/pyperclip) | `1.8.2` |
53+
| [wcwidth](https://pypi.python.org/pypi/wcwidth) | `0.2.12` |
5454

5555
#### Additional prerequisites to build and publish cmd2
5656

5757
| Prerequisite | Minimum Version |
58-
|----------------------------------------------------------|-----------------|
58+
| -------------------------------------------------------- | --------------- |
5959
| [build](https://pypi.org/project/build/) | `1.2.2` |
6060
| [setuptools](https://pypi.org/project/setuptools/) | `72.1.0` |
6161
| [setuptools-scm](https://github.com/pypa/setuptools-scm) | `8.0.4` |
6262
| [twine](https://github.com/pypa/twine) | `5.1.1` |
6363

6464
#### Additional prerequisites for developing cmd2
6565

66-
| Prerequisite | Minimum Version | Purpose |
67-
|----------------------------------------------------------------------|-----------------|----------------------------|
68-
| [codecov](http://doc.pytest.org/en/latest/) | `2.1.13` | Cover coverage reporting |
69-
| [doc8](https://github.com/PyCQA/doc8) | `1.1.2` | Sphinx style checker |
70-
| [invoke](https://www.pyinvoke.org/) | `2.2.0` | Command automation |
71-
| [mypy](https://mypy-lang.org/) | `1.13.0` | Static type checker |
72-
| [pytest](https://docs.pytest.org/en/stable/) | `3.0.6` | Unit and integration tests |
73-
| [pytest-cov](http://doc.pytest.org/en/latest/) | `6.0.0` | Pytest code coverage |
74-
| [pytest-mock](https://pypi.org/project/pytest-mock/) | `3.14.0` | Pytest mocker fixture |
75-
| [sphinx](https://www.sphinx-doc.org/en/master/) | `8.1.3` | Documentation |
76-
| [sphinx-autobuild](hhttps://pypi.org/project/sphinx-autobuild/) | `2024.10.3` | Rebuild docs on changes |
77-
| [sphinx-rtd-theme](https://github.com/readthedocs/sphinx_rtd_theme ) | `3.0.1` | Sphinx theme for RTD |
78-
| [ruff](https://github.com/astral-sh/ruff) | `0.7.3` | Fast linter and formatter |
79-
| [uv](https://github.com/astral-sh/uv) | `0.5.1` | Python package management |
80-
81-
66+
| Prerequisite | Minimum Version | Purpose |
67+
| ------------------------------------------------------------------------------------------ | --------------- | --------------------------------- |
68+
| [codecov](http://doc.pytest.org/en/latest/) | `2.1.13` | Cover coverage reporting |
69+
| [invoke](https://www.pyinvoke.org/) | `2.2.0` | Command automation |
70+
| [griffe_typingdoc](https://github.com/mkdocstrings/griffe-typingdoc) | `0.2.7` | mkdocstrings extension for typing |
71+
| [mypy](https://mypy-lang.org/) | `1.13.0` | Static type checker |
72+
| [pytest](https://docs.pytest.org/en/stable/) | `3.0.6` | Unit and integration tests |
73+
| [pytest-cov](http://doc.pytest.org/en/latest/) | `6.0.0` | Pytest code coverage |
74+
| [pytest-mock](https://pypi.org/project/pytest-mock/) | `3.14.0` | Pytest mocker fixture |
75+
| [mkdocs-include-markdown-plugin](https://pypi.org/project/mkdocs-include-markdown-plugin/) | `7.1.2` | MkDocs Plugin include MkDn |
76+
| [mkdocs-macros-plugin](https://mkdocs-macros-plugin.readthedocs.io/) | `1.3.7` | MkDocs Plugin for macros |
77+
| [mkdocs-material](https://squidfunk.github.io/mkdocs-material/) | `9.5.49` | Documentation |
78+
| [mkdocstrings[python]](https://mkdocstrings.github.io/) | `0.27.0` | MkDocs Plugin for Python AutoDoc |
79+
| [ruff](https://github.com/astral-sh/ruff) | `0.7.3` | Fast linter and formatter |
80+
| [uv](https://github.com/astral-sh/uv) | `0.5.1` | Python package management |
8281

8382
If Python is already installed in your machine, run the following commands to validate the versions:
8483

@@ -89,11 +88,12 @@ $ pip freeze | grep pyperclip
8988

9089
If your versions are lower than the prerequisite versions, you should update.
9190

92-
If you do not already have Python installed on your machine, we recommend using [uv](https://github.com/astral-sh/uv)
91+
If you do not already have Python installed on your machine, we recommend using [uv](https://github.com/astral-sh/uv)
9392
for all of your Python needs because it is extremely fast, meets all Python installation and packaging needs, and works
94-
on all platforms (Windows, Mac, and Linux). You can install `uv` using instructions at the link above.
93+
on all platforms (Windows, Mac, and Linux). You can install `uv` using instructions at the link above.
9594

9695
You can then install multiple versions of Python using `uv` like so:
96+
9797
```sh
9898
uv python install 3.10 3.11 3.12 3.13
9999
```
@@ -147,31 +147,31 @@ Do this prior to every time you create a branch for a PR:
147147
1. Make sure you are on the `master` branch
148148

149149
> ```sh
150-
> $ git status
151-
> On branch master
152-
> Your branch is up-to-date with 'origin/master'.
153-
> ```
150+
> $ git status
151+
> On branch master
152+
> Your branch is up-to-date with 'origin/master'.
153+
> ```
154154
155155
> If your aren't on `master`, resolve outstanding files and commits and checkout the `master` branch
156156
157157
> ```sh
158-
> $ git checkout master
159-
> ```
158+
> $ git checkout master
159+
> ```
160160
161161
2. Do a pull with rebase against `upstream`
162162
163163
> ```sh
164-
> $ git pull --rebase upstream master
165-
> ```
164+
> $ git pull --rebase upstream master
165+
> ```
166166
167167
> This will pull down all of the changes to the official master branch, without making an additional commit in your
168168
> local repo.
169169
170170
3. (_Optional_) Force push your updated master branch to your GitHub fork
171171
172172
> ```sh
173-
> $ git push origin master --force
174-
> ```
173+
> $ git push origin master --force
174+
> ```
175175
176176
> This will overwrite the master branch of your fork.
177177
@@ -213,8 +213,8 @@ package from the source.
213213

214214
`cmd2` has support for using [uv](https://github.com/astral-sh/uv) for development.
215215

216-
`uv` is single tool to replace `pip`, `pip-tools`, `pipx`, `poetry`, `pyenv`, `twine`, `virtualenv`, and more. `cmd2`
217-
contains configuration for using `uv` in it's `pyproject.toml` file which makes it extremely easy to setup a `cmd2`
216+
`uv` is single tool to replace `pip`, `pip-tools`, `pipx`, `poetry`, `pyenv`, `twine`, `virtualenv`, and more. `cmd2`
217+
contains configuration for using `uv` in it's `pyproject.toml` file which makes it extremely easy to setup a `cmd2`
218218
development environment using `uv`.
219219

220220
To create a virtual environment and install everything needed for `cmd2` development using `uv`, do the following
@@ -238,6 +238,7 @@ uv run examples/basic.py
238238
```
239239

240240
Alternatively you can activate the virtual environment using the OS-specific command such as this on Linux or macOS:
241+
241242
```sh
242243
source .venv/bin/activate
243244
```
@@ -316,7 +317,7 @@ primarily related to continuous integration and release deployment.
316317
#### Changes to the documentation files
317318

318319
If you made changes to any file in the `/docs` directory, you need to build the
319-
Sphinx documentation and make sure your changes look good:
320+
MkDocs documentation and make sure your changes look good:
320321

321322
```sh
322323
$ uv inv docs
@@ -337,7 +338,7 @@ served (usually [http://localhost:8000](http://localhost:8000)).
337338
### Code Quality Checks
338339

339340
You should have some sort of [PEP 8](https://www.python.org/dev/peps/pep-0008/)-based linting running in your editor or
340-
IDE or at the command line before you commit code. `cmd2` uses [ruff](https://github.com/astral-sh/ruff) as part of
341+
IDE or at the command line before you commit code. `cmd2` uses [ruff](https://github.com/astral-sh/ruff) as part of
341342
its continuous integration (CI) process for both linting and auto-formatting.
342343

343344
> Please do not ignore any linting errors in code you write or modify, as they are meant to **help** you and to ensure a
@@ -440,7 +441,7 @@ nothing to commit, working directory clean
440441
any outstanding files/commits and checkout master `git checkout master`
441442

442443
2. Create a branch off of `master` with git: `git checkout -B
443-
branch/name-here` **Note:** Branch naming is important. Use a name like
444+
branch/name-here` **Note:** Branch naming is important. Use a name like
444445
`fix/short-fix-description` or `feature/short-feature-description`. Review
445446
the [Contribution Guidelines](#contribution-guidelines) for more detail.
446447

@@ -449,7 +450,7 @@ nothing to commit, working directory clean
449450
4. Check your `git status` to see unstaged files
450451

451452
5. Add your edited files: `git add path/to/filename.ext` You can also do: `git
452-
add .` to add all unstaged files. Take care, though, because you can
453+
add .` to add all unstaged files. Take care, though, because you can
453454
accidentally add files you don't want added. Review your `git status` first.
454455

455456
6. Commit your edits: `git commit -m "Brief description of commit"`. Do not add the issue number in the commit message.
@@ -482,17 +483,17 @@ how to do it.
482483
4. The title (also called the subject) of your PR should be descriptive of your
483484
changes and succinctly indicate what is being fixed
484485

485-
- **Do not add the issue number in the PR title or commit message**
486+
- **Do not add the issue number in the PR title or commit message**
486487

487-
- Examples: `Add test cases for Unicode support`; `Correct typo in overview documentation`
488+
- Examples: `Add test cases for Unicode support`; `Correct typo in overview documentation`
488489

489490
5. In the body of your PR include a more detailed summary of the changes you
490491
made and why
491492

492-
- If the PR is meant to fix an existing bug/issue, then, at the end of
493-
your PR's description, append the keyword `closes` and #xxxx (where xxxx
494-
is the issue number). Example: `closes #1337`. This tells GitHub to
495-
close the existing issue if the PR is merged.
493+
- If the PR is meant to fix an existing bug/issue, then, at the end of
494+
your PR's description, append the keyword `closes` and #xxxx (where xxxx
495+
is the issue number). Example: `closes #1337`. This tells GitHub to
496+
close the existing issue if the PR is merged.
496497

497498
6. Indicate what local testing you have done (e.g. what OS and version(s) of Python did you run the
498499
unit test suite with)
@@ -632,8 +633,8 @@ mostly automated. The manual steps are all git operations. Here's the checklist:
632633
1. Make sure all the unit tests pass with `invoke pytest` or `py.test`
633634
1. Make sure latest year in `LICENSE` matches current year
634635
1. Make sure `CHANGELOG.md` describes the version and has the correct release date
635-
1. Add a git tag representing the version number using ``invoke tag x.y.z``
636-
* Where x, y, and z are all small non-negative integers
636+
1. Add a git tag representing the version number using `invoke tag x.y.z`
637+
- Where x, y, and z are all small non-negative integers
637638
1. (Optional) Run `invoke pypi-test` to clean, build, and upload a new release to [Test PyPi](https://test.pypi.org)
638639
1. Run `invoke pypi` to clean, build, and upload a new release to [PyPi](https://pypi.org/)
639640

Diff for: .github/workflows/doc.yml

+8-8
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
# https://docs.github.com/en/actions/reference/workflow-syntax-for-github-actions
33
name: Doc
44

5-
on: [ push, pull_request, workflow_dispatch ]
5+
on: [push, pull_request, workflow_dispatch]
66

77
permissions:
88
contents: read
@@ -11,21 +11,21 @@ jobs:
1111
doc:
1212
strategy:
1313
matrix:
14-
os: [ ubuntu-latest ]
15-
python-version: [ "3.12" ]
14+
os: [ubuntu-latest]
15+
python-version: ["3.12"]
1616
fail-fast: false
1717
runs-on: ${{ matrix.os }}
1818
steps:
19-
- uses: actions/checkout@v4 # https://github.com/actions/checkout
19+
- uses: actions/checkout@v4 # https://github.com/actions/checkout
2020
with:
2121
# Only a single commit is fetched by default, for the ref/SHA that triggered the workflow.
2222
# Set fetch-depth: 0 to fetch all history for all branches and tags.
2323
fetch-depth: 0 # Needed for setuptools_scm to work correctly
2424
- name: Set up Python
25-
uses: actions/setup-python@v5 # https://github.com/actions/setup-python
25+
uses: actions/setup-python@v5 # https://github.com/actions/setup-python
2626
with:
2727
python-version: ${{ matrix.python-version }}
2828
- name: Install python prerequisites
29-
run: pip install -U --user pip setuptools setuptools-scm sphinx sphinx-autobuild sphinx-rtd-theme . plugins/ext_test
30-
- name: Sphinx documentation build
31-
run: python -m sphinx -M html docs docs/_build -nvWT
29+
run: pip install -U --user pip setuptools setuptools-scm griffe_typingdoc mkdocs-include-markdown-plugin mkdocs-macros-plugin mkdocs-material mkdocstrings[python] . plugins/ext_test
30+
- name: MkDocs documentation build
31+
run: mkdocs build

Diff for: .gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
# Python development, test, and build
22
__pycache__
3+
target
34
build
45
dist
56
*.egg-info

Diff for: .prettierignore

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
# Markdown documentation files with non-standards syntax for mkdocstrings that Prettier should not auto-format
2+
docs/features/initialization.md

Diff for: .prettierrc

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
{
2+
"overrides": [
3+
{
4+
"files": "*.md",
5+
"options": {
6+
"tabWidth": 4
7+
}
8+
}
9+
]
10+
}

Diff for: .readthedocs.yaml

+7-11
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,18 @@
1-
# Read the Docs configuration file for Sphinx projects
2-
# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
1+
# Read the Docs configuration file for MkDocs projects
2+
# See https://docs.readthedocs.io/en/stable/intro/mkdocs.html for details
33

44
# Required
55
version: 2
66

77
# Set the OS, Python version and other tools you might need
88
build:
9-
os: ubuntu-22.04
9+
os: ubuntu-24.04
1010
tools:
11-
python: "3.12"
11+
python: "3"
1212

13-
# Build documentation in the "docs/" directory with Sphinx
14-
sphinx:
15-
configuration: docs/conf.py
16-
# You can configure Sphinx to use a different builder, for instance use the dirhtml builder for simpler URLs
17-
# builder: "dirhtml"
18-
# Fail on all warnings to avoid broken references
19-
# fail_on_warning: true
13+
# Build documentation in the "docs/" directory with MkDocs
14+
mkdocs:
15+
configuration: mkdocs.yml
2016

2117
# Optionally build your docs in additional formats such as PDF and ePub
2218
# formats:

Diff for: Pipfile

+5-4
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ build = "*"
1313
cmd2 = { editable = true, path = "." }
1414
cmd2_ext_test = { editable = true, path = "plugins/ext_test" }
1515
codecov = "*"
16-
doc8 = "*"
1716
gnureadline = { version = "*", sys_platform = "== 'darwin'" }
17+
griffe-typingdoc = "*"
1818
invoke = "*"
1919
ipython = "*"
2020
mypy = "*"
@@ -24,9 +24,10 @@ pytest-cov = "*"
2424
pytest-mock = "*"
2525
ruff = "*"
2626
setuptools-scm = "*"
27-
sphinx = "*"
28-
sphinx-autobuild = "*"
29-
sphinx-rtd-theme = "*"
27+
mkdocs-include-markdown-plugin = "*"
28+
mkdocs-macros-plugin = "*"
29+
mkdocs-material = "*"
30+
mkdocstrings[python] = "*"
3031
twine = ">=1.11"
3132

3233
[pipenv]

Diff for: cmd2/ansi.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -1043,13 +1043,13 @@ def style(
10431043
# These can be altered to suit an application's needs and only need to be a
10441044
# function with the following structure: func(str) -> str
10451045
style_success = functools.partial(style, fg=Fg.GREEN)
1046-
"""Partial function supplying arguments to :meth:`cmd2.ansi.style()` which colors text to signify success"""
1046+
"""Partial function supplying arguments to [cmd2.ansi.style][] which colors text to signify success"""
10471047

10481048
style_warning = functools.partial(style, fg=Fg.LIGHT_YELLOW)
1049-
"""Partial function supplying arguments to :meth:`cmd2.ansi.style()` which colors text to signify a warning"""
1049+
"""Partial function supplying arguments to [cmd2.ansi.style][] which colors text to signify a warning"""
10501050

10511051
style_error = functools.partial(style, fg=Fg.LIGHT_RED)
1052-
"""Partial function supplying arguments to :meth:`cmd2.ansi.style()` which colors text to signify an error"""
1052+
"""Partial function supplying arguments to [cmd2.ansi.style][] which colors text to signify an error"""
10531053

10541054

10551055
def async_alert_str(*, terminal_columns: int, prompt: str, line: str, cursor_offset: int, alert_msg: str) -> str:

0 commit comments

Comments
 (0)