From b40e0dd4a1d8d4d3e309baf65bade2ab7d4589f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20L=C3=BCscher?= Date: Mon, 13 May 2024 08:41:12 +0000 Subject: [PATCH 1/4] chore(devcontainer): add connection from devcontainer to docker registry (#43) --- .devcontainer/devcontainer.json | 2 ++ .devcontainer/install-dev-tools.sh | 14 ++++++++++++++ 2 files changed, 16 insertions(+) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 9ab7b13..12984db 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -16,6 +16,8 @@ "version": "1.8.2" } }, + // Additional arguments when starting the container + "runArgs": ["--add-host=host.docker.internal:host-gateway"], // Create symbolic link for forge data dir mount "initializeCommand": "${localWorkspaceFolder}/.devcontainer/prepare_mount.sh", // Container user definition - This is needed for compatibility with podman -> https://github.com/containers/podman/issues/15001#issuecomment-1193321924 diff --git a/.devcontainer/install-dev-tools.sh b/.devcontainer/install-dev-tools.sh index eac5b14..435450f 100644 --- a/.devcontainer/install-dev-tools.sh +++ b/.devcontainer/install-dev-tools.sh @@ -4,6 +4,20 @@ YELLOW="\e[33m" GREEN="\e[32m" ENDCOLOR="\e[0m" +# Add Forge DEV DNS entries +echo "" +echo -e "${YELLOW}Adding DNS entries for ublue.local${ENDCOLOR}" +echo "" +DOCKER_HOST=$(getent hosts host.docker.internal | awk '{ print $1 }') +echo "$DOCKER_HOST registry.ublue.local" | sudo tee -a /etc/hosts + +## Install SSL certificates +echo "" +echo -e "${YELLOW}Installing SSL certificates${ENDCOLOR}" +echo "" +sudo cp /data/ublue-os_forge-root.pem /usr/local/share/ca-certificates/ublue-os_forge-root.crt +sudo update-ca-certificates --fresh + ## Update system echo "" echo -e "${YELLOW}Updating OS${ENDCOLOR}" From 83f047f2d64486b1207b974370bbac66e67b912d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20L=C3=BCscher?= Date: Wed, 15 May 2024 20:39:20 +0000 Subject: [PATCH 2/4] feat(nicegui): show list of all images stored in container registry (#43) --- anvil/nicegui/pages/registry.py | 40 ++++- anvil/nicegui/utils/registry.py | 65 +++++++ anvil/poetry.lock | 306 +++++++++++++++++++++++++++++++- anvil/pyproject.toml | 3 + docs/assets/gui_registry.png | Bin 0 -> 14660 bytes docs/gui.md | 7 +- forge-pod.yml | 4 + forge.sh | 2 + 8 files changed, 417 insertions(+), 10 deletions(-) create mode 100644 anvil/nicegui/utils/registry.py create mode 100644 docs/assets/gui_registry.png diff --git a/anvil/nicegui/pages/registry.py b/anvil/nicegui/pages/registry.py index c4caf8b..13fab32 100644 --- a/anvil/nicegui/pages/registry.py +++ b/anvil/nicegui/pages/registry.py @@ -1,10 +1,38 @@ +import pandas +import humanize from nicegui import ui -import os +from utils.registry import DockerRegistry + + +## TODO: this should be async but I currently don't know how to implement this without button press +def get_image_info() -> pandas.DataFrame: + registry = DockerRegistry() + all_image_info = registry.get_all_image_info() + if isinstance(all_image_info, list) and len(all_image_info) > 0: + data = pandas.json_normalize( + all_image_info, + record_path=["tags"], + meta=[["name"]], + meta_prefix="image_", + ).assign( + size=lambda x: x["manifest.layers"].apply( + lambda layers: sum(layer["size"] for layer in layers) + ) + ) + data = data[["image_name", "name", "size"]].rename( + columns={"image_name": "image", "name": "tag", "size": "size"} + ) + data["size"] = data["size"].apply(humanize.naturalsize) + return data + else: + ui.notify(message="No images found") + data = pandas.DataFrame(columns=["image_name", "tag", "size"]) + return data def content() -> None: - project_root = os.environ['NICEGUI_DIR'] - ui.label("Work in progress...").classes("text-h6") - ui.image(project_root + "/pages/assets/work-in-progress.png").classes( - "w-[200%]" - ) + with ui.row().classes("w-full"): + with ui.card().classes("w-full"): + ui.label("Image Overview").classes("text-h5") + data = get_image_info() + ui.table.from_pandas(df=data).classes("w-full") diff --git a/anvil/nicegui/utils/registry.py b/anvil/nicegui/utils/registry.py new file mode 100644 index 0000000..f02d805 --- /dev/null +++ b/anvil/nicegui/utils/registry.py @@ -0,0 +1,65 @@ +import requests +from nicegui import ui + + +class DockerRegistry: + + def __init__( + self, + *, + registry_url: str = "https://registry.ublue.local", + registry_root_cert: str = "/data/ublue-os_forge-root.pem", + ) -> None: + """ + Docker Registry integration for ublue-os forge + """ + + self.registry_url = registry_url + self.registry_root_cert = registry_root_cert + + def get_repositories(self) -> list: + endpoint = f"{self.registry_url}/v2/_catalog" + response = requests.get(url=endpoint, verify=self.registry_root_cert) + if response.status_code == 200: + repositories = response.json()["repositories"] + else: + with self, ui.notify() as notify: + notify(message=f"Error: {response.text}") + return repositories + + def get_image_tags(self, image_name=str) -> dict: + endpoint = f"{self.registry_url}/v2/{image_name}/tags/list" + response = requests.get(url=endpoint, verify=self.registry_root_cert) + if response.status_code == 200: + tags = response.json()["tags"] + else: + with self, ui.notify() as notify: + notify(message=f"Error: {response.text}") + return tags + + def get_image_manifest(self, image_name=str, image_tag=str) -> dict: + endpoint = f"{self.registry_url}/v2/{image_name}/manifests/{image_tag}" + headers = {"accept": "application/vnd.oci.image.manifest.v1+json"} + response = requests.get( + url=endpoint, verify=self.registry_root_cert, headers=headers + ) + if response.status_code == 200: + manifest = response.json() + else: + with self, ui.notify() as notify: + notify(message=f"Error: {response.text}") + return manifest + + def get_all_image_info(self, image_name=str) -> list: + repositories = self.get_repositories() + all_image_info = [] + for repository in repositories: + tags = self.get_image_tags(image_name=repository) + for tag in tags: + manifest = self.get_image_manifest(image_name=repository, image_tag=tag) + image_info = { + "name": repository, + "tags": [{"name": tag, "manifest": manifest}], + } + all_image_info.append(image_info) + return all_image_info diff --git a/anvil/poetry.lock b/anvil/poetry.lock index 14fb940..f84c08e 100644 --- a/anvil/poetry.lock +++ b/anvil/poetry.lock @@ -399,6 +399,105 @@ files = [ [package.dependencies] pycparser = "*" +[[package]] +name = "charset-normalizer" +version = "3.3.2" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, + {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, +] + [[package]] name = "click" version = "8.1.7" @@ -714,6 +813,20 @@ cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] http2 = ["h2 (>=3,<5)"] socks = ["socksio (==1.*)"] +[[package]] +name = "humanize" +version = "4.9.0" +description = "Python humanize utilities" +optional = false +python-versions = ">=3.8" +files = [ + {file = "humanize-4.9.0-py3-none-any.whl", hash = "sha256:ce284a76d5b1377fd8836733b983bfb0b76f1aa1c090de2566fcf008d7f6ab16"}, + {file = "humanize-4.9.0.tar.gz", hash = "sha256:582a265c931c683a7e9b8ed9559089dea7edcf6cc95be39a3cbc2c5d5ac2bcfa"}, +] + +[package.extras] +tests = ["freezegun", "pytest", "pytest-cov"] + [[package]] name = "idna" version = "3.7" @@ -1088,6 +1201,51 @@ native = ["pywebview (>=4.4.0,<5.0.0)"] plotly = ["plotly (>=5.13.0,<6.0.0)"] sass = ["libsass (>=0.23.0,<0.24.0)"] +[[package]] +name = "numpy" +version = "1.26.4" +description = "Fundamental package for array computing in Python" +optional = false +python-versions = ">=3.9" +files = [ + {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"}, + {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2"}, + {file = "numpy-1.26.4-cp310-cp310-win32.whl", hash = "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07"}, + {file = "numpy-1.26.4-cp310-cp310-win_amd64.whl", hash = "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a"}, + {file = "numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20"}, + {file = "numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0"}, + {file = "numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110"}, + {file = "numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c"}, + {file = "numpy-1.26.4-cp39-cp39-win32.whl", hash = "sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6"}, + {file = "numpy-1.26.4-cp39-cp39-win_amd64.whl", hash = "sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0"}, + {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, +] + [[package]] name = "orjson" version = "3.10.3" @@ -1154,6 +1312,78 @@ files = [ {file = "packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"}, ] +[[package]] +name = "pandas" +version = "2.2.2" +description = "Powerful data structures for data analysis, time series, and statistics" +optional = false +python-versions = ">=3.9" +files = [ + {file = "pandas-2.2.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:90c6fca2acf139569e74e8781709dccb6fe25940488755716d1d354d6bc58bce"}, + {file = "pandas-2.2.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c7adfc142dac335d8c1e0dcbd37eb8617eac386596eb9e1a1b77791cf2498238"}, + {file = "pandas-2.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4abfe0be0d7221be4f12552995e58723c7422c80a659da13ca382697de830c08"}, + {file = "pandas-2.2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8635c16bf3d99040fdf3ca3db669a7250ddf49c55dc4aa8fe0ae0fa8d6dcc1f0"}, + {file = "pandas-2.2.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:40ae1dffb3967a52203105a077415a86044a2bea011b5f321c6aa64b379a3f51"}, + {file = "pandas-2.2.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8e5a0b00e1e56a842f922e7fae8ae4077aee4af0acb5ae3622bd4b4c30aedf99"}, + {file = "pandas-2.2.2-cp310-cp310-win_amd64.whl", hash = "sha256:ddf818e4e6c7c6f4f7c8a12709696d193976b591cc7dc50588d3d1a6b5dc8772"}, + {file = "pandas-2.2.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:696039430f7a562b74fa45f540aca068ea85fa34c244d0deee539cb6d70aa288"}, + {file = "pandas-2.2.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8e90497254aacacbc4ea6ae5e7a8cd75629d6ad2b30025a4a8b09aa4faf55151"}, + {file = "pandas-2.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58b84b91b0b9f4bafac2a0ac55002280c094dfc6402402332c0913a59654ab2b"}, + {file = "pandas-2.2.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d2123dc9ad6a814bcdea0f099885276b31b24f7edf40f6cdbc0912672e22eee"}, + {file = "pandas-2.2.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:2925720037f06e89af896c70bca73459d7e6a4be96f9de79e2d440bd499fe0db"}, + {file = "pandas-2.2.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0cace394b6ea70c01ca1595f839cf193df35d1575986e484ad35c4aeae7266c1"}, + {file = "pandas-2.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:873d13d177501a28b2756375d59816c365e42ed8417b41665f346289adc68d24"}, + {file = "pandas-2.2.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:9dfde2a0ddef507a631dc9dc4af6a9489d5e2e740e226ad426a05cabfbd7c8ef"}, + {file = "pandas-2.2.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e9b79011ff7a0f4b1d6da6a61aa1aa604fb312d6647de5bad20013682d1429ce"}, + {file = "pandas-2.2.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1cb51fe389360f3b5a4d57dbd2848a5f033350336ca3b340d1c53a1fad33bcad"}, + {file = "pandas-2.2.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eee3a87076c0756de40b05c5e9a6069c035ba43e8dd71c379e68cab2c20f16ad"}, + {file = "pandas-2.2.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3e374f59e440d4ab45ca2fffde54b81ac3834cf5ae2cdfa69c90bc03bde04d76"}, + {file = "pandas-2.2.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:43498c0bdb43d55cb162cdc8c06fac328ccb5d2eabe3cadeb3529ae6f0517c32"}, + {file = "pandas-2.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:d187d355ecec3629624fccb01d104da7d7f391db0311145817525281e2804d23"}, + {file = "pandas-2.2.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0ca6377b8fca51815f382bd0b697a0814c8bda55115678cbc94c30aacbb6eff2"}, + {file = "pandas-2.2.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9057e6aa78a584bc93a13f0a9bf7e753a5e9770a30b4d758b8d5f2a62a9433cd"}, + {file = "pandas-2.2.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:001910ad31abc7bf06f49dcc903755d2f7f3a9186c0c040b827e522e9cef0863"}, + {file = "pandas-2.2.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66b479b0bd07204e37583c191535505410daa8df638fd8e75ae1b383851fe921"}, + {file = "pandas-2.2.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a77e9d1c386196879aa5eb712e77461aaee433e54c68cf253053a73b7e49c33a"}, + {file = "pandas-2.2.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:92fd6b027924a7e178ac202cfbe25e53368db90d56872d20ffae94b96c7acc57"}, + {file = "pandas-2.2.2-cp39-cp39-win_amd64.whl", hash = "sha256:640cef9aa381b60e296db324337a554aeeb883ead99dc8f6c18e81a93942f5f4"}, + {file = "pandas-2.2.2.tar.gz", hash = "sha256:9e79019aba43cb4fda9e4d983f8e88ca0373adbb697ae9c6c43093218de28b54"}, +] + +[package.dependencies] +numpy = [ + {version = ">=1.23.2", markers = "python_version == \"3.11\""}, + {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, +] +python-dateutil = ">=2.8.2" +pytz = ">=2020.1" +tzdata = ">=2022.7" + +[package.extras] +all = ["PyQt5 (>=5.15.9)", "SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)", "beautifulsoup4 (>=4.11.2)", "bottleneck (>=1.3.6)", "dataframe-api-compat (>=0.1.7)", "fastparquet (>=2022.12.0)", "fsspec (>=2022.11.0)", "gcsfs (>=2022.11.0)", "html5lib (>=1.1)", "hypothesis (>=6.46.1)", "jinja2 (>=3.1.2)", "lxml (>=4.9.2)", "matplotlib (>=3.6.3)", "numba (>=0.56.4)", "numexpr (>=2.8.4)", "odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "pandas-gbq (>=0.19.0)", "psycopg2 (>=2.9.6)", "pyarrow (>=10.0.1)", "pymysql (>=1.0.2)", "pyreadstat (>=1.2.0)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "qtpy (>=2.3.0)", "s3fs (>=2022.11.0)", "scipy (>=1.10.0)", "tables (>=3.8.0)", "tabulate (>=0.9.0)", "xarray (>=2022.12.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)", "zstandard (>=0.19.0)"] +aws = ["s3fs (>=2022.11.0)"] +clipboard = ["PyQt5 (>=5.15.9)", "qtpy (>=2.3.0)"] +compression = ["zstandard (>=0.19.0)"] +computation = ["scipy (>=1.10.0)", "xarray (>=2022.12.0)"] +consortium-standard = ["dataframe-api-compat (>=0.1.7)"] +excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)"] +feather = ["pyarrow (>=10.0.1)"] +fss = ["fsspec (>=2022.11.0)"] +gcp = ["gcsfs (>=2022.11.0)", "pandas-gbq (>=0.19.0)"] +hdf5 = ["tables (>=3.8.0)"] +html = ["beautifulsoup4 (>=4.11.2)", "html5lib (>=1.1)", "lxml (>=4.9.2)"] +mysql = ["SQLAlchemy (>=2.0.0)", "pymysql (>=1.0.2)"] +output-formatting = ["jinja2 (>=3.1.2)", "tabulate (>=0.9.0)"] +parquet = ["pyarrow (>=10.0.1)"] +performance = ["bottleneck (>=1.3.6)", "numba (>=0.56.4)", "numexpr (>=2.8.4)"] +plot = ["matplotlib (>=3.6.3)"] +postgresql = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "psycopg2 (>=2.9.6)"] +pyarrow = ["pyarrow (>=10.0.1)"] +spss = ["pyreadstat (>=1.2.0)"] +sql-other = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)"] +test = ["hypothesis (>=6.46.1)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)"] +xml = ["lxml (>=4.9.2)"] + [[package]] name = "pathspec" version = "0.12.1" @@ -1372,6 +1602,20 @@ setuptools = ">=62.4.0" devel = ["coverage", "docutils", "isort", "testscenarios (>=0.4)", "testtools", "twine"] test = ["coverage", "docutils", "testscenarios (>=0.4)", "testtools"] +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +description = "Extensions to the standard Python datetime module" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, + {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, +] + +[package.dependencies] +six = ">=1.5" + [[package]] name = "python-dotenv" version = "1.0.1" @@ -1440,6 +1684,17 @@ asyncio-client = ["aiohttp (>=3.4)"] client = ["requests (>=2.21.0)", "websocket-client (>=0.54.0)"] docs = ["sphinx"] +[[package]] +name = "pytz" +version = "2024.1" +description = "World timezone definitions, modern and historical" +optional = false +python-versions = "*" +files = [ + {file = "pytz-2024.1-py2.py3-none-any.whl", hash = "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319"}, + {file = "pytz-2024.1.tar.gz", hash = "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812"}, +] + [[package]] name = "pyyaml" version = "6.0.1" @@ -1515,6 +1770,27 @@ files = [ attrs = ">=22.2.0" rpds-py = ">=0.7.0" +[[package]] +name = "requests" +version = "2.31.0" +description = "Python HTTP for Humans." +optional = false +python-versions = ">=3.7" +files = [ + {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, + {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + [[package]] name = "resolvelib" version = "1.0.1" @@ -1832,6 +2108,34 @@ files = [ {file = "typing_extensions-4.11.0.tar.gz", hash = "sha256:83f085bd5ca59c80295fc2a82ab5dac679cbe02b9f33f7d83af68e241bea51b0"}, ] +[[package]] +name = "tzdata" +version = "2024.1" +description = "Provider of IANA time zone data" +optional = false +python-versions = ">=2" +files = [ + {file = "tzdata-2024.1-py2.py3-none-any.whl", hash = "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252"}, + {file = "tzdata-2024.1.tar.gz", hash = "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd"}, +] + +[[package]] +name = "urllib3" +version = "2.2.1" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = ">=3.8" +files = [ + {file = "urllib3-2.2.1-py3-none-any.whl", hash = "sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d"}, + {file = "urllib3-2.2.1.tar.gz", hash = "sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +h2 = ["h2 (>=4,<5)"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] + [[package]] name = "uvicorn" version = "0.29.0" @@ -2235,4 +2539,4 @@ multidict = ">=4.0" [metadata] lock-version = "2.0" python-versions = "^3.11" -content-hash = "594fcf1d1d6401925826bc6446611e2f41144ee2b79835d563db26b7593cccf9" +content-hash = "9acf410a48c12c73c00bd0aa133d052c5626af6db8c0342aa2b5ab3015588c95" diff --git a/anvil/pyproject.toml b/anvil/pyproject.toml index 4e9e78e..a17b6b9 100644 --- a/anvil/pyproject.toml +++ b/anvil/pyproject.toml @@ -12,6 +12,9 @@ ansible-core = "^2.16" jmespath = "^1.0" nicegui = "^1.4.23" ansible-runner = "^2.3.6" +requests = "^2.31.0" +pandas = "^2.2.2" +humanize = "^4.9.0" [tool.poetry.group.dev.dependencies] ansible-lint = { version = "^24.2", markers = 'platform_system != "Windows"' } # https://github.com/ansible/ansible-lint/issues/2730#issuecomment-1330406601 diff --git a/docs/assets/gui_registry.png b/docs/assets/gui_registry.png new file mode 100644 index 0000000000000000000000000000000000000000..6be3d771336f166eeac08e0e2c79b5cb121dc0b2 GIT binary patch literal 14660 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 here. -Like a list of all available images you have uploaded etc. +Here you get an overview of all images available in +the container registry `registry.ublue.local`. + +![registry](./assets/gui_registry.png) ### About diff --git a/forge-pod.yml b/forge-pod.yml index e7c4e3b..54187c1 100644 --- a/forge-pod.yml +++ b/forge-pod.yml @@ -110,6 +110,10 @@ spec: - name: ublue-os_forge-data-pvc persistentVolumeClaim: claimName: ublue-os_forge-data + hostAliases: + - ip: ${FORGE_HOST_IP_ADDRESS} + hostnames: + - registry.${FORGE_DOMAIN_NAME} containers: - name: ansible.${FORGE_DOMAIN_NAME} image: anvil # will be built on pod start diff --git a/forge.sh b/forge.sh index 2ebe1d6..167623f 100755 --- a/forge.sh +++ b/forge.sh @@ -9,6 +9,8 @@ export FORGE_POD_NAME_PRE_AMBLE="ublue-os_forge-" export FORGE_POD_NAME_REVERSE_PROXY=${FORGE_POD_NAME_PRE_AMBLE}rvproxy export FORGE_POD_NAME_REGISTRY=${FORGE_POD_NAME_PRE_AMBLE}registry export FORGE_POD_NAME_ANVIL=${FORGE_POD_NAME_PRE_AMBLE}anvil +export FORGE_HOST_IP_ADDRESS=$(hostname -I | awk '{print $1}') + # Functions function setup { From b3bb17943061cf4fae216a5cbcd99719931ed6a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20L=C3=BCscher?= Date: Wed, 15 May 2024 20:44:41 +0000 Subject: [PATCH 3/4] refactor(nicegui): move filepicker to utils --- .vscode/cspell_custom.txt | 4 ++++ anvil/ansible/group_vars/all/container.yml | 3 +++ anvil/ansible/playbooks/project_build.yml | 4 ++-- anvil/nicegui/pages/ansible.py | 3 +-- anvil/nicegui/utils/__init__.py | 0 anvil/nicegui/{utils.py => utils/filepicker.py} | 0 6 files changed, 10 insertions(+), 4 deletions(-) create mode 100644 anvil/ansible/group_vars/all/container.yml create mode 100644 anvil/nicegui/utils/__init__.py rename anvil/nicegui/{utils.py => utils/filepicker.py} (100%) diff --git a/.vscode/cspell_custom.txt b/.vscode/cspell_custom.txt index 512eddb..3a5a1c8 100644 --- a/.vscode/cspell_custom.txt +++ b/.vscode/cspell_custom.txt @@ -1,6 +1,7 @@ aggrid CHACHA configmap +Containerfile containerignore devcontainer devcontainers @@ -8,15 +9,18 @@ dotenv ENDCOLOR ensurepath envsubst +filepicker getent gitmessage hostvars +humanfriendly keygen LAZYGIT lightspeed lineinfile minica Mountpoint +naturalsize nicegui noarchive noimageindex diff --git a/anvil/ansible/group_vars/all/container.yml b/anvil/ansible/group_vars/all/container.yml new file mode 100644 index 0000000..6be86b7 --- /dev/null +++ b/anvil/ansible/group_vars/all/container.yml @@ -0,0 +1,3 @@ +--- +forge_container_file: "Containerfile" +forge_container_format: "oci" diff --git a/anvil/ansible/playbooks/project_build.yml b/anvil/ansible/playbooks/project_build.yml index 3f4b9e6..5c32129 100644 --- a/anvil/ansible/playbooks/project_build.yml +++ b/anvil/ansible/playbooks/project_build.yml @@ -14,8 +14,8 @@ tag: latest path: "{{ forge_git_repository_destination }}" build: - file: Containerfile - format: oci + file: "{{ forge_container_file | default('Containerfile') }}" + format: "{{ forge_container_format | default('oci') }}" pull: false push: true push_args: diff --git a/anvil/nicegui/pages/ansible.py b/anvil/nicegui/pages/ansible.py index 6af5646..4b77f67 100644 --- a/anvil/nicegui/pages/ansible.py +++ b/anvil/nicegui/pages/ansible.py @@ -4,7 +4,7 @@ import os from nicegui import ui from theme import GuiProgressSpinner -from utils import local_file_picker +from utils.filepicker import local_file_picker ANSIBLE_EXTRA_VARS = None @@ -117,5 +117,4 @@ def content() -> None: with ui.card().classes("w-full"): ui.label("Playbook Log").classes("text-h6") ui.button("Clear Log", on_click=lambda: gui_playbook_log.clear()) - gui_playbook_log = ui.log().classes("w-full h-full") diff --git a/anvil/nicegui/utils/__init__.py b/anvil/nicegui/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/anvil/nicegui/utils.py b/anvil/nicegui/utils/filepicker.py similarity index 100% rename from anvil/nicegui/utils.py rename to anvil/nicegui/utils/filepicker.py From 12cdc3cb83040151e51866dc933b3ba3be80f735 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20L=C3=BCscher?= Date: Wed, 15 May 2024 20:52:32 +0000 Subject: [PATCH 4/4] doc(ansible): update missing documentation --- docs/variables.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/variables.md b/docs/variables.md index 420e36e..743243b 100644 --- a/docs/variables.md +++ b/docs/variables.md @@ -12,6 +12,8 @@ The following configuration variables are available and can be set to your likin | Name | Type | Default value | Description | | ---------------------------------- | ---- | ------------------------------------------------- | -------------------------------------------------------------------------------- | +| `forge_container_file` | str | Containerfile | Path to the Containerfile for Podman to build | +| `forge_container_format` | str | oci | Format of the image Podman will build. Can be either `oci` or `docker` | | `forge_git_repository_url` | str | | Git repository url | | `forge_git_repository_destination` | str | `{{ forge_data_volume_mountpoint }}`/data/bluefin | Git destination where repository is cloned to. Can be any directory on your host | | `forge_git_repository_version` | str | main | Git repository branch or tag or commit version |