Browse Source

⬆️ Upgrade to MkDocs Material 5 and update docs scripts (#1225)

* ⬆️ Upgrade mkdocs.yml configs for MkDocs Material 5

*  Update docs.py to always update mkdocs.yml

* 🌐 Update mkdocs.yml for translations

* 🔧 Update MkDocs config

*  Add tabs for alternative options

* ⬆️ Update termynal setup with new CSS classes

* 🔧 Sync / Update mkdocs.yml for languages
pull/1222/head
Sebastián Ramírez 5 years ago
committed by GitHub
parent
commit
483bce3ae1
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 40
      docs/en/docs/advanced/settings.md
  2. 100
      docs/en/docs/contributing.md
  3. 62
      docs/en/docs/deployment.md
  4. 2
      docs/en/docs/js/custom.js
  5. 15
      docs/en/mkdocs.yml
  6. 17
      docs/es/mkdocs.yml
  7. 15
      docs/pt/mkdocs.yml
  8. 15
      docs/zh/mkdocs.yml
  9. 62
      scripts/docs.py

40
docs/en/docs/advanced/settings.md

@ -15,35 +15,37 @@ An <a href="https://en.wikipedia.org/wiki/Environment_variable" class="external-
You can create and use environment variables in the shell, without needing Python: You can create and use environment variables in the shell, without needing Python:
<div class="termy"> === "Linux, macOS, Windows Bash"
```console <div class="termy">
// You could create an env var MY_NAME with
$ export MY_NAME="Wade Wilson"
// Then you could use it with other programs, like ```console
$ echo "Hello $MY_NAME" // You could create an env var MY_NAME with
$ export MY_NAME="Wade Wilson"
Hello Wade Wilson // Then you could use it with other programs, like
``` $ echo "Hello $MY_NAME"
</div> Hello Wade Wilson
```
Or in PowerShell in Windows: </div>
<div class="termy"> === "Windows PowerShell"
```console <div class="termy">
// Create an env var MY_NAME
$ $Env:MY_NAME = "Wade Wilson"
// Use it with other programs, like ```console
$ echo "Hello $Env:MY_NAME" // Create an env var MY_NAME
$ $Env:MY_NAME = "Wade Wilson"
Hello Wade Wilson // Use it with other programs, like
``` $ echo "Hello $Env:MY_NAME"
</div> Hello Wade Wilson
```
</div>
### Read env vars in Python ### Read env vars in Python

100
docs/en/docs/contributing.md

@ -24,59 +24,67 @@ That will create a directory `./env/` with the Python binaries and then you will
Activate the new environment with: Activate the new environment with:
<div class="termy"> === "Linux, macOS"
```console <div class="termy">
$ source ./env/bin/activate
```
</div> ```console
$ source ./env/bin/activate
```
Or in Windows' PowerShell: </div>
<div class="termy"> === "Windows PowerShell"
```console <div class="termy">
$ .\env\Scripts\Activate.ps1
```
</div> ```console
$ .\env\Scripts\Activate.ps1
```
Or if you use Bash for Windows (e.g. <a href="https://gitforwindows.org/" class="external-link" target="_blank">Git Bash</a>): </div>
<div class="termy"> === "Windows Bash"
```console Or if you use Bash for Windows (e.g. <a href="https://gitforwindows.org/" class="external-link" target="_blank">Git Bash</a>):
$ source ./env/Scripts/activate
```
</div> <div class="termy">
```console
$ source ./env/Scripts/activate
```
</div>
To check it worked, use: To check it worked, use:
<div class="termy"> === "Linux, macOS, Windows Bash"
```console <div class="termy">
$ which pip
some/directory/fastapi/env/bin/pip ```console
``` $ which pip
</div> some/directory/fastapi/env/bin/pip
```
If it shows the `pip` binary at `env/bin/pip` then it worked. 🎉 </div>
Or in Windows PowerShell: === "Windows PowerShell"
<div class="termy"> <div class="termy">
```console ```console
$ Get-Command pip $ Get-Command pip
some/directory/fastapi/env/bin/pip
```
</div>
If it shows the `pip` binary at `env/bin/pip` then it worked. 🎉
some/directory/fastapi/env/bin/pip
```
</div>
!!! tip !!! tip
Every time you install a new package with `pip` under that environment, activate the environment again. Every time you install a new package with `pip` under that environment, activate the environment again.
@ -103,27 +111,31 @@ Now re-activate the environment to make sure you are using the `flit` you just i
And now use `flit` to install the development dependencies: And now use `flit` to install the development dependencies:
<div class="termy"> === "Linux, macOS"
```console <div class="termy">
$ flit install --deps develop --symlink
---> 100% ```console
``` $ flit install --deps develop --symlink
</div> ---> 100%
```
If you are on Windows, use `--pth-file` instead of `--symlink`: </div>
<div class="termy"> === "Windows"
```console If you are on Windows, use `--pth-file` instead of `--symlink`:
$ flit install --deps develop --pth-file
---> 100% <div class="termy">
```
</div> ```console
$ flit install --deps develop --pth-file
---> 100%
```
</div>
It will install all the dependencies and your local FastAPI in your local environment. It will install all the dependencies and your local FastAPI in your local environment.

62
docs/en/docs/deployment.md

@ -329,55 +329,61 @@ You can deploy **FastAPI** directly without Docker too.
You just need to install an ASGI compatible server like: You just need to install an ASGI compatible server like:
* <a href="https://www.uvicorn.org/" class="external-link" target="_blank">Uvicorn</a>, a lightning-fast ASGI server, built on uvloop and httptools. === "Uvicorn"
<div class="termy"> * <a href="https://www.uvicorn.org/" class="external-link" target="_blank">Uvicorn</a>, a lightning-fast ASGI server, built on uvloop and httptools.
```console <div class="termy">
$ pip install uvicorn
---> 100% ```console
``` $ pip install uvicorn
</div> ---> 100%
```
* <a href="https://gitlab.com/pgjones/hypercorn" class="external-link" target="_blank">Hypercorn</a>, an ASGI server also compatible with HTTP/2. </div>
<div class="termy"> === "Hypercorn"
```console * <a href="https://gitlab.com/pgjones/hypercorn" class="external-link" target="_blank">Hypercorn</a>, an ASGI server also compatible with HTTP/2.
$ pip install hypercorn
---> 100% <div class="termy">
```
</div> ```console
$ pip install hypercorn
---> 100%
```
...or any other ASGI server. </div>
...or any other ASGI server.
And run your application the same way you have done in the tutorials, but without the `--reload` option, e.g.: And run your application the same way you have done in the tutorials, but without the `--reload` option, e.g.:
<div class="termy"> === "Uvicorn"
```console <div class="termy">
$ uvicorn main:app --host 0.0.0.0 --port 80
<span style="color: green;">INFO</span>: Uvicorn running on http://0.0.0.0:80 (Press CTRL+C to quit) ```console
``` $ uvicorn main:app --host 0.0.0.0 --port 80
</div> <span style="color: green;">INFO</span>: Uvicorn running on http://0.0.0.0:80 (Press CTRL+C to quit)
```
or with Hypercorn: </div>
<div class="termy"> === "Hypercorn"
```console <div class="termy">
$ hypercorn main:app --bind 0.0.0.0:80
Running on 0.0.0.0:8080 over http (CTRL + C to quit) ```console
``` $ hypercorn main:app --bind 0.0.0.0:80
</div> Running on 0.0.0.0:8080 over http (CTRL + C to quit)
```
</div>
You might want to set up some tooling to make sure it is restarted automatically if it stops. You might want to set up some tooling to make sure it is restarted automatically if it stops.

2
docs/en/docs/js/custom.js

@ -35,7 +35,7 @@ function setupTermynal() {
function createTermynals() { function createTermynals() {
document document
.querySelectorAll(`.${termynalActivateClass} .codehilite`) .querySelectorAll(`.${termynalActivateClass} .highlight`)
.forEach(node => { .forEach(node => {
const text = node.textContent; const text = node.textContent;
const lines = text.split("\n"); const lines = text.split("\n");

15
docs/en/mkdocs.yml

@ -6,6 +6,8 @@ theme:
palette: palette:
primary: teal primary: teal
accent: amber accent: amber
icon:
repo: fontawesome/brands/github-alt
logo: img/icon-white.svg logo: img/icon-white.svg
favicon: img/favicon.png favicon: img/favicon.png
language: en language: en
@ -129,19 +131,20 @@ markdown_extensions:
- name: mermaid - name: mermaid
class: mermaid class: mermaid
format: !!python/name:pymdownx.superfences.fence_div_format '' format: !!python/name:pymdownx.superfences.fence_div_format ''
- pymdownx.tabbed
extra: extra:
social: social:
- type: github - icon: fontawesome/brands/github-alt
link: https://github.com/tiangolo/typer link: https://github.com/tiangolo/typer
- type: twitter - icon: fontawesome/brands/twitter
link: https://twitter.com/tiangolo link: https://twitter.com/tiangolo
- type: linkedin - icon: fontawesome/brands/linkedin
link: https://www.linkedin.com/in/tiangolo link: https://www.linkedin.com/in/tiangolo
- type: rss - icon: fontawesome/brands/dev
link: https://dev.to/tiangolo link: https://dev.to/tiangolo
- type: medium - icon: fontawesome/brands/medium
link: https://medium.com/@tiangolo link: https://medium.com/@tiangolo
- type: globe - icon: fontawesome/solid/globe
link: https://tiangolo.com link: https://tiangolo.com
extra_css: extra_css:
- css/termynal.css - css/termynal.css

17
docs/es/mkdocs.yml

@ -6,6 +6,8 @@ theme:
palette: palette:
primary: teal primary: teal
accent: amber accent: amber
icon:
repo: fontawesome/brands/github-alt
logo: https://fastapi.tiangolo.com/img/icon-white.svg logo: https://fastapi.tiangolo.com/img/icon-white.svg
favicon: https://fastapi.tiangolo.com/img/favicon.png favicon: https://fastapi.tiangolo.com/img/favicon.png
language: es language: es
@ -37,19 +39,20 @@ markdown_extensions:
- name: mermaid - name: mermaid
class: mermaid class: mermaid
format: !!python/name:pymdownx.superfences.fence_div_format '' format: !!python/name:pymdownx.superfences.fence_div_format ''
- pymdownx.tabbed
extra: extra:
social: social:
- type: github - icon: fontawesome/brands/github-alt
link: https://github.com/tiangolo/typer link: https://github.com/tiangolo/typer
- type: twitter - icon: fontawesome/brands/twitter
link: https://twitter.com/tiangolo link: https://twitter.com/tiangolo
- type: linkedin - icon: fontawesome/brands/linkedin
link: https://www.linkedin.com/in/tiangolo link: https://www.linkedin.com/in/tiangolo
- type: rss - icon: fontawesome/brands/dev
link: https://dev.to/tiangolo link: https://dev.to/tiangolo
- type: medium - icon: fontawesome/brands/medium
link: https://medium.com/@tiangolo link: https://medium.com/@tiangolo
- type: globe - icon: fontawesome/solid/globe
link: https://tiangolo.com link: https://tiangolo.com
extra_css: extra_css:
- https://fastapi.tiangolo.com/css/termynal.css - https://fastapi.tiangolo.com/css/termynal.css
@ -58,3 +61,5 @@ extra_javascript:
- https://unpkg.com/[email protected]/dist/mermaid.min.js - https://unpkg.com/[email protected]/dist/mermaid.min.js
- https://fastapi.tiangolo.com/js/termynal.js - https://fastapi.tiangolo.com/js/termynal.js
- https://fastapi.tiangolo.com/js/custom.js - https://fastapi.tiangolo.com/js/custom.js
- https://fastapi.tiangolo.com/js/chat.js
- https://sidecar.gitter.im/dist/sidecar.v1.js

15
docs/pt/mkdocs.yml

@ -6,6 +6,8 @@ theme:
palette: palette:
primary: teal primary: teal
accent: amber accent: amber
icon:
repo: fontawesome/brands/github-alt
logo: https://fastapi.tiangolo.com/img/icon-white.svg logo: https://fastapi.tiangolo.com/img/icon-white.svg
favicon: https://fastapi.tiangolo.com/img/favicon.png favicon: https://fastapi.tiangolo.com/img/favicon.png
language: pt language: pt
@ -37,19 +39,20 @@ markdown_extensions:
- name: mermaid - name: mermaid
class: mermaid class: mermaid
format: !!python/name:pymdownx.superfences.fence_div_format '' format: !!python/name:pymdownx.superfences.fence_div_format ''
- pymdownx.tabbed
extra: extra:
social: social:
- type: github - icon: fontawesome/brands/github-alt
link: https://github.com/tiangolo/typer link: https://github.com/tiangolo/typer
- type: twitter - icon: fontawesome/brands/twitter
link: https://twitter.com/tiangolo link: https://twitter.com/tiangolo
- type: linkedin - icon: fontawesome/brands/linkedin
link: https://www.linkedin.com/in/tiangolo link: https://www.linkedin.com/in/tiangolo
- type: rss - icon: fontawesome/brands/dev
link: https://dev.to/tiangolo link: https://dev.to/tiangolo
- type: medium - icon: fontawesome/brands/medium
link: https://medium.com/@tiangolo link: https://medium.com/@tiangolo
- type: globe - icon: fontawesome/solid/globe
link: https://tiangolo.com link: https://tiangolo.com
extra_css: extra_css:
- https://fastapi.tiangolo.com/css/termynal.css - https://fastapi.tiangolo.com/css/termynal.css

15
docs/zh/mkdocs.yml

@ -6,6 +6,8 @@ theme:
palette: palette:
primary: teal primary: teal
accent: amber accent: amber
icon:
repo: fontawesome/brands/github-alt
logo: https://fastapi.tiangolo.com/img/icon-white.svg logo: https://fastapi.tiangolo.com/img/icon-white.svg
favicon: https://fastapi.tiangolo.com/img/favicon.png favicon: https://fastapi.tiangolo.com/img/favicon.png
language: zh language: zh
@ -37,19 +39,20 @@ markdown_extensions:
- name: mermaid - name: mermaid
class: mermaid class: mermaid
format: !!python/name:pymdownx.superfences.fence_div_format '' format: !!python/name:pymdownx.superfences.fence_div_format ''
- pymdownx.tabbed
extra: extra:
social: social:
- type: github - icon: fontawesome/brands/github-alt
link: https://github.com/tiangolo/typer link: https://github.com/tiangolo/typer
- type: twitter - icon: fontawesome/brands/twitter
link: https://twitter.com/tiangolo link: https://twitter.com/tiangolo
- type: linkedin - icon: fontawesome/brands/linkedin
link: https://www.linkedin.com/in/tiangolo link: https://www.linkedin.com/in/tiangolo
- type: rss - icon: fontawesome/brands/dev
link: https://dev.to/tiangolo link: https://dev.to/tiangolo
- type: medium - icon: fontawesome/brands/medium
link: https://medium.com/@tiangolo link: https://medium.com/@tiangolo
- type: globe - icon: fontawesome/solid/globe
link: https://tiangolo.com link: https://tiangolo.com
extra_css: extra_css:
- https://fastapi.tiangolo.com/css/termynal.css - https://fastapi.tiangolo.com/css/termynal.css

62
scripts/docs.py

@ -20,6 +20,12 @@ missing_translation_snippet = """
""" """
docs_path = Path("docs") docs_path = Path("docs")
en_docs_path = Path("docs/en")
en_config_path: Path = en_docs_path / mkdocs_name
def get_en_config() -> dict:
return mkdocs.utils.yaml_load(en_config_path.read_text(encoding="utf-8"))
def get_lang_paths(): def get_lang_paths():
@ -43,39 +49,15 @@ def complete_existing_lang(incomplete: str):
yield lang_path.name yield lang_path.name
@app.command() def get_base_lang_config(lang: str):
def new_lang(lang: str = typer.Argument(..., callback=lang_callback)): en_config = get_en_config()
"""
Generate a new docs translation directory for the language LANG.
LANG should be a 2-letter language code, like: en, es, de, pt, etc.
"""
new_path: Path = Path("docs") / lang
if new_path.exists():
typer.echo(f"The language was already created: {lang}")
raise typer.Abort()
new_path.mkdir()
en_docs_path = Path("docs/en")
en_config_path: Path = en_docs_path / mkdocs_name
en_config: dict = mkdocs.utils.yaml_load(en_config_path.read_text(encoding="utf-8"))
fastapi_url_base = "https://fastapi.tiangolo.com/" fastapi_url_base = "https://fastapi.tiangolo.com/"
new_config = {} new_config = en_config.copy()
new_config["site_name"] = en_config["site_name"]
new_config["site_description"] = en_config["site_description"]
new_config["site_url"] = en_config["site_url"] + f"{lang}/" new_config["site_url"] = en_config["site_url"] + f"{lang}/"
new_config["theme"] = en_config["theme"]
new_config["theme"]["logo"] = fastapi_url_base + en_config["theme"]["logo"] new_config["theme"]["logo"] = fastapi_url_base + en_config["theme"]["logo"]
new_config["theme"]["favicon"] = fastapi_url_base + en_config["theme"]["favicon"] new_config["theme"]["favicon"] = fastapi_url_base + en_config["theme"]["favicon"]
new_config["theme"]["language"] = lang new_config["theme"]["language"] = lang
new_config["repo_name"] = en_config["repo_name"]
new_config["repo_url"] = en_config["repo_url"]
new_config["edit_uri"] = en_config["edit_uri"]
new_config["google_analytics"] = en_config["google_analytics"]
new_config["nav"] = en_config["nav"][:2] new_config["nav"] = en_config["nav"][:2]
new_config["markdown_extensions"] = en_config["markdown_extensions"]
new_config["extra"] = en_config["extra"]
extra_css = [] extra_css = []
css: str css: str
for css in en_config["extra_css"]: for css in en_config["extra_css"]:
@ -93,6 +75,22 @@ def new_lang(lang: str = typer.Argument(..., callback=lang_callback)):
else: else:
extra_js.append(fastapi_url_base + js) extra_js.append(fastapi_url_base + js)
new_config["extra_javascript"] = extra_js new_config["extra_javascript"] = extra_js
return new_config
@app.command()
def new_lang(lang: str = typer.Argument(..., callback=lang_callback)):
"""
Generate a new docs translation directory for the language LANG.
LANG should be a 2-letter language code, like: en, es, de, pt, etc.
"""
new_path: Path = Path("docs") / lang
if new_path.exists():
typer.echo(f"The language was already created: {lang}")
raise typer.Abort()
new_path.mkdir()
new_config = get_base_lang_config(lang)
new_config_path: Path = Path(new_path) / mkdocs_name new_config_path: Path = Path(new_path) / mkdocs_name
new_config_path.write_text( new_config_path.write_text(
yaml.dump(new_config, sort_keys=False, width=200), encoding="utf-8" yaml.dump(new_config, sort_keys=False, width=200), encoding="utf-8"
@ -280,7 +278,15 @@ def live(
def update_config(lang: str): def update_config(lang: str):
lang_path: Path = docs_path / lang lang_path: Path = docs_path / lang
config_path = lang_path / mkdocs_name config_path = lang_path / mkdocs_name
config: dict = mkdocs.utils.yaml_load(config_path.read_text(encoding="utf-8")) current_config: dict = mkdocs.utils.yaml_load(
config_path.read_text(encoding="utf-8")
)
if lang == "en":
config = get_en_config()
else:
config = get_base_lang_config(lang)
config["nav"] = current_config["nav"]
config["theme"]["language"] = current_config["theme"]["language"]
languages = [{"en": "/"}] languages = [{"en": "/"}]
for lang in get_lang_paths(): for lang in get_lang_paths():
if lang.name == "en" or not lang.is_dir(): if lang.name == "en" or not lang.is_dir():

Loading…
Cancel
Save