Browse Source
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>pull/5971/head
committed by
GitHub
2 changed files with 470 additions and 0 deletions
@ -0,0 +1,469 @@ |
|||
# Участие в разработке фреймворка |
|||
|
|||
Возможно, для начала Вам стоит ознакомиться с основными способами [помочь FastAPI или получить помощь](help-fastapi.md){.internal-link target=_blank}. |
|||
|
|||
## Разработка |
|||
|
|||
Если Вы уже склонировали репозиторий и знаете, что Вам нужно более глубокое погружение в код фреймворка, то здесь представлены некоторые инструкции по настройке виртуального окружения. |
|||
|
|||
### Виртуальное окружение с помощью `venv` |
|||
|
|||
Находясь в нужной директории, Вы можете создать виртуальное окружение при помощи Python модуля `venv`. |
|||
|
|||
<div class="termy"> |
|||
|
|||
```console |
|||
$ python -m venv env |
|||
``` |
|||
|
|||
</div> |
|||
|
|||
Эта команда создаст директорию `./env/` с бинарными (двоичными) файлами Python, а затем Вы сможете скачивать и устанавливать необходимые библиотеки в изолированное виртуальное окружение. |
|||
|
|||
### Активация виртуального окружения |
|||
|
|||
Активируйте виртуально окружение командой: |
|||
|
|||
=== "Linux, macOS" |
|||
|
|||
<div class="termy"> |
|||
|
|||
```console |
|||
$ source ./env/bin/activate |
|||
``` |
|||
|
|||
</div> |
|||
|
|||
=== "Windows PowerShell" |
|||
|
|||
<div class="termy"> |
|||
|
|||
```console |
|||
$ .\env\Scripts\Activate.ps1 |
|||
``` |
|||
|
|||
</div> |
|||
|
|||
=== "Windows Bash" |
|||
|
|||
Если Вы пользуетесь Bash для Windows (например: <a href="https://gitforwindows.org/" class="external-link" target="_blank">Git Bash</a>): |
|||
|
|||
<div class="termy"> |
|||
|
|||
```console |
|||
$ source ./env/Scripts/activate |
|||
``` |
|||
|
|||
</div> |
|||
|
|||
Проверьте, что всё сработало: |
|||
|
|||
=== "Linux, macOS, Windows Bash" |
|||
|
|||
<div class="termy"> |
|||
|
|||
```console |
|||
$ which pip |
|||
|
|||
some/directory/fastapi/env/bin/pip |
|||
``` |
|||
|
|||
</div> |
|||
|
|||
=== "Windows PowerShell" |
|||
|
|||
<div class="termy"> |
|||
|
|||
```console |
|||
$ Get-Command pip |
|||
|
|||
some/directory/fastapi/env/bin/pip |
|||
``` |
|||
|
|||
</div> |
|||
|
|||
Ели в терминале появится ответ, что бинарник `pip` расположен по пути `.../env/bin/pip`, значит всё в порядке. 🎉 |
|||
|
|||
Во избежание ошибок в дальнейших шагах, удостоверьтесь, что в Вашем виртуальном окружении установлена последняя версия `pip`: |
|||
|
|||
<div class="termy"> |
|||
|
|||
```console |
|||
$ python -m pip install --upgrade pip |
|||
|
|||
---> 100% |
|||
``` |
|||
|
|||
</div> |
|||
|
|||
!!! tip "Подсказка" |
|||
Каждый раз, перед установкой новой библиотеки в виртуальное окружение при помощи `pip`, не забудьте активировать это виртуальное окружение. |
|||
|
|||
Это гарантирует, что если Вы используете библиотеку, установленную этим пакетом, то Вы используете библиотеку из Вашего локального окружения, а не любую другую, которая может быть установлена глобально. |
|||
|
|||
### pip |
|||
|
|||
После активации виртуального окружения, как было указано ранее, введите следующую команду: |
|||
|
|||
<div class="termy"> |
|||
|
|||
```console |
|||
$ pip install -e ."[dev,doc,test]" |
|||
|
|||
---> 100% |
|||
``` |
|||
|
|||
</div> |
|||
|
|||
Это установит все необходимые зависимости в локальное окружение для Вашего локального FastAPI. |
|||
|
|||
#### Использование локального FastAPI |
|||
|
|||
Если Вы создаёте Python файл, который импортирует и использует FastAPI,а затем запускаете его интерпретатором Python из Вашего локального окружения, то он будет использовать код из локального FastAPI. |
|||
|
|||
И, так как при вводе вышеупомянутой команды был указан флаг `-e`, если Вы измените код локального FastAPI, то при следующем запуске этого файла, он будет использовать свежую версию локального FastAPI, который Вы только что изменили. |
|||
|
|||
Таким образом, Вам не нужно "переустанавливать" Вашу локальную версию, чтобы протестировать каждое изменение. |
|||
|
|||
### Форматировние |
|||
|
|||
Скачанный репозиторий содержит скрипт, который может отформатировать и подчистить Ваш код: |
|||
|
|||
<div class="termy"> |
|||
|
|||
```console |
|||
$ bash scripts/format.sh |
|||
``` |
|||
|
|||
</div> |
|||
|
|||
Заодно он упорядочит Ваши импорты. |
|||
|
|||
Чтобы он сортировал их правильно, необходимо, чтобы FastAPI был установлен локально в Вашей среде, с помощью команды из раздела выше, использующей флаг `-e`. |
|||
|
|||
## Документация |
|||
|
|||
Прежде всего, убедитесь, что Вы настроили своё окружение, как описано выше, для установки всех зависимостей. |
|||
|
|||
Документация использует <a href="https://www.mkdocs.org/" class="external-link" target="_blank">MkDocs</a>. |
|||
|
|||
Также существуют дополнительные инструменты/скрипты для работы с переводами в `./scripts/docs.py`. |
|||
|
|||
!!! tip "Подсказка" |
|||
|
|||
Нет необходимости заглядывать в `./scripts/docs.py`, просто используйте это в командной строке. |
|||
|
|||
Вся документация имеет формат Markdown и расположена в директории `./docs/en/`. |
|||
|
|||
Многие руководства содержат блоки кода. |
|||
|
|||
В большинстве случаев эти блоки кода представляют собой вполне законченные приложения, которые можно запускать как есть. |
|||
|
|||
На самом деле, эти блоки кода не написаны внутри Markdown, это Python файлы в директории `./docs_src/`. |
|||
|
|||
И эти Python файлы включаются/вводятся в документацию при создании сайта. |
|||
|
|||
### Тестирование документации |
|||
|
|||
|
|||
Фактически, большинство тестов запускаются с примерами исходных файлов в документации. |
|||
|
|||
Это помогает убедиться, что: |
|||
|
|||
* Документация находится в актуальном состоянии. |
|||
* Примеры из документации могут быть запущены как есть. |
|||
* Большинство функций описаны в документации и покрыты тестами. |
|||
|
|||
Существует скрипт, который во время локальной разработки создаёт сайт и проверяет наличие любых изменений, перезагружая его в реальном времени: |
|||
|
|||
<div class="termy"> |
|||
|
|||
```console |
|||
$ python ./scripts/docs.py live |
|||
|
|||
<span style="color: green;">[INFO]</span> Serving on http://127.0.0.1:8008 |
|||
<span style="color: green;">[INFO]</span> Start watching changes |
|||
<span style="color: green;">[INFO]</span> Start detecting changes |
|||
``` |
|||
|
|||
</div> |
|||
|
|||
Он запустит сайт документации по адресу: `http://127.0.0.1:8008`. |
|||
|
|||
|
|||
Таким образом, Вы сможете редактировать файлы с документацией или кодом и наблюдать изменения вживую. |
|||
|
|||
#### Typer CLI (опционально) |
|||
|
|||
|
|||
Приведенная ранее инструкция показала Вам, как запускать скрипт `./scripts/docs.py` непосредственно через интерпретатор `python` . |
|||
|
|||
Но также можно использовать <a href="https://typer.tiangolo.com/typer-cli/" class="external-link" target="_blank">Typer CLI</a>, что позволит Вам воспользоваться автозаполнением команд в Вашем терминале. |
|||
|
|||
Если Вы установили Typer CLI, то для включения функции автозаполнения, введите эту команду: |
|||
|
|||
<div class="termy"> |
|||
|
|||
```console |
|||
$ typer --install-completion |
|||
|
|||
zsh completion installed in /home/user/.bashrc. |
|||
Completion will take effect once you restart the terminal. |
|||
``` |
|||
|
|||
</div> |
|||
|
|||
### Приложения и документация одновременно |
|||
|
|||
Если Вы запускаете приложение, например так: |
|||
|
|||
<div class="termy"> |
|||
|
|||
```console |
|||
$ uvicorn tutorial001:app --reload |
|||
|
|||
<span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) |
|||
``` |
|||
|
|||
</div> |
|||
|
|||
По умолчанию Uvicorn будет использовать порт `8000` и не будет конфликтовать с сайтом документации, использующим порт `8008`. |
|||
|
|||
### Переводы на другие языки |
|||
|
|||
Помощь с переводами ценится КРАЙНЕ ВЫСОКО! И переводы не могут быть сделаны без помощи сообщества. 🌎 🚀 |
|||
|
|||
Ниже приведены шаги, как помочь с переводами. |
|||
|
|||
#### Подсказки и инструкции |
|||
|
|||
* Проверьте <a href="https://github.com/tiangolo/fastapi/pulls" class="external-link" target="_blank">существующие пул-реквесты</a> для Вашего языка. Добавьте отзывы с просьбой внести изменения, если они необходимы, или одобрите их. |
|||
|
|||
!!! tip "Подсказка" |
|||
Вы можете <a href="https://help.github.com/en/github/collaborating-with-issues-and-pull-requests/commenting-on-a-pull-request" class="external-link" target="_blank">добавлять комментарии с предложениями по изменению</a> в существующие пул-реквесты. |
|||
|
|||
Ознакомьтесь с документацией о <a href="https://help.github.com/en/github/collaborating-with-issues-and-pull-requests/about-pull-request-reviews" class="external-link" target="_blank">добавлении отзыва к пул-реквесту</a>, чтобы утвердить его или запросить изменения. |
|||
|
|||
* Проверьте <a href="https://github.com/tiangolo/fastapi/issues" class="external-link" target="_blank">проблемы и вопросы</a>, чтобы узнать, есть ли кто-то, координирующий переводы для Вашего языка. |
|||
|
|||
* Добавляйте один пул-реквест для каждой отдельной переведённой страницы. Это значительно облегчит другим его просмотр. |
|||
|
|||
Для языков, которые я не знаю, прежде чем добавить перевод в основную ветку, я подожду пока несколько других участников сообщества проверят его. |
|||
|
|||
* Вы также можете проверить, есть ли переводы для Вашего языка и добавить к ним отзыв, который поможет мне убедиться в правильности перевода. Тогда я смогу объединить его с основной веткой. |
|||
|
|||
* Используйте те же самые примеры кода Python. Переводите только текст документации. Вам не нужно ничего менять, чтобы эти примеры работали. |
|||
|
|||
* Используйте те же самые изображения, имена файлов и ссылки. Вы не должны менять ничего для сохранения работоспособности. |
|||
|
|||
* Чтобы узнать 2-буквенный код языка, на который Вы хотите сделать перевод, Вы можете воспользоваться таблицей <a href="https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes" class="external-link" target="_blank">Список кодов языков ISO 639-1</a>. |
|||
|
|||
#### Существующий язык |
|||
|
|||
Допустим, Вы хотите перевести страницу на язык, на котором уже есть какие-то переводы, например, на испанский. |
|||
|
|||
Кодом испанского языка является `es`. А значит директория для переводов на испанский язык: `docs/es/`. |
|||
|
|||
!!! tip "Подсказка" |
|||
Главный ("официальный") язык - английский, директория для него `docs/en/`. |
|||
|
|||
Вы можете запустить сервер документации на испанском: |
|||
|
|||
<div class="termy"> |
|||
|
|||
```console |
|||
// Используйте команду "live" и передайте код языка в качестве аргумента командной строки |
|||
$ python ./scripts/docs.py live es |
|||
|
|||
<span style="color: green;">[INFO]</span> Serving on http://127.0.0.1:8008 |
|||
<span style="color: green;">[INFO]</span> Start watching changes |
|||
<span style="color: green;">[INFO]</span> Start detecting changes |
|||
``` |
|||
|
|||
</div> |
|||
|
|||
Теперь Вы можете перейти по адресу: <a href="http://127.0.0.1:8008" class="external-link" target="_blank">http://127.0.0.1:8008</a> и наблюдать вносимые Вами изменения вживую. |
|||
|
|||
|
|||
Если Вы посмотрите на сайт документации FastAPI, то увидите, что все страницы есть на каждом языке. Но некоторые страницы не переведены и имеют уведомление об отсутствующем переводе. |
|||
|
|||
Но когда Вы запускаете сайт локально, Вы видите только те страницы, которые уже переведены. |
|||
|
|||
|
|||
Предположим, что Вы хотите добавить перевод страницы [Основные свойства](features.md){.internal-link target=_blank}. |
|||
|
|||
* Скопируйте файл: |
|||
|
|||
``` |
|||
docs/en/docs/features.md |
|||
``` |
|||
|
|||
* Вставьте его точно в то же место, но в директорию языка, на который Вы хотите сделать перевод, например: |
|||
|
|||
``` |
|||
docs/es/docs/features.md |
|||
``` |
|||
|
|||
!!! tip "Подсказка" |
|||
Заметьте, что в пути файла мы изменили только код языка с `en` на `es`. |
|||
|
|||
* Теперь откройте файл конфигурации MkDocs для английского языка, расположенный тут: |
|||
|
|||
``` |
|||
docs/en/mkdocs.yml |
|||
``` |
|||
|
|||
* Найдите в файле конфигурации место, где расположена строка `docs/features.md`. Похожее на это: |
|||
|
|||
```YAML hl_lines="8" |
|||
site_name: FastAPI |
|||
# More stuff |
|||
nav: |
|||
- FastAPI: index.md |
|||
- Languages: |
|||
- en: / |
|||
- es: /es/ |
|||
- features.md |
|||
``` |
|||
|
|||
* Откройте файл конфигурации MkDocs для языка, на который Вы переводите, например: |
|||
|
|||
``` |
|||
docs/es/mkdocs.yml |
|||
``` |
|||
|
|||
* Добавьте строку `docs/features.md` точно в то же место, как и в случае для английского, как-то так: |
|||
|
|||
```YAML hl_lines="8" |
|||
site_name: FastAPI |
|||
# More stuff |
|||
nav: |
|||
- FastAPI: index.md |
|||
- Languages: |
|||
- en: / |
|||
- es: /es/ |
|||
- features.md |
|||
``` |
|||
|
|||
Убедитесь, что при наличии других записей, новая запись с Вашим переводом находится точно в том же порядке, что и в английской версии. |
|||
|
|||
Если Вы зайдёте в свой браузер, то увидите, что в документации стал отображаться Ваш новый раздел.🎉 |
|||
|
|||
Теперь Вы можете переводить эту страницу и смотреть, как она выглядит при сохранении файла. |
|||
|
|||
#### Новый язык |
|||
|
|||
Допустим, Вы хотите добавить перевод для языка, на который пока что не переведена ни одна страница. |
|||
|
|||
Скажем, Вы решили сделать перевод для креольского языка, но его еще нет в документации. |
|||
|
|||
Перейдите в таблицу кодов языков по ссылке указанной выше, где найдёте, что кодом креольского языка является `ht`. |
|||
|
|||
Затем запустите скрипт, генерирующий директорию для переводов на новые языки: |
|||
|
|||
<div class="termy"> |
|||
|
|||
```console |
|||
// Используйте команду new-lang и передайте код языка в качестве аргумента командной строки |
|||
$ python ./scripts/docs.py new-lang ht |
|||
|
|||
Successfully initialized: docs/ht |
|||
Updating ht |
|||
Updating en |
|||
``` |
|||
|
|||
</div> |
|||
|
|||
После чего Вы можете проверить в своем редакторе кода, что появился новый каталог `docs/ht/`. |
|||
|
|||
!!! tip "Подсказка" |
|||
Создайте первый пул-реквест, который будет содержать только пустую директорию для нового языка, прежде чем добавлять переводы. |
|||
|
|||
Таким образом, другие участники могут переводить другие страницы, пока Вы работаете над одной. 🚀 |
|||
|
|||
Начните перевод с главной страницы `docs/ht/index.md`. |
|||
|
|||
В дальнейшем можно действовать, как указано в предыдущих инструкциях для "существующего языка". |
|||
|
|||
##### Новый язык не поддерживается |
|||
|
|||
Если при запуске скрипта `./scripts/docs.py live` Вы получаете сообщение об ошибке, что язык не поддерживается, что-то вроде: |
|||
|
|||
``` |
|||
raise TemplateNotFound(template) |
|||
jinja2.exceptions.TemplateNotFound: partials/language/xx.html |
|||
``` |
|||
|
|||
Сие означает, что тема не поддерживает этот язык (в данном случае с поддельным 2-буквенным кодом `xx`). |
|||
|
|||
Но не стоит переживать. Вы можете установить языком темы английский, а затем перевести текст документации. |
|||
|
|||
Если возникла такая необходимость, отредактируйте `mkdocs.yml` для Вашего нового языка. Это будет выглядеть как-то так: |
|||
|
|||
```YAML hl_lines="5" |
|||
site_name: FastAPI |
|||
# More stuff |
|||
theme: |
|||
# More stuff |
|||
language: xx |
|||
``` |
|||
|
|||
Измените `xx` (код Вашего языка) на `en` и перезапустите сервер. |
|||
|
|||
#### Предпросмотр результата |
|||
|
|||
Когда Вы запускаете скрипт `./scripts/docs.py` с командой `live`, то будут показаны файлы и переводы для указанного языка. |
|||
|
|||
Но когда Вы закончите, то можете посмотреть, как это будет выглядеть по-настоящему. |
|||
|
|||
Для этого сначала создайте всю документацию: |
|||
|
|||
<div class="termy"> |
|||
|
|||
```console |
|||
// Используйте команду "build-all", это займёт немного времени |
|||
$ python ./scripts/docs.py build-all |
|||
|
|||
Updating es |
|||
Updating en |
|||
Building docs for: en |
|||
Building docs for: es |
|||
Successfully built docs for: es |
|||
Copying en index.md to README.md |
|||
``` |
|||
|
|||
</div> |
|||
|
|||
Скрипт сгенерирует `./docs_build/` для каждого языка. Он добавит все файлы с отсутствующими переводами с пометкой о том, что "у этого файла еще нет перевода". Но Вам не нужно ничего делать с этим каталогом. |
|||
|
|||
Затем он создаст независимые сайты MkDocs для каждого языка, объединит их и сгенерирует конечный результат на `./site/`. |
|||
|
|||
После чего Вы сможете запустить сервер со всеми языками командой `serve`: |
|||
|
|||
<div class="termy"> |
|||
|
|||
```console |
|||
// Используйте команду "serve" после того, как отработает команда "build-all" |
|||
$ python ./scripts/docs.py serve |
|||
|
|||
Warning: this is a very simple server. For development, use mkdocs serve instead. |
|||
This is here only to preview a site with translations already built. |
|||
Make sure you run the build-all command first. |
|||
Serving at: http://127.0.0.1:8008 |
|||
``` |
|||
|
|||
</div> |
|||
|
|||
## Тесты |
|||
|
|||
Также в репозитории есть скрипт, который Вы можете запустить локально, чтобы протестировать весь код и сгенерировать отчеты о покрытии тестами в HTML: |
|||
|
|||
<div class="termy"> |
|||
|
|||
```console |
|||
$ bash scripts/test-cov-html.sh |
|||
``` |
|||
|
|||
</div> |
|||
|
|||
Эта команда создаст директорию `./htmlcov/`, в которой будет файл `./htmlcov/index.html`. Открыв его в Вашем браузере, Вы можете в интерактивном режиме изучить, все ли части кода охвачены тестами. |
Loading…
Reference in new issue