From cc85ab521a83b082d107a8fbc02b7aac673a2ff3 Mon Sep 17 00:00:00 2001 From: Tim Monko Date: Sun, 3 Aug 2025 14:02:27 -0500 Subject: [PATCH 1/4] initial repo setup --- .python-version | 1 + README.md | 0 docs/assets/gh-pr-settings.png | Bin 0 -> 47984 bytes docs/gh_repo_settings.md | 33 +++ docs/index.md | 17 ++ main.py | 6 + mkdocs.yml | 4 + pyproject.toml | 9 + uv.lock | 390 +++++++++++++++++++++++++++++++++ 9 files changed, 460 insertions(+) create mode 100644 .python-version create mode 100644 README.md create mode 100644 docs/assets/gh-pr-settings.png create mode 100644 docs/gh_repo_settings.md create mode 100644 docs/index.md create mode 100644 main.py create mode 100644 mkdocs.yml create mode 100644 pyproject.toml create mode 100644 uv.lock diff --git a/.python-version b/.python-version new file mode 100644 index 0000000..24ee5b1 --- /dev/null +++ b/.python-version @@ -0,0 +1 @@ +3.13 diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/assets/gh-pr-settings.png b/docs/assets/gh-pr-settings.png new file mode 100644 index 0000000000000000000000000000000000000000..e2fbdc5c7daf2eea42c97a9410e284564a149f09 GIT binary patch literal 47984 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 literal 0 HcmV?d00001 diff --git a/docs/gh_repo_settings.md b/docs/gh_repo_settings.md new file mode 100644 index 0000000..d0a13c6 --- /dev/null +++ b/docs/gh_repo_settings.md @@ -0,0 +1,33 @@ +# Recommended Github Repo Settings + +## Using Pull Requests to Document Code Change History + +Use pull requests for all changes to the codebase. Not only does this make changes safer, especially with regards to CI checks, but it also provides a clear history of changes made to the codebase. This is particularly useful for understanding the evolution of the code because it allows you to see what changes were made, when, and by whom. More than just `git blame`, many IDEs provide a way to view the history of the PR, including the discussions and commits that led to the final merged PR. This is invaluable not only for remembering your own work, but for documenting the codebase for others. *Even if you are working on a project alone, using a PR approach will prove invaluable at times.* + +A few recommendations to optimize this process: + +## General Repo Settings + +Use only Squash and Merge to keep a clean commit history. Use PR title and description to document the merge commit. Again, blame will allow you to find the PR and its discussion. + +![Github Pull Request Settings](assets/gh-pr-settings.png) + +You may also like: + +- Always suggest updating pull request branches: Adds a button to update a PR with content from main -- useful for new contributors. +- Automaticly delete head branches: Automatically deletes the branch after merging a PR. + +## Branch Protection Rules + +Set up branch protection rules to ensure that the main branch is protected from direct pushes, especially when you may accidentally push and break things that people rely on! Instead require all changes to go through a PR. + +In Repo Settings -> Rulesets. + +1. Name and activate a ruleset +2. Protect the default branch and add the `gh-pages` branch if using for docs. +3. Leave on the default settings +4. Turn on "Require a pull request before merging". Use settings appropriate for yourself or team. +5. Read through the rest of the settings and determine if they are appropriate for your project. + +![Github Branch Protection Settings](assets/gh-branch-protection-settings.png) + diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 0000000..000ea34 --- /dev/null +++ b/docs/index.md @@ -0,0 +1,17 @@ +# Welcome to MkDocs + +For full documentation visit [mkdocs.org](https://www.mkdocs.org). + +## Commands + +* `mkdocs new [dir-name]` - Create a new project. +* `mkdocs serve` - Start the live-reloading docs server. +* `mkdocs build` - Build the documentation site. +* `mkdocs -h` - Print help message and exit. + +## Project layout + + mkdocs.yml # The configuration file. + docs/ + index.md # The documentation homepage. + ... # Other markdown pages, images and other files. diff --git a/main.py b/main.py new file mode 100644 index 0000000..0c7a649 --- /dev/null +++ b/main.py @@ -0,0 +1,6 @@ +def main(): + print("Hello from urssi-docs!") + + +if __name__ == "__main__": + main() diff --git a/mkdocs.yml b/mkdocs.yml new file mode 100644 index 0000000..9a2d90a --- /dev/null +++ b/mkdocs.yml @@ -0,0 +1,4 @@ +site_name: 2025 URSSI Docs +site_url: https://timmonko.github.io/urssi-docs/ +theme: + name: material \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..378e10b --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,9 @@ +[project] +name = "urssi-docs" +version = "0.1.0" +description = "Add your description here" +readme = "README.md" +requires-python = ">=3.13" +dependencies = [ + "mkdocs-material>=9.6.16", +] diff --git a/uv.lock b/uv.lock new file mode 100644 index 0000000..19a83e5 --- /dev/null +++ b/uv.lock @@ -0,0 +1,390 @@ +version = 1 +revision = 2 +requires-python = ">=3.13" + +[[package]] +name = "babel" +version = "2.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/6b/d52e42361e1aa00709585ecc30b3f9684b3ab62530771402248b1b1d6240/babel-2.17.0.tar.gz", hash = "sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d", size = 9951852, upload-time = "2025-02-01T15:17:41.026Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/b8/3fe70c75fe32afc4bb507f75563d39bc5642255d1d94f1f23604725780bf/babel-2.17.0-py3-none-any.whl", hash = "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2", size = 10182537, upload-time = "2025-02-01T15:17:37.39Z" }, +] + +[[package]] +name = "backrefs" +version = "5.9" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/eb/a7/312f673df6a79003279e1f55619abbe7daebbb87c17c976ddc0345c04c7b/backrefs-5.9.tar.gz", hash = "sha256:808548cb708d66b82ee231f962cb36faaf4f2baab032f2fbb783e9c2fdddaa59", size = 5765857, upload-time = "2025-06-22T19:34:13.97Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/19/4d/798dc1f30468134906575156c089c492cf79b5a5fd373f07fe26c4d046bf/backrefs-5.9-py310-none-any.whl", hash = "sha256:db8e8ba0e9de81fcd635f440deab5ae5f2591b54ac1ebe0550a2ca063488cd9f", size = 380267, upload-time = "2025-06-22T19:34:05.252Z" }, + { url = "https://files.pythonhosted.org/packages/55/07/f0b3375bf0d06014e9787797e6b7cc02b38ac9ff9726ccfe834d94e9991e/backrefs-5.9-py311-none-any.whl", hash = "sha256:6907635edebbe9b2dc3de3a2befff44d74f30a4562adbb8b36f21252ea19c5cf", size = 392072, upload-time = "2025-06-22T19:34:06.743Z" }, + { url = "https://files.pythonhosted.org/packages/9d/12/4f345407259dd60a0997107758ba3f221cf89a9b5a0f8ed5b961aef97253/backrefs-5.9-py312-none-any.whl", hash = "sha256:7fdf9771f63e6028d7fee7e0c497c81abda597ea45d6b8f89e8ad76994f5befa", size = 397947, upload-time = "2025-06-22T19:34:08.172Z" }, + { url = "https://files.pythonhosted.org/packages/10/bf/fa31834dc27a7f05e5290eae47c82690edc3a7b37d58f7fb35a1bdbf355b/backrefs-5.9-py313-none-any.whl", hash = "sha256:cc37b19fa219e93ff825ed1fed8879e47b4d89aa7a1884860e2db64ccd7c676b", size = 399843, upload-time = "2025-06-22T19:34:09.68Z" }, + { url = "https://files.pythonhosted.org/packages/fc/24/b29af34b2c9c41645a9f4ff117bae860291780d73880f449e0b5d948c070/backrefs-5.9-py314-none-any.whl", hash = "sha256:df5e169836cc8acb5e440ebae9aad4bf9d15e226d3bad049cf3f6a5c20cc8dc9", size = 411762, upload-time = "2025-06-22T19:34:11.037Z" }, + { url = "https://files.pythonhosted.org/packages/41/ff/392bff89415399a979be4a65357a41d92729ae8580a66073d8ec8d810f98/backrefs-5.9-py39-none-any.whl", hash = "sha256:f48ee18f6252b8f5777a22a00a09a85de0ca931658f1dd96d4406a34f3748c60", size = 380265, upload-time = "2025-06-22T19:34:12.405Z" }, +] + +[[package]] +name = "certifi" +version = "2025.8.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/dc/67/960ebe6bf230a96cda2e0abcf73af550ec4f090005363542f0765df162e0/certifi-2025.8.3.tar.gz", hash = "sha256:e564105f78ded564e3ae7c923924435e1daa7463faeab5bb932bc53ffae63407", size = 162386, upload-time = "2025-08-03T03:07:47.08Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/48/1549795ba7742c948d2ad169c1c8cdbae65bc450d6cd753d124b17c8cd32/certifi-2025.8.3-py3-none-any.whl", hash = "sha256:f6c12493cfb1b06ba2ff328595af9350c65d6644968e5d3a2ffd78699af217a5", size = 161216, upload-time = "2025-08-03T03:07:45.777Z" }, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e4/33/89c2ced2b67d1c2a61c19c6751aa8902d46ce3dacb23600a283619f5a12d/charset_normalizer-3.4.2.tar.gz", hash = "sha256:5baececa9ecba31eff645232d59845c07aa030f0c81ee70184a90d35099a0e63", size = 126367, upload-time = "2025-05-02T08:34:42.01Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ea/12/a93df3366ed32db1d907d7593a94f1fe6293903e3e92967bebd6950ed12c/charset_normalizer-3.4.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:926ca93accd5d36ccdabd803392ddc3e03e6d4cd1cf17deff3b989ab8e9dbcf0", size = 199622, upload-time = "2025-05-02T08:32:56.363Z" }, + { url = "https://files.pythonhosted.org/packages/04/93/bf204e6f344c39d9937d3c13c8cd5bbfc266472e51fc8c07cb7f64fcd2de/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eba9904b0f38a143592d9fc0e19e2df0fa2e41c3c3745554761c5f6447eedabf", size = 143435, upload-time = "2025-05-02T08:32:58.551Z" }, + { url = "https://files.pythonhosted.org/packages/22/2a/ea8a2095b0bafa6c5b5a55ffdc2f924455233ee7b91c69b7edfcc9e02284/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3fddb7e2c84ac87ac3a947cb4e66d143ca5863ef48e4a5ecb83bd48619e4634e", size = 153653, upload-time = "2025-05-02T08:33:00.342Z" }, + { url = "https://files.pythonhosted.org/packages/b6/57/1b090ff183d13cef485dfbe272e2fe57622a76694061353c59da52c9a659/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98f862da73774290f251b9df8d11161b6cf25b599a66baf087c1ffe340e9bfd1", size = 146231, upload-time = "2025-05-02T08:33:02.081Z" }, + { url = "https://files.pythonhosted.org/packages/e2/28/ffc026b26f441fc67bd21ab7f03b313ab3fe46714a14b516f931abe1a2d8/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c9379d65defcab82d07b2a9dfbfc2e95bc8fe0ebb1b176a3190230a3ef0e07c", size = 148243, upload-time = "2025-05-02T08:33:04.063Z" }, + { url = "https://files.pythonhosted.org/packages/c0/0f/9abe9bd191629c33e69e47c6ef45ef99773320e9ad8e9cb08b8ab4a8d4cb/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e635b87f01ebc977342e2697d05b56632f5f879a4f15955dfe8cef2448b51691", size = 150442, upload-time = "2025-05-02T08:33:06.418Z" }, + { url = "https://files.pythonhosted.org/packages/67/7c/a123bbcedca91d5916c056407f89a7f5e8fdfce12ba825d7d6b9954a1a3c/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1c95a1e2902a8b722868587c0e1184ad5c55631de5afc0eb96bc4b0d738092c0", size = 145147, upload-time = "2025-05-02T08:33:08.183Z" }, + { url = "https://files.pythonhosted.org/packages/ec/fe/1ac556fa4899d967b83e9893788e86b6af4d83e4726511eaaad035e36595/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ef8de666d6179b009dce7bcb2ad4c4a779f113f12caf8dc77f0162c29d20490b", size = 153057, upload-time = "2025-05-02T08:33:09.986Z" }, + { url = "https://files.pythonhosted.org/packages/2b/ff/acfc0b0a70b19e3e54febdd5301a98b72fa07635e56f24f60502e954c461/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:32fc0341d72e0f73f80acb0a2c94216bd704f4f0bce10aedea38f30502b271ff", size = 156454, upload-time = "2025-05-02T08:33:11.814Z" }, + { url = "https://files.pythonhosted.org/packages/92/08/95b458ce9c740d0645feb0e96cea1f5ec946ea9c580a94adfe0b617f3573/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:289200a18fa698949d2b39c671c2cc7a24d44096784e76614899a7ccf2574b7b", size = 154174, upload-time = "2025-05-02T08:33:13.707Z" }, + { url = "https://files.pythonhosted.org/packages/78/be/8392efc43487ac051eee6c36d5fbd63032d78f7728cb37aebcc98191f1ff/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4a476b06fbcf359ad25d34a057b7219281286ae2477cc5ff5e3f70a246971148", size = 149166, upload-time = "2025-05-02T08:33:15.458Z" }, + { url = "https://files.pythonhosted.org/packages/44/96/392abd49b094d30b91d9fbda6a69519e95802250b777841cf3bda8fe136c/charset_normalizer-3.4.2-cp313-cp313-win32.whl", hash = "sha256:aaeeb6a479c7667fbe1099af9617c83aaca22182d6cf8c53966491a0f1b7ffb7", size = 98064, upload-time = "2025-05-02T08:33:17.06Z" }, + { url = "https://files.pythonhosted.org/packages/e9/b0/0200da600134e001d91851ddc797809e2fe0ea72de90e09bec5a2fbdaccb/charset_normalizer-3.4.2-cp313-cp313-win_amd64.whl", hash = "sha256:aa6af9e7d59f9c12b33ae4e9450619cf2488e2bbe9b44030905877f0b2324980", size = 105641, upload-time = "2025-05-02T08:33:18.753Z" }, + { url = "https://files.pythonhosted.org/packages/20/94/c5790835a017658cbfabd07f3bfb549140c3ac458cfc196323996b10095a/charset_normalizer-3.4.2-py3-none-any.whl", hash = "sha256:7f56930ab0abd1c45cd15be65cc741c28b1c9a34876ce8c17a2fa107810c0af0", size = 52626, upload-time = "2025-05-02T08:34:40.053Z" }, +] + +[[package]] +name = "click" +version = "8.2.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/60/6c/8ca2efa64cf75a977a0d7fac081354553ebe483345c734fb6b6515d96bbc/click-8.2.1.tar.gz", hash = "sha256:27c491cc05d968d271d5a1db13e3b5a184636d9d930f148c50b038f0d0646202", size = 286342, upload-time = "2025-05-20T23:19:49.832Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/85/32/10bb5764d90a8eee674e9dc6f4db6a0ab47c8c4d0d83c27f7c39ac415a4d/click-8.2.1-py3-none-any.whl", hash = "sha256:61a3265b914e850b85317d0b3109c7f8cd35a670f963866005d6ef1d5175a12b", size = 102215, upload-time = "2025-05-20T23:19:47.796Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "ghp-import" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "python-dateutil" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d9/29/d40217cbe2f6b1359e00c6c307bb3fc876ba74068cbab3dde77f03ca0dc4/ghp-import-2.1.0.tar.gz", hash = "sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343", size = 10943, upload-time = "2022-05-02T15:47:16.11Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619", size = 11034, upload-time = "2022-05-02T15:47:14.552Z" }, +] + +[[package]] +name = "idna" +version = "3.10" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490, upload-time = "2024-09-15T18:07:39.745Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442, upload-time = "2024-09-15T18:07:37.964Z" }, +] + +[[package]] +name = "jinja2" +version = "3.1.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markupsafe" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload-time = "2025-03-05T20:05:02.478Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" }, +] + +[[package]] +name = "markdown" +version = "3.8.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/c2/4ab49206c17f75cb08d6311171f2d65798988db4360c4d1485bd0eedd67c/markdown-3.8.2.tar.gz", hash = "sha256:247b9a70dd12e27f67431ce62523e675b866d254f900c4fe75ce3dda62237c45", size = 362071, upload-time = "2025-06-19T17:12:44.483Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/96/2b/34cc11786bc00d0f04d0f5fdc3a2b1ae0b6239eef72d3d345805f9ad92a1/markdown-3.8.2-py3-none-any.whl", hash = "sha256:5c83764dbd4e00bdd94d85a19b8d55ccca20fe35b2e678a1422b380324dd5f24", size = 106827, upload-time = "2025-06-19T17:12:42.994Z" }, +] + +[[package]] +name = "markupsafe" +version = "3.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b2/97/5d42485e71dfc078108a86d6de8fa46db44a1a9295e89c5d6d4a06e23a62/markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0", size = 20537, upload-time = "2024-10-18T15:21:54.129Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/83/0e/67eb10a7ecc77a0c2bbe2b0235765b98d164d81600746914bebada795e97/MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd", size = 14274, upload-time = "2024-10-18T15:21:24.577Z" }, + { url = "https://files.pythonhosted.org/packages/2b/6d/9409f3684d3335375d04e5f05744dfe7e9f120062c9857df4ab490a1031a/MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430", size = 12352, upload-time = "2024-10-18T15:21:25.382Z" }, + { url = "https://files.pythonhosted.org/packages/d2/f5/6eadfcd3885ea85fe2a7c128315cc1bb7241e1987443d78c8fe712d03091/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094", size = 24122, upload-time = "2024-10-18T15:21:26.199Z" }, + { url = "https://files.pythonhosted.org/packages/0c/91/96cf928db8236f1bfab6ce15ad070dfdd02ed88261c2afafd4b43575e9e9/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396", size = 23085, upload-time = "2024-10-18T15:21:27.029Z" }, + { url = "https://files.pythonhosted.org/packages/c2/cf/c9d56af24d56ea04daae7ac0940232d31d5a8354f2b457c6d856b2057d69/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79", size = 22978, upload-time = "2024-10-18T15:21:27.846Z" }, + { url = "https://files.pythonhosted.org/packages/2a/9f/8619835cd6a711d6272d62abb78c033bda638fdc54c4e7f4272cf1c0962b/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a", size = 24208, upload-time = "2024-10-18T15:21:28.744Z" }, + { url = "https://files.pythonhosted.org/packages/f9/bf/176950a1792b2cd2102b8ffeb5133e1ed984547b75db47c25a67d3359f77/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca", size = 23357, upload-time = "2024-10-18T15:21:29.545Z" }, + { url = "https://files.pythonhosted.org/packages/ce/4f/9a02c1d335caabe5c4efb90e1b6e8ee944aa245c1aaaab8e8a618987d816/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c", size = 23344, upload-time = "2024-10-18T15:21:30.366Z" }, + { url = "https://files.pythonhosted.org/packages/ee/55/c271b57db36f748f0e04a759ace9f8f759ccf22b4960c270c78a394f58be/MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1", size = 15101, upload-time = "2024-10-18T15:21:31.207Z" }, + { url = "https://files.pythonhosted.org/packages/29/88/07df22d2dd4df40aba9f3e402e6dc1b8ee86297dddbad4872bd5e7b0094f/MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f", size = 15603, upload-time = "2024-10-18T15:21:32.032Z" }, + { url = "https://files.pythonhosted.org/packages/62/6a/8b89d24db2d32d433dffcd6a8779159da109842434f1dd2f6e71f32f738c/MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c", size = 14510, upload-time = "2024-10-18T15:21:33.625Z" }, + { url = "https://files.pythonhosted.org/packages/7a/06/a10f955f70a2e5a9bf78d11a161029d278eeacbd35ef806c3fd17b13060d/MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb", size = 12486, upload-time = "2024-10-18T15:21:34.611Z" }, + { url = "https://files.pythonhosted.org/packages/34/cf/65d4a571869a1a9078198ca28f39fba5fbb910f952f9dbc5220afff9f5e6/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c", size = 25480, upload-time = "2024-10-18T15:21:35.398Z" }, + { url = "https://files.pythonhosted.org/packages/0c/e3/90e9651924c430b885468b56b3d597cabf6d72be4b24a0acd1fa0e12af67/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d", size = 23914, upload-time = "2024-10-18T15:21:36.231Z" }, + { url = "https://files.pythonhosted.org/packages/66/8c/6c7cf61f95d63bb866db39085150df1f2a5bd3335298f14a66b48e92659c/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe", size = 23796, upload-time = "2024-10-18T15:21:37.073Z" }, + { url = "https://files.pythonhosted.org/packages/bb/35/cbe9238ec3f47ac9a7c8b3df7a808e7cb50fe149dc7039f5f454b3fba218/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5", size = 25473, upload-time = "2024-10-18T15:21:37.932Z" }, + { url = "https://files.pythonhosted.org/packages/e6/32/7621a4382488aa283cc05e8984a9c219abad3bca087be9ec77e89939ded9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a", size = 24114, upload-time = "2024-10-18T15:21:39.799Z" }, + { url = "https://files.pythonhosted.org/packages/0d/80/0985960e4b89922cb5a0bac0ed39c5b96cbc1a536a99f30e8c220a996ed9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9", size = 24098, upload-time = "2024-10-18T15:21:40.813Z" }, + { url = "https://files.pythonhosted.org/packages/82/78/fedb03c7d5380df2427038ec8d973587e90561b2d90cd472ce9254cf348b/MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6", size = 15208, upload-time = "2024-10-18T15:21:41.814Z" }, + { url = "https://files.pythonhosted.org/packages/4f/65/6079a46068dfceaeabb5dcad6d674f5f5c61a6fa5673746f42a9f4c233b3/MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f", size = 15739, upload-time = "2024-10-18T15:21:42.784Z" }, +] + +[[package]] +name = "mergedeep" +version = "1.3.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/3a/41/580bb4006e3ed0361b8151a01d324fb03f420815446c7def45d02f74c270/mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8", size = 4661, upload-time = "2021-02-05T18:55:30.623Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2c/19/04f9b178c2d8a15b076c8b5140708fa6ffc5601fb6f1e975537072df5b2a/mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307", size = 6354, upload-time = "2021-02-05T18:55:29.583Z" }, +] + +[[package]] +name = "mkdocs" +version = "1.6.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "ghp-import" }, + { name = "jinja2" }, + { name = "markdown" }, + { name = "markupsafe" }, + { name = "mergedeep" }, + { name = "mkdocs-get-deps" }, + { name = "packaging" }, + { name = "pathspec" }, + { name = "pyyaml" }, + { name = "pyyaml-env-tag" }, + { name = "watchdog" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/bc/c6/bbd4f061bd16b378247f12953ffcb04786a618ce5e904b8c5a01a0309061/mkdocs-1.6.1.tar.gz", hash = "sha256:7b432f01d928c084353ab39c57282f29f92136665bdd6abf7c1ec8d822ef86f2", size = 3889159, upload-time = "2024-08-30T12:24:06.899Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/22/5b/dbc6a8cddc9cfa9c4971d59fb12bb8d42e161b7e7f8cc89e49137c5b279c/mkdocs-1.6.1-py3-none-any.whl", hash = "sha256:db91759624d1647f3f34aa0c3f327dd2601beae39a366d6e064c03468d35c20e", size = 3864451, upload-time = "2024-08-30T12:24:05.054Z" }, +] + +[[package]] +name = "mkdocs-get-deps" +version = "0.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mergedeep" }, + { name = "platformdirs" }, + { name = "pyyaml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/98/f5/ed29cd50067784976f25ed0ed6fcd3c2ce9eb90650aa3b2796ddf7b6870b/mkdocs_get_deps-0.2.0.tar.gz", hash = "sha256:162b3d129c7fad9b19abfdcb9c1458a651628e4b1dea628ac68790fb3061c60c", size = 10239, upload-time = "2023-11-20T17:51:09.981Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9f/d4/029f984e8d3f3b6b726bd33cafc473b75e9e44c0f7e80a5b29abc466bdea/mkdocs_get_deps-0.2.0-py3-none-any.whl", hash = "sha256:2bf11d0b133e77a0dd036abeeb06dec8775e46efa526dc70667d8863eefc6134", size = 9521, upload-time = "2023-11-20T17:51:08.587Z" }, +] + +[[package]] +name = "mkdocs-material" +version = "9.6.16" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "babel" }, + { name = "backrefs" }, + { name = "colorama" }, + { name = "jinja2" }, + { name = "markdown" }, + { name = "mkdocs" }, + { name = "mkdocs-material-extensions" }, + { name = "paginate" }, + { name = "pygments" }, + { name = "pymdown-extensions" }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/dd/84/aec27a468c5e8c27689c71b516fb5a0d10b8fca45b9ad2dd9d6e43bc4296/mkdocs_material-9.6.16.tar.gz", hash = "sha256:d07011df4a5c02ee0877496d9f1bfc986cfb93d964799b032dd99fe34c0e9d19", size = 4028828, upload-time = "2025-07-26T15:53:47.542Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/65/f4/90ad67125b4dd66e7884e4dbdfab82e3679eb92b751116f8bb25ccfe2f0c/mkdocs_material-9.6.16-py3-none-any.whl", hash = "sha256:8d1a1282b892fe1fdf77bfeb08c485ba3909dd743c9ba69a19a40f637c6ec18c", size = 9223743, upload-time = "2025-07-26T15:53:44.236Z" }, +] + +[[package]] +name = "mkdocs-material-extensions" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/79/9b/9b4c96d6593b2a541e1cb8b34899a6d021d208bb357042823d4d2cabdbe7/mkdocs_material_extensions-1.3.1.tar.gz", hash = "sha256:10c9511cea88f568257f960358a467d12b970e1f7b2c0e5fb2bb48cab1928443", size = 11847, upload-time = "2023-11-22T19:09:45.208Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5b/54/662a4743aa81d9582ee9339d4ffa3c8fd40a4965e033d77b9da9774d3960/mkdocs_material_extensions-1.3.1-py3-none-any.whl", hash = "sha256:adff8b62700b25cb77b53358dad940f3ef973dd6db797907c49e3c2ef3ab4e31", size = 8728, upload-time = "2023-11-22T19:09:43.465Z" }, +] + +[[package]] +name = "packaging" +version = "25.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727, upload-time = "2025-04-19T11:48:59.673Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" }, +] + +[[package]] +name = "paginate" +version = "0.5.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ec/46/68dde5b6bc00c1296ec6466ab27dddede6aec9af1b99090e1107091b3b84/paginate-0.5.7.tar.gz", hash = "sha256:22bd083ab41e1a8b4f3690544afb2c60c25e5c9a63a30fa2f483f6c60c8e5945", size = 19252, upload-time = "2024-08-25T14:17:24.139Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/90/96/04b8e52da071d28f5e21a805b19cb9390aa17a47462ac87f5e2696b9566d/paginate-0.5.7-py2.py3-none-any.whl", hash = "sha256:b885e2af73abcf01d9559fd5216b57ef722f8c42affbb63942377668e35c7591", size = 13746, upload-time = "2024-08-25T14:17:22.55Z" }, +] + +[[package]] +name = "pathspec" +version = "0.12.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ca/bc/f35b8446f4531a7cb215605d100cd88b7ac6f44ab3fc94870c120ab3adbf/pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712", size = 51043, upload-time = "2023-12-10T22:30:45Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", size = 31191, upload-time = "2023-12-10T22:30:43.14Z" }, +] + +[[package]] +name = "platformdirs" +version = "4.3.8" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fe/8b/3c73abc9c759ecd3f1f7ceff6685840859e8070c4d947c93fae71f6a0bf2/platformdirs-4.3.8.tar.gz", hash = "sha256:3d512d96e16bcb959a814c9f348431070822a6496326a4be0911c40b5a74c2bc", size = 21362, upload-time = "2025-05-07T22:47:42.121Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fe/39/979e8e21520d4e47a0bbe349e2713c0aac6f3d853d0e5b34d76206c439aa/platformdirs-4.3.8-py3-none-any.whl", hash = "sha256:ff7059bb7eb1179e2685604f4aaf157cfd9535242bd23742eadc3c13542139b4", size = 18567, upload-time = "2025-05-07T22:47:40.376Z" }, +] + +[[package]] +name = "pygments" +version = "2.19.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b0/77/a5b8c569bf593b0140bde72ea885a803b82086995367bf2037de0159d924/pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", size = 4968631, upload-time = "2025-06-21T13:39:12.283Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload-time = "2025-06-21T13:39:07.939Z" }, +] + +[[package]] +name = "pymdown-extensions" +version = "10.16.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown" }, + { name = "pyyaml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/55/b3/6d2b3f149bc5413b0a29761c2c5832d8ce904a1d7f621e86616d96f505cc/pymdown_extensions-10.16.1.tar.gz", hash = "sha256:aace82bcccba3efc03e25d584e6a22d27a8e17caa3f4dd9f207e49b787aa9a91", size = 853277, upload-time = "2025-07-28T16:19:34.167Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e4/06/43084e6cbd4b3bc0e80f6be743b2e79fbc6eed8de9ad8c629939fa55d972/pymdown_extensions-10.16.1-py3-none-any.whl", hash = "sha256:d6ba157a6c03146a7fb122b2b9a121300056384eafeec9c9f9e584adfdb2a32d", size = 266178, upload-time = "2025-07-28T16:19:31.401Z" }, +] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload-time = "2024-03-01T18:36:20.211Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" }, +] + +[[package]] +name = "pyyaml" +version = "6.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/54/ed/79a089b6be93607fa5cdaedf301d7dfb23af5f25c398d5ead2525b063e17/pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", size = 130631, upload-time = "2024-08-06T20:33:50.674Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ef/e3/3af305b830494fa85d95f6d95ef7fa73f2ee1cc8ef5b495c7c3269fb835f/PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", size = 181309, upload-time = "2024-08-06T20:32:43.4Z" }, + { url = "https://files.pythonhosted.org/packages/45/9f/3b1c20a0b7a3200524eb0076cc027a970d320bd3a6592873c85c92a08731/PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", size = 171679, upload-time = "2024-08-06T20:32:44.801Z" }, + { url = "https://files.pythonhosted.org/packages/7c/9a/337322f27005c33bcb656c655fa78325b730324c78620e8328ae28b64d0c/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", size = 733428, upload-time = "2024-08-06T20:32:46.432Z" }, + { url = "https://files.pythonhosted.org/packages/a3/69/864fbe19e6c18ea3cc196cbe5d392175b4cf3d5d0ac1403ec3f2d237ebb5/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", size = 763361, upload-time = "2024-08-06T20:32:51.188Z" }, + { url = "https://files.pythonhosted.org/packages/04/24/b7721e4845c2f162d26f50521b825fb061bc0a5afcf9a386840f23ea19fa/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", size = 759523, upload-time = "2024-08-06T20:32:53.019Z" }, + { url = "https://files.pythonhosted.org/packages/2b/b2/e3234f59ba06559c6ff63c4e10baea10e5e7df868092bf9ab40e5b9c56b6/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", size = 726660, upload-time = "2024-08-06T20:32:54.708Z" }, + { url = "https://files.pythonhosted.org/packages/fe/0f/25911a9f080464c59fab9027482f822b86bf0608957a5fcc6eaac85aa515/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", size = 751597, upload-time = "2024-08-06T20:32:56.985Z" }, + { url = "https://files.pythonhosted.org/packages/14/0d/e2c3b43bbce3cf6bd97c840b46088a3031085179e596d4929729d8d68270/PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", size = 140527, upload-time = "2024-08-06T20:33:03.001Z" }, + { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446, upload-time = "2024-08-06T20:33:04.33Z" }, +] + +[[package]] +name = "pyyaml-env-tag" +version = "1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyyaml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/eb/2e/79c822141bfd05a853236b504869ebc6b70159afc570e1d5a20641782eaa/pyyaml_env_tag-1.1.tar.gz", hash = "sha256:2eb38b75a2d21ee0475d6d97ec19c63287a7e140231e4214969d0eac923cd7ff", size = 5737, upload-time = "2025-05-13T15:24:01.64Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/11/432f32f8097b03e3cd5fe57e88efb685d964e2e5178a48ed61e841f7fdce/pyyaml_env_tag-1.1-py3-none-any.whl", hash = "sha256:17109e1a528561e32f026364712fee1264bc2ea6715120891174ed1b980d2e04", size = 4722, upload-time = "2025-05-13T15:23:59.629Z" }, +] + +[[package]] +name = "requests" +version = "2.32.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e1/0a/929373653770d8a0d7ea76c37de6e41f11eb07559b103b1c02cafb3f7cf8/requests-2.32.4.tar.gz", hash = "sha256:27d0316682c8a29834d3264820024b62a36942083d52caf2f14c0591336d3422", size = 135258, upload-time = "2025-06-09T16:43:07.34Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7c/e4/56027c4a6b4ae70ca9de302488c5ca95ad4a39e190093d6c1a8ace08341b/requests-2.32.4-py3-none-any.whl", hash = "sha256:27babd3cda2a6d50b30443204ee89830707d396671944c998b5975b031ac2b2c", size = 64847, upload-time = "2025-06-09T16:43:05.728Z" }, +] + +[[package]] +name = "six" +version = "1.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, +] + +[[package]] +name = "urllib3" +version = "2.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/15/22/9ee70a2574a4f4599c47dd506532914ce044817c7752a79b6a51286319bc/urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760", size = 393185, upload-time = "2025-06-18T14:07:41.644Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc", size = 129795, upload-time = "2025-06-18T14:07:40.39Z" }, +] + +[[package]] +name = "urssi-docs" +version = "0.1.0" +source = { virtual = "." } +dependencies = [ + { name = "mkdocs-material" }, +] + +[package.metadata] +requires-dist = [{ name = "mkdocs-material", specifier = ">=9.6.16" }] + +[[package]] +name = "watchdog" +version = "6.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/db/7d/7f3d619e951c88ed75c6037b246ddcf2d322812ee8ea189be89511721d54/watchdog-6.0.0.tar.gz", hash = "sha256:9ddf7c82fda3ae8e24decda1338ede66e1c99883db93711d8fb941eaa2d8c282", size = 131220, upload-time = "2024-11-01T14:07:13.037Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/68/98/b0345cabdce2041a01293ba483333582891a3bd5769b08eceb0d406056ef/watchdog-6.0.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:490ab2ef84f11129844c23fb14ecf30ef3d8a6abafd3754a6f75ca1e6654136c", size = 96480, upload-time = "2024-11-01T14:06:42.952Z" }, + { url = "https://files.pythonhosted.org/packages/85/83/cdf13902c626b28eedef7ec4f10745c52aad8a8fe7eb04ed7b1f111ca20e/watchdog-6.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:76aae96b00ae814b181bb25b1b98076d5fc84e8a53cd8885a318b42b6d3a5134", size = 88451, upload-time = "2024-11-01T14:06:45.084Z" }, + { url = "https://files.pythonhosted.org/packages/fe/c4/225c87bae08c8b9ec99030cd48ae9c4eca050a59bf5c2255853e18c87b50/watchdog-6.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a175f755fc2279e0b7312c0035d52e27211a5bc39719dd529625b1930917345b", size = 89057, upload-time = "2024-11-01T14:06:47.324Z" }, + { url = "https://files.pythonhosted.org/packages/a9/c7/ca4bf3e518cb57a686b2feb4f55a1892fd9a3dd13f470fca14e00f80ea36/watchdog-6.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7607498efa04a3542ae3e05e64da8202e58159aa1fa4acddf7678d34a35d4f13", size = 79079, upload-time = "2024-11-01T14:06:59.472Z" }, + { url = "https://files.pythonhosted.org/packages/5c/51/d46dc9332f9a647593c947b4b88e2381c8dfc0942d15b8edc0310fa4abb1/watchdog-6.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:9041567ee8953024c83343288ccc458fd0a2d811d6a0fd68c4c22609e3490379", size = 79078, upload-time = "2024-11-01T14:07:01.431Z" }, + { url = "https://files.pythonhosted.org/packages/d4/57/04edbf5e169cd318d5f07b4766fee38e825d64b6913ca157ca32d1a42267/watchdog-6.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:82dc3e3143c7e38ec49d61af98d6558288c415eac98486a5c581726e0737c00e", size = 79076, upload-time = "2024-11-01T14:07:02.568Z" }, + { url = "https://files.pythonhosted.org/packages/ab/cc/da8422b300e13cb187d2203f20b9253e91058aaf7db65b74142013478e66/watchdog-6.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:212ac9b8bf1161dc91bd09c048048a95ca3a4c4f5e5d4a7d1b1a7d5752a7f96f", size = 79077, upload-time = "2024-11-01T14:07:03.893Z" }, + { url = "https://files.pythonhosted.org/packages/2c/3b/b8964e04ae1a025c44ba8e4291f86e97fac443bca31de8bd98d3263d2fcf/watchdog-6.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:e3df4cbb9a450c6d49318f6d14f4bbc80d763fa587ba46ec86f99f9e6876bb26", size = 79078, upload-time = "2024-11-01T14:07:05.189Z" }, + { url = "https://files.pythonhosted.org/packages/62/ae/a696eb424bedff7407801c257d4b1afda455fe40821a2be430e173660e81/watchdog-6.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:2cce7cfc2008eb51feb6aab51251fd79b85d9894e98ba847408f662b3395ca3c", size = 79077, upload-time = "2024-11-01T14:07:06.376Z" }, + { url = "https://files.pythonhosted.org/packages/b5/e8/dbf020b4d98251a9860752a094d09a65e1b436ad181faf929983f697048f/watchdog-6.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:20ffe5b202af80ab4266dcd3e91aae72bf2da48c0d33bdb15c66658e685e94e2", size = 79078, upload-time = "2024-11-01T14:07:07.547Z" }, + { url = "https://files.pythonhosted.org/packages/07/f6/d0e5b343768e8bcb4cda79f0f2f55051bf26177ecd5651f84c07567461cf/watchdog-6.0.0-py3-none-win32.whl", hash = "sha256:07df1fdd701c5d4c8e55ef6cf55b8f0120fe1aef7ef39a1c6fc6bc2e606d517a", size = 79065, upload-time = "2024-11-01T14:07:09.525Z" }, + { url = "https://files.pythonhosted.org/packages/db/d9/c495884c6e548fce18a8f40568ff120bc3a4b7b99813081c8ac0c936fa64/watchdog-6.0.0-py3-none-win_amd64.whl", hash = "sha256:cbafb470cf848d93b5d013e2ecb245d4aa1c8fd0504e863ccefa32445359d680", size = 79070, upload-time = "2024-11-01T14:07:10.686Z" }, + { url = "https://files.pythonhosted.org/packages/33/e8/e40370e6d74ddba47f002a32919d91310d6074130fe4e17dabcafc15cbf1/watchdog-6.0.0-py3-none-win_ia64.whl", hash = "sha256:a1914259fa9e1454315171103c6a30961236f508b9b623eae470268bbcc6a22f", size = 79067, upload-time = "2024-11-01T14:07:11.845Z" }, +] From e706db64205a6da30607a367c4fcec943fd0e7db Mon Sep 17 00:00:00 2001 From: Tim Monko Date: Sun, 3 Aug 2025 15:06:38 -0500 Subject: [PATCH 2/4] add docs deployment --- .github/workflows/deploy_docs.yml | 28 ++++++++++ docs/docs-setup.md | 86 +++++++++++++++++++++++++++++++ docs/gh_repo_settings.md | 21 +++++++- 3 files changed, 133 insertions(+), 2 deletions(-) create mode 100644 .github/workflows/deploy_docs.yml create mode 100644 docs/docs-setup.md diff --git a/.github/workflows/deploy_docs.yml b/.github/workflows/deploy_docs.yml new file mode 100644 index 0000000..016d91f --- /dev/null +++ b/.github/workflows/deploy_docs.yml @@ -0,0 +1,28 @@ +name: Deploy Docs + +on: + push: + branches: [main] + pull_request: + +permissions: + contents: write + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + docs: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: astral-sh/setup-uv@v6 + + - name: Test that docs build without error + if: github.event_name == 'pull_request' + run: uv run mkdocs build --strict + + - name: Deploy docs to GitHub Pages + if: github.event_name == 'push' + run: uv run mkdocs gh-deploy --strict --force \ No newline at end of file diff --git a/docs/docs-setup.md b/docs/docs-setup.md new file mode 100644 index 0000000..8dd8466 --- /dev/null +++ b/docs/docs-setup.md @@ -0,0 +1,86 @@ +# Creating documentation with uv and MkDocs + +For preparing documentation, we will use [MkDocs](https://www.mkdocs.org/) with the [Material theme](https://squidfunk.github.io/mkdocs-material/). The Material theme is first class for MkDocs, and in fact many plugins are set up for Material and not the default MkDocs theme. + +## Get MkDocs locally + +```bash +uv init +uv add mkdocs-material +``` + +or + +```bash +uv pip install mkdocs-material +``` + +## Initialize a new MkDocs project + +```bash +uv run mkdocs new . +uv run mkdocs serve +``` + +Follow the [setup instructions](https://squidfunk.github.io/mkdocs-material/creating-your-site/) from mkdocs-material. + +## Create Documentation Locally + +Add documentation to `docs/`. Save, and watch a live update in your browser. + +Make commits and push to your repo, preferably with a PR. (See [Recommended Github Repo Settings](docs/gh_repo_settings.md) for more details on how to set up your repo.) + +To build the documentation locally, use + +```bash +uv run mkdocs build +``` + +And it will create a `site/` directory with the built documentation. + +While you *can* manage a static site by locally building and uploading the `site/` directory, it is much easier to use a service like [GitHub Pages](https://pages.github.com/) or [Read the Docs](https://readthedocs.org/) to host your documentation. For this reason, I add `site/` to `.gitignore` so that it is not committed to the repo. + +## Deploy Documentation + +Instead of building the docs locally, we will use GitHub Actions to build and deploy the documentation. + +MkDocs provides a way to manually deploy to GitHub Pages `mkdocs gh-deploy`, but again, this requires local management *and* goes against the ethos of using PRs to manage changes to the codebase. + +Instead, we will use a GitHub Action to automatically build the documentation in PRs and commits to main, and deploy the docs to GitHub Pages when a PR is merged to main. MkDocs-Materials provides an action to do this, which is documented in the [MkDocs-Material documentation](https://squidfunk.github.io/mkdocs-material/publishing-your-site/), but we will use a custom action. + +First, create a `.github/workflows/` directory in your repo. Then, create a file called `deploy_docs.yml` in that directory with the following content: + +```yaml +name: Deploy Docs + +on: + push: + branches: [main] + pull_request: + +permissions: + contents: write + +concurrency: + name: Cancel in-progress jobs for same trigger + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + docs: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: astral-sh/setup-uv@v6 + + - name: Test that docs build without error + if: github.event_name == 'pull_request' + run: uv run mkdocs build --strict + + - name: Deploy docs to GitHub Pages + if: github.event_name == 'push' + run: uv run mkdocs gh-deploy --strict --force + +``` + +Now, when you create a PR the docs will be tested to ensure they build without error. When you merge a PR to main, the docs will be built and deployed to GitHub Pages. diff --git a/docs/gh_repo_settings.md b/docs/gh_repo_settings.md index d0a13c6..41210c2 100644 --- a/docs/gh_repo_settings.md +++ b/docs/gh_repo_settings.md @@ -29,5 +29,22 @@ In Repo Settings -> Rulesets. 4. Turn on "Require a pull request before merging". Use settings appropriate for yourself or team. 5. Read through the rest of the settings and determine if they are appropriate for your project. -![Github Branch Protection Settings](assets/gh-branch-protection-settings.png) - +Trying to push to main will result in + +```bash +C:\Users\Tim\teaching\urssi-docs>git push +Enumerating objects: 14, done. +Counting objects: 100% (14/14), done. +Delta compression using up to 12 threads +Compressing objects: 100% (10/10), done. +Writing objects: 100% (13/13), 58.66 KiB | 8.38 MiB/s, done. +Total 13 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0) +remote: error: GH013: Repository rule violations found for refs/heads/main. +remote: Review all repository rules at https://github.com/TimMonko/urssi-docs/rules?ref=refs%2Fheads%2Fmain +remote: +remote: - Changes must be made through a pull request. +remote: +To https://github.com/TimMonko/urssi-docs.git + ! [remote rejected] main -> main (push declined due to repository rule violations) +error: failed to push some refs to 'https://github.com/TimMonko/urssi-docs.git' +``` From 5b07408dd5bfb5cdd18c0f70a4bf9a36369c226d Mon Sep 17 00:00:00 2001 From: Tim Monko Date: Sun, 3 Aug 2025 15:10:21 -0500 Subject: [PATCH 3/4] rename with underscores --- docs/{docs-setup.md => docs_setup.md} | 6 ++++++ 1 file changed, 6 insertions(+) rename docs/{docs-setup.md => docs_setup.md} (91%) diff --git a/docs/docs-setup.md b/docs/docs_setup.md similarity index 91% rename from docs/docs-setup.md rename to docs/docs_setup.md index 8dd8466..925fcf6 100644 --- a/docs/docs-setup.md +++ b/docs/docs_setup.md @@ -84,3 +84,9 @@ jobs: ``` Now, when you create a PR the docs will be tested to ensure they build without error. When you merge a PR to main, the docs will be built and deployed to GitHub Pages. + +While writing this, I got the error in my [action on the PR](https://github.com/TimMonko/urssi-docs/actions/runs/16708940401/job/47291006777?pr=1). Helpful! + +```bash +WARNING - Doc file 'docs-setup.md' contains a link 'docs/gh_repo_settings.md', but the target is not found among documentation files. +``` \ No newline at end of file From 6cf20ce80d7c1ff688c52060b6ac7057471298c8 Mon Sep 17 00:00:00 2001 From: Tim Monko Date: Sun, 3 Aug 2025 15:11:32 -0500 Subject: [PATCH 4/4] fix crosslink --- docs/docs_setup.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs_setup.md b/docs/docs_setup.md index 925fcf6..65457c1 100644 --- a/docs/docs_setup.md +++ b/docs/docs_setup.md @@ -28,7 +28,7 @@ Follow the [setup instructions](https://squidfunk.github.io/mkdocs-material/crea Add documentation to `docs/`. Save, and watch a live update in your browser. -Make commits and push to your repo, preferably with a PR. (See [Recommended Github Repo Settings](docs/gh_repo_settings.md) for more details on how to set up your repo.) +Make commits and push to your repo, preferably with a PR. (See [Recommended Github Repo Settings](gh_repo_settings.md) for more details on how to set up your repo.) To build the documentation locally, use