From e0e23c7b9b7ad30fa9d6693891ab875f6f2911d8 Mon Sep 17 00:00:00 2001 From: Cian Hughes Date: Tue, 7 Nov 2023 13:43:26 +0000 Subject: [PATCH] Polished up documentation --- LICENSE | 7 ++ README.md | 34 +++++++ docs/assets/favicon.ico | Bin 0 -> 116246 bytes docs/assets/logo.png | Bin 0 -> 26110 bytes docs/license.md | 7 ++ docs/src/autoignition.md | 2 +- docs/src/cli.md | 3 + docs/src/config.md | 3 + docs/src/create_disk.md | 3 + docs/src/create_img.md | 3 + docs/src/debug.md | 3 + docs/src/utils.md | 3 + mkdocs.yaml | 51 ++++++++-- poetry.lock | 210 ++++++++++++++++++++++++++++++++++++++- pyproject.toml | 4 + scripts/docs.py | 32 ++++++ 16 files changed, 356 insertions(+), 9 deletions(-) create mode 100644 LICENSE create mode 100644 docs/assets/favicon.ico create mode 100644 docs/assets/logo.png create mode 100644 docs/license.md create mode 100644 docs/src/cli.md create mode 100644 docs/src/config.md create mode 100644 docs/src/debug.md create mode 100644 docs/src/utils.md create mode 100644 scripts/docs.py diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..d0fd285 --- /dev/null +++ b/LICENSE @@ -0,0 +1,7 @@ +Copyright 2023 Cian Hughes + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/README.md b/README.md index e69de29..843404e 100644 --- a/README.md +++ b/README.md @@ -0,0 +1,34 @@ + + +## + +# I-Form Server Node Deployer +--- +## Introduction +Welcome to the documentation for the I-Form Server Node Deployer tool. This tool is designed to simplify the process of deploying new nodes to the I-Form server swarm. It is intended to make the process of deploying new nodes as simple as possible, and to reduce the amount of time required to deploy new nodes. This should provide a reliable and consistent deployment process, creating an adaptable and scalable foundation for building research servers. +## Description +This program is designed to automatically create install media for deploying a swarm of minimal, immutable, and stateless nodes, to which containers can be deployed. If correctly configured, the resulting nodes will automatically connect to the specied swarm manager and immediately begin running deployed containers. The deployed nodes can be managed via the MicroOS dashboard, or via SSH. If the swarm is managed by a similarly deployed node, the entire swarm can also be managed via the MicroOS dashboard. Otherwise, access to the swarm manager is required to manage the swarm. +## Notice +The tool is currently in early alpha, and is subject to significant change. + +## Installation + +To install currently, download the `node_deployer` repo from the github repository, then install the package with poetry: +```bash +poetry install --no-dev +``` +The tool can then be invoked with `poetry run node_deployer`. To install the tool system-wide, run `poetry build` and then install the package with `pip install dist/node_deployer*.whl`. The tool can then be invoked with `python -m node_deployer`. + +This installation process will be subject to significant change in the future. Currently, the tool is in early alpha. + +## Usage + +To create an install disk invoke the `create-ignition-disk` command. The tool will then prompt the user to input the required parameters. Alternatively, the parameters can be passed as command line arguments. The following example creates an install disk on `/dev/sdb` managed by the computer at `192.168.1.1` +```bash + node_deployer create-ignition-disk -d /dev/sdb -ip 192.168.1.1 +``` +The user will then be prompted to input a password and swarm token. + +## Deployment + +This tool creates an [ignition drive](https://coreos.github.io/ignition/) that can be used with a [OpenSUSE MicroOS self-install drive](https://get.opensuse.org/microos/) to automatically deploy new nodes to the swarm. \ No newline at end of file diff --git a/docs/assets/favicon.ico b/docs/assets/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..ca66531a614af52da5230130a3101e9e85d13841 GIT binary patch literal 116246 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.1.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +[[package]] +name = "babel" +version = "2.13.1" +description = "Internationalization utilities" +optional = false +python-versions = ">=3.7" +files = [ + {file = "Babel-2.13.1-py3-none-any.whl", hash = "sha256:7077a4984b02b6727ac10f1f7294484f737443d7e2e66c5e4380e41a3ae0b4ed"}, + {file = "Babel-2.13.1.tar.gz", hash = "sha256:33e0952d7dd6374af8dbf6768cc4ddf3ccfefc244f9986d4074704f2fbd18900"}, +] + +[package.dependencies] +setuptools = {version = "*", markers = "python_version >= \"3.12\""} + +[package.extras] +dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"] + [[package]] name = "beautifulsoup4" version = "4.12.2" @@ -792,6 +809,63 @@ files = [ Markdown = ">=3.3" mkdocs = ">=1.1" +[[package]] +name = "mkdocs-git-revision-date-localized-plugin" +version = "1.2.1" +description = "Mkdocs plugin that enables displaying the localized date of the last git modification of a markdown file." +optional = false +python-versions = ">=3.6" +files = [ + {file = "mkdocs-git-revision-date-localized-plugin-1.2.1.tar.gz", hash = "sha256:fc5b23a9d572cbba0114e9e17152001d01724990cb308830e58291fa614faf73"}, + {file = "mkdocs_git_revision_date_localized_plugin-1.2.1-py3-none-any.whl", hash = "sha256:d57dc99d67af917899e69c392f1ebccd1779fa243d641255469b03f8a3596b96"}, +] + +[package.dependencies] +babel = ">=2.7.0" +GitPython = "*" +mkdocs = ">=1.0" +pytz = "*" + +[[package]] +name = "mkdocs-material" +version = "9.4.8" +description = "Documentation that simply works" +optional = false +python-versions = ">=3.8" +files = [ + {file = "mkdocs_material-9.4.8-py3-none-any.whl", hash = "sha256:8b20f6851bddeef37dced903893cd176cf13a21a482e97705a103c45f06ce9b9"}, + {file = "mkdocs_material-9.4.8.tar.gz", hash = "sha256:f0c101453e8bc12b040e8b64ca39a405d950d8402609b1378cc2b98976e74b5f"}, +] + +[package.dependencies] +babel = ">=2.10,<3.0" +colorama = ">=0.4,<1.0" +jinja2 = ">=3.0,<4.0" +markdown = ">=3.2,<4.0" +mkdocs = ">=1.5.3,<2.0" +mkdocs-material-extensions = ">=1.3,<2.0" +paginate = ">=0.5,<1.0" +pygments = ">=2.16,<3.0" +pymdown-extensions = ">=10.2,<11.0" +regex = ">=2022.4" +requests = ">=2.26,<3.0" + +[package.extras] +git = ["mkdocs-git-committers-plugin-2 (>=1.1,<2.0)", "mkdocs-git-revision-date-localized-plugin (>=1.2,<2.0)"] +imaging = ["cairosvg (>=2.6,<3.0)", "pillow (>=9.4,<10.0)"] +recommended = ["mkdocs-minify-plugin (>=0.7,<1.0)", "mkdocs-redirects (>=1.2,<2.0)", "mkdocs-rss-plugin (>=1.6,<2.0)"] + +[[package]] +name = "mkdocs-material-extensions" +version = "1.3" +description = "Extension pack for Python Markdown and MkDocs Material." +optional = false +python-versions = ">=3.8" +files = [ + {file = "mkdocs_material_extensions-1.3-py3-none-any.whl", hash = "sha256:0297cc48ba68a9fdd1ef3780a3b41b534b0d0df1d1181a44676fda5f464eeadc"}, + {file = "mkdocs_material_extensions-1.3.tar.gz", hash = "sha256:f0446091503acb110a7cab9349cbc90eeac51b58d1caa92a704a81ca1e24ddbd"}, +] + [[package]] name = "mkdocstrings" version = "0.23.0" @@ -913,6 +987,16 @@ files = [ {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, ] +[[package]] +name = "paginate" +version = "0.5.6" +description = "Divides large result sets into pages for easier browsing" +optional = false +python-versions = "*" +files = [ + {file = "paginate-0.5.6.tar.gz", hash = "sha256:5e6007b6a9398177a7e1648d04fdd9f8c9766a1a945bceac82f1929e8c78af2d"}, +] + [[package]] name = "pathspec" version = "0.11.2" @@ -1043,6 +1127,17 @@ files = [ [package.dependencies] six = ">=1.5" +[[package]] +name = "pytz" +version = "2023.3.post1" +description = "World timezone definitions, modern and historical" +optional = false +python-versions = "*" +files = [ + {file = "pytz-2023.3.post1-py2.py3-none-any.whl", hash = "sha256:ce42d816b81b68506614c11e8937d3aa9e41007ceb50bfdcb0749b921bf646c7"}, + {file = "pytz-2023.3.post1.tar.gz", hash = "sha256:7b4fddbeb94a1eba4b557da24f19fdf9db575192544270a9101d8509f9f43d7b"}, +] + [[package]] name = "pywin32" version = "306" @@ -1129,6 +1224,103 @@ files = [ [package.dependencies] pyyaml = "*" +[[package]] +name = "regex" +version = "2023.10.3" +description = "Alternative regular expression module, to replace re." +optional = false +python-versions = ">=3.7" +files = [ + {file = "regex-2023.10.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4c34d4f73ea738223a094d8e0ffd6d2c1a1b4c175da34d6b0de3d8d69bee6bcc"}, + {file = "regex-2023.10.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a8f4e49fc3ce020f65411432183e6775f24e02dff617281094ba6ab079ef0915"}, + {file = "regex-2023.10.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4cd1bccf99d3ef1ab6ba835308ad85be040e6a11b0977ef7ea8c8005f01a3c29"}, + {file = "regex-2023.10.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:81dce2ddc9f6e8f543d94b05d56e70d03a0774d32f6cca53e978dc01e4fc75b8"}, + {file = "regex-2023.10.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c6b4d23c04831e3ab61717a707a5d763b300213db49ca680edf8bf13ab5d91b"}, + {file = "regex-2023.10.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c15ad0aee158a15e17e0495e1e18741573d04eb6da06d8b84af726cfc1ed02ee"}, + {file = "regex-2023.10.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6239d4e2e0b52c8bd38c51b760cd870069f0bdf99700a62cd509d7a031749a55"}, + {file = "regex-2023.10.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4a8bf76e3182797c6b1afa5b822d1d5802ff30284abe4599e1247be4fd6b03be"}, + {file = "regex-2023.10.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d9c727bbcf0065cbb20f39d2b4f932f8fa1631c3e01fcedc979bd4f51fe051c5"}, + {file = "regex-2023.10.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:3ccf2716add72f80714b9a63899b67fa711b654be3fcdd34fa391d2d274ce767"}, + {file = "regex-2023.10.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:107ac60d1bfdc3edb53be75e2a52aff7481b92817cfdddd9b4519ccf0e54a6ff"}, + {file = "regex-2023.10.3-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:00ba3c9818e33f1fa974693fb55d24cdc8ebafcb2e4207680669d8f8d7cca79a"}, + {file = "regex-2023.10.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f0a47efb1dbef13af9c9a54a94a0b814902e547b7f21acb29434504d18f36e3a"}, + {file = "regex-2023.10.3-cp310-cp310-win32.whl", hash = "sha256:36362386b813fa6c9146da6149a001b7bd063dabc4d49522a1f7aa65b725c7ec"}, + {file = "regex-2023.10.3-cp310-cp310-win_amd64.whl", hash = "sha256:c65a3b5330b54103e7d21cac3f6bf3900d46f6d50138d73343d9e5b2900b2353"}, + {file = "regex-2023.10.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:90a79bce019c442604662d17bf69df99090e24cdc6ad95b18b6725c2988a490e"}, + {file = "regex-2023.10.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c7964c2183c3e6cce3f497e3a9f49d182e969f2dc3aeeadfa18945ff7bdd7051"}, + {file = "regex-2023.10.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ef80829117a8061f974b2fda8ec799717242353bff55f8a29411794d635d964"}, + {file = "regex-2023.10.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5addc9d0209a9afca5fc070f93b726bf7003bd63a427f65ef797a931782e7edc"}, + {file = "regex-2023.10.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c148bec483cc4b421562b4bcedb8e28a3b84fcc8f0aa4418e10898f3c2c0eb9b"}, + {file = "regex-2023.10.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d1f21af4c1539051049796a0f50aa342f9a27cde57318f2fc41ed50b0dbc4ac"}, + {file = "regex-2023.10.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0b9ac09853b2a3e0d0082104036579809679e7715671cfbf89d83c1cb2a30f58"}, + {file = "regex-2023.10.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ebedc192abbc7fd13c5ee800e83a6df252bec691eb2c4bedc9f8b2e2903f5e2a"}, + {file = "regex-2023.10.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:d8a993c0a0ffd5f2d3bda23d0cd75e7086736f8f8268de8a82fbc4bd0ac6791e"}, + {file = "regex-2023.10.3-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:be6b7b8d42d3090b6c80793524fa66c57ad7ee3fe9722b258aec6d0672543fd0"}, + {file = "regex-2023.10.3-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4023e2efc35a30e66e938de5aef42b520c20e7eda7bb5fb12c35e5d09a4c43f6"}, + {file = "regex-2023.10.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0d47840dc05e0ba04fe2e26f15126de7c755496d5a8aae4a08bda4dd8d646c54"}, + {file = "regex-2023.10.3-cp311-cp311-win32.whl", hash = "sha256:9145f092b5d1977ec8c0ab46e7b3381b2fd069957b9862a43bd383e5c01d18c2"}, + {file = "regex-2023.10.3-cp311-cp311-win_amd64.whl", hash = "sha256:b6104f9a46bd8743e4f738afef69b153c4b8b592d35ae46db07fc28ae3d5fb7c"}, + {file = "regex-2023.10.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:bff507ae210371d4b1fe316d03433ac099f184d570a1a611e541923f78f05037"}, + {file = "regex-2023.10.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:be5e22bbb67924dea15039c3282fa4cc6cdfbe0cbbd1c0515f9223186fc2ec5f"}, + {file = "regex-2023.10.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a992f702c9be9c72fa46f01ca6e18d131906a7180950958f766c2aa294d4b41"}, + {file = "regex-2023.10.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7434a61b158be563c1362d9071358f8ab91b8d928728cd2882af060481244c9e"}, + {file = "regex-2023.10.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c2169b2dcabf4e608416f7f9468737583ce5f0a6e8677c4efbf795ce81109d7c"}, + {file = "regex-2023.10.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9e908ef5889cda4de038892b9accc36d33d72fb3e12c747e2799a0e806ec841"}, + {file = "regex-2023.10.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:12bd4bc2c632742c7ce20db48e0d99afdc05e03f0b4c1af90542e05b809a03d9"}, + {file = "regex-2023.10.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:bc72c231f5449d86d6c7d9cc7cd819b6eb30134bb770b8cfdc0765e48ef9c420"}, + {file = "regex-2023.10.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bce8814b076f0ce5766dc87d5a056b0e9437b8e0cd351b9a6c4e1134a7dfbda9"}, + {file = "regex-2023.10.3-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:ba7cd6dc4d585ea544c1412019921570ebd8a597fabf475acc4528210d7c4a6f"}, + {file = "regex-2023.10.3-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b0c7d2f698e83f15228ba41c135501cfe7d5740181d5903e250e47f617eb4292"}, + {file = "regex-2023.10.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5a8f91c64f390ecee09ff793319f30a0f32492e99f5dc1c72bc361f23ccd0a9a"}, + {file = "regex-2023.10.3-cp312-cp312-win32.whl", hash = "sha256:ad08a69728ff3c79866d729b095872afe1e0557251da4abb2c5faff15a91d19a"}, + {file = "regex-2023.10.3-cp312-cp312-win_amd64.whl", hash = "sha256:39cdf8d141d6d44e8d5a12a8569d5a227f645c87df4f92179bd06e2e2705e76b"}, + {file = "regex-2023.10.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4a3ee019a9befe84fa3e917a2dd378807e423d013377a884c1970a3c2792d293"}, + {file = "regex-2023.10.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76066d7ff61ba6bf3cb5efe2428fc82aac91802844c022d849a1f0f53820502d"}, + {file = "regex-2023.10.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bfe50b61bab1b1ec260fa7cd91106fa9fece57e6beba05630afe27c71259c59b"}, + {file = "regex-2023.10.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fd88f373cb71e6b59b7fa597e47e518282455c2734fd4306a05ca219a1991b0"}, + {file = "regex-2023.10.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b3ab05a182c7937fb374f7e946f04fb23a0c0699c0450e9fb02ef567412d2fa3"}, + {file = "regex-2023.10.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dac37cf08fcf2094159922edc7a2784cfcc5c70f8354469f79ed085f0328ebdf"}, + {file = "regex-2023.10.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e54ddd0bb8fb626aa1f9ba7b36629564544954fff9669b15da3610c22b9a0991"}, + {file = "regex-2023.10.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:3367007ad1951fde612bf65b0dffc8fd681a4ab98ac86957d16491400d661302"}, + {file = "regex-2023.10.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:16f8740eb6dbacc7113e3097b0a36065a02e37b47c936b551805d40340fb9971"}, + {file = "regex-2023.10.3-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:f4f2ca6df64cbdd27f27b34f35adb640b5d2d77264228554e68deda54456eb11"}, + {file = "regex-2023.10.3-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:39807cbcbe406efca2a233884e169d056c35aa7e9f343d4e78665246a332f597"}, + {file = "regex-2023.10.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:7eece6fbd3eae4a92d7c748ae825cbc1ee41a89bb1c3db05b5578ed3cfcfd7cb"}, + {file = "regex-2023.10.3-cp37-cp37m-win32.whl", hash = "sha256:ce615c92d90df8373d9e13acddd154152645c0dc060871abf6bd43809673d20a"}, + {file = "regex-2023.10.3-cp37-cp37m-win_amd64.whl", hash = "sha256:0f649fa32fe734c4abdfd4edbb8381c74abf5f34bc0b3271ce687b23729299ed"}, + {file = "regex-2023.10.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9b98b7681a9437262947f41c7fac567c7e1f6eddd94b0483596d320092004533"}, + {file = "regex-2023.10.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:91dc1d531f80c862441d7b66c4505cd6ea9d312f01fb2f4654f40c6fdf5cc37a"}, + {file = "regex-2023.10.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82fcc1f1cc3ff1ab8a57ba619b149b907072e750815c5ba63e7aa2e1163384a4"}, + {file = "regex-2023.10.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7979b834ec7a33aafae34a90aad9f914c41fd6eaa8474e66953f3f6f7cbd4368"}, + {file = "regex-2023.10.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ef71561f82a89af6cfcbee47f0fabfdb6e63788a9258e913955d89fdd96902ab"}, + {file = "regex-2023.10.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd829712de97753367153ed84f2de752b86cd1f7a88b55a3a775eb52eafe8a94"}, + {file = "regex-2023.10.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:00e871d83a45eee2f8688d7e6849609c2ca2a04a6d48fba3dff4deef35d14f07"}, + {file = "regex-2023.10.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:706e7b739fdd17cb89e1fbf712d9dc21311fc2333f6d435eac2d4ee81985098c"}, + {file = "regex-2023.10.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:cc3f1c053b73f20c7ad88b0d1d23be7e7b3901229ce89f5000a8399746a6e039"}, + {file = "regex-2023.10.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:6f85739e80d13644b981a88f529d79c5bdf646b460ba190bffcaf6d57b2a9863"}, + {file = "regex-2023.10.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:741ba2f511cc9626b7561a440f87d658aabb3d6b744a86a3c025f866b4d19e7f"}, + {file = "regex-2023.10.3-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:e77c90ab5997e85901da85131fd36acd0ed2221368199b65f0d11bca44549711"}, + {file = "regex-2023.10.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:979c24cbefaf2420c4e377ecd1f165ea08cc3d1fbb44bdc51bccbbf7c66a2cb4"}, + {file = "regex-2023.10.3-cp38-cp38-win32.whl", hash = "sha256:58837f9d221744d4c92d2cf7201c6acd19623b50c643b56992cbd2b745485d3d"}, + {file = "regex-2023.10.3-cp38-cp38-win_amd64.whl", hash = "sha256:c55853684fe08d4897c37dfc5faeff70607a5f1806c8be148f1695be4a63414b"}, + {file = "regex-2023.10.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2c54e23836650bdf2c18222c87f6f840d4943944146ca479858404fedeb9f9af"}, + {file = "regex-2023.10.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:69c0771ca5653c7d4b65203cbfc5e66db9375f1078689459fe196fe08b7b4930"}, + {file = "regex-2023.10.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ac965a998e1388e6ff2e9781f499ad1eaa41e962a40d11c7823c9952c77123e"}, + {file = "regex-2023.10.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1c0e8fae5b27caa34177bdfa5a960c46ff2f78ee2d45c6db15ae3f64ecadde14"}, + {file = "regex-2023.10.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6c56c3d47da04f921b73ff9415fbaa939f684d47293f071aa9cbb13c94afc17d"}, + {file = "regex-2023.10.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ef1e014eed78ab650bef9a6a9cbe50b052c0aebe553fb2881e0453717573f52"}, + {file = "regex-2023.10.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d29338556a59423d9ff7b6eb0cb89ead2b0875e08fe522f3e068b955c3e7b59b"}, + {file = "regex-2023.10.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9c6d0ced3c06d0f183b73d3c5920727268d2201aa0fe6d55c60d68c792ff3588"}, + {file = "regex-2023.10.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:994645a46c6a740ee8ce8df7911d4aee458d9b1bc5639bc968226763d07f00fa"}, + {file = "regex-2023.10.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:66e2fe786ef28da2b28e222c89502b2af984858091675044d93cb50e6f46d7af"}, + {file = "regex-2023.10.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:11175910f62b2b8c055f2b089e0fedd694fe2be3941b3e2633653bc51064c528"}, + {file = "regex-2023.10.3-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:06e9abc0e4c9ab4779c74ad99c3fc10d3967d03114449acc2c2762ad4472b8ca"}, + {file = "regex-2023.10.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:fb02e4257376ae25c6dd95a5aec377f9b18c09be6ebdefa7ad209b9137b73d48"}, + {file = "regex-2023.10.3-cp39-cp39-win32.whl", hash = "sha256:3b2c3502603fab52d7619b882c25a6850b766ebd1b18de3df23b2f939360e1bd"}, + {file = "regex-2023.10.3-cp39-cp39-win_amd64.whl", hash = "sha256:adbccd17dcaff65704c856bd29951c58a1bd4b2b0f8ad6b826dbd543fe740988"}, + {file = "regex-2023.10.3.tar.gz", hash = "sha256:3fef4f844d2290ee0ba57addcec17eec9e3df73f10a2748485dfd6a3a188cc0f"}, +] + [[package]] name = "requests" version = "2.31.0" @@ -1211,6 +1403,22 @@ trio = ">=0.17,<1.0" trio-websocket = ">=0.9,<1.0" urllib3 = {version = ">=1.26,<3", extras = ["socks"]} +[[package]] +name = "setuptools" +version = "68.2.2" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "setuptools-68.2.2-py3-none-any.whl", hash = "sha256:b454a35605876da60632df1a60f736524eb73cc47bbc9f3f1ef1b644de74fd2a"}, + {file = "setuptools-68.2.2.tar.gz", hash = "sha256:4ac1475276d2f1c48684874089fefcd83bd7162ddaafb81fac866ba0db282a87"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9.3)", "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 (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.1)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] + [[package]] name = "shellingham" version = "1.5.4" @@ -1459,4 +1667,4 @@ h11 = ">=0.9.0,<1" [metadata] lock-version = "2.0" python-versions = "^3.12" -content-hash = "928828e0aced77a627487120700ec1db6f94648d35ff77c96e377b1c74e0e5de" +content-hash = "0fbf242978e837c466ac225a733972d0e83360485c59a780baa4eaa2f581fa13" diff --git a/pyproject.toml b/pyproject.toml index 578c626..82e53fd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -19,6 +19,8 @@ docker = "^6.1.3" requests = "^2.31.0" gitpython = "^3.1.40" fsspec = "^2023.10.0" +mkdocs-git-revision-date-localized-plugin = "^1.2.1" +mkdocs-material = {extras = ["all"], version = "^9.4.8"} [tool.poetry.group.dev.dependencies] @@ -32,10 +34,12 @@ docker-stubs = {git = "https://github.com/rdozier-work/docker-stubs"} [tool.poetry.group.docs.dependencies] mkdocs = "^1.5.3" mkdocstrings = {extras = ["python"], version = "^0.23.0"} +mkdocs-material = "^9.4.8" [tool.poetry.scripts] node_deployer = "node_deployer.__main__:main" debug_node_deployer = "node_deployer.__main__:debug" +build_docs = "scripts.docs:main" [build-system] requires = ["poetry-core"] diff --git a/scripts/docs.py b/scripts/docs.py new file mode 100644 index 0000000..5078201 --- /dev/null +++ b/scripts/docs.py @@ -0,0 +1,32 @@ +import subprocess + + +README_FILES = ( + ("", "docs/index.md"), + ("Installation", "docs/installation.md"), + ("Usage", "docs/usage.md"), + ("Deployment", "docs/deployment.md"), +) + + +def create_readme(): + with open("README.md", "wt") as r: + for header, file in README_FILES: + r.write(f"\n\n## {header}\n\n") + with open(file, "rt") as f: + r.write(f.read()) + + +def update_license(): + with open("LICENSE", "rt") as source, open("docs/license.md", "wt") as target: + target.write(source.read()) + + +def create_docs(): + subprocess.run("mkdocs build", shell=True, check=True) + + +def main(): + create_readme() + update_license() + create_docs() \ No newline at end of file