diff --git a/.gitignore b/.gitignore index 744eb8cad..3ce2145a2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,27 @@ +# virtual environemt +/.venv/ +/.env/ +/venv/ +/env/ + +# ide configs +/.vscode/ /.idea/ -.vscode + +# emacs cache and backup files +\#* +*~ + +# temporary files storage +/temp/ +/tmp/ + +# documentation builds +_builds/ +_build/ +builds/ +build/ + +# translation object files +*.pot +*.mo diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 000000000..fbf6f4a41 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "problem-sets"] + path = problem-sets + url = https://github.com/edu-python-course/problem-sets diff --git a/Makefile b/Makefile new file mode 100644 index 000000000..0234fb152 --- /dev/null +++ b/Makefile @@ -0,0 +1,44 @@ +# Python training course makefile for builds automation + +# Sphinx settings +SPHINX_SRC = src +SPHINX_CONFIG = $(SPHINX_SRC)/conf.py + +# Internationalization +SPHINXINTL_LANGUAGE ?= ua +LANGUAGE ?= en + +# Sphinx build directories +_SPHINX_OUT_BASE = _build +GETTEXT_DIR = $(_SPHINX_OUT_BASE)/gettext +LATEX_DIR = $(_SPHINX_OUT_BASE)/latex/$(LANGUAGE) +HTML_DIR = $(_SPHINX_OUT_BASE)/html/$(LANGUAGE) + +# Sphinx builders +SPHINX_BUILD = sphinx-build -q -D language=$(LANGUAGE) + +# Makefile targets +all : clean + @make LANGUAGE=en html pdf + @make LANGUAGE=ua html pdf + +clean : + @echo "Cleaning existing builds at $(_SPHINX_OUT_BASE)" + @rm -rf $(_SPHINX_OUT_BASE) + +html : + @echo "LANGUAGE=$(LANGUAGE): generating HTML output at $(HTML_DIR)" + @$(SPHINX_BUILD) -b html $(SPHINX_SRC) $(HTML_DIR) + +latex : + @echo "LANGUAGE=$(LANGUAGE): generating LaTeX output at $(LATEX_DIR)" + @$(SPHINX_BUILD) -b latex $(SPHINX_SRC) $(LATEX_DIR) + +pdf : latex + @make -C "$(LATEX_DIR)" + +gettext : + @$(SPHINX_BUILD) -b gettext $(SPHINX_SRC) $(GETTEXT_DIR) + +locales : gettext + @sphinx-intl -c $(SPHINX_CONFIG) update -p $(GETTEXT_DIR) diff --git a/PR_explanation.md b/PR_explanation.md new file mode 100644 index 000000000..ad7d8a20a --- /dev/null +++ b/PR_explanation.md @@ -0,0 +1,105 @@ +# Как сдавать домашки + +При помощи пулл-реквеста на GitHub. + +## Что должно быть в репозитории?? + +- Код проекта +- Файл requirements.txt + +### Что за файл requirements.txt? Зачем он нужен? + +![](https://pbs.twimg.com/media/CvIhqpqWYAA92B9.jpg) + +Файл `requirements.txt` необходим для контроля зависимостей. + +Вы создавали виртуальное окружение именно для того, что бы несколько ваших проектов, не могли "мешать" друг другу. + +Каждое отдельное окружение полностью не зависит от других. Но как другой разработчик должен присоединятся к вашему +проекту? Для этого и используется файл зависимостей. + +Предварительно мы должны убедиться, что виртуальное окружение активировано, и что мы находимся на том же самом уровне +вложенности папок, где находится файл `manage.py`. + +Что бы создать такой файл используется команда в командной строке: + +``` +pip freeze > requirements.txt +``` + +Примерное содержимое такого файла: + +``` +asgiref==3.6.0 +Django==4.1.5 +psycopg2==2.9.5 +sqlparse==0.4.3 +tzdata==2022.7 +``` + +Это список всего, что установленно в вашем виртуальном окружении. + +#### Как это может использовать другой разработчик? + +После клона вашего проекта и создания своего виртуального окружения достаточно выполнить всего одну команду + +``` +pip install -r requirements.txt +``` + +И получить полную копию виртуального окружения, с вашими зависимостями. + +## Чего не должно быть в репозитории?? + +Если коротко, то ничего лишнего. + +- Папок `__pycache__` и любого его содержимого. +- Файлов настроек `IDE` например папки `.idea` или аналогов для других `IDE` +- Для маков, файлов `.DS_Store` +- Файла со стандартной базой данных, `db.sqlite3` + +Все эти файлы и папки должны быть занесены в `.gitignore` + +## Как создать проект и репозиторий корректно (Делается один раз когда нам необходимо создать новый проект) + +Действия по пунктам: + +1. Создать виртуальное окружение +2. Установить необходимые зависимости +3. Создать проект и приложение при помощи команд консоли +4. Создать файл requirements.txt +5. Создать репозиторий +6. Подключить репозиторий к проекту (git remote ...) +7. Создать и заполнить `.gitignore` +8. Убедиться, что мы работаем в ветке `master` +9. Закоммитить всё что у вас есть в свежем проекте. +10. Запушить пустой проект и пустое приложение в мастер. +11. Добавить меня в колабораторы проекта. Ник на гитхабе (PonomaryovVladyslav) + +## Как делать домашку + +1. Создать **из мастера** ветку, в названии которой будет информация о том, что это домашка и её номер. Например `hw_3` +2. Выполнить домашнюю работу :) Рекомендуется коммитить изменения после любого осмысленного блока. Добавили кнопку, + коммит. Создали рабочий урл, коммит, итд. +3. Выполнить **пуш** этой ветки на удалённый репозиторий. +4. Создать **пулл-реквест** из ветки с вашей **домашней работы** на **мастер** +5. Добавить меня в раздел `Reviewers` +6. Дождаться моего апрува или коментариев, что нужно изменить + + 6.1. Если получили коментарии о необходимости изменений, изменения добавляем на ветку **домашней работы** после чего + выполняем **пуш**, пулл реквест сам обновится, и я получу уведомление об этом автоматически. +7. После того как получили апрув, мержим изменения в мастер. + +## Что делать если я уже внёс файлы __pycache__ или .idea на гит? + +В этом случае вам надо удалить файлы из гита, но сохранить их на локальной версии. + +Для этого необходимо выполнить команду: + +``` +git rm --cached +``` + +Для каждого файла или папки. + +После чего выполнить коммит и пуш снова. \ No newline at end of file diff --git a/README.rst b/README.rst new file mode 100644 index 000000000..2fc5c6d43 --- /dev/null +++ b/README.rst @@ -0,0 +1,33 @@ +############################################################################### + PYTHON TRAINING COURSE +############################################################################### + +This is the training course to master the Python programming language. This +includes the very basics programming topics like data types, variables and +object-oriented programming and advanced topics like multithreading and +web-frameworks for Python. + +Getting started +=============== + +Installing dependencies +----------------------- + +This project comes with dependencies listed in formats suitable for `pip`_ +and `poetry`_ package managers. It's recommended to use virtual environment +while working with this project. + +To install dependencies via pip do: + +.. code-block:: + + pip install -r requirements.txt + +To do the same using poetry: + +.. code-block:: + + poetry install + +.. _pip: https://pip.pypa.io +.. _poetry: https://python-poetry.org diff --git a/assets/favicon.ico b/assets/favicon.ico new file mode 100644 index 000000000..26727d476 Binary files /dev/null and b/assets/favicon.ico differ diff --git a/assets/img/celebrate.svg b/assets/img/celebrate.svg new file mode 100644 index 000000000..21bae043b --- /dev/null +++ b/assets/img/celebrate.svg @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/img/cmd-python.png b/assets/img/cmd-python.png new file mode 100644 index 000000000..1f8113576 Binary files /dev/null and b/assets/img/cmd-python.png differ diff --git a/assets/img/dropbox.svg b/assets/img/dropbox.svg new file mode 100644 index 000000000..4ef068688 --- /dev/null +++ b/assets/img/dropbox.svg @@ -0,0 +1,17 @@ + + + + + Dropbox-color + Created with Sketch. + + + + + + + + + + + \ No newline at end of file diff --git a/assets/img/emacs.svg b/assets/img/emacs.svg new file mode 100644 index 000000000..64afe6f03 --- /dev/null +++ b/assets/img/emacs.svg @@ -0,0 +1,2 @@ + +file_type_emacs \ No newline at end of file diff --git a/assets/img/facebook.svg b/assets/img/facebook.svg new file mode 100644 index 000000000..88c648577 --- /dev/null +++ b/assets/img/facebook.svg @@ -0,0 +1,17 @@ + + + + + Facebook-color + Created with Sketch. + + + + + + + + + + + \ No newline at end of file diff --git a/assets/img/geany.svg b/assets/img/geany.svg new file mode 100644 index 000000000..7d47d524c --- /dev/null +++ b/assets/img/geany.svg @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/assets/img/google.svg b/assets/img/google.svg new file mode 100644 index 000000000..b26d4a451 --- /dev/null +++ b/assets/img/google.svg @@ -0,0 +1,28 @@ + + + + + Google-color + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/img/guido-headshot-2019.jpg b/assets/img/guido-headshot-2019.jpg new file mode 100644 index 000000000..28b0e9bd6 Binary files /dev/null and b/assets/img/guido-headshot-2019.jpg differ diff --git a/assets/img/instagram.svg b/assets/img/instagram.svg new file mode 100644 index 000000000..b7b97924b --- /dev/null +++ b/assets/img/instagram.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/img/microsoft-store-get.png b/assets/img/microsoft-store-get.png new file mode 100644 index 000000000..34921faa5 Binary files /dev/null and b/assets/img/microsoft-store-get.png differ diff --git a/assets/img/microsoft-store-search.png b/assets/img/microsoft-store-search.png new file mode 100644 index 000000000..7ca927db3 Binary files /dev/null and b/assets/img/microsoft-store-search.png differ diff --git a/assets/img/netflix.svg b/assets/img/netflix.svg new file mode 100644 index 000000000..920720336 --- /dev/null +++ b/assets/img/netflix.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/img/npp.svg b/assets/img/npp.svg new file mode 100644 index 000000000..a0331d399 --- /dev/null +++ b/assets/img/npp.svg @@ -0,0 +1,122 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/img/pycharm.svg b/assets/img/pycharm.svg new file mode 100644 index 000000000..86bb6d44c --- /dev/null +++ b/assets/img/pycharm.svg @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/img/python.svg b/assets/img/python.svg new file mode 100644 index 000000000..25df8268f --- /dev/null +++ b/assets/img/python.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/img/quora.svg b/assets/img/quora.svg new file mode 100644 index 000000000..a4c327ddc --- /dev/null +++ b/assets/img/quora.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/img/reddit.svg b/assets/img/reddit.svg new file mode 100644 index 000000000..64b767668 --- /dev/null +++ b/assets/img/reddit.svg @@ -0,0 +1,17 @@ + + + + + Reddit-color + Created with Sketch. + + + + + + + + + + + \ No newline at end of file diff --git a/assets/img/spotify.svg b/assets/img/spotify.svg new file mode 100644 index 000000000..fb46e3ac8 --- /dev/null +++ b/assets/img/spotify.svg @@ -0,0 +1,17 @@ + + + + + Spotify-color + Created with Sketch. + + + + + + + + + + + \ No newline at end of file diff --git a/assets/img/start-menu-python.png b/assets/img/start-menu-python.png new file mode 100644 index 000000000..419ae72b4 Binary files /dev/null and b/assets/img/start-menu-python.png differ diff --git a/assets/img/terminal-python.png b/assets/img/terminal-python.png new file mode 100644 index 000000000..1d86fe5a8 Binary files /dev/null and b/assets/img/terminal-python.png differ diff --git a/assets/img/vim.svg b/assets/img/vim.svg new file mode 100644 index 000000000..4c4dbfcf2 --- /dev/null +++ b/assets/img/vim.svg @@ -0,0 +1,56 @@ + + + + + + + + + file_type_vim + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/img/vscode.svg b/assets/img/vscode.svg new file mode 100644 index 000000000..0efbaffc7 --- /dev/null +++ b/assets/img/vscode.svg @@ -0,0 +1,2 @@ + +file_type_vscode3 \ No newline at end of file diff --git a/lesson28.md b/lesson28.md index 817213ef1..2d54a2ec9 100644 --- a/lesson28.md +++ b/lesson28.md @@ -810,16 +810,16 @@ def regex(request, text): 2. Создать в нём всю необходимую структуру, для урлов: * `http://127.0.0.1:8000/`, -* `http://127.0.0.1:8000/acricles`, -* `http://127.0.0.1:8000/acrticles/archive`, -* `http://127.0.0.1:8000/users` +* `http://127.0.0.1:8000/articles/`, +* `http://127.0.0.1:8000/articles/archive/`, +* `http://127.0.0.1:8000/users/` 3. Создать структуру для динамических урлов: -* `http://127.0.0.1:8000/article/`, -* `http://127.0.0.1:8000/article//archive`, -* `http://127.0.0.1:8000/article//`, -* `http://127.0.0.1:8000/users/` +* `http://127.0.0.1:8000/article//`, +* `http://127.0.0.1:8000/article//archive/`, +* `http://127.0.0.1:8000/article///`, +* `http://127.0.0.1:8000/users//` 4. Создать урл который будет принимать параметр вида 4 символа от 1 до 9, или от a до f, знак дефиса и еще 6 символов, например `/34f1-1ac498/` diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 000000000..e725373fd --- /dev/null +++ b/poetry.lock @@ -0,0 +1,802 @@ +[[package]] +name = "alabaster" +version = "0.7.13" +description = "A configurable sidebar-enabled Sphinx theme" +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "babel" +version = "2.11.0" +description = "Internationalization utilities" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +pytz = ">=2015.7" + +[[package]] +name = "certifi" +version = "2022.12.7" +description = "Python package for providing Mozilla's CA Bundle." +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "charset-normalizer" +version = "3.0.1" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "click" +version = "8.1.3" +description = "Composable command line interface toolkit" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +category = "main" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" + +[[package]] +name = "docutils" +version = "0.17.1" +description = "Docutils -- Python Documentation Utilities" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "idna" +version = "3.4" +description = "Internationalized Domain Names in Applications (IDNA)" +category = "main" +optional = false +python-versions = ">=3.5" + +[[package]] +name = "imagesize" +version = "1.4.1" +description = "Getting image size from png/jpeg/jpeg2000/gif file" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] +name = "importlib-metadata" +version = "6.0.0" +description = "Read metadata from Python packages" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +zipp = ">=0.5" + +[package.extras] +docs = ["sphinx (>=3.5)", "jaraco.packaging (>=9)", "rst.linker (>=1.9)", "furo", "sphinx-lint", "jaraco.tidelift (>=1.4)"] +perf = ["ipython"] +testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "flake8 (<5)", "pytest-cov", "pytest-enabler (>=1.3)", "packaging", "pyfakefs", "flufl.flake8", "pytest-perf (>=0.9.2)", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)", "pytest-flake8", "importlib-resources (>=1.3)"] + +[[package]] +name = "jinja2" +version = "3.1.2" +description = "A very fast and expressive template engine." +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + +[[package]] +name = "latexcodec" +version = "2.0.1" +description = "A lexer and codec to work with LaTeX code in Python." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[package.dependencies] +six = ">=1.4.1" + +[[package]] +name = "markdown-it-py" +version = "2.1.0" +description = "Python port of markdown-it. Markdown parsing, done right!" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +mdurl = ">=0.1,<1.0" + +[package.extras] +testing = ["pytest-regressions", "pytest-cov", "pytest", "coverage"] +rtd = ["sphinx-book-theme", "sphinx-design", "sphinx-copybutton", "sphinx", "pyyaml", "myst-parser", "attrs"] +profiling = ["gprof2dot"] +plugins = ["mdit-py-plugins"] +linkify = ["linkify-it-py (>=1.0,<2.0)"] +compare = ["panflute (>=2.1.3,<2.2.0)", "mistune (>=2.0.2,<2.1.0)", "mistletoe (>=0.8.1,<0.9.0)", "markdown (>=3.3.6,<3.4.0)", "commonmark (>=0.9.1,<0.10.0)"] +code_style = ["pre-commit (==2.6)"] +benchmarking = ["pytest-benchmark (>=3.2,<4.0)", "pytest", "psutil"] + +[[package]] +name = "markupsafe" +version = "2.1.2" +description = "Safely add untrusted strings to HTML/XML markup." +category = "main" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "mdit-py-plugins" +version = "0.3.3" +description = "Collection of plugins for markdown-it-py" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +markdown-it-py = ">=1.0.0,<3.0.0" + +[package.extras] +code_style = ["pre-commit"] +rtd = ["attrs", "myst-parser (>=0.16.1,<0.17.0)", "sphinx-book-theme (>=0.1.0,<0.2.0)"] +testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] + +[[package]] +name = "mdurl" +version = "0.1.2" +description = "Markdown URL utilities" +category = "main" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "myst-parser" +version = "0.18.1" +description = "An extended commonmark compliant parser, with bridges to docutils & sphinx." +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +docutils = ">=0.15,<0.20" +jinja2 = "*" +markdown-it-py = ">=1.0.0,<3.0.0" +mdit-py-plugins = ">=0.3.1,<0.4.0" +pyyaml = "*" +sphinx = ">=4,<6" +typing-extensions = "*" + +[package.extras] +code_style = ["pre-commit (>=2.12,<3.0)"] +linkify = ["linkify-it-py (>=1.0,<2.0)"] +rtd = ["ipython", "sphinx-book-theme", "sphinx-design", "sphinxext-rediraffe (>=0.2.7,<0.3.0)", "sphinxcontrib.mermaid (>=0.7.1,<0.8.0)", "sphinxext-opengraph (>=0.6.3,<0.7.0)"] +testing = ["beautifulsoup4", "coverage", "pytest (>=6,<7)", "pytest-cov", "pytest-regressions", "pytest-param-files (>=0.3.4,<0.4.0)", "sphinx-pytest", "sphinx (<5.2)"] + +[[package]] +name = "packaging" +version = "23.0" +description = "Core utilities for Python packages" +category = "main" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "pybtex" +version = "0.24.0" +description = "A BibTeX-compatible bibliography processor in Python" +category = "main" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*" + +[package.dependencies] +latexcodec = ">=1.0.4" +PyYAML = ">=3.01" +six = "*" + +[package.extras] +test = ["pytest"] + +[[package]] +name = "pybtex-docutils" +version = "1.0.2" +description = "A docutils backend for pybtex." +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +docutils = ">=0.8" +pybtex = ">=0.16" + +[[package]] +name = "pygments" +version = "2.14.0" +description = "Pygments is a syntax highlighting package written in Python." +category = "main" +optional = false +python-versions = ">=3.6" + +[package.extras] +plugins = ["importlib-metadata"] + +[[package]] +name = "pytz" +version = "2022.7.1" +description = "World timezone definitions, modern and historical" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "pyyaml" +version = "6.0" +description = "YAML parser and emitter for Python" +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "requests" +version = "2.28.2" +description = "Python HTTP for Humans." +category = "main" +optional = false +python-versions = ">=3.7, <4" + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<1.27" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use_chardet_on_py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" + +[[package]] +name = "snowballstemmer" +version = "2.2.0" +description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms." +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "sphinx" +version = "5.3.0" +description = "Python documentation generator" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +alabaster = ">=0.7,<0.8" +babel = ">=2.9" +colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} +docutils = ">=0.14,<0.20" +imagesize = ">=1.3" +importlib-metadata = {version = ">=4.8", markers = "python_version < \"3.10\""} +Jinja2 = ">=3.0" +packaging = ">=21.0" +Pygments = ">=2.12" +requests = ">=2.5.0" +snowballstemmer = ">=2.0" +sphinxcontrib-applehelp = "*" +sphinxcontrib-devhelp = "*" +sphinxcontrib-htmlhelp = ">=2.0.0" +sphinxcontrib-jsmath = "*" +sphinxcontrib-qthelp = "*" +sphinxcontrib-serializinghtml = ">=1.1.5" + +[package.extras] +docs = ["sphinxcontrib-websupport"] +lint = ["flake8 (>=3.5.0)", "flake8-comprehensions", "flake8-bugbear", "flake8-simplify", "isort", "mypy (>=0.981)", "sphinx-lint", "docutils-stubs", "types-typed-ast", "types-requests"] +test = ["pytest (>=4.6)", "html5lib", "typed-ast", "cython"] + +[[package]] +name = "sphinx-intl" +version = "2.0.1" +description = "Sphinx utility that make it easy to translate and to apply translation." +category = "main" +optional = false +python-versions = ">=3.5" + +[package.dependencies] +babel = "*" +click = "*" +sphinx = "*" + +[package.extras] +test = ["pytest", "mock"] +transifex = ["transifex_client (>=0.11)"] + +[[package]] +name = "sphinx-rtd-theme" +version = "1.1.1" +description = "Read the Docs theme for Sphinx" +category = "main" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" + +[package.dependencies] +docutils = "<0.18" +sphinx = ">=1.6,<6" + +[package.extras] +dev = ["transifex-client", "sphinxcontrib-httpdomain", "bump2version", "wheel"] + +[[package]] +name = "sphinxcontrib-applehelp" +version = "1.0.4" +description = "sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books" +category = "main" +optional = false +python-versions = ">=3.8" + +[package.extras] +lint = ["flake8", "mypy", "docutils-stubs"] +test = ["pytest"] + +[[package]] +name = "sphinxcontrib-bibtex" +version = "2.5.0" +description = "Sphinx extension for BibTeX style citations." +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +docutils = ">=0.8" +importlib-metadata = { version = ">=3.6", markers = "python_version < \"3.10\"" } +pybtex = ">=0.24" +pybtex-docutils = ">=1.0.0" +Sphinx = ">=2.1" + +[[package]] +name = "sphinxcontrib-devhelp" +version = "1.0.2" +description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document." +category = "main" +optional = false +python-versions = ">=3.5" + +[package.extras] +test = ["pytest"] +lint = ["docutils-stubs", "mypy", "flake8"] + +[[package]] +name = "sphinxcontrib-htmlhelp" +version = "2.0.0" +description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.extras] +test = ["html5lib", "pytest"] +lint = ["docutils-stubs", "mypy", "flake8"] + +[[package]] +name = "sphinxcontrib-jsmath" +version = "1.0.1" +description = "A sphinx extension which renders display math in HTML via JavaScript" +category = "main" +optional = false +python-versions = ">=3.5" + +[package.extras] +test = ["mypy", "flake8", "pytest"] + +[[package]] +name = "sphinxcontrib-qthelp" +version = "1.0.3" +description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document." +category = "main" +optional = false +python-versions = ">=3.5" + +[package.extras] +test = ["pytest"] +lint = ["docutils-stubs", "mypy", "flake8"] + +[[package]] +name = "sphinxcontrib-serializinghtml" +version = "1.1.5" +description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)." +category = "main" +optional = false +python-versions = ">=3.5" + +[package.extras] +lint = ["flake8", "mypy", "docutils-stubs"] +test = ["pytest"] + +[[package]] +name = "typing-extensions" +version = "4.4.0" +description = "Backported and Experimental Type Hints for Python 3.7+" +category = "main" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "urllib3" +version = "1.26.14" +description = "HTTP library with thread-safe connection pooling, file post, and more." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" + +[package.extras] +brotli = ["brotlicffi (>=0.8.0)", "brotli (>=1.0.9)", "brotlipy (>=0.6.0)"] +secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "urllib3-secure-extra", "ipaddress"] +socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] + +[[package]] +name = "zipp" +version = "3.12.0" +description = "Backport of pathlib-compatible object wrapper for zip files" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.extras] +docs = ["sphinx (>=3.5)", "jaraco.packaging (>=9)", "rst.linker (>=1.9)", "furo", "sphinx-lint", "jaraco.tidelift (>=1.4)"] +testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "flake8 (<5)", "pytest-cov", "pytest-enabler (>=1.3)", "jaraco.itertools", "func-timeout", "jaraco.functools", "more-itertools", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)", "pytest-flake8"] + +[metadata] +lock-version = "1.1" +python-versions = "^3.9" +content-hash = "9dfe764900129c00fa319ad0ed0ca07186e410a65bee83b291a0359f806d3f78" + +[metadata.files] +alabaster = [ + {file = "alabaster-0.7.13-py3-none-any.whl", hash = "sha256:1ee19aca801bbabb5ba3f5f258e4422dfa86f82f3e9cefb0859b283cdd7f62a3"}, + {file = "alabaster-0.7.13.tar.gz", hash = "sha256:a27a4a084d5e690e16e01e03ad2b2e552c61a65469419b907243193de1a84ae2"}, +] +babel = [ + {file = "Babel-2.11.0-py3-none-any.whl", hash = "sha256:1ad3eca1c885218f6dce2ab67291178944f810a10a9b5f3cb8382a5a232b64fe"}, + {file = "Babel-2.11.0.tar.gz", hash = "sha256:5ef4b3226b0180dedded4229651c8b0e1a3a6a2837d45a073272f313e4cf97f6"}, +] +certifi = [ + {file = "certifi-2022.12.7-py3-none-any.whl", hash = "sha256:4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18"}, + {file = "certifi-2022.12.7.tar.gz", hash = "sha256:35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3"}, +] +charset-normalizer = [ + {file = "charset-normalizer-3.0.1.tar.gz", hash = "sha256:ebea339af930f8ca5d7a699b921106c6e29c617fe9606fa7baa043c1cdae326f"}, + {file = "charset_normalizer-3.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:88600c72ef7587fe1708fd242b385b6ed4b8904976d5da0893e31df8b3480cb6"}, + {file = "charset_normalizer-3.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c75ffc45f25324e68ab238cb4b5c0a38cd1c3d7f1fb1f72b5541de469e2247db"}, + {file = "charset_normalizer-3.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:db72b07027db150f468fbada4d85b3b2729a3db39178abf5c543b784c1254539"}, + {file = "charset_normalizer-3.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62595ab75873d50d57323a91dd03e6966eb79c41fa834b7a1661ed043b2d404d"}, + {file = "charset_normalizer-3.0.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ff6f3db31555657f3163b15a6b7c6938d08df7adbfc9dd13d9d19edad678f1e8"}, + {file = "charset_normalizer-3.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:772b87914ff1152b92a197ef4ea40efe27a378606c39446ded52c8f80f79702e"}, + {file = "charset_normalizer-3.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70990b9c51340e4044cfc394a81f614f3f90d41397104d226f21e66de668730d"}, + {file = "charset_normalizer-3.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:292d5e8ba896bbfd6334b096e34bffb56161c81408d6d036a7dfa6929cff8783"}, + {file = "charset_normalizer-3.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:2edb64ee7bf1ed524a1da60cdcd2e1f6e2b4f66ef7c077680739f1641f62f555"}, + {file = "charset_normalizer-3.0.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:31a9ddf4718d10ae04d9b18801bd776693487cbb57d74cc3458a7673f6f34639"}, + {file = "charset_normalizer-3.0.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:44ba614de5361b3e5278e1241fda3dc1838deed864b50a10d7ce92983797fa76"}, + {file = "charset_normalizer-3.0.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:12db3b2c533c23ab812c2b25934f60383361f8a376ae272665f8e48b88e8e1c6"}, + {file = "charset_normalizer-3.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c512accbd6ff0270939b9ac214b84fb5ada5f0409c44298361b2f5e13f9aed9e"}, + {file = "charset_normalizer-3.0.1-cp310-cp310-win32.whl", hash = "sha256:502218f52498a36d6bf5ea77081844017bf7982cdbe521ad85e64cabee1b608b"}, + {file = "charset_normalizer-3.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:601f36512f9e28f029d9481bdaf8e89e5148ac5d89cffd3b05cd533eeb423b59"}, + {file = "charset_normalizer-3.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0298eafff88c99982a4cf66ba2efa1128e4ddaca0b05eec4c456bbc7db691d8d"}, + {file = "charset_normalizer-3.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a8d0fc946c784ff7f7c3742310cc8a57c5c6dc31631269876a88b809dbeff3d3"}, + {file = "charset_normalizer-3.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:87701167f2a5c930b403e9756fab1d31d4d4da52856143b609e30a1ce7160f3c"}, + {file = "charset_normalizer-3.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:14e76c0f23218b8f46c4d87018ca2e441535aed3632ca134b10239dfb6dadd6b"}, + {file = "charset_normalizer-3.0.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0c0a590235ccd933d9892c627dec5bc7511ce6ad6c1011fdf5b11363022746c1"}, + {file = "charset_normalizer-3.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8c7fe7afa480e3e82eed58e0ca89f751cd14d767638e2550c77a92a9e749c317"}, + {file = "charset_normalizer-3.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:79909e27e8e4fcc9db4addea88aa63f6423ebb171db091fb4373e3312cb6d603"}, + {file = "charset_normalizer-3.0.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8ac7b6a045b814cf0c47f3623d21ebd88b3e8cf216a14790b455ea7ff0135d18"}, + {file = "charset_normalizer-3.0.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:72966d1b297c741541ca8cf1223ff262a6febe52481af742036a0b296e35fa5a"}, + {file = "charset_normalizer-3.0.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:f9d0c5c045a3ca9bedfc35dca8526798eb91a07aa7a2c0fee134c6c6f321cbd7"}, + {file = "charset_normalizer-3.0.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:5995f0164fa7df59db4746112fec3f49c461dd6b31b841873443bdb077c13cfc"}, + {file = "charset_normalizer-3.0.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4a8fcf28c05c1f6d7e177a9a46a1c52798bfe2ad80681d275b10dcf317deaf0b"}, + {file = "charset_normalizer-3.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:761e8904c07ad053d285670f36dd94e1b6ab7f16ce62b9805c475b7aa1cffde6"}, + {file = "charset_normalizer-3.0.1-cp311-cp311-win32.whl", hash = "sha256:71140351489970dfe5e60fc621ada3e0f41104a5eddaca47a7acb3c1b851d6d3"}, + {file = "charset_normalizer-3.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:9ab77acb98eba3fd2a85cd160851816bfce6871d944d885febf012713f06659c"}, + {file = "charset_normalizer-3.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:84c3990934bae40ea69a82034912ffe5a62c60bbf6ec5bc9691419641d7d5c9a"}, + {file = "charset_normalizer-3.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:74292fc76c905c0ef095fe11e188a32ebd03bc38f3f3e9bcb85e4e6db177b7ea"}, + {file = "charset_normalizer-3.0.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c95a03c79bbe30eec3ec2b7f076074f4281526724c8685a42872974ef4d36b72"}, + {file = "charset_normalizer-3.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f4c39b0e3eac288fedc2b43055cfc2ca7a60362d0e5e87a637beac5d801ef478"}, + {file = "charset_normalizer-3.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df2c707231459e8a4028eabcd3cfc827befd635b3ef72eada84ab13b52e1574d"}, + {file = "charset_normalizer-3.0.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:93ad6d87ac18e2a90b0fe89df7c65263b9a99a0eb98f0a3d2e079f12a0735837"}, + {file = "charset_normalizer-3.0.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:59e5686dd847347e55dffcc191a96622f016bc0ad89105e24c14e0d6305acbc6"}, + {file = "charset_normalizer-3.0.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:cd6056167405314a4dc3c173943f11249fa0f1b204f8b51ed4bde1a9cd1834dc"}, + {file = "charset_normalizer-3.0.1-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:083c8d17153ecb403e5e1eb76a7ef4babfc2c48d58899c98fcaa04833e7a2f9a"}, + {file = "charset_normalizer-3.0.1-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:f5057856d21e7586765171eac8b9fc3f7d44ef39425f85dbcccb13b3ebea806c"}, + {file = "charset_normalizer-3.0.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:7eb33a30d75562222b64f569c642ff3dc6689e09adda43a082208397f016c39a"}, + {file = "charset_normalizer-3.0.1-cp36-cp36m-win32.whl", hash = "sha256:95dea361dd73757c6f1c0a1480ac499952c16ac83f7f5f4f84f0658a01b8ef41"}, + {file = "charset_normalizer-3.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:eaa379fcd227ca235d04152ca6704c7cb55564116f8bc52545ff357628e10602"}, + {file = "charset_normalizer-3.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3e45867f1f2ab0711d60c6c71746ac53537f1684baa699f4f668d4c6f6ce8e14"}, + {file = "charset_normalizer-3.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cadaeaba78750d58d3cc6ac4d1fd867da6fc73c88156b7a3212a3cd4819d679d"}, + {file = "charset_normalizer-3.0.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:911d8a40b2bef5b8bbae2e36a0b103f142ac53557ab421dc16ac4aafee6f53dc"}, + {file = "charset_normalizer-3.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:503e65837c71b875ecdd733877d852adbc465bd82c768a067badd953bf1bc5a3"}, + {file = "charset_normalizer-3.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a60332922359f920193b1d4826953c507a877b523b2395ad7bc716ddd386d866"}, + {file = "charset_normalizer-3.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:16a8663d6e281208d78806dbe14ee9903715361cf81f6d4309944e4d1e59ac5b"}, + {file = "charset_normalizer-3.0.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:a16418ecf1329f71df119e8a65f3aa68004a3f9383821edcb20f0702934d8087"}, + {file = "charset_normalizer-3.0.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:9d9153257a3f70d5f69edf2325357251ed20f772b12e593f3b3377b5f78e7ef8"}, + {file = "charset_normalizer-3.0.1-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:02a51034802cbf38db3f89c66fb5d2ec57e6fe7ef2f4a44d070a593c3688667b"}, + {file = "charset_normalizer-3.0.1-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:2e396d70bc4ef5325b72b593a72c8979999aa52fb8bcf03f701c1b03e1166918"}, + {file = "charset_normalizer-3.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:11b53acf2411c3b09e6af37e4b9005cba376c872503c8f28218c7243582df45d"}, + {file = "charset_normalizer-3.0.1-cp37-cp37m-win32.whl", hash = "sha256:0bf2dae5291758b6f84cf923bfaa285632816007db0330002fa1de38bfcb7154"}, + {file = "charset_normalizer-3.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:2c03cc56021a4bd59be889c2b9257dae13bf55041a3372d3295416f86b295fb5"}, + {file = "charset_normalizer-3.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:024e606be3ed92216e2b6952ed859d86b4cfa52cd5bc5f050e7dc28f9b43ec42"}, + {file = "charset_normalizer-3.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4b0d02d7102dd0f997580b51edc4cebcf2ab6397a7edf89f1c73b586c614272c"}, + {file = "charset_normalizer-3.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:358a7c4cb8ba9b46c453b1dd8d9e431452d5249072e4f56cfda3149f6ab1405e"}, + {file = "charset_normalizer-3.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81d6741ab457d14fdedc215516665050f3822d3e56508921cc7239f8c8e66a58"}, + {file = "charset_normalizer-3.0.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8b8af03d2e37866d023ad0ddea594edefc31e827fee64f8de5611a1dbc373174"}, + {file = "charset_normalizer-3.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9cf4e8ad252f7c38dd1f676b46514f92dc0ebeb0db5552f5f403509705e24753"}, + {file = "charset_normalizer-3.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e696f0dd336161fca9adbb846875d40752e6eba585843c768935ba5c9960722b"}, + {file = "charset_normalizer-3.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c22d3fe05ce11d3671297dc8973267daa0f938b93ec716e12e0f6dee81591dc1"}, + {file = "charset_normalizer-3.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:109487860ef6a328f3eec66f2bf78b0b72400280d8f8ea05f69c51644ba6521a"}, + {file = "charset_normalizer-3.0.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:37f8febc8ec50c14f3ec9637505f28e58d4f66752207ea177c1d67df25da5aed"}, + {file = "charset_normalizer-3.0.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:f97e83fa6c25693c7a35de154681fcc257c1c41b38beb0304b9c4d2d9e164479"}, + {file = "charset_normalizer-3.0.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a152f5f33d64a6be73f1d30c9cc82dfc73cec6477ec268e7c6e4c7d23c2d2291"}, + {file = "charset_normalizer-3.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:39049da0ffb96c8cbb65cbf5c5f3ca3168990adf3551bd1dee10c48fce8ae820"}, + {file = "charset_normalizer-3.0.1-cp38-cp38-win32.whl", hash = "sha256:4457ea6774b5611f4bed5eaa5df55f70abde42364d498c5134b7ef4c6958e20e"}, + {file = "charset_normalizer-3.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:e62164b50f84e20601c1ff8eb55620d2ad25fb81b59e3cd776a1902527a788af"}, + {file = "charset_normalizer-3.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8eade758719add78ec36dc13201483f8e9b5d940329285edcd5f70c0a9edbd7f"}, + {file = "charset_normalizer-3.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8499ca8f4502af841f68135133d8258f7b32a53a1d594aa98cc52013fff55678"}, + {file = "charset_normalizer-3.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3fc1c4a2ffd64890aebdb3f97e1278b0cc72579a08ca4de8cd2c04799a3a22be"}, + {file = "charset_normalizer-3.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00d3ffdaafe92a5dc603cb9bd5111aaa36dfa187c8285c543be562e61b755f6b"}, + {file = "charset_normalizer-3.0.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c2ac1b08635a8cd4e0cbeaf6f5e922085908d48eb05d44c5ae9eabab148512ca"}, + {file = "charset_normalizer-3.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f6f45710b4459401609ebebdbcfb34515da4fc2aa886f95107f556ac69a9147e"}, + {file = "charset_normalizer-3.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ae1de54a77dc0d6d5fcf623290af4266412a7c4be0b1ff7444394f03f5c54e3"}, + {file = "charset_normalizer-3.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3b590df687e3c5ee0deef9fc8c547d81986d9a1b56073d82de008744452d6541"}, + {file = "charset_normalizer-3.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab5de034a886f616a5668aa5d098af2b5385ed70142090e2a31bcbd0af0fdb3d"}, + {file = "charset_normalizer-3.0.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9cb3032517f1627cc012dbc80a8ec976ae76d93ea2b5feaa9d2a5b8882597579"}, + {file = "charset_normalizer-3.0.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:608862a7bf6957f2333fc54ab4399e405baad0163dc9f8d99cb236816db169d4"}, + {file = "charset_normalizer-3.0.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:0f438ae3532723fb6ead77e7c604be7c8374094ef4ee2c5e03a3a17f1fca256c"}, + {file = "charset_normalizer-3.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:356541bf4381fa35856dafa6a965916e54bed415ad8a24ee6de6e37deccf2786"}, + {file = "charset_normalizer-3.0.1-cp39-cp39-win32.whl", hash = "sha256:39cf9ed17fe3b1bc81f33c9ceb6ce67683ee7526e65fde1447c772afc54a1bb8"}, + {file = "charset_normalizer-3.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:0a11e971ed097d24c534c037d298ad32c6ce81a45736d31e0ff0ad37ab437d59"}, + {file = "charset_normalizer-3.0.1-py3-none-any.whl", hash = "sha256:7e189e2e1d3ed2f4aebabd2d5b0f931e883676e51c7624826e0a4e5fe8a0bf24"}, +] +click = [ + {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, + {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, +] +colorama = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] +docutils = [ + {file = "docutils-0.17.1-py2.py3-none-any.whl", hash = "sha256:cf316c8370a737a022b72b56874f6602acf974a37a9fba42ec2876387549fc61"}, + {file = "docutils-0.17.1.tar.gz", hash = "sha256:686577d2e4c32380bb50cbb22f575ed742d58168cee37e99117a854bcd88f125"}, +] +idna = [ + {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, + {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, +] +imagesize = [ + {file = "imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b"}, + {file = "imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a"}, +] +importlib-metadata = [ + {file = "importlib_metadata-6.0.0-py3-none-any.whl", hash = "sha256:7efb448ec9a5e313a57655d35aa54cd3e01b7e1fbcf72dce1bf06119420f5bad"}, + {file = "importlib_metadata-6.0.0.tar.gz", hash = "sha256:e354bedeb60efa6affdcc8ae121b73544a7aa74156d047311948f6d711cd378d"}, +] +jinja2 = [ + { file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61" }, + { file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852" }, +] +latexcodec = [ + { file = "latexcodec-2.0.1-py2.py3-none-any.whl", hash = "sha256:c277a193638dc7683c4c30f6684e3db728a06efb0dc9cf346db8bd0aa6c5d271" }, + { file = "latexcodec-2.0.1.tar.gz", hash = "sha256:2aa2551c373261cefe2ad3a8953a6d6533e68238d180eb4bb91d7964adb3fe9a" }, +] +markdown-it-py = [ + { file = "markdown-it-py-2.1.0.tar.gz", hash = "sha256:cf7e59fed14b5ae17c0006eff14a2d9a00ed5f3a846148153899a0224e2c07da" }, + { file = "markdown_it_py-2.1.0-py3-none-any.whl", hash = "sha256:93de681e5c021a432c63147656fe21790bc01231e0cd2da73626f1aa3ac0fe27" }, +] +markupsafe = [ + {file = "MarkupSafe-2.1.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:665a36ae6f8f20a4676b53224e33d456a6f5a72657d9c83c2aa00765072f31f7"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:340bea174e9761308703ae988e982005aedf427de816d1afe98147668cc03036"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22152d00bf4a9c7c83960521fc558f55a1adbc0631fbb00a9471e097b19d72e1"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28057e985dace2f478e042eaa15606c7efccb700797660629da387eb289b9323"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca244fa73f50a800cf8c3ebf7fd93149ec37f5cb9596aa8873ae2c1d23498601"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d9d971ec1e79906046aa3ca266de79eac42f1dbf3612a05dc9368125952bd1a1"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7e007132af78ea9df29495dbf7b5824cb71648d7133cf7848a2a5dd00d36f9ff"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7313ce6a199651c4ed9d7e4cfb4aa56fe923b1adf9af3b420ee14e6d9a73df65"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-win32.whl", hash = "sha256:c4a549890a45f57f1ebf99c067a4ad0cb423a05544accaf2b065246827ed9603"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-win_amd64.whl", hash = "sha256:835fb5e38fd89328e9c81067fd642b3593c33e1e17e2fdbf77f5676abb14a156"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2ec4f2d48ae59bbb9d1f9d7efb9236ab81429a764dedca114f5fdabbc3788013"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:608e7073dfa9e38a85d38474c082d4281f4ce276ac0010224eaba11e929dd53a"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:65608c35bfb8a76763f37036547f7adfd09270fbdbf96608be2bead319728fcd"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2bfb563d0211ce16b63c7cb9395d2c682a23187f54c3d79bfec33e6705473c6"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:da25303d91526aac3672ee6d49a2f3db2d9502a4a60b55519feb1a4c7714e07d"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:9cad97ab29dfc3f0249b483412c85c8ef4766d96cdf9dcf5a1e3caa3f3661cf1"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:085fd3201e7b12809f9e6e9bc1e5c96a368c8523fad5afb02afe3c051ae4afcc"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1bea30e9bf331f3fef67e0a3877b2288593c98a21ccb2cf29b74c581a4eb3af0"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-win32.whl", hash = "sha256:7df70907e00c970c60b9ef2938d894a9381f38e6b9db73c5be35e59d92e06625"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-win_amd64.whl", hash = "sha256:e55e40ff0cc8cc5c07996915ad367fa47da6b3fc091fdadca7f5403239c5fec3"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a6e40afa7f45939ca356f348c8e23048e02cb109ced1eb8420961b2f40fb373a"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf877ab4ed6e302ec1d04952ca358b381a882fbd9d1b07cccbfd61783561f98a"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63ba06c9941e46fa389d389644e2d8225e0e3e5ebcc4ff1ea8506dce646f8c8a"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f1cd098434e83e656abf198f103a8207a8187c0fc110306691a2e94a78d0abb2"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:55f44b440d491028addb3b88f72207d71eeebfb7b5dbf0643f7c023ae1fba619"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:a6f2fcca746e8d5910e18782f976489939d54a91f9411c32051b4aab2bd7c513"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:0b462104ba25f1ac006fdab8b6a01ebbfbce9ed37fd37fd4acd70c67c973e460"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-win32.whl", hash = "sha256:7668b52e102d0ed87cb082380a7e2e1e78737ddecdde129acadb0eccc5423859"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6d6607f98fcf17e534162f0709aaad3ab7a96032723d8ac8750ffe17ae5a0666"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a806db027852538d2ad7555b203300173dd1b77ba116de92da9afbc3a3be3eed"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a4abaec6ca3ad8660690236d11bfe28dfd707778e2442b45addd2f086d6ef094"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f03a532d7dee1bed20bc4884194a16160a2de9ffc6354b3878ec9682bb623c54"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4cf06cdc1dda95223e9d2d3c58d3b178aa5dacb35ee7e3bbac10e4e1faacb419"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:22731d79ed2eb25059ae3df1dfc9cb1546691cc41f4e3130fe6bfbc3ecbbecfa"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f8ffb705ffcf5ddd0e80b65ddf7bed7ee4f5a441ea7d3419e861a12eaf41af58"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8db032bf0ce9022a8e41a22598eefc802314e81b879ae093f36ce9ddf39ab1ba"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2298c859cfc5463f1b64bd55cb3e602528db6fa0f3cfd568d3605c50678f8f03"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-win32.whl", hash = "sha256:50c42830a633fa0cf9e7d27664637532791bfc31c731a87b202d2d8ac40c3ea2"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-win_amd64.whl", hash = "sha256:bb06feb762bade6bf3c8b844462274db0c76acc95c52abe8dbed28ae3d44a147"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:99625a92da8229df6d44335e6fcc558a5037dd0a760e11d84be2260e6f37002f"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8bca7e26c1dd751236cfb0c6c72d4ad61d986e9a41bbf76cb445f69488b2a2bd"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40627dcf047dadb22cd25ea7ecfe9cbf3bbbad0482ee5920b582f3809c97654f"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40dfd3fefbef579ee058f139733ac336312663c6706d1163b82b3003fb1925c4"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:090376d812fb6ac5f171e5938e82e7f2d7adc2b629101cec0db8b267815c85e2"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2e7821bffe00aa6bd07a23913b7f4e01328c3d5cc0b40b36c0bd81d362faeb65"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:c0a33bc9f02c2b17c3ea382f91b4db0e6cde90b63b296422a939886a7a80de1c"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b8526c6d437855442cdd3d87eede9c425c4445ea011ca38d937db299382e6fa3"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-win32.whl", hash = "sha256:137678c63c977754abe9086a3ec011e8fd985ab90631145dfb9294ad09c102a7"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-win_amd64.whl", hash = "sha256:0576fe974b40a400449768941d5d0858cc624e3249dfd1e0c33674e5c7ca7aed"}, + {file = "MarkupSafe-2.1.2.tar.gz", hash = "sha256:abcabc8c2b26036d62d4c746381a6f7cf60aafcc653198ad678306986b09450d"}, +] +mdit-py-plugins = [ + {file = "mdit-py-plugins-0.3.3.tar.gz", hash = "sha256:5cfd7e7ac582a594e23ba6546a2f406e94e42eb33ae596d0734781261c251260"}, + {file = "mdit_py_plugins-0.3.3-py3-none-any.whl", hash = "sha256:36d08a29def19ec43acdcd8ba471d3ebab132e7879d442760d963f19913e04b9"}, +] +mdurl = [ + {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, + { file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba" }, +] +myst-parser = [ + { file = "myst-parser-0.18.1.tar.gz", hash = "sha256:79317f4bb2c13053dd6e64f9da1ba1da6cd9c40c8a430c447a7b146a594c246d" }, + { file = "myst_parser-0.18.1-py3-none-any.whl", hash = "sha256:61b275b85d9f58aa327f370913ae1bec26ebad372cc99f3ab85c8ec3ee8d9fb8" }, +] +packaging = [ + { file = "packaging-23.0-py3-none-any.whl", hash = "sha256:714ac14496c3e68c99c29b00845f7a2b85f3bb6f1078fd9f72fd20f0570002b2" }, + { file = "packaging-23.0.tar.gz", hash = "sha256:b6ad297f8907de0fa2fe1ccbd26fdaf387f5f47c7275fedf8cce89f99446cf97" }, +] +pybtex = [ + { file = "pybtex-0.24.0-py2.py3-none-any.whl", hash = "sha256:e1e0c8c69998452fea90e9179aa2a98ab103f3eed894405b7264e517cc2fcc0f" }, + { file = "pybtex-0.24.0.tar.gz", hash = "sha256:818eae35b61733e5c007c3fcd2cfb75ed1bc8b4173c1f70b56cc4c0802d34755" }, +] +pybtex-docutils = [ + { file = "pybtex-docutils-1.0.2.tar.gz", hash = "sha256:43aa353b6d498fd5ac30f0073a98e332d061d34fe619d3d50d1761f8fd4aa016" }, + { file = "pybtex_docutils-1.0.2-py3-none-any.whl", hash = "sha256:6f9e3c25a37bcaac8c4f69513272706ec6253bb708a93d8b4b173f43915ba239" }, +] +pygments = [ + { file = "Pygments-2.14.0-py3-none-any.whl", hash = "sha256:fa7bd7bd2771287c0de303af8bfdfc731f51bd2c6a47ab69d117138893b82717" }, + { file = "Pygments-2.14.0.tar.gz", hash = "sha256:b3ed06a9e8ac9a9aae5a6f5dbe78a8a58655d17b43b93c078f094ddc476ae297" }, +] +pytz = [ + { file = "pytz-2022.7.1-py2.py3-none-any.whl", hash = "sha256:78f4f37d8198e0627c5f1143240bb0206b8691d8d7ac6d78fee88b78733f8c4a" }, + { file = "pytz-2022.7.1.tar.gz", hash = "sha256:01a0681c4b9684a28304615eba55d1ab31ae00bf68ec157ec3708a8182dbbcd0" }, +] +pyyaml = [ + { file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53" }, + {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, + {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, + {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, + {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"}, + {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"}, + {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"}, + {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"}, + {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"}, + {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"}, + {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"}, + {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"}, + {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"}, + {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"}, + {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"}, + {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"}, + {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, + {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, +] +requests = [ + { file = "requests-2.28.2-py3-none-any.whl", hash = "sha256:64299f4909223da747622c030b781c0d7811e359c37124b4bd368fb8c6518baa" }, + { file = "requests-2.28.2.tar.gz", hash = "sha256:98b1b2782e3c6c4904938b84c0eb932721069dfdb9134313beff7c83c2df24bf" }, +] +six = [ + { file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" }, + { file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926" }, +] +snowballstemmer = [ + { file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a" }, + { file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1" }, +] +sphinx = [ + {file = "Sphinx-5.3.0.tar.gz", hash = "sha256:51026de0a9ff9fc13c05d74913ad66047e104f56a129ff73e174eb5c3ee794b5"}, + {file = "sphinx-5.3.0-py3-none-any.whl", hash = "sha256:060ca5c9f7ba57a08a1219e547b269fadf125ae25b06b9fa7f66768efb652d6d"}, +] +sphinx-intl = [ + {file = "sphinx-intl-2.0.1.tar.gz", hash = "sha256:b25a6ec169347909e8d983eefe2d8adecb3edc2f27760db79b965c69950638b4"}, + {file = "sphinx_intl-2.0.1-py3.8.egg", hash = "sha256:2ff97cba0e4e43249e339a3c29dd2f5b63c25ce794050aabca320ad95f5c5b55"}, +] +sphinx-rtd-theme = [ + {file = "sphinx_rtd_theme-1.1.1-py2.py3-none-any.whl", hash = "sha256:31faa07d3e97c8955637fc3f1423a5ab2c44b74b8cc558a51498c202ce5cbda7"}, + {file = "sphinx_rtd_theme-1.1.1.tar.gz", hash = "sha256:6146c845f1e1947b3c3dd4432c28998a1693ccc742b4f9ad7c63129f0757c103"}, +] +sphinxcontrib-applehelp = [ + { file = "sphinxcontrib-applehelp-1.0.4.tar.gz", hash = "sha256:828f867945bbe39817c210a1abfd1bc4895c8b73fcaade56d45357a348a07d7e" }, + { file = "sphinxcontrib_applehelp-1.0.4-py3-none-any.whl", hash = "sha256:29d341f67fb0f6f586b23ad80e072c8e6ad0b48417db2bde114a4c9746feb228" }, +] +sphinxcontrib-bibtex = [ + { file = "sphinxcontrib-bibtex-2.5.0.tar.gz", hash = "sha256:71b42e5db0e2e284f243875326bf9936aa9a763282277d75048826fef5b00eaa" }, + { file = "sphinxcontrib_bibtex-2.5.0-py3-none-any.whl", hash = "sha256:748f726eaca6efff7731012103417ef130ecdcc09501b4d0c54283bf5f059f76" }, +] +sphinxcontrib-devhelp = [ + { file = "sphinxcontrib-devhelp-1.0.2.tar.gz", hash = "sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4" }, + { file = "sphinxcontrib_devhelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e" }, +] +sphinxcontrib-htmlhelp = [ + {file = "sphinxcontrib-htmlhelp-2.0.0.tar.gz", hash = "sha256:f5f8bb2d0d629f398bf47d0d69c07bc13b65f75a81ad9e2f71a63d4b7a2f6db2"}, + {file = "sphinxcontrib_htmlhelp-2.0.0-py2.py3-none-any.whl", hash = "sha256:d412243dfb797ae3ec2b59eca0e52dac12e75a241bf0e4eb861e450d06c6ed07"}, +] +sphinxcontrib-jsmath = [ + {file = "sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"}, + {file = "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178"}, +] +sphinxcontrib-qthelp = [ + {file = "sphinxcontrib-qthelp-1.0.3.tar.gz", hash = "sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72"}, + {file = "sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl", hash = "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6"}, +] +sphinxcontrib-serializinghtml = [ + {file = "sphinxcontrib-serializinghtml-1.1.5.tar.gz", hash = "sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952"}, + {file = "sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl", hash = "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd"}, +] +typing-extensions = [ + {file = "typing_extensions-4.4.0-py3-none-any.whl", hash = "sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e"}, + {file = "typing_extensions-4.4.0.tar.gz", hash = "sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa"}, +] +urllib3 = [ + {file = "urllib3-1.26.14-py2.py3-none-any.whl", hash = "sha256:75edcdc2f7d85b137124a6c3c9fc3933cdeaa12ecb9a6a959f22797a0feca7e1"}, + {file = "urllib3-1.26.14.tar.gz", hash = "sha256:076907bf8fd355cde77728471316625a4d2f7e713c125f51953bb5b3eecf4f72"}, +] +zipp = [ + {file = "zipp-3.12.0-py3-none-any.whl", hash = "sha256:9eb0a4c5feab9b08871db0d672745b53450d7f26992fd1e4653aa43345e97b86"}, + {file = "zipp-3.12.0.tar.gz", hash = "sha256:73efd63936398aac78fd92b6f4865190119d6c91b531532e798977ea8dd402eb"}, +] diff --git a/problem-sets b/problem-sets new file mode 160000 index 000000000..738e6d464 --- /dev/null +++ b/problem-sets @@ -0,0 +1 @@ +Subproject commit 738e6d464d7173d5027d6ff882602109f19088b5 diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 000000000..2b5aba184 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,46 @@ +[tool.poetry] +name = "python-course" +version = "2022.11.dev" +description = "" +license = "MIT" +authors = [ + "Vladyslav Ponomaryov", + "Serhii Horodilov " +] +maintainers = [ + "Serhii Horodilov " +] +readme = "README.rst" +homepage = "" # todo: +repository = "https://github.com/edu-python-course/edu-python-course.github.io" +keywords = [ + "python", + "training", + "course", + "education" +] +classifiers = [ + "License :: OSI Approved :: MIT License", + "Natural Language :: English", + "Natural Language :: Ukrainian", + "Operating System :: OS Independent", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3 :: Only", + "Topic :: Documentation", + "Topic :: Documentation :: Sphinx", + "Topic :: Education" +] + +[tool.poetry.dependencies] +python = "^3.9" +Sphinx = "^5.3.0" +sphinx-intl = "^2.0.1" +sphinx-rtd-theme = "^1.1.0" +myst-parser = "^0.18.1" +sphinxcontrib-bibtex = "^2.5.0" + +[tool.poetry.dev-dependencies] + +[build-system] +requires = ["poetry-core>=1.0.0"] +build-backend = "poetry.core.masonry.api" diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 000000000..f3e31cb75 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,39 @@ +alabaster==0.7.13; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.7" +babel==2.11.0; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.7" +certifi==2022.12.7; python_version >= "3.7" and python_version < "4" +charset-normalizer==3.0.1; python_version >= "3.7" and python_version < "4" +click==8.1.3; python_version >= "3.7" +colorama==0.4.6; python_version >= "3.7" and python_full_version < "3.0.0" and sys_platform == "win32" and platform_system == "Windows" and (python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.6") or sys_platform == "win32" and python_version >= "3.7" and python_full_version >= "3.7.0" and platform_system == "Windows" and (python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.6") +docutils==0.17.1; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.7" +idna==3.4; python_version >= "3.7" and python_version < "4" +imagesize==1.4.1; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.7" +importlib-metadata==6.0.0; python_version < "3.10" and python_version >= "3.7" and (python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.6") +jinja2==3.1.2; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.7" +latexcodec==2.0.1; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.6" +markdown-it-py==2.1.0; python_version >= "3.7" +markupsafe==2.1.2; python_version >= "3.7" +mdit-py-plugins==0.3.3; python_version >= "3.7" +mdurl==0.1.2; python_version >= "3.7" +myst-parser==0.18.1; python_version >= "3.7" +packaging==23.0; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.7" +pybtex-docutils==1.0.2; python_version >= "3.6" +pybtex==0.24.0; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.3.0" and python_version >= "3.6" +pygments==2.14.0; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.7" +pytz==2022.7.1; python_version >= "3.6" +pyyaml==6.0; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.3.0" and python_version >= "3.7" +requests==2.28.2; python_version >= "3.7" and python_version < "4" and (python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.7") +six==1.16.0; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.6" +snowballstemmer==2.2.0; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.7" +sphinx-intl==2.0.1; python_version >= "3.5" +sphinx-rtd-theme==1.1.1; (python_version >= "2.7" and python_full_version < "3.0.0") or (python_full_version >= "3.4.0") +sphinx==5.3.0; python_version >= "3.6" +sphinxcontrib-applehelp==1.0.4; python_version >= "3.8" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.8" +sphinxcontrib-bibtex==2.5.0; python_version >= "3.6" +sphinxcontrib-devhelp==1.0.2; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.7" +sphinxcontrib-htmlhelp==2.0.0; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.7" +sphinxcontrib-jsmath==1.0.1; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.7" +sphinxcontrib-qthelp==1.0.3; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.7" +sphinxcontrib-serializinghtml==1.1.5; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.7" +typing-extensions==4.4.0; python_version >= "3.7" +urllib3==1.26.14; python_version >= "3.7" and python_full_version < "3.0.0" and python_version < "4" or python_version >= "3.7" and python_version < "4" and python_full_version >= "3.6.0" +zipp==3.12.0; python_version < "3.10" and python_version >= "3.7" diff --git a/src/appx/blog.md b/src/appx/blog.md new file mode 100644 index 000000000..70272e6a0 --- /dev/null +++ b/src/appx/blog.md @@ -0,0 +1,5 @@ +[//]: # (this document describes a project to build while learning django framework) + +# Blog Project Specification + +https://github.com/edu-python-course/blog-bootstrap diff --git a/src/appx/code_edit.txt b/src/appx/code_edit.txt new file mode 100644 index 000000000..f3308f071 --- /dev/null +++ b/src/appx/code_edit.txt @@ -0,0 +1,10 @@ +.. appendix + +############ +Code Editors +############ + +Writing Python using IDLE or the Python Shell is great for simple things, but +those tools quickly turn larger programming projects into frustrating pits of +despair. Using an IDE, or even just a good dedicated code editor, makes coding +fun — but which one is best for you? :cite:`realpython:code-edit` diff --git a/src/appx/env_path.txt b/src/appx/env_path.txt new file mode 100644 index 000000000..6786d036e --- /dev/null +++ b/src/appx/env_path.txt @@ -0,0 +1,5 @@ +.. appendix + +############################### +Issue - System Environment PATH +############################### diff --git a/src/appx/precedence.txt b/src/appx/precedence.txt new file mode 100644 index 000000000..d88a0a8ee --- /dev/null +++ b/src/appx/precedence.txt @@ -0,0 +1,68 @@ +.. appendix + +.. todo: + https://docs.python.org/3/reference/expressions.html#operator-precedence + +################### +Operator Precedence +################### + +The following table summarizes the operator precedence in Python, from highest +precedence (most binding) to lowest precedence (least binding) +:cite:`docs-python:operator-precedence`. Operators in the same cell have the +same precedence (use left-to-right precedence). + ++------------------------+----------------------------------------------------+ +| Operator | Description | ++========================+====================================================+ +| ``(expressions...)``, | Binding or parenthesized expression, list display, | +| ``[expressions...]``, | dictionary display, set display | +| ``{key: value...}``, | | +| ``{expressions...}`` | | ++------------------------+----------------------------------------------------+ +| ``x[index]``, | Subscription, slicing, call, attribute reference | +| ``x[index:index]``, | | +| ``x(arguments...)``, | | +| ``x.attribute`` | | ++------------------------+----------------------------------------------------+ +| ``await x`` | Await expression | ++------------------------+----------------------------------------------------+ +| ``**`` | Exponentiation[#]_ | ++------------------------+----------------------------------------------------+ +| ``+x``, ``-x``, ``~x`` | Positive, negative, bitwise NOT | ++------------------------+----------------------------------------------------+ +| ``*``, ``@``, ``/``, | Multiplication, matrix multiplication, division, | +| ``//``, ``%`` | floor division, remainder[#]_ | ++------------------------+----------------------------------------------------+ +| ``+``, ``-`` | Addition and subtraction | ++------------------------+----------------------------------------------------+ +| ``<<``, ``>>`` | Shifts | ++------------------------+----------------------------------------------------+ +| ``&`` | Bitwise AND | ++------------------------+----------------------------------------------------+ +| ``^`` | Bitwise XOR | ++------------------------+----------------------------------------------------+ +| ``|`` | Bitwise OR | ++------------------------+----------------------------------------------------+ +| ``in``, ``not in``, | Comparisons, including membership tests and | +| ``is``, ``is not``, | identity tests | +| ``<``, ``<=``, ``>``, | | +| ``>=``, ``==``, ``!=`` | | ++------------------------+----------------------------------------------------+ +| ``not x`` | Boolean NOT | ++------------------------+----------------------------------------------------+ +| ``and`` | Boolean AND | ++------------------------+----------------------------------------------------+ +| ``or`` | Boolean OR | ++------------------------+----------------------------------------------------+ +| ``if - else`` | Conditional expression (ternary ``if``) | ++------------------------+----------------------------------------------------+ +| ``lambda`` | Lambda expression | ++------------------------+----------------------------------------------------+ +| ``=``, ``:=`` | Assignment expression | ++------------------------+----------------------------------------------------+ + +.. [#] the power operator binds less tightly than an arithmetic or bitwise + unary operator on its right (``2 ** -1`` is ``0.5``). +.. [#] the ``%`` operator is also used for string formatting; + the same precedence applies. diff --git a/src/appx/printf.txt b/src/appx/printf.txt new file mode 100644 index 000000000..5a7ea0f79 --- /dev/null +++ b/src/appx/printf.txt @@ -0,0 +1,73 @@ +.. appendix + +.. todo: add code examples + +################################## +``printf-style`` String Formatting +################################## + +String objects have one unique built-in operation: the ``%`` operator (modulo). +This is also known as the string *formatting* or *interpolation* operator +:cite:`docs-python:printf-style`. Given ``format % values`` (where *format* is +a string), ``%`` conversion specifications in *format* are replaced with zero +or more elements of *values*. If *format* requires a single argument, *values* +may be a single non-tuple object. + +The conversion flag characters are: + ++------------+----------------------------------------------------------------+ +| Flag | Meaning | ++============+================================================================+ +| ``#`` | The value conversion will use the "alternative form" | ++------------+----------------------------------------------------------------+ +| ``0`` | The conversion will be zero padded for numeric values | ++------------+----------------------------------------------------------------+ +| ``'-'`` | The converted value is left adjusted (override the ``'0'`` if | +| | both are given) | ++------------+----------------------------------------------------------------+ +| ``' '`` | (a space) A blank should be left before a positive number | ++------------+----------------------------------------------------------------+ +| ``'+'`` | A sign character (``'+'`` or ``'-'``) will precede | +| | the conversion (overrides a "space" flag) | ++------------+----------------------------------------------------------------+ + +The conversion types are: + ++------------+----------------------------------------------------------------+ +| Conversion | Meaning | ++============+================================================================+ +| ``'d'`` | Signed integer decimal | ++------------+----------------------------------------------------------------+ +| ``'i'`` | Signed integer decimal | ++------------+----------------------------------------------------------------+ +| ``'o'`` | Signed octal value | ++------------+----------------------------------------------------------------+ +| ``'u'`` | Obsolete type - it is identical to ``'d'`` | ++------------+----------------------------------------------------------------+ +| ``'x'`` | Signed hexadecimal (lowercase) | ++------------+----------------------------------------------------------------+ +| ``'X'`` | Signed hexadecimal (uppercase) | ++------------+----------------------------------------------------------------+ +| ``'e'`` | Floating point exponential format (lowercase) | ++------------+----------------------------------------------------------------+ +| ``'E'`` | Floating point exponential format (uppercase) | ++------------+----------------------------------------------------------------+ +| ``'f'`` | Floating point decimal format | +| ``'F'`` | | ++------------+----------------------------------------------------------------+ +| ``'g'`` | Floating point format. Uses lowercase exponential format if | +| | exponent is less that -4 or not less than precision, decimal | +| | format overwise. | +| ``'G'`` | | ++------------+----------------------------------------------------------------+ +| ``'c'`` | Single character (accepts integer or single character string) | ++------------+----------------------------------------------------------------+ +| ``'r'`` | Converts any Python object using ``repr()`` | ++------------+----------------------------------------------------------------+ +| ``'s'`` | Converts any Python object using ``str()`` | ++------------+----------------------------------------------------------------+ +| ``'a'`` | Converts any Python object using ``ascii()`` | ++------------+----------------------------------------------------------------+ +| ``'%'`` | No arguments is converted, results in a ``'%'`` character in | +| | the result. | ++------------+----------------------------------------------------------------+ diff --git a/src/appx/software_list.md b/src/appx/software_list.md new file mode 100644 index 000000000..9d5d6f34a --- /dev/null +++ b/src/appx/software_list.md @@ -0,0 +1,110 @@ +Software List +============= + +7zip +---- + +**7-Zip** is **free software** with **open source**. + +- High compression ratio in [7z format](https://7-zip.org/7z.html) with + **LZMA** and **LZMA2** compression +- Supported formats: + - Packing / unpacking: 7z, XZ, BZIP2, GZIP, TAR, ZIP and WIM + - Unpacking only: APFS, AR, ARJ, CAB, CHM, CPIO, CramFS, DMG, EXT, FAT, + GPT, HFS, IHEX, ISO, LZH, LZMA, MBR, MSI, NSIS, NTFS, QCOW2, RAR, RPM, + SquashFS, UDF, UEFI, VDI, VHD, VHDX, VMDK, XAR and Z. +- Self-extracting capability for 7z format +- Integration with Windows Shell + +https://7-zip.org/ + +cygwin +------ + +It is a large collection of GNU and Open Source tools which provide +functionality similar to a +[Linux distribution](https://en.wikipedia.org/wiki/Linux_distribution) on +Windows and a DLL (cygwin1.dll) which provides substantial POSIX API +functionality. + +**Cygwin is not**: + +- a way to run native Linux apps on Windows. You must rebuild your application + *from source* if you want it to run on Windows. +- a way to magically make native Windows apps aware of UNIX® functionality like + `signals`, `ptys` etc. Again, you need to build your apps *from source* if + you want to take advantage of Cygwin functionality. + +https://www.cygwin.com/ + +git[^cygwin-pkg] +--- + +Git is a [free and open source](https://git-scm.com/about/free-and-open-source) +distributed version control system designed to handle everything from small to +very large projects with speed and efficiency. + +https://git-scm.com/ + +Docker +------ + +> The most-loved Tool in Stack Overflow’s 2022 Developer Survey. + +Docker helps developers bring their ideas to life by conquering the complexity +of app development. We simplify and accelerate development workflows with +an integrated dev pipeline and through the consolidation of application +components. Actively used by millions of developers around the world, +Docker Desktop and Docker Hub provide unmatched simplicity, agility and choice. + +https://www.docker.com/ + +PostgreSQL[^cygwin-pkg] +---------- + +PostgreSQL is a powerful, open source object-relational database system with +over 35 years of active development that has earned it a strong reputation for +reliability, feature robustness, and performance. + +https://www.postgresql.org/ + +psql[^cygwin-pkg] +---- + +A terminal-based front-end to PostgreSQL. It enables you to type in queries +interactively, issue them to PostgreSQL, and see the query results. +Alternatively, input can be from a file or from command line arguments. +In addition, psql provides a number of meta-commands and various shell-like +features to facilitate writing scripts and automating a wide variety of tasks. + +On Windows it will be installed within PostgreSQL RDBMS. For macOS and Linux +look for `postgresql-client` package. + +https://www.postgresql.org/docs/current/app-psql.html + +pgAdmin +------- + +pgAdmin is the most popular and feature rich Open Source administration and +development platform for PostgreSQL, the most advanced Open Source database +in the world. + +It is a PostgreSQL client (like a `psql`), but with web based GUI. + +https://pgadmin.org/ + +SQLite[^cygwin-pkg] +------ + +SQLite is a C-language library that implements a +[small](https://sqlite.org/footprint.html), +[fast](https://sqlite.org/fasterthanfs.html), +[self-contained](https://sqlite.org/selfcontained.html), +[high-reliability](https://sqlite.org/hirely.html), +[full-featured](https://sqlite.org/fullsql.html), SQL database engine. + +https://sqlite.org/ + + +[^cygwin-pkg]: available for installation as a cygwin package + diff --git a/src/basics/controlflow.txt b/src/basics/controlflow.txt new file mode 100644 index 000000000..93b4e4add --- /dev/null +++ b/src/basics/controlflow.txt @@ -0,0 +1,3 @@ +******************************************************************************* + Control Flow +******************************************************************************* diff --git a/src/basics/datatypes.txt b/src/basics/datatypes.txt new file mode 100644 index 000000000..df4c63c1b --- /dev/null +++ b/src/basics/datatypes.txt @@ -0,0 +1,129 @@ +******************************************************************************* + Data Types +******************************************************************************* + +In programming data types is an important concept. Data may represent different +things. + +Data may represent different things and require various operations available. +In programming data types is an important concept. Python has the following +data types built-in by default in these categories: + +:Text: + ``str`` + +:Numeric: + ``int``, ``float``, ``complex`` + +:Sequence: + ``list``, ``tuple``, ``range`` + +:Mapping: + ``dict`` + +:Set: + ``set``, ``frozenset`` + +:Boolean: + ``bool`` + +:None: + ``None`` + +Python uses dynamic typing. This means as a developer you should not declare +a variable with its data type - the interpreter will do this for you. Other +popular language using dynamic typing are JavaScript and PHP. Setting variables +in Python is as easy as: + +.. code-block:: python + + variable = "Hello World" # create variable of str type + +Casting +======= + +You may specify the data type of a variable with casting: + +.. code-block:: python + + x = str(3) # x will be '3' + y = int(3) # y will be 3 + z = float(3) # z will be 3.0 + +Text +==== + +Text data are stored as strings (``str`` data type) in Python. Strings are +surrounded by either single quotation marks, or double quotation marks. So +``'Python'`` is the same as ``"Python"``. To assign string to a variable: + +.. code-block:: python + + string = "string" + string = str("string") # declare using casting + +Multiline strings +----------------- + +You can assign a multiline string using three quotes: + +.. code-block:: python + + variable = """Well, ye scrawny mate- set sails for riddle! + Never love a lagoon.""" + +Single quotes or double quotes +------------------------------ + +Don't care. Use any quote mark you like. Remember the string is any characters +surrounded by the same quotes. So you are use single quotes if double quote +mark is the part of your string data and vice versa. It's not recommended to +mess various quote marks in the same project. + +Strings are subscriptable +------------------------- + +Strings in Python are arrays of bytes representing unicode characters. This is +common for many programming languages. However Python does not have a data type +to represent a single character itself; a single character in Python is of +string type as well. You can get the character at a specific position in +a string. + +.. code-block:: python + + text = "Plank of a salty strength, endure the fortune!" + character = text[10] + +Strings are iterable +-------------------- + +Since strings are arrays, we can loop through the characters in a string with +a ``for`` loop: + +.. code-block:: python + + for character in "foobar": + print(character) + +Integers +======== + +``int``, or integer, is a whole number, positive or negative, without decimals. + +.. code-block:: python + + integer_number = 42 + integer_number = int(42) # declare using casting + +Floats +====== + +``float``, or floating point number, is a number, positive or negative, +containing one or more decimals. + +.. code-block:: python + + float_number = 42. # will assign 42.0 + float_number = .42 # will assign 0.42 + float_number = 4.2 # will assign 4.2 + float_number = float(42) # declare using casting (42.0) diff --git a/src/basics/exceptions.txt b/src/basics/exceptions.txt new file mode 100644 index 000000000..2d5056873 --- /dev/null +++ b/src/basics/exceptions.txt @@ -0,0 +1,3 @@ +******************************************************************************* + Errors and Exceptions +******************************************************************************* diff --git a/src/basics/functions.txt b/src/basics/functions.txt new file mode 100644 index 000000000..36a1acce6 --- /dev/null +++ b/src/basics/functions.txt @@ -0,0 +1,3 @@ +******************************************************************************* + Functions +******************************************************************************* diff --git a/src/basics/index.txt b/src/basics/index.txt new file mode 100644 index 000000000..e59340e4f --- /dev/null +++ b/src/basics/index.txt @@ -0,0 +1,15 @@ +############################################################################### + Python Basics +############################################################################### + +.. toctree:: + :name: basics + + variables + datatypes + controlflow + functions + modules + exceptions + pep8 + testing diff --git a/src/basics/modules.txt b/src/basics/modules.txt new file mode 100644 index 000000000..6e757289f --- /dev/null +++ b/src/basics/modules.txt @@ -0,0 +1,3 @@ +******************************************************************************* + Pythons Modules and Imports +******************************************************************************* diff --git a/src/basics/pep8.txt b/src/basics/pep8.txt new file mode 100644 index 000000000..4f805f71b --- /dev/null +++ b/src/basics/pep8.txt @@ -0,0 +1,3 @@ +******************************************************************************* + Style Guides: PEP8 +******************************************************************************* diff --git a/src/basics/testing.txt b/src/basics/testing.txt new file mode 100644 index 000000000..6507d155f --- /dev/null +++ b/src/basics/testing.txt @@ -0,0 +1,3 @@ +******************************************************************************* + Testing +******************************************************************************* diff --git a/src/basics/variables.txt b/src/basics/variables.txt new file mode 100644 index 000000000..d5dd7522a --- /dev/null +++ b/src/basics/variables.txt @@ -0,0 +1,13 @@ +******************************************************************************* + Variables +******************************************************************************* + +Variables are container for storing data. There is no syntax for declaring +variables in Python. A variable is created the moment you first assign a value +to it. + +.. code-block:: python + + foo = 42 + bar = "some string data" + foobar = 42.0 diff --git a/src/conf.py b/src/conf.py new file mode 100644 index 000000000..1020d144e --- /dev/null +++ b/src/conf.py @@ -0,0 +1,64 @@ +# Sphinx documentation generator configuration + +import sys +from datetime import datetime +from pathlib import Path + +# set up paths +BASE_DIR = Path(__file__).resolve().parent.parent +sys.path.insert(0, str(BASE_DIR / "problem-sets" / "src")) + +# project information +project = "Python Training Course" +project_copyright = \ + f"{datetime.now().year}, Python training course authors and contributors" +authors = "Vladyslav Ponomaryov \\and " \ + "Serhii Horodilov" +version = "2022.11.dev" + +# general configuration +master_doc = root_doc = "index" +extensions = [ + "sphinx.ext.autodoc", + "sphinx.ext.imgconverter", + + "sphinxcontrib.bibtex", + "sphinx_rtd_theme", + "myst_parser", +] +source_suffix = { + ".txt": "restructuredtext", + ".rst": "restructuredtext", + ".md": "markdown", +} +needs_sphinx = "4.0" +exclude_patterns = [] +suppress_warnings = [] + +# options for bibliography +bibtex_bibfiles = ["refs.bib"] +bibtex_reference_style = "label" + +# options for internationalization +language = "en" +locale_dirs = ["_locales"] + +# options for HTML output +html_theme = "sphinx_rtd_theme" +html_favicon = str(BASE_DIR / "assets" / "favicon.ico") + +# options for LaTeX output +latex_doc = project.title().replace(" ", "") + ".tex" +latex_engine = "xelatex" +latex_documents = [ + (master_doc, latex_doc, project, authors, "manual", False), + ("appx/software_list", "Software.tex", project, authors, "howto", False), + ("appx/code_edit", "IDE.tex", project, authors, "howto", False), +] +latex_appendices = [ + "appx/software_list", + "appx/code_edit", + "appx/env_path", + "appx/precedence", + "appx/printf", +] diff --git a/src/deploy/index.txt b/src/deploy/index.txt new file mode 100644 index 000000000..2bcaf44bc --- /dev/null +++ b/src/deploy/index.txt @@ -0,0 +1,6 @@ +############################################################################### + Application Deployment +############################################################################### + +.. toctree:: + :name: deploy diff --git a/src/django/index.txt b/src/django/index.txt new file mode 100644 index 000000000..2fe584b69 --- /dev/null +++ b/src/django/index.txt @@ -0,0 +1,6 @@ +############################################################################### + Django Framework +############################################################################### + +.. toctree:: + :name: django diff --git a/src/flask/index.txt b/src/flask/index.txt new file mode 100644 index 000000000..607e139fa --- /dev/null +++ b/src/flask/index.txt @@ -0,0 +1,6 @@ +############################################################################### + Flask Framework +############################################################################### + +.. toctree:: + :name: flask diff --git a/src/index.txt b/src/index.txt new file mode 100644 index 000000000..a0fbf68e3 --- /dev/null +++ b/src/index.txt @@ -0,0 +1,32 @@ +.. master document + +############################################################################### + PYTHON TRAINING COURSE +############################################################################### + +.. toctree:: + :name: master + + intro/index + basics/index + rdbms/index + oop/index + flask/index + django/index + linux/index + deploy/index + +.. only:: builder_html + + .. toctree:: + :name: appx + :caption: Additional materials + + appx/software_list + appx/code_edit + appx/env_path + +.. rubric:: References + +.. bibliography:: + :all: diff --git a/src/intro/index.txt b/src/intro/index.txt new file mode 100644 index 000000000..322bee8fb --- /dev/null +++ b/src/intro/index.txt @@ -0,0 +1,173 @@ + + There are a whole bunch of common programming tasks that are easy in + Python. For someone who is not yet a programmer, who wants to become + a programmer, for those people Python is particularly easy to get. + In Python, every symbol you type is essential. + + |guido| Guido van Rossum + +############################################################################### + Introduction to Python +############################################################################### + +|python| **Python** is a high-level, interpreted scripting language. +It was created in the early 1990s by Guido van Rossum at Stichting Mathematisch +Centrum (CWI, see https://www.cwi.nl/) in the Netherlands as a successor of +a language called ABC. Guido remains Python’s principal author, although it +includes many contributions from others. + +Python 2.0 was released in 2000, and the 2.x versions were the prevalent +releases until December 2008. At that time, the development team made +the decision to release version 3.0, which contained a few relatively small but +significant changes that were not backward compatible with the 2.x versions. +Python 2 and 3 are very similar, and some features of Python 3 have been +backported to Python 2. But in general, they remain not quite compatible. + +Both Python 2 and 3 have continued to be maintained and developed, with +periodic release updates for both. However, an official End Of Life date of +January 1, 2020 has been established for Python 2, after which time it will no +longer be maintained. + +Python is still maintained by a core development team at the Institute, and +Guido is still in charge, having been given the title of BDFL (Benevolent +Dictator For Life) by the Python community. The name Python, by the way, +derives not from the snake, but from the British comedy troupe Monty Python’s +Flying Circus, of which Guido was, and presumably still is, a fan. It is common +to find references to Monty Python sketches and movies scattered throughout +the Python documentation. + +Here are some significant facts about Python. + +.. rubric:: Python is popular + +Python has been growing in popularity over the last few years. +The 2018 Stack Overflow Developer Survey ranked Python as the 7th most popular +and the number one most wanted technology of the year. +By the end of Q-4 in 2022 Python is the **top** language on all GitHut metrics +:cite:`github:stats`. + +Here are some logos of unknown companies across the globe who uses Python: + +.. centered:: + |google| |facebook| |instagram| |spotify| |quora| |netflix| |dropbox| + |reddit| + +.. rubric:: Python is interpreted + +Many languages are compiled, meaning the source code you create needs to be +translated into machine code, the language of your computer’s processor, before +it can be run. Programs written in an interpreted language are passed straight +to an interpreter that runs them directly. + +This makes for a quicker development cycle because you just type in your code +and run it, without the intermediate compilation step. + +.. rubric:: Python is free + +The Python interpreter is developed under an OSI-approved open-source license, +making it free to install, use, and distribute, even for commercial purposes. + +.. rubric:: Python is portable + +Because Python code is interpreted and not compiled into native machine +instructions, code written for one platform will work on any other platform +that has the Python interpreter installed. +This is true of any interpreted language, not just Python. + +.. rubric:: Python is simple + +As programming languages go, Python is relatively uncluttered, +and the developers have deliberately kept it that way. A rough estimate of +the complexity of a language can be gleaned from the number of keywords or +reserved words in the language. These are words that are reserved for special +meaning by the compiler or interpreter because they designate specific built-in +functionality of the language. +There are only 35 :cite:`docs-python:keywords` in Python and they are: + ++--------+----------+---------+----------+--------+ +| False | await | else | import | pass | ++--------+----------+---------+----------+--------+ +| None | break | except | in | raise | ++--------+----------+---------+----------+--------+ +| True | class | finally | is | return | ++--------+----------+---------+----------+--------+ +| and | continue | for | lambda | try | ++--------+----------+---------+----------+--------+ +| as | def | from | nonlocal | while | ++--------+----------+---------+----------+--------+ +| assert | del | global | not | with | ++--------+----------+---------+----------+--------+ +| async | elif | if | or | yield | ++--------+----------+---------+----------+--------+ + +.. rubric:: Python is general purpose + +Python is everywhere. Talking more specific common scopes for Python developers +are :cite:`python-usage`: + +- Web Scraping Applications +- Data Science Solutions +- Machine Learning Applications +- Web Development +- Game Development +- Scientific and Numeric Applications +- Image Design and Graphic Design Applications +- Finance Fintech Platform +- Language Development +- Operating Systems + + +.. toctree:: + :caption: Contents + :name: intro + + install + interact + +.. static files within this document + +.. |python| image:: /../assets/img/python.svg + :width: 24 + +.. |google| image:: /../assets/img/google.svg + :width: 64 + :alt: Google + :target: https://about.google/ + +.. |facebook| image:: /../assets/img/facebook.svg + :width: 64 + :alt: Facebook + :target: https://www.facebook.com/ + +.. |instagram| image:: /../assets/img/instagram.svg + :width: 64 + :alt: Instagram + :target: https://about.instagram.com/ + +.. |spotify| image:: /../assets/img/spotify.svg + :width: 64 + :alt: Spotify + :target: https://support.spotify.com/us/article/what-is-spotify/ + +.. |quora| image:: /../assets/img/quora.svg + :width: 64 + :alt: Quora + :target: https://www.quora.com/about + +.. |netflix| image:: /../assets/img/netflix.svg + :width: 64 + :alt: Netflix + :target: https://about.netflix.com + +.. |dropbox| image:: /../assets/img/dropbox.svg + :width: 64 + :alt: Dropbox + :target: https://www.dropbox.com/about + +.. |reddit| image:: /../assets/img/reddit.svg + :width: 64 + :alt: Reddit + :target: https://www.redditinc.com/ + +.. |guido| image:: /../assets/img/guido-headshot-2019.jpg + :width: 100 diff --git a/src/intro/install.txt b/src/intro/install.txt new file mode 100644 index 000000000..359ba78ef --- /dev/null +++ b/src/intro/install.txt @@ -0,0 +1,136 @@ +******************************************************************************* + Install Python +******************************************************************************* + +The `Python wiki `_ +briefly describes the installation process. + +.. note:: To become a **true** professional, you need a special software called + :abbr:`IDE (Integrated Development Environment)` or at least a code + editor supporting syntax highlight. Refer :doc:`/appx/code_edit` for + more information. + +Linux +===== + +On most Linux distros Python comes pre-installed and/or all distro have it +available in their package repository (I haven't seen the one which does have). +The installation process depends on the distro, but here are some examples how +you can install it: + +.. code-block:: + :caption: Install Python + + # Debian / Ubuntu (and other distros that uses ``apt``) + apt install python3 python3-dev + + # ArchLinux + pacman -S python3 + + # RedHat, CentOS, Fedora + dnf install python3 python3-devel + + # Gentoo + # ... you should know what to do + +MacOS +===== + +For newer versions of MacOS Python is no longer included by default and you +will have to download and install it. + +The process is described at: `Using Python on a Mac`_. + +Briefly, you are invited to visit `downloads`_ and download the latest +stable version of Python. A "universal binary" build of Python runs natively on +Mac's new Intel and legacy PPC CPUs. + +After the installation you would get: + +- `Python 3.x` folder in `Applications` folder. + Standard development environment (`IDLE`) and `PythonLauncher` included. +- A framework `/Library/Frameworks/Python.framework` included libraries and + executables. + +Install from Homebrew +--------------------- + +Python for MacOS is available via Homebrew. You are to search `formulae`_ for +the latest available version. In general, it's as easy as: + +.. code-block:: shell + + brew install python@3.9 + +Windows +======= + +As for MacOS, here is the official documentation: `Using Python on Windows`_. + +For Windows' users the stable release is available from `downloads`_. Just +download the installer and proceed to common steps to install software. + +.. important:: It's recommended to **Add Python3.x to PATH**, this will avoid + problems at the beginning of your journey with Python + +.. figure:: https://docs.python.org/3/_images/win_installer.png + :width: 600 + :align: center + + Python installer first page + +Going on with **Install Now**: + +- Python will be installed to your user directory +- Python Launcher will be installed according to the option at the bottom + of the page + +Using **Customize installation** will perform an *all-users* installation. + +Removing the MAX_PATH Limitation +-------------------------------- + +Windows historically has limited path lengths to 260 characters. This meant +that paths longer than this would not resolve and errors would result. In the +latest versions of Windows, this limitation can be expanded to approximately +32,000 characters. This allows the open() function, the os module and most +other path functionality to accept and return paths longer than 260 characters. + +You will need PC administrator assistance to perform this action. + +Install from the Microsoft Store +-------------------------------- + +You can install from the Microsoft Store in two steps: + +#. Open the Microsoft Store app and search for ``Python`` + The result should look like: + + .. figure:: /../assets/img/microsoft-store-search.png + :align: center + + Microsoft Store - search results for "Python" + + Select ``Python 3.9`` or the higher available version. + +#. Click **GET** and wait until the installer is downloaded. The installation + process should run automatically. Follow the installer's instructions. + + .. figure:: /../assets/img/microsoft-store-get.png + :scale: 50% + :align: center + +Online Interpreters +=================== + +Installing or updating Python on your computer is the first step to becoming +a Python programmer :cite:`realpython:install-and-setup`. + +But if you cannot install Python at the moment for some reason, are can go +with online interpreters. `repl.it `_ provides the ability +to create and store Python scripts (they are called *repl* here) for free. + +.. _formulae: https://formulae.brew.sh/formula/ +.. _Using Python on Windows: https://docs.python.org/3/using/windows.html +.. _Using Python on a Mac: https://docs.python.org/3/using/mac.html +.. _downloads: https://www.python.org/downloads/ diff --git a/src/intro/interact.txt b/src/intro/interact.txt new file mode 100644 index 000000000..9b78646f2 --- /dev/null +++ b/src/intro/interact.txt @@ -0,0 +1,151 @@ +******************************************************************************* + Interacting with Python Interpreter +******************************************************************************* + + It’s time to write some Python code! + + :cite:t:`realpython:interact` + +In short there are three major ways to do something with Python: + +- interactive Python console +- running code from file [#]_ +- use online editors (like `repl.it `_) + +Using Python interpreter interactively +====================================== + +Using :abbr:`REPL (Read-Eval-Print-Loop)` environment is the most straight +forward way to start talking to Python. This simply means starting up the +interpreter and typing commands to it directly :cite:`realpython:interact`. +The interpreter: + +- Reads the command you enter +- Evaluates and executes it +- Prints the output (if any) back to the console +- Loops back and repeats + +Starting the interpreter +------------------------ + +In :abbr:`GUI (Graphic User Interface)` environment, it's likely that the +installer placed a shortcut on the desktop to launch the Python. + +For example in Windows the interpreter can be found in the **Start** menu +labeled **Python 3.x**: + +.. figure:: /../assets/img/start-menu-python.png + :align: center + + Windows start menu Python group + +.. hint:: In case you are getting error saying python is not installed, but you + are sure that the interpreter **is installed** - this means you have + no Python in your ``PATH``. Message may look like: + ``'python' is not recognized as an internal or external command`` / + ``python: command not found`` + + Refer :doc:`/appx/env_path` for problem solution. + +The alternative is to launch from a terminal window: + +- **Command Prompt** in Windows +- **Terminal** both in macOS and Linux + +.. figure:: /../assets/img/cmd-python.png + :align: center + + Start Python via Command Prompt + +.. figure:: /../assets/img/terminal-python.png + :align: center + + Start Python via Terminal + +Running code +------------ + +Put the Python code in interactive console and press enter to execute it. + +#. Ensure that the ``>>>`` prompt is displayed and the cursor is pointed after + it +#. Type the command ``print("Hello, World!")`` +#. Press enter + +.. code-block:: python + + print("Hello, World!") + +Your session should look like: + +:: + + print("Hello, World!") + "Hello, World!" + +If you've seen string "Hello, World!" printed back, congrats - you've run your +first program in Python. + +.. image:: /../assets/img/celebrate.svg + :width: 200 + :align: center + +Exiting the interpreter +----------------------- + +To exit the interactive console type "exit" and hit enter. + +.. code-block:: python + + exit() + +Running code from file +====================== + +A Python script is a reusable set of code. It is essentially a Python program - +a sequence of Python instructions - contained in a file. You can run the +program by specifying the name of the script file to the interpreter. + +Python scripts are just plain text, so you can edit them with any text editor. +If you have a favorite programmer’s editor that operates on text files, it +should be fine to use. Otherwise here are some options for the first time: + +- Windows: |npp| `Notepad++ `_ +- Linux: |geany| `Geany `_ + +Using whatever editor create a script file called ``hello.py`` and put the code +in it: + +.. code-block:: python + + print("Hello, World!") + +Save file keeping track on the directory you choose to save into. Now, open +the terminal or command prompt in this directory. + +.. hint:: In window you may open Command Prompt in the directory by typing + "cmd" to the address bar in explorer. + +In the terminal (or command prompt) type: + +.. code-block:: + + python hello.py + +Python will print string "Hello, World!". Your session should look like: + +:: + + python hello.py + Hello, World! + +.. footnotes + +.. [#] Files containing Python code are called *modules*. + +.. static files within document + +.. |npp| image:: /../assets/img/npp.svg + :width: 24 +.. |geany| image:: /../assets/img/geany.svg + :width: 24 diff --git a/src/linux/index.txt b/src/linux/index.txt new file mode 100644 index 000000000..363585aa9 --- /dev/null +++ b/src/linux/index.txt @@ -0,0 +1,6 @@ +############################################################################### + Linux Basics +############################################################################### + +.. toctree:: + :name: linux diff --git a/src/oop/index.txt b/src/oop/index.txt new file mode 100644 index 000000000..eac03d924 --- /dev/null +++ b/src/oop/index.txt @@ -0,0 +1,11 @@ +############################################################################### + Object-Oriented Programming +############################################################################### + +.. toctree:: + :name: oop + + intro + inheritance + patterns + solid diff --git a/src/oop/inheritance.txt b/src/oop/inheritance.txt new file mode 100644 index 000000000..30cded93f --- /dev/null +++ b/src/oop/inheritance.txt @@ -0,0 +1,3 @@ +******************************************************************************* + Inheritance +******************************************************************************* diff --git a/src/oop/intro.txt b/src/oop/intro.txt new file mode 100644 index 000000000..03be8014c --- /dev/null +++ b/src/oop/intro.txt @@ -0,0 +1,3 @@ +******************************************************************************* + Classes and Objects +******************************************************************************* diff --git a/src/oop/patterns.txt b/src/oop/patterns.txt new file mode 100644 index 000000000..dddb5de33 --- /dev/null +++ b/src/oop/patterns.txt @@ -0,0 +1,3 @@ +******************************************************************************* + Design Patterns +******************************************************************************* diff --git a/src/oop/solid.txt b/src/oop/solid.txt new file mode 100644 index 000000000..75f1952a1 --- /dev/null +++ b/src/oop/solid.txt @@ -0,0 +1,3 @@ +******************************************************************************* + Solid Principles +******************************************************************************* diff --git a/src/rdbms/index.txt b/src/rdbms/index.txt new file mode 100644 index 000000000..d9bcfbed7 --- /dev/null +++ b/src/rdbms/index.txt @@ -0,0 +1,6 @@ +############################################################################### + Relational Database +############################################################################### + +.. toctree:: + :name: rdbms diff --git a/src/refs.bib b/src/refs.bib new file mode 100644 index 000000000..569696c29 --- /dev/null +++ b/src/refs.bib @@ -0,0 +1,59 @@ +******************************************************************************* +Python training course bibliography database +******************************************************************************* + +@misc{realpython:py3-intro, + title = "Intoduction to Python 3", + author = "John Sturtz", + url = {https://realpython.com/python-introduction/}, + urldate = {2018.5.21}, +} + +@misc{github:stats, + title = "{GitHut 2.0}", + author = "Fabian Beuke", + url = {https://madnight.github.io/githut/#/2022/4}, +} + +@misc{docs-python:keywords, + title = "{Python Documentation}", + url = {https://docs.python.org/3.10/reference/lexical_analysis.html#keywords}, +} + +@misc{python-usage, + title = "Top 10 Python Uses for 2022", + author = "Yancy Dennis", + url = {https://python.plainenglish.io/top-10-python-uses-for-2022-a10cbfb5f041}, + urldate = {2022.1.24}, +} + +@misc{realpython:install-and-setup, + title = "Python 3 Installation & Setup Guide", + author = "{Real Python}", + url = {https://realpython.com/installing-python/}, + urldate = {2020.8.31}, +} + +@misc{realpython:interact, + title = "Interacting with Python", + author = "John Sturtz", + url = {https://realpython.com/interacting-with-python/}, + urldate = {2018.5.28}, +} + +@misc{realpython:code-edit, + title = "Python IDEs and Code Editors (Guide)", + author = "Jon Fincher", + url = {https://realpython.com/python-ides-code-editors-guide/}, + urldata = {2018.3.13}, +} + +@misc{docs-python:operator-precedence, + title = "{Python Documentation}", + url = {https://docs.python.org/3/reference/expressions.html#operator-precedence}, +} + +@misc{docs-python:printf-formating, + title = "{Python Documentation}", + url = {https://docs.python.org/3/library/stdtypes.html#printf-style-string-formatting}, +}