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 index 050679cb3..0234fb152 100644 --- a/Makefile +++ b/Makefile @@ -19,6 +19,8 @@ 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)" 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/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/aggregate-function.svg b/assets/img/aggregate-function.svg new file mode 100644 index 000000000..f1cae6e44 --- /dev/null +++ b/assets/img/aggregate-function.svg @@ -0,0 +1,78 @@ + + + + + + + aggregate-func + + + + ( + + + + + + DISTINCT + + + + + + + + expr + + + + ) + + + + filter-clause + + + + + + + + + + + + + , + + + + + + * + + + + + + + + + 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/assets/sql/products.pg13-1.dump.sql b/assets/sql/products.pg13-1.dump.sql new file mode 100644 index 000000000..b7ff37b33 --- /dev/null +++ b/assets/sql/products.pg13-1.dump.sql @@ -0,0 +1,103 @@ +-- +-- PostgreSQL database dump +-- + +-- Dumped from database version 13.1 (Debian 13.1-1.pgdg100+1) +-- Dumped by pg_dump version 14.5 + +SET statement_timeout = 0; +SET lock_timeout = 0; +SET idle_in_transaction_session_timeout = 0; +SET client_encoding = 'UTF8'; +SET standard_conforming_strings = on; +SELECT pg_catalog.set_config('search_path', '', false); +SET check_function_bodies = false; +SET xmloption = content; +SET client_min_messages = warning; +SET row_security = off; + +SET default_tablespace = ''; + +SET default_table_access_method = heap; + +-- +-- Name: product; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.product ( + id integer NOT NULL, + name text NOT NULL, + price integer NOT NULL, + category text NOT NULL, + sold integer NOT NULL +); + + +ALTER TABLE public.product OWNER TO postgres; + +-- +-- Name: product_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres +-- + +CREATE SEQUENCE public.product_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE public.product_id_seq OWNER TO postgres; + +-- +-- Name: product_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: postgres +-- + +ALTER SEQUENCE public.product_id_seq OWNED BY public.product.id; + + +-- +-- Name: product id; Type: DEFAULT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.product ALTER COLUMN id SET DEFAULT nextval('public.product_id_seq'::regclass); + + +-- +-- Data for Name: product; Type: TABLE DATA; Schema: public; Owner: postgres +-- + +COPY public.product (id, name, price, category, sold) FROM stdin; +1 Samsung Galaxy 100000 Phones 500 +2 iPhone 13 Pro 120000 Phones 300 +3 MacBook Pro 350000 Laptops 100 +4 Lenovo ThinkPad 150000 Laptops 200 +5 HP Printer 20000 Printers 800 +6 Dell Monitor 50000 Monitors 400 +7 Sony Headphones 30000 Audio 0 +8 Bose Soundbar 70000 Audio 0 +9 Xbox Series X 60000 Gaming 250 +10 PlayStation 5 55000 Gaming 350 +\. + + +-- +-- Name: product_id_seq; Type: SEQUENCE SET; Schema: public; Owner: postgres +-- + +SELECT pg_catalog.setval('public.product_id_seq', 10, true); + + +-- +-- Name: product product_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.product + ADD CONSTRAINT product_pkey PRIMARY KEY (id); + + +-- +-- PostgreSQL database dump complete +-- + 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 index 7cea65c27..7a858d484 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,40 +1,125 @@ +# This file is automatically @generated by Poetry 1.4.0 and should not be changed by hand. + [[package]] name = "alabaster" -version = "0.7.12" +version = "0.7.13" description = "A configurable sidebar-enabled Sphinx theme" category = "main" optional = false -python-versions = "*" +python-versions = ">=3.6" +files = [ + {file = "alabaster-0.7.13-py3-none-any.whl", hash = "sha256:1ee19aca801bbabb5ba3f5f258e4422dfa86f82f3e9cefb0859b283cdd7f62a3"}, + {file = "alabaster-0.7.13.tar.gz", hash = "sha256:a27a4a084d5e690e16e01e03ad2b2e552c61a65469419b907243193de1a84ae2"}, +] [[package]] name = "babel" -version = "2.11.0" +version = "2.12.1" description = "Internationalization utilities" category = "main" optional = false -python-versions = ">=3.6" - -[package.dependencies] -pytz = ">=2015.7" +python-versions = ">=3.7" +files = [ + {file = "Babel-2.12.1-py3-none-any.whl", hash = "sha256:b4246fb7677d3b98f501a39d43396d3cafdc8eadb045f4a31be01863f655c610"}, + {file = "Babel-2.12.1.tar.gz", hash = "sha256:cc2d99999cd01d44420ae725a21c9e3711b3aadc7976d6147f622d8581963455"}, +] [[package]] name = "certifi" -version = "2022.9.24" +version = "2022.12.7" description = "Python package for providing Mozilla's CA Bundle." category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "certifi-2022.12.7-py3-none-any.whl", hash = "sha256:4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18"}, + {file = "certifi-2022.12.7.tar.gz", hash = "sha256:35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3"}, +] [[package]] name = "charset-normalizer" -version = "2.1.1" +version = "3.1.0" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." category = "main" optional = false -python-versions = ">=3.6.0" - -[package.extras] -unicode_backport = ["unicodedata2"] +python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.1.0.tar.gz", hash = "sha256:34e0a2f9c370eb95597aae63bf85eb5e96826d81e3dcf88b8886012906f509b5"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e0ac8959c929593fee38da1c2b64ee9778733cdf03c482c9ff1d508b6b593b2b"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d7fc3fca01da18fbabe4625d64bb612b533533ed10045a2ac3dd194bfa656b60"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:04eefcee095f58eaabe6dc3cc2262f3bcd776d2c67005880894f447b3f2cb9c1"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20064ead0717cf9a73a6d1e779b23d149b53daf971169289ed2ed43a71e8d3b0"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1435ae15108b1cb6fffbcea2af3d468683b7afed0169ad718451f8db5d1aff6f"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c84132a54c750fda57729d1e2599bb598f5fa0344085dbde5003ba429a4798c0"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75f2568b4189dda1c567339b48cba4ac7384accb9c2a7ed655cd86b04055c795"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11d3bcb7be35e7b1bba2c23beedac81ee893ac9871d0ba79effc7fc01167db6c"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:891cf9b48776b5c61c700b55a598621fdb7b1e301a550365571e9624f270c203"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:5f008525e02908b20e04707a4f704cd286d94718f48bb33edddc7d7b584dddc1"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:b06f0d3bf045158d2fb8837c5785fe9ff9b8c93358be64461a1089f5da983137"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:49919f8400b5e49e961f320c735388ee686a62327e773fa5b3ce6721f7e785ce"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:22908891a380d50738e1f978667536f6c6b526a2064156203d418f4856d6e86a"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-win32.whl", hash = "sha256:12d1a39aa6b8c6f6248bb54550efcc1c38ce0d8096a146638fd4738e42284448"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:65ed923f84a6844de5fd29726b888e58c62820e0769b76565480e1fdc3d062f8"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9a3267620866c9d17b959a84dd0bd2d45719b817245e49371ead79ed4f710d19"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6734e606355834f13445b6adc38b53c0fd45f1a56a9ba06c2058f86893ae8017"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f8303414c7b03f794347ad062c0516cee0e15f7a612abd0ce1e25caf6ceb47df"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf53a6cebad0eae578f062c7d462155eada9c172bd8c4d250b8c1d8eb7f916a"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3dc5b6a8ecfdc5748a7e429782598e4f17ef378e3e272eeb1340ea57c9109f41"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e1b25e3ad6c909f398df8921780d6a3d120d8c09466720226fc621605b6f92b1"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ca564606d2caafb0abe6d1b5311c2649e8071eb241b2d64e75a0d0065107e62"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b82fab78e0b1329e183a65260581de4375f619167478dddab510c6c6fb04d9b6"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bd7163182133c0c7701b25e604cf1611c0d87712e56e88e7ee5d72deab3e76b5"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:11d117e6c63e8f495412d37e7dc2e2fff09c34b2d09dbe2bee3c6229577818be"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:cf6511efa4801b9b38dc5546d7547d5b5c6ef4b081c60b23e4d941d0eba9cbeb"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:abc1185d79f47c0a7aaf7e2412a0eb2c03b724581139193d2d82b3ad8cbb00ac"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cb7b2ab0188829593b9de646545175547a70d9a6e2b63bf2cd87a0a391599324"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-win32.whl", hash = "sha256:c36bcbc0d5174a80d6cccf43a0ecaca44e81d25be4b7f90f0ed7bcfbb5a00909"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:cca4def576f47a09a943666b8f829606bcb17e2bc2d5911a46c8f8da45f56755"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0c95f12b74681e9ae127728f7e5409cbbef9cd914d5896ef238cc779b8152373"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fca62a8301b605b954ad2e9c3666f9d97f63872aa4efcae5492baca2056b74ab"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac0aa6cd53ab9a31d397f8303f92c42f534693528fafbdb997c82bae6e477ad9"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3af8e0f07399d3176b179f2e2634c3ce9c1301379a6b8c9c9aeecd481da494f"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a5fc78f9e3f501a1614a98f7c54d3969f3ad9bba8ba3d9b438c3bc5d047dd28"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:628c985afb2c7d27a4800bfb609e03985aaecb42f955049957814e0491d4006d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:74db0052d985cf37fa111828d0dd230776ac99c740e1a758ad99094be4f1803d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1e8fcdd8f672a1c4fc8d0bd3a2b576b152d2a349782d1eb0f6b8e52e9954731d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:04afa6387e2b282cf78ff3dbce20f0cc071c12dc8f685bd40960cc68644cfea6"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:dd5653e67b149503c68c4018bf07e42eeed6b4e956b24c00ccdf93ac79cdff84"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d2686f91611f9e17f4548dbf050e75b079bbc2a82be565832bc8ea9047b61c8c"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-win32.whl", hash = "sha256:4155b51ae05ed47199dc5b2a4e62abccb274cee6b01da5b895099b61b1982974"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:322102cdf1ab682ecc7d9b1c5eed4ec59657a65e1c146a0da342b78f4112db23"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e633940f28c1e913615fd624fcdd72fdba807bf53ea6925d6a588e84e1151531"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3a06f32c9634a8705f4ca9946d667609f52cf130d5548881401f1eb2c39b1e2c"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7381c66e0561c5757ffe616af869b916c8b4e42b367ab29fedc98481d1e74e14"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3573d376454d956553c356df45bb824262c397c6e26ce43e8203c4c540ee0acb"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e89df2958e5159b811af9ff0f92614dabf4ff617c03a4c1c6ff53bf1c399e0e1"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:78cacd03e79d009d95635e7d6ff12c21eb89b894c354bd2b2ed0b4763373693b"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de5695a6f1d8340b12a5d6d4484290ee74d61e467c39ff03b39e30df62cf83a0"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c60b9c202d00052183c9be85e5eaf18a4ada0a47d188a83c8f5c5b23252f649"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f645caaf0008bacf349875a974220f1f1da349c5dbe7c4ec93048cdc785a3326"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ea9f9c6034ea2d93d9147818f17c2a0860d41b71c38b9ce4d55f21b6f9165a11"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:80d1543d58bd3d6c271b66abf454d437a438dff01c3e62fdbcd68f2a11310d4b"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:73dc03a6a7e30b7edc5b01b601e53e7fc924b04e1835e8e407c12c037e81adbd"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6f5c2e7bc8a4bf7c426599765b1bd33217ec84023033672c1e9a8b35eaeaaaf8"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-win32.whl", hash = "sha256:12a2b561af122e3d94cdb97fe6fb2bb2b82cef0cdca131646fdb940a1eda04f0"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:3160a0fd9754aab7d47f95a6b63ab355388d890163eb03b2d2b87ab0a30cfa59"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:38e812a197bf8e71a59fe55b757a84c1f946d0ac114acafaafaf21667a7e169e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6baf0baf0d5d265fa7944feb9f7451cc316bfe30e8df1a61b1bb08577c554f31"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8f25e17ab3039b05f762b0a55ae0b3632b2e073d9c8fc88e89aca31a6198e88f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3747443b6a904001473370d7810aa19c3a180ccd52a7157aacc264a5ac79265e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b116502087ce8a6b7a5f1814568ccbd0e9f6cfd99948aa59b0e241dc57cf739f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d16fd5252f883eb074ca55cb622bc0bee49b979ae4e8639fff6ca3ff44f9f854"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fa558996782fc226b529fdd2ed7866c2c6ec91cee82735c98a197fae39f706"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6f6c7a8a57e9405cad7485f4c9d3172ae486cfef1344b5ddd8e5239582d7355e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ac3775e3311661d4adace3697a52ac0bab17edd166087d493b52d4f4f553f9f0"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:10c93628d7497c81686e8e5e557aafa78f230cd9e77dd0c40032ef90c18f2230"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:6f4f4668e1831850ebcc2fd0b1cd11721947b6dc7c00bf1c6bd3c929ae14f2c7"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:0be65ccf618c1e7ac9b849c315cc2e8a8751d9cfdaa43027d4f6624bd587ab7e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:53d0a3fa5f8af98a1e261de6a3943ca631c526635eb5817a87a59d9a57ebf48f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-win32.whl", hash = "sha256:a04f86f41a8916fe45ac5024ec477f41f886b3c435da2d4e3d2709b22ab02af1"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:830d2948a5ec37c386d3170c483063798d7879037492540f10a475e3fd6f244b"}, + {file = "charset_normalizer-3.1.0-py3-none-any.whl", hash = "sha256:3d9098b479e78c85080c98e1e35ff40b4a31d8953102bb0fd7d1b6f8a2111a3d"}, +] [[package]] name = "click" @@ -43,6 +128,10 @@ description = "Composable command line interface toolkit" category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, + {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, +] [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} @@ -54,14 +143,22 @@ 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" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] [[package]] name = "docutils" -version = "0.17.1" +version = "0.18.1" description = "Docutils -- Python Documentation Utilities" category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "docutils-0.18.1-py2.py3-none-any.whl", hash = "sha256:23010f129180089fbcd3bc08cfefccb3b890b0050e1ca00c867036e9d161b98c"}, + {file = "docutils-0.18.1.tar.gz", hash = "sha256:679987caf361a7539d76e584cbeddc311e3aee937877c87346f31debc63e9d06"}, +] [[package]] name = "idna" @@ -70,6 +167,10 @@ description = "Internationalized Domain Names in Applications (IDNA)" category = "main" optional = false python-versions = ">=3.5" +files = [ + {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, + {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, +] [[package]] name = "imagesize" @@ -78,22 +179,30 @@ 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.*" +files = [ + {file = "imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b"}, + {file = "imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a"}, +] [[package]] name = "importlib-metadata" -version = "5.0.0" +version = "6.1.0" description = "Read metadata from Python packages" category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "importlib_metadata-6.1.0-py3-none-any.whl", hash = "sha256:ff80f3b5394912eb1b108fcfd444dc78b7f1f3e16b16188054bd01cb9cb86f09"}, + {file = "importlib_metadata-6.1.0.tar.gz", hash = "sha256:43ce9281e097583d758c2c708c4376371261a02c34682491a8e98352365aad20"}, +] [package.dependencies] zipp = ">=0.5" [package.extras] -docs = ["sphinx (>=3.5)", "jaraco.packaging (>=9)", "rst.linker (>=1.9)", "furo", "jaraco.tidelift (>=1.4)"] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] perf = ["ipython"] -testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "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)", "importlib-resources (>=1.3)"] +testing = ["flake8 (<5)", "flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)"] [[package]] name = "jinja2" @@ -102,6 +211,10 @@ description = "A very fast and expressive template engine." category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, + {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, +] [package.dependencies] MarkupSafe = ">=2.0" @@ -109,48 +222,123 @@ 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.*" +files = [ + {file = "latexcodec-2.0.1-py2.py3-none-any.whl", hash = "sha256:c277a193638dc7683c4c30f6684e3db728a06efb0dc9cf346db8bd0aa6c5d271"}, + {file = "latexcodec-2.0.1.tar.gz", hash = "sha256:2aa2551c373261cefe2ad3a8953a6d6533e68238d180eb4bb91d7964adb3fe9a"}, +] + +[package.dependencies] +six = ">=1.4.1" + [[package]] name = "markdown-it-py" -version = "2.1.0" +version = "2.2.0" description = "Python port of markdown-it. Markdown parsing, done right!" category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "markdown-it-py-2.2.0.tar.gz", hash = "sha256:7c9a5e412688bc771c67432cbfebcdd686c93ce6484913dccf06cb5a0bea35a1"}, + {file = "markdown_it_py-2.2.0-py3-none-any.whl", hash = "sha256:5a35f8d1870171d9acc47b99612dc146129b631baf04970128b568f190d0cc30"}, +] [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"] +benchmarking = ["psutil", "pytest", "pytest-benchmark"] +code-style = ["pre-commit (>=3.0,<4.0)"] +compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "mistletoe (>=1.0,<2.0)", "mistune (>=2.0,<3.0)", "panflute (>=2.3,<3.0)"] +linkify = ["linkify-it-py (>=1,<3)"] 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"] +profiling = ["gprof2dot"] +rtd = ["attrs", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] +testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] [[package]] name = "markupsafe" -version = "2.1.1" +version = "2.1.2" description = "Safely add untrusted strings to HTML/XML markup." category = "main" optional = false python-versions = ">=3.7" +files = [ + {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"}, +] [[package]] name = "mdit-py-plugins" -version = "0.3.1" +version = "0.3.5" description = "Collection of plugins for markdown-it-py" category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "mdit-py-plugins-0.3.5.tar.gz", hash = "sha256:eee0adc7195e5827e17e02d2a258a2ba159944a0748f59c5099a4a27f78fcf6a"}, + {file = "mdit_py_plugins-0.3.5-py3-none-any.whl", hash = "sha256:ca9a0714ea59a24b2b044a1831f48d817dd0c817e84339f20e7889f392d77c4e"}, +] [package.dependencies] markdown-it-py = ">=1.0.0,<3.0.0" [package.extras] -code_style = ["pre-commit"] +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"] @@ -161,70 +349,100 @@ description = "Markdown URL utilities" category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, + {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, +] [[package]] name = "myst-parser" -version = "0.18.1" -description = "An extended commonmark compliant parser, with bridges to docutils & sphinx." +version = "1.0.0" +description = "An extended [CommonMark](https://spec.commonmark.org/) compliant parser," category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "myst-parser-1.0.0.tar.gz", hash = "sha256:502845659313099542bd38a2ae62f01360e7dd4b1310f025dd014dfc0439cdae"}, + {file = "myst_parser-1.0.0-py3-none-any.whl", hash = "sha256:69fb40a586c6fa68995e6521ac0a525793935db7e724ca9bac1d33be51be9a4c"}, +] [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" +mdit-py-plugins = ">=0.3.4,<0.4.0" pyyaml = "*" -sphinx = ">=4,<6" -typing-extensions = "*" +sphinx = ">=5,<7" [package.extras] -code_style = ["pre-commit (>=2.12,<3.0)"] +code-style = ["pre-commit (>=3.0,<4.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)"] +rtd = ["ipython", "pydata-sphinx-theme (==v0.13.0rc4)", "sphinx-autodoc2 (>=0.4.2,<0.5.0)", "sphinx-book-theme (==1.0.0rc2)", "sphinx-copybutton", "sphinx-design2", "sphinx-pyscript", "sphinx-tippy (>=0.3.1)", "sphinx-togglebutton", "sphinxext-opengraph (>=0.7.5,<0.8.0)", "sphinxext-rediraffe (>=0.2.7,<0.3.0)"] +testing = ["beautifulsoup4", "coverage[toml]", "pytest (>=7,<8)", "pytest-cov", "pytest-param-files (>=0.3.4,<0.4.0)", "pytest-regressions", "sphinx-pytest"] +testing-docutils = ["pygments", "pytest (>=7,<8)", "pytest-param-files (>=0.3.4,<0.4.0)"] [[package]] name = "packaging" -version = "21.3" +version = "23.0" description = "Core utilities for Python packages" category = "main" optional = false -python-versions = ">=3.6" - -[package.dependencies] -pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" +python-versions = ">=3.7" +files = [ + {file = "packaging-23.0-py3-none-any.whl", hash = "sha256:714ac14496c3e68c99c29b00845f7a2b85f3bb6f1078fd9f72fd20f0570002b2"}, + {file = "packaging-23.0.tar.gz", hash = "sha256:b6ad297f8907de0fa2fe1ccbd26fdaf387f5f47c7275fedf8cce89f99446cf97"}, +] [[package]] -name = "pygments" -version = "2.13.0" -description = "Pygments is a syntax highlighting package written in Python." +name = "pybtex" +version = "0.24.0" +description = "A BibTeX-compatible bibliography processor in Python" category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*" +files = [ + {file = "pybtex-0.24.0-py2.py3-none-any.whl", hash = "sha256:e1e0c8c69998452fea90e9179aa2a98ab103f3eed894405b7264e517cc2fcc0f"}, + {file = "pybtex-0.24.0.tar.gz", hash = "sha256:818eae35b61733e5c007c3fcd2cfb75ed1bc8b4173c1f70b56cc4c0802d34755"}, +] + +[package.dependencies] +latexcodec = ">=1.0.4" +PyYAML = ">=3.01" +six = "*" [package.extras] -plugins = ["importlib-metadata"] +test = ["pytest"] [[package]] -name = "pyparsing" -version = "3.0.9" -description = "pyparsing module - Classes and methods to define and execute parsing grammars" +name = "pybtex-docutils" +version = "1.0.2" +description = "A docutils backend for pybtex." category = "main" optional = false -python-versions = ">=3.6.8" +python-versions = ">=3.6" +files = [ + {file = "pybtex-docutils-1.0.2.tar.gz", hash = "sha256:43aa353b6d498fd5ac30f0073a98e332d061d34fe619d3d50d1761f8fd4aa016"}, + {file = "pybtex_docutils-1.0.2-py3-none-any.whl", hash = "sha256:6f9e3c25a37bcaac8c4f69513272706ec6253bb708a93d8b4b173f43915ba239"}, +] -[package.extras] -diagrams = ["railroad-diagrams", "jinja2"] +[package.dependencies] +docutils = ">=0.8" +pybtex = ">=0.16" [[package]] -name = "pytz" -version = "2022.6" -description = "World timezone definitions, modern and historical" +name = "pygments" +version = "2.14.0" +description = "Pygments is a syntax highlighting package written in Python." category = "main" optional = false -python-versions = "*" +python-versions = ">=3.6" +files = [ + {file = "Pygments-2.14.0-py3-none-any.whl", hash = "sha256:fa7bd7bd2771287c0de303af8bfdfc731f51bd2c6a47ab69d117138893b82717"}, + {file = "Pygments-2.14.0.tar.gz", hash = "sha256:b3ed06a9e8ac9a9aae5a6f5dbe78a8a58655d17b43b93c078f094ddc476ae297"}, +] + +[package.extras] +plugins = ["importlib-metadata"] [[package]] name = "pyyaml" @@ -233,24 +451,99 @@ description = "YAML parser and emitter for Python" category = "main" optional = false python-versions = ">=3.6" +files = [ + {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-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358"}, + {file = "PyYAML-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782"}, + {file = "PyYAML-6.0-cp311-cp311-win32.whl", hash = "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7"}, + {file = "PyYAML-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf"}, + {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"}, +] [[package]] name = "requests" -version = "2.28.1" +version = "2.28.2" description = "Python HTTP for Humans." category = "main" optional = false python-versions = ">=3.7, <4" +files = [ + {file = "requests-2.28.2-py3-none-any.whl", hash = "sha256:64299f4909223da747622c030b781c0d7811e359c37124b4bd368fb8c6518baa"}, + {file = "requests-2.28.2.tar.gz", hash = "sha256:98b1b2782e3c6c4904938b84c0eb932721069dfdb9134313beff7c83c2df24bf"}, +] [package.dependencies] certifi = ">=2017.4.17" -charset-normalizer = ">=2,<3" +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)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "setuptools" +version = "67.6.0" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "setuptools-67.6.0-py3-none-any.whl", hash = "sha256:b78aaa36f6b90a074c1fa651168723acbf45d14cb1196b6f02c0fd07f17623b2"}, + {file = "setuptools-67.6.0.tar.gz", hash = "sha256:2ee892cd5f29f3373097f5a814697e397cf3ce313616df0af11231e2ad118077"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8 (<5)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] + +[[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.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] [[package]] name = "snowballstemmer" @@ -259,26 +552,34 @@ description = "This package provides 29 stemmers for 28 languages generated from category = "main" optional = false python-versions = "*" +files = [ + {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"}, + {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"}, +] [[package]] name = "sphinx" -version = "5.3.0" +version = "6.1.3" description = "Python documentation generator" category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" +files = [ + {file = "Sphinx-6.1.3.tar.gz", hash = "sha256:0dac3b698538ffef41716cf97ba26c1c7788dba73ce6f150c1ff5b4720786dd2"}, + {file = "sphinx-6.1.3-py3-none-any.whl", hash = "sha256:807d1cb3d6be87eb78a381c3e70ebd8d346b9a25f3753e9947e866b2786865fc"}, +] [package.dependencies] alabaster = ">=0.7,<0.8" babel = ">=2.9" colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} -docutils = ">=0.14,<0.20" +docutils = ">=0.18,<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" +Pygments = ">=2.13" +requests = ">=2.25.0" snowballstemmer = ">=2.0" sphinxcontrib-applehelp = "*" sphinxcontrib-devhelp = "*" @@ -289,52 +590,84 @@ 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"] +lint = ["docutils-stubs", "flake8 (>=3.5.0)", "flake8-simplify", "isort", "mypy (>=0.990)", "ruff", "sphinx-lint", "types-requests"] +test = ["cython", "html5lib", "pytest (>=4.6)"] [[package]] name = "sphinx-intl" -version = "2.0.1" +version = "2.1.0" description = "Sphinx utility that make it easy to translate and to apply translation." category = "main" optional = false -python-versions = ">=3.5" +python-versions = ">=3.7" +files = [ + {file = "sphinx-intl-2.1.0.tar.gz", hash = "sha256:9d9849ae42515b39786824e99f1e30db0404c377b01bb022690fc932b0221c02"}, + {file = "sphinx_intl-2.1.0-py3-none-any.whl", hash = "sha256:9798946b995989de691387651d70c3fc191275b587e2e519655541edfd7bbd68"}, +] [package.dependencies] babel = "*" click = "*" +setuptools = "*" sphinx = "*" [package.extras] -test = ["pytest", "mock"] -transifex = ["transifex_client (>=0.11)"] +test = ["mock", "pytest", "six"] [[package]] name = "sphinx-rtd-theme" -version = "1.1.1" +version = "1.2.0" description = "Read the Docs theme for Sphinx" category = "main" optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +files = [ + {file = "sphinx_rtd_theme-1.2.0-py2.py3-none-any.whl", hash = "sha256:f823f7e71890abe0ac6aaa6013361ea2696fc8d3e1fa798f463e82bdb77eeff2"}, + {file = "sphinx_rtd_theme-1.2.0.tar.gz", hash = "sha256:a0d8bd1a2ed52e0b338cbe19c4b2eef3c5e7a048769753dac6a9f059c7b641b8"}, +] [package.dependencies] -docutils = "<0.18" -sphinx = ">=1.6,<6" +docutils = "<0.19" +sphinx = ">=1.6,<7" +sphinxcontrib-jquery = {version = ">=2.0.0,<3.0.0 || >3.0.0", markers = "python_version > \"3\""} [package.extras] -dev = ["transifex-client", "sphinxcontrib-httpdomain", "bump2version", "wheel"] +dev = ["bump2version", "sphinxcontrib-httpdomain", "transifex-client", "wheel"] [[package]] name = "sphinxcontrib-applehelp" -version = "1.0.2" -description = "sphinxcontrib-applehelp is a sphinx extension which outputs Apple help books" +version = "1.0.4" +description = "sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books" category = "main" optional = false -python-versions = ">=3.5" +python-versions = ">=3.8" +files = [ + {file = "sphinxcontrib-applehelp-1.0.4.tar.gz", hash = "sha256:828f867945bbe39817c210a1abfd1bc4895c8b73fcaade56d45357a348a07d7e"}, + {file = "sphinxcontrib_applehelp-1.0.4-py3-none-any.whl", hash = "sha256:29d341f67fb0f6f586b23ad80e072c8e6ad0b48417db2bde114a4c9746feb228"}, +] [package.extras] +lint = ["docutils-stubs", "flake8", "mypy"] test = ["pytest"] -lint = ["docutils-stubs", "mypy", "flake8"] + +[[package]] +name = "sphinxcontrib-bibtex" +version = "2.5.0" +description = "Sphinx extension for BibTeX style citations." +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "sphinxcontrib-bibtex-2.5.0.tar.gz", hash = "sha256:71b42e5db0e2e284f243875326bf9936aa9a763282277d75048826fef5b00eaa"}, + {file = "sphinxcontrib_bibtex-2.5.0-py3-none-any.whl", hash = "sha256:748f726eaca6efff7731012103417ef130ecdcc09501b4d0c54283bf5f059f76"}, +] + +[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" @@ -343,22 +676,45 @@ description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp category = "main" optional = false python-versions = ">=3.5" +files = [ + {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"}, +] [package.extras] +lint = ["docutils-stubs", "flake8", "mypy"] test = ["pytest"] -lint = ["docutils-stubs", "mypy", "flake8"] [[package]] name = "sphinxcontrib-htmlhelp" -version = "2.0.0" +version = "2.0.1" description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" +files = [ + {file = "sphinxcontrib-htmlhelp-2.0.1.tar.gz", hash = "sha256:0cbdd302815330058422b98a113195c9249825d681e18f11e8b1f78a2f11efff"}, + {file = "sphinxcontrib_htmlhelp-2.0.1-py3-none-any.whl", hash = "sha256:c38cb46dccf316c79de6e5515e1770414b797162b23cd3d06e67020e1d2a6903"}, +] [package.extras] +lint = ["docutils-stubs", "flake8", "mypy"] test = ["html5lib", "pytest"] -lint = ["docutils-stubs", "mypy", "flake8"] + +[[package]] +name = "sphinxcontrib-jquery" +version = "4.1" +description = "Extension to include jQuery on newer Sphinx releases" +category = "main" +optional = false +python-versions = ">=2.7" +files = [ + {file = "sphinxcontrib-jquery-4.1.tar.gz", hash = "sha256:1620739f04e36a2c779f1a131a2dfd49b2fd07351bf1968ced074365933abc7a"}, + {file = "sphinxcontrib_jquery-4.1-py2.py3-none-any.whl", hash = "sha256:f936030d7d0147dd026a4f2b5a57343d233f1fc7b363f68b3d4f1cb0993878ae"}, +] + +[package.dependencies] +Sphinx = ">=1.8" [[package]] name = "sphinxcontrib-jsmath" @@ -367,9 +723,25 @@ description = "A sphinx extension which renders display math in HTML via JavaScr category = "main" optional = false python-versions = ">=3.5" +files = [ + {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"}, +] [package.extras] -test = ["mypy", "flake8", "pytest"] +test = ["flake8", "mypy", "pytest"] + +[[package]] +name = "sphinxcontrib-mermaid" +version = "0.8.1" +description = "Mermaid diagrams in yours Sphinx powered docs" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "sphinxcontrib-mermaid-0.8.1.tar.gz", hash = "sha256:fa3e5325d4ba395336e6137d113f55026b1a03ccd115dc54113d1d871a580466"}, + {file = "sphinxcontrib_mermaid-0.8.1-py3-none-any.whl", hash = "sha256:15491c24ec78cf1626b1e79e797a9ce87cb7959cf38f955eb72dd5512aeb6ce9"}, +] [[package]] name = "sphinxcontrib-qthelp" @@ -378,10 +750,14 @@ description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp d category = "main" optional = false python-versions = ">=3.5" +files = [ + {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"}, +] [package.extras] +lint = ["docutils-stubs", "flake8", "mypy"] test = ["pytest"] -lint = ["docutils-stubs", "mypy", "flake8"] [[package]] name = "sphinxcontrib-serializinghtml" @@ -390,256 +766,49 @@ description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs category = "main" optional = false python-versions = ">=3.5" +files = [ + {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"}, +] [package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] +lint = ["docutils-stubs", "flake8", "mypy"] 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.12" +version = "1.26.15" 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.*, <4" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +files = [ + {file = "urllib3-1.26.15-py2.py3-none-any.whl", hash = "sha256:aa751d169e23c7479ce47a0cb0da579e3ede798f994f5816a74e4f4500dcea42"}, + {file = "urllib3-1.26.15.tar.gz", hash = "sha256:8a388717b9476f934a21484e8c8e61875ab60644d29b9b39e11e4b9dc1c6b305"}, +] [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"] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] +secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] [[package]] name = "zipp" -version = "3.10.0" +version = "3.15.0" description = "Backport of pathlib-compatible object wrapper for zip files" category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "zipp-3.15.0-py3-none-any.whl", hash = "sha256:48904fc76a60e542af151aded95726c1a5c34ed43ab4134b597665c86d7ad556"}, + {file = "zipp-3.15.0.tar.gz", hash = "sha256:112929ad649da941c23de50f356a2b5570c954b65150642bccdd66bf194d224b"}, +] [package.extras] -docs = ["sphinx (>=3.5)", "jaraco.packaging (>=9)", "rst.linker (>=1.9)", "furo", "jaraco.tidelift (>=1.4)"] -testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "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)"] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] [metadata] -lock-version = "1.1" +lock-version = "2.0" python-versions = "^3.9" -content-hash = "51f6df5deeeab6ac6526e6be2fa9b37d26f6d30651d3d4f7ee661b97d456fecb" - -[metadata.files] -alabaster = [ - {file = "alabaster-0.7.12-py2.py3-none-any.whl", hash = "sha256:446438bdcca0e05bd45ea2de1668c1d9b032e1a9154c2c259092d77031ddd359"}, - {file = "alabaster-0.7.12.tar.gz", hash = "sha256:a661d72d58e6ea8a57f7a86e37d86716863ee5e92788398526d58b26a4e4dc02"}, -] -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.9.24-py3-none-any.whl", hash = "sha256:90c1a32f1d68f940488354e36370f6cca89f0f106db09518524c88d6ed83f382"}, - {file = "certifi-2022.9.24.tar.gz", hash = "sha256:0d9c601124e5a6ba9712dbc60d9c53c21e34f5f641fe83002317394311bdce14"}, -] -charset-normalizer = [ - {file = "charset-normalizer-2.1.1.tar.gz", hash = "sha256:5a3d016c7c547f69d6f81fb0db9449ce888b418b5b9952cc5e6e66843e9dd845"}, - {file = "charset_normalizer-2.1.1-py3-none-any.whl", hash = "sha256:83e9a75d1911279afd89352c68b45348559d1fc0506b054b346651b5e7fee29f"}, -] -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-5.0.0-py3-none-any.whl", hash = "sha256:ddb0e35065e8938f867ed4928d0ae5bf2a53b7773871bfe6bcc7e4fcdc7dea43"}, - {file = "importlib_metadata-5.0.0.tar.gz", hash = "sha256:da31db32b304314d044d3c12c79bd59e307889b287ad12ff387b3500835fc2ab"}, -] -jinja2 = [ - {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, - {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, -] -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.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c1bfff05d95783da83491be968e8fe789263689c02724e0c691933c52994f5"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7bd98b796e2b6553da7225aeb61f447f80a1ca64f41d83612e6139ca5213aa4"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b09bf97215625a311f669476f44b8b318b075847b49316d3e28c08e41a7a573f"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:694deca8d702d5db21ec83983ce0bb4b26a578e71fbdbd4fdcd387daa90e4d5e"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:efc1913fd2ca4f334418481c7e595c00aad186563bbc1ec76067848c7ca0a933"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-win32.whl", hash = "sha256:4a33dea2b688b3190ee12bd7cfa29d39c9ed176bda40bfa11099a3ce5d3a7ac6"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:dda30ba7e87fbbb7eab1ec9f58678558fd9a6b8b853530e176eabd064da81417"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:671cd1187ed5e62818414afe79ed29da836dde67166a9fac6d435873c44fdd02"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3799351e2336dc91ea70b034983ee71cf2f9533cdff7c14c90ea126bfd95d65a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e72591e9ecd94d7feb70c1cbd7be7b3ebea3f548870aa91e2732960fa4d57a37"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6fbf47b5d3728c6aea2abb0589b5d30459e369baa772e0f37a0320185e87c980"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d5ee4f386140395a2c818d149221149c54849dfcfcb9f1debfe07a8b8bd63f9a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bcb3ed405ed3222f9904899563d6fc492ff75cce56cba05e32eff40e6acbeaa3"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e1c0b87e09fa55a220f058d1d49d3fb8df88fbfab58558f1198e08c1e1de842a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-win32.whl", hash = "sha256:8dc1c72a69aa7e082593c4a203dcf94ddb74bb5c8a731e4e1eb68d031e8498ff"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:97a68e6ada378df82bc9f16b800ab77cbf4b2fada0081794318520138c088e4a"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8c843bbcda3a2f1e3c2ab25913c80a3c5376cd00c6e8c4a86a89a28c8dc5452"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e576a51ad59e4bfaac456023a78f6b5e6e7651dcd383bcc3e18d06f9b55d6d1"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b9fe39a2ccc108a4accc2676e77da025ce383c108593d65cc909add5c3bd601"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96e37a3dc86e80bf81758c152fe66dbf60ed5eca3d26305edf01892257049925"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6d0072fea50feec76a4c418096652f2c3238eaa014b2f94aeb1d56a66b41403f"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:089cf3dbf0cd6c100f02945abeb18484bd1ee57a079aefd52cffd17fba910b88"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6a074d34ee7a5ce3effbc526b7083ec9731bb3cbf921bbe1d3005d4d2bdb3a63"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-win32.whl", hash = "sha256:421be9fbf0ffe9ffd7a378aafebbf6f4602d564d34be190fc19a193232fd12b1"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e04e26803c9c3851c931eac40c695602c6295b8d432cbe78609649ad9bd2da8a"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b87db4360013327109564f0e591bd2a3b318547bcef31b468a92ee504d07ae4f"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99a2a507ed3ac881b975a2976d59f38c19386d128e7a9a18b7df6fff1fd4c1d6"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56442863ed2b06d19c37f94d999035e15ee982988920e12a5b4ba29b62ad1f77"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ce11ee3f23f79dbd06fb3d63e2f6af7b12db1d46932fe7bd8afa259a5996603"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:33b74d289bd2f5e527beadcaa3f401e0df0a89927c1559c8566c066fa4248ab7"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:43093fb83d8343aac0b1baa75516da6092f58f41200907ef92448ecab8825135"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8e3dcf21f367459434c18e71b2a9532d96547aef8a871872a5bd69a715c15f96"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-win32.whl", hash = "sha256:d4306c36ca495956b6d568d276ac11fdd9c30a36f1b6eb928070dc5360b22e1c"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247"}, - {file = "MarkupSafe-2.1.1.tar.gz", hash = "sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b"}, -] -mdit-py-plugins = [ - {file = "mdit-py-plugins-0.3.1.tar.gz", hash = "sha256:3fc13298497d6e04fe96efdd41281bfe7622152f9caa1815ea99b5c893de9441"}, - {file = "mdit_py_plugins-0.3.1-py3-none-any.whl", hash = "sha256:606a7f29cf56dbdfaf914acb21709b8f8ee29d857e8f29dcc33d8cb84c57bfa1"}, -] -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-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, - {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, -] -pygments = [ - {file = "Pygments-2.13.0-py3-none-any.whl", hash = "sha256:f643f331ab57ba3c9d89212ee4a2dabc6e94f117cf4eefde99a0574720d14c42"}, - {file = "Pygments-2.13.0.tar.gz", hash = "sha256:56a8508ae95f98e2b9bdf93a6be5ae3f7d8af858b43e02c5a2ff083726be40c1"}, -] -pyparsing = [ - {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, - {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, -] -pytz = [ - {file = "pytz-2022.6-py2.py3-none-any.whl", hash = "sha256:222439474e9c98fced559f1709d89e6c9cbf8d79c794ff3eb9f8800064291427"}, - {file = "pytz-2022.6.tar.gz", hash = "sha256:e89512406b793ca39f5971bc999cc538ce125c0e51c27941bef4568b460095e2"}, -] -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.1-py3-none-any.whl", hash = "sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349"}, - {file = "requests-2.28.1.tar.gz", hash = "sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983"}, -] -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.2.tar.gz", hash = "sha256:a072735ec80e7675e3f432fcae8610ecf509c5f1869d17e2eecff44389cdbc58"}, - {file = "sphinxcontrib_applehelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:806111e5e962be97c29ec4c1e7fe277bfd19e9652fb1a4392105b43e01af885a"}, -] -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.12-py2.py3-none-any.whl", hash = "sha256:b930dd878d5a8afb066a637fbb35144fe7901e3b209d1cd4f524bd0e9deee997"}, - {file = "urllib3-1.26.12.tar.gz", hash = "sha256:3fa96cf423e6987997fc326ae8df396db2a8b7c667747d47ddd8ecba91f4a74e"}, -] -zipp = [ - {file = "zipp-3.10.0-py3-none-any.whl", hash = "sha256:4fcb6f278987a6605757302a6e40e896257570d11c51628968ccb2a47e80c6c1"}, - {file = "zipp-3.10.0.tar.gz", hash = "sha256:7a7262fd930bd3e36c50b9a64897aec3fafff3dfdeec9623ae22b40e93f99bb8"}, -] +content-hash = "1a2e7b2d16a856baa85023359e142ff950911a5a26e41614c462053ddca4a8dd" 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 index f06c2f2e4..36544b23c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -33,10 +33,12 @@ classifiers = [ [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" +Sphinx = "^6.1.3" +sphinx-intl = "^2.1.0" +sphinx-rtd-theme = "^1.2.0" +myst-parser = "^1.0.0" +sphinxcontrib-bibtex = "^2.5.0" +sphinxcontrib-mermaid = "^0.8.1" [tool.poetry.dev-dependencies] diff --git a/requirements.txt b/requirements.txt index 8f533fbaf..1cb4a09e6 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,174 +1,40 @@ -alabaster==0.7.12; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.7" \ - --hash=sha256:446438bdcca0e05bd45ea2de1668c1d9b032e1a9154c2c259092d77031ddd359 \ - --hash=sha256:a661d72d58e6ea8a57f7a86e37d86716863ee5e92788398526d58b26a4e4dc02 -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" \ - --hash=sha256:1ad3eca1c885218f6dce2ab67291178944f810a10a9b5f3cb8382a5a232b64fe \ - --hash=sha256:5ef4b3226b0180dedded4229651c8b0e1a3a6a2837d45a073272f313e4cf97f6 -certifi==2022.9.24; python_version >= "3.7" and python_version < "4" \ - --hash=sha256:90c1a32f1d68f940488354e36370f6cca89f0f106db09518524c88d6ed83f382 \ - --hash=sha256:0d9c601124e5a6ba9712dbc60d9c53c21e34f5f641fe83002317394311bdce14 -charset-normalizer==2.1.1; python_version >= "3.7" and python_version < "4" and python_full_version >= "3.6.0" \ - --hash=sha256:5a3d016c7c547f69d6f81fb0db9449ce888b418b5b9952cc5e6e66843e9dd845 \ - --hash=sha256:83e9a75d1911279afd89352c68b45348559d1fc0506b054b346651b5e7fee29f -click==8.1.3; python_version >= "3.7" \ - --hash=sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48 \ - --hash=sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e -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") \ - --hash=sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6 \ - --hash=sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44 -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" \ - --hash=sha256:cf316c8370a737a022b72b56874f6602acf974a37a9fba42ec2876387549fc61 \ - --hash=sha256:686577d2e4c32380bb50cbb22f575ed742d58168cee37e99117a854bcd88f125 -idna==3.4; python_version >= "3.7" and python_version < "4" \ - --hash=sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2 \ - --hash=sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4 -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" \ - --hash=sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b \ - --hash=sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a -importlib-metadata==5.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") \ - --hash=sha256:ddb0e35065e8938f867ed4928d0ae5bf2a53b7773871bfe6bcc7e4fcdc7dea43 \ - --hash=sha256:da31db32b304314d044d3c12c79bd59e307889b287ad12ff387b3500835fc2ab -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" \ - --hash=sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61 \ - --hash=sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852 -markdown-it-py==2.1.0; python_version >= "3.7" \ - --hash=sha256:cf7e59fed14b5ae17c0006eff14a2d9a00ed5f3a846148153899a0224e2c07da \ - --hash=sha256:93de681e5c021a432c63147656fe21790bc01231e0cd2da73626f1aa3ac0fe27 -markupsafe==2.1.1; python_version >= "3.7" \ - --hash=sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812 \ - --hash=sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a \ - --hash=sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e \ - --hash=sha256:10c1bfff05d95783da83491be968e8fe789263689c02724e0c691933c52994f5 \ - --hash=sha256:b7bd98b796e2b6553da7225aeb61f447f80a1ca64f41d83612e6139ca5213aa4 \ - --hash=sha256:b09bf97215625a311f669476f44b8b318b075847b49316d3e28c08e41a7a573f \ - --hash=sha256:694deca8d702d5db21ec83983ce0bb4b26a578e71fbdbd4fdcd387daa90e4d5e \ - --hash=sha256:efc1913fd2ca4f334418481c7e595c00aad186563bbc1ec76067848c7ca0a933 \ - --hash=sha256:4a33dea2b688b3190ee12bd7cfa29d39c9ed176bda40bfa11099a3ce5d3a7ac6 \ - --hash=sha256:dda30ba7e87fbbb7eab1ec9f58678558fd9a6b8b853530e176eabd064da81417 \ - --hash=sha256:671cd1187ed5e62818414afe79ed29da836dde67166a9fac6d435873c44fdd02 \ - --hash=sha256:3799351e2336dc91ea70b034983ee71cf2f9533cdff7c14c90ea126bfd95d65a \ - --hash=sha256:e72591e9ecd94d7feb70c1cbd7be7b3ebea3f548870aa91e2732960fa4d57a37 \ - --hash=sha256:6fbf47b5d3728c6aea2abb0589b5d30459e369baa772e0f37a0320185e87c980 \ - --hash=sha256:d5ee4f386140395a2c818d149221149c54849dfcfcb9f1debfe07a8b8bd63f9a \ - --hash=sha256:bcb3ed405ed3222f9904899563d6fc492ff75cce56cba05e32eff40e6acbeaa3 \ - --hash=sha256:e1c0b87e09fa55a220f058d1d49d3fb8df88fbfab58558f1198e08c1e1de842a \ - --hash=sha256:8dc1c72a69aa7e082593c4a203dcf94ddb74bb5c8a731e4e1eb68d031e8498ff \ - --hash=sha256:97a68e6ada378df82bc9f16b800ab77cbf4b2fada0081794318520138c088e4a \ - --hash=sha256:e8c843bbcda3a2f1e3c2ab25913c80a3c5376cd00c6e8c4a86a89a28c8dc5452 \ - --hash=sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003 \ - --hash=sha256:8e576a51ad59e4bfaac456023a78f6b5e6e7651dcd383bcc3e18d06f9b55d6d1 \ - --hash=sha256:4b9fe39a2ccc108a4accc2676e77da025ce383c108593d65cc909add5c3bd601 \ - --hash=sha256:96e37a3dc86e80bf81758c152fe66dbf60ed5eca3d26305edf01892257049925 \ - --hash=sha256:6d0072fea50feec76a4c418096652f2c3238eaa014b2f94aeb1d56a66b41403f \ - --hash=sha256:089cf3dbf0cd6c100f02945abeb18484bd1ee57a079aefd52cffd17fba910b88 \ - --hash=sha256:6a074d34ee7a5ce3effbc526b7083ec9731bb3cbf921bbe1d3005d4d2bdb3a63 \ - --hash=sha256:421be9fbf0ffe9ffd7a378aafebbf6f4602d564d34be190fc19a193232fd12b1 \ - --hash=sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7 \ - --hash=sha256:e04e26803c9c3851c931eac40c695602c6295b8d432cbe78609649ad9bd2da8a \ - --hash=sha256:b87db4360013327109564f0e591bd2a3b318547bcef31b468a92ee504d07ae4f \ - --hash=sha256:99a2a507ed3ac881b975a2976d59f38c19386d128e7a9a18b7df6fff1fd4c1d6 \ - --hash=sha256:56442863ed2b06d19c37f94d999035e15ee982988920e12a5b4ba29b62ad1f77 \ - --hash=sha256:3ce11ee3f23f79dbd06fb3d63e2f6af7b12db1d46932fe7bd8afa259a5996603 \ - --hash=sha256:33b74d289bd2f5e527beadcaa3f401e0df0a89927c1559c8566c066fa4248ab7 \ - --hash=sha256:43093fb83d8343aac0b1baa75516da6092f58f41200907ef92448ecab8825135 \ - --hash=sha256:8e3dcf21f367459434c18e71b2a9532d96547aef8a871872a5bd69a715c15f96 \ - --hash=sha256:d4306c36ca495956b6d568d276ac11fdd9c30a36f1b6eb928070dc5360b22e1c \ - --hash=sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247 \ - --hash=sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b -mdit-py-plugins==0.3.1; python_version >= "3.7" \ - --hash=sha256:3fc13298497d6e04fe96efdd41281bfe7622152f9caa1815ea99b5c893de9441 \ - --hash=sha256:606a7f29cf56dbdfaf914acb21709b8f8ee29d857e8f29dcc33d8cb84c57bfa1 -mdurl==0.1.2; python_version >= "3.7" \ - --hash=sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8 \ - --hash=sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba -myst-parser==0.18.1; python_version >= "3.7" \ - --hash=sha256:79317f4bb2c13053dd6e64f9da1ba1da6cd9c40c8a430c447a7b146a594c246d \ - --hash=sha256:61b275b85d9f58aa327f370913ae1bec26ebad372cc99f3ab85c8ec3ee8d9fb8 -packaging==21.3; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.7" \ - --hash=sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522 \ - --hash=sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb -pygments==2.13.0; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.7" \ - --hash=sha256:f643f331ab57ba3c9d89212ee4a2dabc6e94f117cf4eefde99a0574720d14c42 \ - --hash=sha256:56a8508ae95f98e2b9bdf93a6be5ae3f7d8af858b43e02c5a2ff083726be40c1 -pyparsing==3.0.9; python_full_version >= "3.6.8" and python_version >= "3.6" \ - --hash=sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc \ - --hash=sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb -pytz==2022.6; python_version >= "3.6" \ - --hash=sha256:222439474e9c98fced559f1709d89e6c9cbf8d79c794ff3eb9f8800064291427 \ - --hash=sha256:e89512406b793ca39f5971bc999cc538ce125c0e51c27941bef4568b460095e2 -pyyaml==6.0; python_version >= "3.7" \ - --hash=sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53 \ - --hash=sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c \ - --hash=sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc \ - --hash=sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b \ - --hash=sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5 \ - --hash=sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513 \ - --hash=sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a \ - --hash=sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86 \ - --hash=sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f \ - --hash=sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92 \ - --hash=sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4 \ - --hash=sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293 \ - --hash=sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57 \ - --hash=sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c \ - --hash=sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0 \ - --hash=sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4 \ - --hash=sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9 \ - --hash=sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737 \ - --hash=sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d \ - --hash=sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b \ - --hash=sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba \ - --hash=sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34 \ - --hash=sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287 \ - --hash=sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78 \ - --hash=sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07 \ - --hash=sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b \ - --hash=sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174 \ - --hash=sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803 \ - --hash=sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3 \ - --hash=sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0 \ - --hash=sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb \ - --hash=sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c \ - --hash=sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2 -requests==2.28.1; 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") \ - --hash=sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349 \ - --hash=sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983 -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" \ - --hash=sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a \ - --hash=sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1 -sphinx-intl==2.0.1; python_version >= "3.5" \ - --hash=sha256:b25a6ec169347909e8d983eefe2d8adecb3edc2f27760db79b965c69950638b4 \ - --hash=sha256:2ff97cba0e4e43249e339a3c29dd2f5b63c25ce794050aabca320ad95f5c5b55 -sphinx-rtd-theme==1.1.1; (python_version >= "2.7" and python_full_version < "3.0.0") or (python_full_version >= "3.4.0") \ - --hash=sha256:31faa07d3e97c8955637fc3f1423a5ab2c44b74b8cc558a51498c202ce5cbda7 \ - --hash=sha256:6146c845f1e1947b3c3dd4432c28998a1693ccc742b4f9ad7c63129f0757c103 -sphinx==5.3.0; python_version >= "3.6" \ - --hash=sha256:51026de0a9ff9fc13c05d74913ad66047e104f56a129ff73e174eb5c3ee794b5 \ - --hash=sha256:060ca5c9f7ba57a08a1219e547b269fadf125ae25b06b9fa7f66768efb652d6d -sphinxcontrib-applehelp==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" \ - --hash=sha256:a072735ec80e7675e3f432fcae8610ecf509c5f1869d17e2eecff44389cdbc58 \ - --hash=sha256:806111e5e962be97c29ec4c1e7fe277bfd19e9652fb1a4392105b43e01af885a -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" \ - --hash=sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4 \ - --hash=sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e -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" \ - --hash=sha256:f5f8bb2d0d629f398bf47d0d69c07bc13b65f75a81ad9e2f71a63d4b7a2f6db2 \ - --hash=sha256:d412243dfb797ae3ec2b59eca0e52dac12e75a241bf0e4eb861e450d06c6ed07 -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" \ - --hash=sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8 \ - --hash=sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178 -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" \ - --hash=sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72 \ - --hash=sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6 -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" \ - --hash=sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952 \ - --hash=sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd -typing-extensions==4.4.0; python_version >= "3.7" \ - --hash=sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e \ - --hash=sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa -urllib3==1.26.12; python_version >= "3.7" and python_full_version < "3.0.0" and python_version < "4" or python_full_version >= "3.6.0" and python_version < "4" and python_version >= "3.7" \ - --hash=sha256:b930dd878d5a8afb066a637fbb35144fe7901e3b209d1cd4f524bd0e9deee997 \ - --hash=sha256:3fa96cf423e6987997fc326ae8df396db2a8b7c667747d47ddd8ecba91f4a74e -zipp==3.10.0; python_version < "3.10" and python_version >= "3.7" \ - --hash=sha256:4fcb6f278987a6605757302a6e40e896257570d11c51628968ccb2a47e80c6c1 \ - --hash=sha256:7a7262fd930bd3e36c50b9a64897aec3fafff3dfdeec9623ae22b40e93f99bb8 +alabaster==0.7.13 ; python_version >= "3.9" and python_version < "4.0" +babel==2.12.1 ; python_version >= "3.9" and python_version < "4.0" +certifi==2022.12.7 ; python_version >= "3.9" and python_version < "4" +charset-normalizer==3.1.0 ; python_version >= "3.9" and python_version < "4" +click==8.1.3 ; python_version >= "3.9" and python_version < "4.0" +colorama==0.4.6 ; python_version >= "3.9" and python_version < "4.0" and sys_platform == "win32" or python_version >= "3.9" and python_version < "4.0" and platform_system == "Windows" +docutils==0.18.1 ; python_version >= "3.9" and python_version < "4.0" +idna==3.4 ; python_version >= "3.9" and python_version < "4" +imagesize==1.4.1 ; python_version >= "3.9" and python_version < "4.0" +importlib-metadata==6.1.0 ; python_version >= "3.9" and python_version < "3.10" +jinja2==3.1.2 ; python_version >= "3.9" and python_version < "4.0" +latexcodec==2.0.1 ; python_version >= "3.9" and python_version < "4.0" +markdown-it-py==2.2.0 ; python_version >= "3.9" and python_version < "4.0" +markupsafe==2.1.2 ; python_version >= "3.9" and python_version < "4.0" +mdit-py-plugins==0.3.5 ; python_version >= "3.9" and python_version < "4.0" +mdurl==0.1.2 ; python_version >= "3.9" and python_version < "4.0" +myst-parser==1.0.0 ; python_version >= "3.9" and python_version < "4.0" +packaging==23.0 ; python_version >= "3.9" and python_version < "4.0" +pybtex-docutils==1.0.2 ; python_version >= "3.9" and python_version < "4.0" +pybtex==0.24.0 ; python_version >= "3.9" and python_version < "4.0" +pygments==2.14.0 ; python_version >= "3.9" and python_version < "4.0" +pyyaml==6.0 ; python_version >= "3.9" and python_version < "4.0" +requests==2.28.2 ; python_version >= "3.9" and python_version < "4" +setuptools==67.6.0 ; python_version >= "3.9" and python_version < "4.0" +six==1.16.0 ; python_version >= "3.9" and python_version < "4.0" +snowballstemmer==2.2.0 ; python_version >= "3.9" and python_version < "4.0" +sphinx-intl==2.1.0 ; python_version >= "3.9" and python_version < "4.0" +sphinx-rtd-theme==1.2.0 ; python_version >= "3.9" and python_version < "4.0" +sphinx==6.1.3 ; python_version >= "3.9" and python_version < "4.0" +sphinxcontrib-applehelp==1.0.4 ; python_version >= "3.9" and python_version < "4.0" +sphinxcontrib-bibtex==2.5.0 ; python_version >= "3.9" and python_version < "4.0" +sphinxcontrib-devhelp==1.0.2 ; python_version >= "3.9" and python_version < "4.0" +sphinxcontrib-htmlhelp==2.0.1 ; python_version >= "3.9" and python_version < "4.0" +sphinxcontrib-jquery==4.1 ; python_version >= "3.9" and python_version < "4.0" +sphinxcontrib-jsmath==1.0.1 ; python_version >= "3.9" and python_version < "4.0" +sphinxcontrib-mermaid==0.8.1 ; python_version >= "3.9" and python_version < "4.0" +sphinxcontrib-qthelp==1.0.3 ; python_version >= "3.9" and python_version < "4.0" +sphinxcontrib-serializinghtml==1.1.5 ; python_version >= "3.9" and python_version < "4.0" +urllib3==1.26.15 ; python_version >= "3.9" and python_version < "4" +zipp==3.15.0 ; python_version >= "3.9" and python_version < "3.10" 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..5fce07b0a --- /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..af9dda63b --- /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-formatting`. 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 otherwise. | +| ``'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/datatypes.txt b/src/basics/datatypes.txt deleted file mode 100644 index df4c63c1b..000000000 --- a/src/basics/datatypes.txt +++ /dev/null @@ -1,129 +0,0 @@ -******************************************************************************* - 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/index.txt b/src/basics/index.txt index e59340e4f..468d9cc36 100644 --- a/src/basics/index.txt +++ b/src/basics/index.txt @@ -6,7 +6,8 @@ :name: basics variables - datatypes + syntax + stdtypes controlflow functions modules diff --git a/src/basics/stdtypes.txt b/src/basics/stdtypes.txt new file mode 100644 index 000000000..46f69fe30 --- /dev/null +++ b/src/basics/stdtypes.txt @@ -0,0 +1,330 @@ +******************************************************************************* + Built-in Types +******************************************************************************* + +The principal built-in types are numerics, sequences, mappings, classes, +instances and exceptions :cite:`docs-python:stdtypes`. This section covers +only the most base of them. Others will be discussed in the future within +their own topics. + +Numeric types +============= + +There are 3 distinct numeric types: *integers*, *floating point numbers*, and +*complex numbers*. In addition, Booleans are a subtype of integers. Integers +have unlimited precision. Floating point numbers are usually implemented using +``double`` in C. Complex numbers have a real and imaginary part, which are each +a floating point number. + +Numbers are created by numeric literals or as the result of built-in functions +and operators. Unadorned integer literals (including hex, octal and binary +numbers) yield integers. Numeric literals containing a decimal point or an +exponent sign yield floating point numbers. Appending ``j`` or ``J`` to a +numeric literal yields an imaginary number (a complex number with a zero real +part) which you can add to an integer or float to get a complex number with +real and imaginary parts. + +Supported operations +-------------------- + ++---------------------+-------------------------------------------------------+ +| Operation | Result | ++=====================+=======================================================+ +| ``x + y`` | sum of *x* and *y* | ++---------------------+-------------------------------------------------------+ +| ``x - y`` | difference of *x* and *y* | ++---------------------+-------------------------------------------------------+ +| ``x * y`` | product of *x* and *y* | ++---------------------+-------------------------------------------------------+ +| ``x / y`` | quotient of *x* and *y* | ++---------------------+-------------------------------------------------------+ +| ``x // y`` | floored quotient of *x* and *y* | ++---------------------+-------------------------------------------------------+ +| ``x % y`` | remainder of ``x / y`` | ++---------------------+-------------------------------------------------------+ +| ``-x`` | *x* negated | ++---------------------+-------------------------------------------------------+ +| ``+x`` | *y* unchanged | ++---------------------+-------------------------------------------------------+ +| ``abs(x)`` | absolute value or magnitude of *x* | ++---------------------+-------------------------------------------------------+ +| ``int(x)`` | *x* converted to integer | ++---------------------+-------------------------------------------------------+ +| ``float(x)`` | *x* converted to floating point | ++---------------------+-------------------------------------------------------+ +| ``complex(re, im)`` | a complex number with real part *re*, imaginary part | +| | *im*. *im* defaults to zero. | ++---------------------+-------------------------------------------------------+ +| ``divmod(x, y)`` | the pair ``(x // y, x % y)`` | ++---------------------+-------------------------------------------------------+ +| ``pow(x, y)`` | *x* to the power *y* | +| ``x ** y`` | | ++---------------------+-------------------------------------------------------+ + +.. note:: ``x // y`` also referred to as integer division. The resultant value + is a whole integer, through the result's type is not necessarily int. + The result is always rounded towards minus infinity: + ``1 // 2`` is ``0`` + +.. note:: ``float(x)`` also accepts the strings ``"nan"`` and ``"inf"`` with + an optional prefix "+" or "-" for :abbr:Nan(Not a Number) and + positive and negative infinity. + +Code examples +------------- + +.. code-block:: python + :caption: Integer numbers + + x = 42 + y = 24 + a = int(42) + b = int(42.24) + + result = x + y # for both int operands only + result = x - y # for both int operands only + result = x * y # for both int operands only + result = x // y # for any numeric operands + +.. code-block:: python + :caption: Floating point numbers + + x = 42. + y = .24 + z = 42.24 + a = float(42) + b = float(42.24) + + result = x + y # for any float operand + result = x - y # for any float operand + result = x * y # for any float operand + result = x / y # for any numeric operands + +Value comparisons +----------------- + +Numbers of built-in numeric types can be compared within and across their types +(with the restriction that complex numbers do not support order comparison). +Within the limits of the types involved, they compare mathematically correct +without loss of precision. + +The "not-a-number" values ``float("NaN")`` and ``decimal.Decimal('NaN')`` are +special. Any ordered comparison of a number to a not-a-number value is false. + +Sequence types +============== + +There are 3 basic sequence types: *lists*, *tuples*, and *range objects*. +Additional sequence types tailored for processing of binary data and text +strings are described in dedicated sections. + +Lists +----- + +Lists are mutable sequences, typically used to store collections of items. +They may be constructed in several ways: + +- using a pair of square brackets to denote the empty list: ``[]`` +- using square brackets, separating items with commas: ``[a]``, ``[a, b, c]`` +- using a list comprehension: ``[x for x in iterable]`` +- using the type constructor: ``list()`` or ``list(iterable)`` + +Tuples +------ + +Tuples are immutable sequences, typically used to store collections of data or +for cases where an immutable sequence of data is needed (such as allowing +storage in a ``set`` or ``dict`` instances). +They may be constructed in a number of ways: + +- using a pair of parentheses to denote the empty tuple: ``()`` +- using a trailing comma for a singleton tuple: ``a,`` or ``(a, b, c)`` +- separating items with commas: ``a, b, c`` or ``(a, b, c)`` +- using the type constructor: ``tuple()`` or ``tuple(iterable)`` + +Common operations +----------------- + ++----------------------+------------------------------------------------------+ +| Operation | Result | ++======================+======================================================+ +| ``x in s`` | ``True`` if an item of *s* equal to *x* | +| ``x not in s`` | ``False`` if an item of *s* equal to *x* | ++----------------------+------------------------------------------------------+ +| ``s + t`` | the concatenation of *s* and *t* | ++----------------------+------------------------------------------------------+ +| ``s * n`` | equivalent to adding *s* to itself *n* times | ++----------------------+------------------------------------------------------+ +| ``s[i]`` | *i*-th item of *s*, origin 0 | ++----------------------+------------------------------------------------------+ +| ``s[i:j]`` | slice of *s* from *i* to *j* with step *k*. any of | +| ``s[i:j:k]`` | these (or even all 3) may be omitted. | ++----------------------+------------------------------------------------------+ +| ``len(s)`` | length of *s* | ++----------------------+------------------------------------------------------+ +| ``min(s)`` | smallest item of *s* | ++----------------------+------------------------------------------------------+ +| ``max(s)`` | largest item of *s* | ++----------------------+------------------------------------------------------+ +| ``s.count(x)`` | total number of occurrences of *x* in *s* | ++----------------------+------------------------------------------------------+ +| ``s.index(x)`` | index of the first occurrence of *x* in *s* | +| ``s.index(x, i)`` | (at or after index *i* and before index *j*) | +| ``s.index(x, i, j)`` | | ++----------------------+------------------------------------------------------+ + +Value comparisons +----------------- + +.. todo: make TypeError a link + +Sequences can be compared only within each of their types, with the restriction +that ranges do not support order comparison. Equality comparison across these +types results in inequality, and ordering comparison across these types raises +``TypeError``. + +Sequences compare lexicographically using comparison of corresponding elements. +The built-in containers typically assume identical objects are equal to +themselves. Lexicographical comparison between built-in collections works as +follows: + +- For two collections to compare equal, they must be of the same type, have + the same length, and each pair of corresponding elements must compare equal. +- Collections that supports order comparison are ordered the same as their + first unequal elements. If corresponding element does not exist, the shorter + collection is ordered first. + +Mutable sequence types +---------------------- + ++--------------------+--------------------------------------------------------+ +| Operation | Result | ++====================+========================================================+ +| ``s[i] = x`` | item *i* of *s* is replaced by *x* | ++--------------------+--------------------------------------------------------+ +| ``s[i:j] = t`` | slice of *s* from *i* to *j* replaced by the contents | +| | of *t* | ++--------------------+--------------------------------------------------------+ +| ``del s[i:j]`` | same as ``s[i:j] = []`` | ++--------------------+--------------------------------------------------------+ +| ``s[i:j:k] = t`` | the elements of *s* are replaced by those of *t* [#]_ | ++--------------------+--------------------------------------------------------+ +| ``del s[i:j:k]`` | removes the elements of ``s[i:j:k]`` from the list | ++--------------------+--------------------------------------------------------+ +| ``s.append(x)`` | appends *x* to the end of the sequence; the same as | +| | ``s[len(s):len(s)] = [x]`` | ++--------------------+--------------------------------------------------------+ +| ``s.clear()`` | removes all items from *s* (``del s[:]``) [#py33]_ | ++--------------------+--------------------------------------------------------+ +| ``s.copy()`` | creates a shallow copy of *s* (``s[:]``) [#py33]_ | ++--------------------+--------------------------------------------------------+ +| ``s.extend(t)`` | extends *s* with the contents of *t* | +| ``s += t`` | | ++--------------------+--------------------------------------------------------+ +| ``s.insert(i, x)`` | inserts *x* into *s* at the index *i*; same as | +| | ``s[i:i] = [x]`` | ++--------------------+--------------------------------------------------------+ +| ``s.pop()``, | retrieves the item at *i* and also removes it from *s* | +| ``s.pop(i)`` | (if *i* is omitted - use the last one available index) | ++--------------------+--------------------------------------------------------+ +| ``s.remove(x)`` | remove the first item that is equal to *x* from *s* | ++--------------------+--------------------------------------------------------+ +| ``s.reverse()`` | reverses the items of *s* in place | ++--------------------+--------------------------------------------------------+ + +.. [#] *t* must have the same length as the slice it is replacing +.. [#py33] new in Python version 3.3 + +Text sequence type +================== + +String methods +-------------- + +Strings implement all of the common sequence operations, along with the +additional methods. + +.. todo: methods to be described + str.capitalize() + str.center() + str.count() + str.encode() + str.endswith(suffix) + str.expandtabs(tabsize=8) + str.find(sub) + str.format() + str.index(sub) + str.isalnum() + srt.isalpha() + str.isascii() + str.isdecimal() + str.isdigit() + str.islower() + str.isnumeric() + str.isprintable() + str.isspace() + str.istitle() + str.isupper() + str.join() + str.ljust() + str.lower() + str.lstrip() + str.replace() + str.rfind() + str.rindex() + str.rjust() + str.rsplit() + str.rstrip() + str.split() + str.splitlines() + str.startswith(prefix) + str.strip() + str.swapcase() + str.title() + str.upper() + +Value comparisons +----------------- + +Strings compare lexicographically using the numerical Unicode code points of +their characters. + +Set types +========= + +Value comparisons +----------------- + +Sets (instances of ``set`` or ``frozenset``) can be compared within and across +their types. They define order comparison operators to mean subset and superset +tests. Those relations do not define total ordering (e.g. two sets ``{1, 2}`` +and ``{2, 3}`` are not equal, nor subsets of one another, nor supersets of one +another). + +Mapping type +============ + +A mapping object maps hashable values to arbitrary objects. Mappings are +mutable objects. There is currently ony one standard mapping type, the +*dictionary*. In few words mappings are collections of keys and their values. + +A dictionary's keys are almost arbitrary values. Values that are not hashable +may not be used as keys. Values that compare equal (such as ``1``, ``1.0`` and +``True``) can be used interchangeably to index the same dictionary entry. + +Dictionaries can be created by several means: + +- Use braces to denote the empty dictionary: ``{}`` +- Use a comma-separated list of ``key: value`` pairs with braces: + ``{'first_name': 'Serhii', 'last_name': 'Horodilov', 'age': 34}`` +- Use a dict comprehension: ``{x: x ** 2 for x in range(10)}`` +- Use the type constructor: ``dict()``, ``dict([('key', 100)])``, + ``dict(key=100)`` + +Value comparisons +----------------- + +Instances of ``dict`` compare equal if and only if they have equal key-value +pairs. + +Order comparisons raise ``TypeError``. diff --git a/src/basics/syntax.txt b/src/basics/syntax.txt new file mode 100644 index 000000000..704f16599 --- /dev/null +++ b/src/basics/syntax.txt @@ -0,0 +1,109 @@ +******************************************************************************* + Python Syntax +******************************************************************************* + +.. note:: As a natural language like English or Ukrainian has its own rules to + write down something, programming languages do. + This makes them programming **languages**. + +A programming language syntax is the set of rules and principles that govern +how code is written and structured in a given programming language. Syntax +encompasses the rules for writing statements, expressions, variables, data +types, control structures, and other constructs that make up the language. + +The syntax of a programming language defines how code is organized and +interpreted by a compiler or interpreter. It defines the rules for writing +valid statements and expressions that can be understood and executed by +the language's runtime system. + +A programming language's syntax is designed to be both readable and expressive, +allowing programmers to write code that is easy to understand and modify. +Syntax often influences the style and structure of code, as well as its +maintainability and performance. + +Different programming languages have different syntax, with some languages +being more concise and expressive than others. While syntax is an important +aspect of a programming language, it is only one of several factors that +determine its ease of use, flexibility, and suitability for different +programming tasks. + +In the case of Python, the language's syntax defines how code is written and +structured in a way that is consistent, readable, and easy to understand. +A general overview is provided below, no need to dive deep in this now. All of +the following is to be discussed during the course. So, some of the key aspects +of Python's syntax include: + +:Indentation: + Python uses whitespace, specifically indentation, to delimit blocks of + code, such as loops, conditionals, and functions. This means that + the indentation level of a line determines which block of code it belongs + to. + +:Statement structure: + Python statements are typically written on one line, with the end of + the line indicating the end of the statement. However, if a statement is + too long to fit on one line, it can be continued across multiple lines + using backslashes. + +:Variables: + In Python, variables are created automatically when a value is assigned to + them, and their type is inferred from the value. Variables can be assigned + values of different types, including integers, floats, strings, and more + complex data structures like lists and dictionaries. + +:Operators: + Python supports a wide range of operators for performing arithmetic, + comparison, and logical operations. These include arithmetic operators like + ``+``, ``-``, ``*``, and ``/``, as well as comparison operators like + ``<``, ``>``, ``==``, and ``!=``. + +:Control flow: + Python provides control flow statements like if, else, elif, for, and + while to control the flow of execution in a program. These statements are + used to make decisions, repeat code, or perform actions based on + conditions. + +:Functions: + In Python, functions are defined using the def keyword and can take + arguments and return values. The body of a function is defined using + a block of indented code. + +:Modules: + Python has a large library of modules that provide pre-written code for + a variety of tasks. Modules can be imported into a program using the import + statement. + +:Exception handling: + Python provides a way to handle errors and exceptions in a program using + the try, except, else, and finally keywords. These statements allow + a program to gracefully recover from errors and continue executing. + +In few words: + +.. code-block:: python + :caption: Input/Output example script + + # This is a comment. + # It is used to provide additional information or context in a script. + + # Getting input from the user + name = input("What is your name? ") # stores string input by the user + age = int(input("How old are you? ")) + is_student = input("Are you a student? (yes/no) ") + + # Converting user input to boolean + is_student = is_student.lower() == "yes" + + # Displaying values of variables + print("My name is", name) + print("I am", age, "years old") + print("I am a student:", is_student) + +The code snippet above demonstrates some basics abilities of Python to gather +data from the user, process it and print out back. Note the words starting with +a **#** (hash) symbol. This is a comment. Any sequence of characters after +the hash and till the line end are considered to be a comment. These are for +those people, who see the code and they are ignored by the interpreter. + +On the other hand each individual line is the instruction for the interpreter +to perform some action, like gather inputs, do math, store data in memory etc. diff --git a/src/basics/variables.txt b/src/basics/variables.txt index d5dd7522a..cc4525a03 100644 --- a/src/basics/variables.txt +++ b/src/basics/variables.txt @@ -2,12 +2,51 @@ 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. +In computer science a **variable** is a named storage location in memory that +can hold a value (*data*). The value stored in a variable can be changed or +accessed by the program during its execution. + +In Python, variables are created dynamically once a value is assigned to them. +This makes Python a dynamically typed language, which means that the data type +of a variable is inferred from the value assigned to it. So, you do not need +to declare a variable before using it, as in statically typed languages. + +The ability to create variables dynamically and infer their data type makes +Python code more concise and easier to read. However, it also requires careful +attention to variable naming and assignment to avoid unexpected behavior. + +In Python ``=`` (assignment operator) is used to set a value to some variable, +the portion on the left of the operator is a *variable name* and the portion +on the right is a *value* to assign to a variable. .. code-block:: python + :caption: Variable assignment in Python + + number_of_students = 10 + greeting = "hello" + pi = 3.14 + +.. code-block:: java + :caption: Variable assignment in Java + + int number_of_students = 10; + String greeting = "hello"; + double pi = 3.14; + +Naming +====== + +In Python there are several rules that describe how to name your variables. +Some of these are requirements and cannot be ignored, others are rather +recommended than required and can be omitted. For now note, that a variable +name **cannot**: + +- a language keyword (like ``pass``, ``def`` or ``class``) +- start with a number (e.g. ``123``, ``1_something``) +- contain special operators in it (``+``, ``-``, ``=`` etc.) +- contain white spaces + +Also here are some general recommendation on naming anything: - foo = 42 - bar = "some string data" - foobar = 42.0 +- do not use built-in functions as a variable name (e.g. ``len = 42``) +- keep names meaningful (``x = 10`` vs ``number_of_student = 100``) diff --git a/src/conf.py b/src/conf.py index cf76ae6af..4060685b5 100644 --- a/src/conf.py +++ b/src/conf.py @@ -1,17 +1,29 @@ # 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" +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", + "sphinxcontrib.mermaid", "sphinx_rtd_theme", "myst_parser", ] @@ -24,17 +36,30 @@ 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 = "relative/path/to/favicon" todo +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/index.txt b/src/index.txt index 0d5b6e006..8da277c3e 100644 --- a/src/index.txt +++ b/src/index.txt @@ -15,3 +15,20 @@ django/index linux/index deploy/index + +.. only:: builder_html + + .. toctree:: + :name: appx + :caption: Additional materials + + appx/software_list + appx/code_edit + appx/env_path + appx/precedence + appx/printf + +.. rubric:: References + +.. bibliography:: + :all: diff --git a/src/intro/index.txt b/src/intro/index.txt index aca6a9589..322bee8fb 100644 --- a/src/intro/index.txt +++ b/src/intro/index.txt @@ -1,3 +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/rdbms/aggregation.txt b/src/rdbms/aggregation.txt new file mode 100644 index 000000000..ea4fedf04 --- /dev/null +++ b/src/rdbms/aggregation.txt @@ -0,0 +1,224 @@ +******************************************************************************* + Data Aggregation +******************************************************************************* + +Here is some dummy data, that will be used as example in this section. + +.. csv-table:: product + :align: center + :file: products_table.csv + :header-rows: 1 + +.. only:: builder_html + + The same dataset is available as: + + - :download:`csv file <./products_table.csv>` + - :download:`postgres dump file ` + +Aggregate functions +=================== + +*Aggregate functions* compute a single result from a set of input values. +Various RDBMS implement various built-in aggregate functions. In this section +we will review 5 basic functions that are available in all RDBMS. + +.. image:: /../assets/img/aggregate-function.svg + +Count +----- + +The ``count(field)`` function returns a count of the number of times that +``field`` is not ``NULL`` in a group. +The ``count(*)`` function (with no arguments) returns the total number of rows +in the group. + +.. code-block:: sql + + SELECT count(*) as "total products" FROM product; + +:: + + total_products + ---------------- + 10 + +Maximum value +------------- + +The ``max()`` aggregate function returns the maximum value of all values in +the group. The maximum value is the value that would be returned last in +an ORDER BY on the same column. +Aggregate function returns ``NULL`` if and only if there are no non-NULL values +in the group. + +.. code-block:: sql + + SELECT max(price) as "maximum price" FROM product; + +:: + + maximum price +--------------- + 350000 + +Minimum value +------------- + +The ``min()`` aggregate function returns the minimum non-NULL value of all +values in the group. The minimum value is the first non-NULL value that would +appear in an ORDER BY of the column. +Aggregate function returns ``NULL`` if and only if there are no non-NULL values +in the group. + +.. code-block:: sql + + SELECT min(price) as "minimum price" FROM product; + +:: + + minimum price +--------------- + 20000 + +Average value +------------- + +The ``avg()`` function returns the average value of all non-NULL inputs within +a group. String and BLOB values that do not look like numbers are interpreted +as 0. The result is always a floating point value whenever there is at least +one non-NULL input even if all inputs are integers. +The result is ``NULL`` if and only if there are no non-NULL inputs. + +.. code-block:: sql + + SELECT avg(price) as "average price" FROM product; + +:: + + average price + --------------------- + 100500.000000000000 + + +Sum of values +------------- + +The ``sum()`` aggregate functions return the sum of all non-NULL values in +the group. +If there are no non-NULL input rows then function returns ``NULL``. + +.. note:: + NULL is not normally a helpful result for the sum of no rows but + the SQL standard requires it. + + SQLite implements ``total`` aggregate function, that is similar to + ``sum``, but returns ``0.0`` (always floating point) if there are + no non-NULL input rows. + +.. code-block:: sql + + SELECT sum(sold) as "total sold items" FROM product; + +:: + + total sold items + ------------------ + 3750 + +Grouping data +============= + +Getting some aggregated values is not very helpful itself. Most cases require +to group outputs in some specific manner. + +For example, if the task is to count number of registered categories it is +simple to solve as: + +.. code-block:: + + SELECT count(DISTINCT category) FROM product; + +:: + + count + ------- + 6 + +But in case, the task is to count **sold** items for each category, this +becomes impossible to solve without grouping items. ``GROUP BY`` clause +provides the ability to group rows based on some field(s) values. + +General syntax is: + +:: + + SELECT select_list + FROM ... + [WHERE ...] + GROUP BY grouping_column_reference [, grouping_column_reference]... + +.. code-block:: + + SELECT category, sum(sold) as sold FROM product GROUP BY category; + +.. table:: + :align: center + + ======== ==== + category sold + ======== ==== + Audio 0 + Printers 800 + Gaming 600 + Monitors 400 + Laptops 300 + Phones 800 + ======== ==== + +If the ``SELECT`` statement is an aggregate query with a ``GROUP BY`` clause, +then each of the expressions specified as part of the GROUP BY clause is +evaluated for each row of the dataset according to the processing rules stated +below for ORDER BY expressions. Each row is then assigned to a "group" based on +the results; rows for which the results of evaluating the GROUP BY expressions +are the same get assigned to the same group. For the purposes of grouping rows, +``NULL`` values are considered equal. The usual rules for selecting a collation +sequence with which to compare text values apply when evaluating expressions in +a GROUP BY clause. The expressions in the GROUP BY clause do not have to be +expressions that appear in the result. The expressions in a GROUP BY clause may +not be aggregate expressions. + +Having clause +------------- + +But what, if the task is to filter categories, that have less than 500 sold +items in it? ``WHERE`` clause will be useless, cause it's evaluated before +grouping output. In other words, only rows that suite WHERE filter will be +selected. + +.. code-block:: sql + + SELECT category, sum(sold) as sold + FROM product + GROUP BY category + HAVING sum(sold) < 500; + +.. table:: + :align: center + + ======== ==== + category sold + ======== ==== + Audio 0 + Monitors 400 + Laptops 300 + ======== ==== + +If a ``HAVING`` clause is specified, it is evaluated once for each group of +rows as a boolean expression. If the result of evaluating the HAVING clause is +false, the group is discarded. If the HAVING clause is an aggregate expression, +it is evaluated across all rows in the group. + +If a HAVING clause is a non-aggregate expression, it is evaluated with respect +to an arbitrarily selected row from the group. The HAVING expression may refer +to values, even aggregate functions, that are not in the result. diff --git a/src/rdbms/index.txt b/src/rdbms/index.txt index d9bcfbed7..337ec1331 100644 --- a/src/rdbms/index.txt +++ b/src/rdbms/index.txt @@ -2,5 +2,27 @@ Relational Database ############################################################################### +:abbr:`RDBMS (Relational Database Management System)` is a type of software +that helps users to create, update, manage, and access relational databases. +Relational databases organize data into tables, which consist of rows and +columns. Each column represents a specific attribute of the data, while each +row represents a specific instance of that data. + +RDBMS allow users to interact with the database using +:abbr:`SQL (Structured Query Language)`, which is a standard language for +managing and manipulating relational databases. SQL allows users to perform +a variety of operations on the database, including adding, updating, and +deleting data, as well as retrieving data based on specific criteria. + +RDBMS also provide a range of features to ensure data integrity, such as +enforcing data constraints, supporting transactions, and providing backup +and recovery capabilities. Additionally, RDBMS systems often provide tools +for managing the database, such as user interfaces for creating and modifying +tables and views, and monitoring tools for optimizing database performance. + .. toctree:: :name: rdbms + + aggregation + relations + normalization diff --git a/src/rdbms/normalization.txt b/src/rdbms/normalization.txt new file mode 100644 index 000000000..3affcaa67 --- /dev/null +++ b/src/rdbms/normalization.txt @@ -0,0 +1,142 @@ +******************************************************************************* + Database Normalization +******************************************************************************* + +Normalization is a process of organizing data in a database so that it is free +from redundancy and dependency. It helps to eliminate data inconsistencies and +anomalies, thereby improving data integrity. Normalization is a set of rules or +guidelines to design a database schema in such a way that it avoids data +duplication, data redundancy, and data inconsistency. + +There are several normal forms, each building on the previous one, which guide +us in the normalization process. The most commonly used normal forms are: + +- **First Normal Form (1NF)**: + Each column should hold atomic (indivisible) values. + There should be no repeating groups or arrays of data in a table. +- **Second Normal Form (2NF)**: + Each non-key column should be functionally dependent on the entire primary + key. In other words, every column in a table should be related to + the primary key and not dependent on any other non-key columns. +- **Third Normal Form (3NF)**: + All non-key columns should be dependent only on the primary key and not on + any other non-key columns. This eliminates transitive dependencies. + +Normalization reduces data redundancy and dependency, making the database more +efficient, flexible, and scalable. It also helps in maintaining data +consistency and accuracy, and ensures that updates and deletions are properly +handled. + +First normal form (1NF) +======================= + +It's easier to understand normalization via examples. +Let's start with some dummy orders data. + +.. csv-table:: Initial data + :header-rows: 1 + + order,customer,product,quantity,price,total + 1,"John Doe","(Apple, Orange)","(2, 3)","(100, 50)","(200, 150)" + 2,"Jane Smith","Banana",4,25,100 + +This table violates 1NF, since its columns contain multiple values. To bring +this to 1NF all data within the table are to be atomic. + +.. csv-table:: 1NF applied + :header-rows: 1 + + order,customer,product,quantity,price,total + 1,"John Doe","Apple",2,100 ,200 + 2,"John Doe","Orange",3,50 ,150 + 3,"Jane Smith","Banana",4,25,100 + +From now each peace of data is represented as atomic value. + +Second normal form (2NF) +======================== + +The table above is in 1NF, but ``item price`` is dependent on the *item* entity +itself and have low cohesion to *orders*. To bring it into 2NF a dedicated +table to store information about items themselves is to be created. After that +``order`` and ``product`` table are connected (related) to each other via a +foreign key. + +.. csv-table:: ``order`` table + :header-rows: 1 + + id, customer, product_id, quantity + 1, "John Doe", 1, 2 + 2, "John Doe", 2, 3 + 3, "Jane Smith", 3, 4 + +.. csv-table:: ``product`` table + :header-rows: 1 + + id, product, price + 1, "Apple", 100 + 2, "Orange", 50 + 3, "Banana", 25 + +.. mermaid:: + :align: center + + erDiagram + ORDER ||--|{ PRODUCT : contains + ORDER { + int id pk + string customer + int product_id fk + int quantity + } + PRODUCT { + int id pk + string name + int price + } + +.. note:: ``total`` field is also removed, since now it can be calculated + as product of ``product.price`` and ``order.quantity``. + +Third normal form (3NF) +======================= + +At last it's time to remove a transitive functional dependency. Customer's name +is not actually dependent on a product, but on a person, who places an order. + +.. csv-table:: ``order`` table + :header-rows: 1 + + id, customer_id, product_id, quantity + 1, 1, 1, 2 + 2, 1, 2, 3 + 3, 2, 3, 4 + +.. csv-table:: ``customer`` table + :header-rows: 1 + + id, customer + 1, "John Doe" + 3, "Jane Smith" + +.. mermaid:: + :align: center + + erDiagram + CUSTOMER }o--|| ORDER : places + ORDER ||--|{ PRODUCT : contains + ORDER { + int id pk + int customer_id fk + int product_id fk + int quantity + } + PRODUCT { + int id pk + string name + int price + } + CUSTOMER { + int id pk + string name + } diff --git a/src/rdbms/products_table.csv b/src/rdbms/products_table.csv new file mode 100644 index 000000000..4e4549145 --- /dev/null +++ b/src/rdbms/products_table.csv @@ -0,0 +1,11 @@ +id,name,price,category,sold +1,"Samsung Galaxy",100000,Phones,500 +2,"iPhone 13 Pro",120000,Phones,300 +3,"MacBook Pro",350000,Laptops,100 +4,"Lenovo ThinkPad",150000,Laptops,200 +5,"HP Printer",20000,Printers,800 +6,"Dell Monitor",50000,Monitors,400 +7,"Sony Headphones",30000,Audio,0 +8,"Bose Soundbar",70000,Audio,0 +9,"Xbox Series X",60000,Gaming,250 +10,"PlayStation 5",55000,Gaming,350 diff --git a/src/rdbms/relations.txt b/src/rdbms/relations.txt new file mode 100644 index 000000000..ebdfcfb2c --- /dev/null +++ b/src/rdbms/relations.txt @@ -0,0 +1,364 @@ +******************************************************************************* + Data Relationships +******************************************************************************* + +It's time to talk about **data relations**. + +For example your database contains two tables: ``weather`` and ``city``. The +diagram below demonstrates the overall data structure: + +.. mermaid:: + :align: center + + erDiagram + weather { + string city + int temp_lo + int temp_hi + date date + } + city { + string name + point location + } + +Consider the following problem: you want to make sure no one can insert +a record into ``weather`` without a matching entry in ``city`` table. +This is called maintaining the *referential integrity* of your data. +In simplistic database systems this would be implemented (if at all) by first +looking at the cities table to check if a matching record exists, and then +inserting or rejecting the new weather records. This approach has a number of +problems and is very inconvenient. + +.. code-block:: sql + + CREATE TABLE city ( + name varchar(80) primary key, + location point + ); + + CREATE TABLE weather ( + city varchar(80) references cities(name), + temp_lo int, + temp_hi int, + date date + ); + +This declaration creates a relationship between two (or even more) tables. + +Foreign key (FK) +=========== + +So far, you have knowledge about **primary** keys. +The **foreign** key is a column, that *references* some another table. +In common, it's a reference to another table's PK; but there is no limitation +of this kind, any column can be referenced by another one. +FKs handle data integrity only, it's not required for FK to be non-NULL value. + +The relation's properties are described by CONSTRAINTS and the database's +structure. + +For example, modifying declaration with ``NOT NULL`` constraint grants +that each record within a table has a matching one entity in another table. + +.. code-block:: sql + + CREATE TABLE weather ( + city varchar(80) references cities(name) NOT NULL, + ... + ); + +This brings us to various relationship models. + +One-to-many relationship (1-to-N) +------------------------ + +This is the most common relationship. + +For the example above there are no limitations on temperature measurements in +a specified city. So, a single city may has 0 or N related records in +``weather`` table. But each weather record is related to the only one city. + +Another example is employees and office buildings they work in. Some big +company may have multiple offices and employee across the globe. +Multiple employees can be present in a single office building at a time. +But each employee can be physically located only in a single office at a time. + +.. mermaid:: + + erDiagram + employee }o--|| office : located + employee { + int id + string first_name + string last_name + email email + int office_id fk + } + office { + int id + point location + text address + } + +One-to-one relationship (1-to-1) +----------------------- + +``UNIQUE`` and ``NOT NULL`` constraints are used together to ensure there is +and only one matching record. Back to the example with employees. Multiple +workstations (personal computers) are located in each office building. +The only one person can occupy the only one work station at a time. + +.. mermaid:: + + erDiagram + employee ||--|| work_station : occupies + +Many-to-many relationship (N-to-N) +------------------------- + +These relationships require additional table. +A good example may be a *project role*. There are many of them in a production +team. And some employees may be assigned to the same role (e.g. developers, +testers etc.). But also a single person can be a developer and tester at +a time. + +.. mermaid:: + + erDiagram + employee }o--|{ employee_role : execute + role }o--|{ employee_role : assign + +Joining data +============ + +``JOIN`` is used to *join* data fetched from multiple related tables. +To build a valid query you are to set the tables to join and parameter to use +for this operation. + +Common syntax is: + +:: + + T1 join_type T2 [ join_condition ] + +There are various join types available. +Here are is some dummy data to demonstrate their purpose. + +.. table:: poem + + +----+------------------------+-----------+ + | id | title | author_id | + +====+========================+===========+ + | 1 | On the Field of Battle | 1 | + +----+------------------------+-----------+ + | 2 | Moses | 2 | + +----+------------------------+-----------+ + | 3 | The Forest Song | 1 | + +----+------------------------+-----------+ + | 4 | In the Catacombs | null | + +----+------------------------+-----------+ + | 5 | The Singing Stones | 1 | + +----+------------------------+-----------+ + | 6 | Ancient Fairy Tales | null | + +----+------------------------+-----------+ + | 7 | My Thoughts | 2 | + +----+------------------------+-----------+ + | 8 | To Shevchenko | null | + +----+------------------------+-----------+ + + +.. table:: author + + +----+---------------+ + | id | name | + +====+===============+ + | 1 | Larysa Kosach | + +----+---------------+ + | 2 | Ivan Franko | + +----+---------------+ + | 3 | John Doe | + +----+---------------+ + +.. code-block:: sql + + CREATE TABLE author + ( + id SERIAL PRIMARY KEY, + name VARCHAR(32) NOT NULL UNIQUE + ); + CREATE TABLE poem + ( + id SERIAL PRIMARY KEY, + title VARCHAR(32) NOT NULL UNIQUE, + author_id INT REFERENCES author (id) + ); + INSERT INTO author(name) + VALUES ('Larysa Kosach'), + ('Ivan Franko'), + ('John Doe'); + INSERT INTO poem(title, author_id) + VALUES ('On the Field of Battle', 1), + ('Moses', 2), + ('The Forest Song', 1), + ('In the Catacombs', null), + ('The Singing Stones', 1), + ('Ancient Fairy Tales', null), + ('My Thoughts', 2), + ('To Shevchenko', null) + ; + +Join types +---------- + +:Cross join: + + .. code-block:: + + T1 CROSS JOIN T2 + + For every possible combination of rows from T1 and T2 + (i.e., a Cartesian product), the joined table will contain a row consisting + of all columns in T1 followed by all columns in T2. If the tables have N + and M rows respectively, the joined table will have N * M rows. + +:Qualified joins: + + .. code-block:: + + T1 { [INNER] | { LEFT | RIGHT | FULL } [OUTER] } JOIN T2 ON condition + + The words ``INNER`` and ``OUTER`` are optional for all forms. + ``INNER`` is the default; ``LEFT``, ``RIGHT`` and ``FULL`` imply ``OUTER`` + join. + +INNER JOIN +---------- + +For each row R1 of T1, the joined table has a row for each row in T2 that +satisfies the join condition with R1. + +.. code-block:: sql + :caption: Inner join + + SELECT p.title, a.name + FROM poem p + JOIN author a on p.author_id = a.id; + ++------------------------+---------------+ +| title | name | ++========================+===============+ +| On the Field of Battle | Larysa Kosach | ++------------------------+---------------+ +| Moses | Ivan Franko | ++------------------------+---------------+ +| The Forest Song | Larysa Kosach | ++------------------------+---------------+ +| The Singing Stones | Larysa Kosach | ++------------------------+---------------+ +| My Thoughts | Ivan Franko | ++------------------------+---------------+ + +LEFT OUTER JOIN +--------------- + +First, an inner join is performed. Then, for each row in T1 that does not +satisfy the join condition with any row in T2, a joined row is added with null +values in columns of T2. Thus, the joined table always has at least one row for +each row in T1. + +.. code-block:: sql + :caption: Left join + + SELECT p.title, a.name + FROM poem p + LEFT JOIN author a on p.author_id = a.id; + ++------------------------+---------------+ +| title | name | ++========================+===============+ +| On the Field of Battle | Larysa Kosach | ++------------------------+---------------+ +| Moses | Ivan Franko | ++------------------------+---------------+ +| The Forest Song | Larysa Kosach | ++------------------------+---------------+ +| In the Catacombs | null | ++------------------------+---------------+ +| The Singing Stones | Larysa Kosach | ++------------------------+---------------+ +| Ancient Fairy Tales | null | ++------------------------+---------------+ +| My Thoughts | Ivan Franko | ++------------------------+---------------+ +| To Shevchenko | null | ++------------------------+---------------+ + +RIGHT OUTER JOIN +---------------- + +First, an inner join is performed. Then, for each row in T2 that does not +satisfy the join condition with any row in T1, a joined row is added with +null values in columns of T1. This is the converse of a left join: the result +table will always have a row for each row in T2. + +.. code-block:: sql + :caption: Right join + + SELECT p.title, a.name + FROM poem p + RIGHT JOIN author a on p.author_id = a.id; + ++------------------------+---------------+ +| title | name | ++========================+===============+ +| On the Field of Battle | Larysa Kosach | ++------------------------+---------------+ +| Moses | Ivan Franko | ++------------------------+---------------+ +| The Forest Song | Larysa Kosach | ++------------------------+---------------+ +| The Singing Stones | Larysa Kosach | ++------------------------+---------------+ +| My Thoughts | Ivan Franko | ++------------------------+---------------+ +| null | John Doe | ++------------------------+---------------+ + +FULL OUTER JOIN +--------------- + +First, an inner join is performed. Then, for each row in T1 that does not +satisfy the join condition with any row in T2, a joined row is added with +null values in columns of T2. Also, for each row of T2 that does not satisfy +the join condition with any row in T1, a joined row with null values in +the columns of T1 is added. + +.. code-block:: sql + :caption: Full join + + SELECT p.title, a.name + FROM poem p + FULL JOIN author a on p.author_id = a.id; + ++------------------------+---------------+ +| title | name | ++========================+===============+ +| On the Field of Battle | Larysa Kosach | ++------------------------+---------------+ +| Moses | Ivan Franko | ++------------------------+---------------+ +| The Forest Song | Larysa Kosach | ++------------------------+---------------+ +| In the Catacombs | null | ++------------------------+---------------+ +| The Singing Stones | Larysa Kosach | ++------------------------+---------------+ +| Ancient Fairy Tales | null | ++------------------------+---------------+ +| My Thoughts | Ivan Franko | ++------------------------+---------------+ +| To Shevchenko | null | ++------------------------+---------------+ +| null | John Doe | ++------------------------+---------------+ diff --git a/src/refs.bib b/src/refs.bib new file mode 100644 index 000000000..de0048798 --- /dev/null +++ b/src/refs.bib @@ -0,0 +1,69 @@ +******************************************************************************* +Python training course bibliography database +******************************************************************************* + +@misc{docs-python, + title = "{Python Documentation}", + url = {https://docs.python.org}, +} + +@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-formatting, + title = "{Python Documentation}", + url = {https://docs.python.org/3/library/stdtypes.html#printf-style-string-formatting}, +} + +@misc{docs-python:stdtypes, + title = "{Python Documentation}", + url = {https://docs.python.org/library/stdtypes.html} +}