From 6766d77128acda1651f0fda17ffd29dc15840445 Mon Sep 17 00:00:00 2001 From: mike dupont Date: Sat, 30 Sep 2023 18:21:33 -0400 Subject: [PATCH 01/27] starting to work --- .github/workflows/python-package.yml | 17 ++++++++++------- .gitignore | 4 +++- Makefile | 2 ++ docker-compose.yml | 7 ++++--- runact.sh | 18 ++++++++++++++++++ 5 files changed, 37 insertions(+), 11 deletions(-) create mode 100644 Makefile create mode 100644 runact.sh diff --git a/.github/workflows/python-package.yml b/.github/workflows/python-package.yml index 42cf029..f076033 100644 --- a/.github/workflows/python-package.yml +++ b/.github/workflows/python-package.yml @@ -5,22 +5,25 @@ on: pull_request: branches: [ "main" ] jobs: - build: + python-package-build: runs-on: ubuntu-latest strategy: fail-fast: false matrix: - python-version: ["3.10"] + python-version: [ + #"3.10", + "3.x"] steps: - uses: actions/checkout@v3 - name: Checkout repository uses: actions/checkout@master with: submodules: 'true' - - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v3 - with: - python-version: ${{ matrix.python-version }} + #- name: Set up Python ${{ matrix.python-version }} + #3 uses: actions/setup-python@v3 + # with: + # architecture: x64 + # python-version: ${{ matrix.python-version }} - name: Install dependencies run: | python -m pip install --upgrade pip @@ -31,7 +34,7 @@ jobs: # flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics # flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics - name: Docker Compose Action - uses: isbang/compose-action@v1.5.1 + uses: meta-introspector/compose-action@main env: GITHUB_PAT: ${{ secrets.PAT }} GITHUB_REPO: "jmikedupont2/ai-ticket" diff --git a/.gitignore b/.gitignore index 311200f..d54b7d5 100644 --- a/.gitignore +++ b/.gitignore @@ -160,4 +160,6 @@ cython_debug/ # option (not recommended) you can uncomment the following to ignore the entire idea folder. #.idea/ -*~ \ No newline at end of file +*~ +/dckr_pat_.txt +/github_pat.txt diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..53433c5 --- /dev/null +++ b/Makefile @@ -0,0 +1,2 @@ +test: + bash ./runact.sh diff --git a/docker-compose.yml b/docker-compose.yml index d45baf6..a1364cb 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,9 +2,9 @@ version: '3' services: ai_ticket: - image: ai_ticket - build: - context: . + #image: ai_ticket + build: . + # context: . #entrypoint: /bin/bash #stdin_open: true # docker run -i #tty: true # docker run -t @@ -25,6 +25,7 @@ services: build: context: vendor/Auto-GPT/ depends_on: + - ai_ticket - mockopenai mockopenai: diff --git a/runact.sh b/runact.sh new file mode 100644 index 0000000..997e85a --- /dev/null +++ b/runact.sh @@ -0,0 +1,18 @@ + +#prerequists +# git clone https://github.com/nektos/act -> https://github.com/meta-introspector/actx +# make build + + +# git clone https://github.com/moovweb/gvm +# cd gvm/ &&./autogen.sh && make install + +act \ + -s GITHUB_TOKEN=`cat github_pat.txt` \ + -s GITHUB_PAT=`cat github_pat.txt` \ + -s DOCKER=`cat dckr_pat_.txt` \ + -P ubuntu-latest=localhost/my_local_act \ + --verbose \ + --job python-package-build + +# --pull=false \ From d2bb483940d579f10e181e2d8b40b6354dbb7be8 Mon Sep 17 00:00:00 2001 From: mike dupont Date: Sat, 30 Sep 2023 21:29:06 -0400 Subject: [PATCH 02/27] working better now just need to add a job --- .github/workflows/debug.yml | 20 ++++++++++++++++++++ .github/workflows/python-package.yml | 24 ++++++++++++++++++++++-- .secrets.example.txt | 4 ++++ runact.sh | 10 +++------- 4 files changed, 49 insertions(+), 9 deletions(-) create mode 100644 .github/workflows/debug.yml create mode 100644 .secrets.example.txt diff --git a/.github/workflows/debug.yml b/.github/workflows/debug.yml new file mode 100644 index 0000000..5d63fd2 --- /dev/null +++ b/.github/workflows/debug.yml @@ -0,0 +1,20 @@ +name: Python package +on: + push: + branches: [ "main" ] + pull_request: + branches: [ "main" ] +jobs: + debug: + runs-on: ubuntu-latest + steps: + - name: test + env: + GITHUB_PAT: ${{ secrets.PAT }} + GITHUB_1: ${{ secrets.PAT }} + DOCKERTEST: ${{ secrets.DOCKER }} + run: echo pat ${{ secrets.PAT }} docker ${{ secrets.DOCKER }} and test1 ${DOCKERTEST} and $GITHUB_1 + - name: test2 + env: + GITHUB_PAT: ${{ secrets.PAT }} + run: docker-compose -e GIHUB_PAT="${{ secrets.PAT }}" up diff --git a/.github/workflows/python-package.yml b/.github/workflows/python-package.yml index f076033..d0ed12a 100644 --- a/.github/workflows/python-package.yml +++ b/.github/workflows/python-package.yml @@ -14,6 +14,8 @@ jobs: #"3.10", "3.x"] steps: + + - uses: actions/checkout@v3 - name: Checkout repository uses: actions/checkout@master @@ -29,12 +31,30 @@ jobs: python -m pip install --upgrade pip #python -m pip install flake8 pytest if [ -f requirements.txt ]; then pip install -r requirements.txt; fi + pip install podman-compose #- name: Lint with flake8 # run: | # flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics # flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics - - name: Docker Compose Action - uses: meta-introspector/compose-action@main + - name: Docker Compose Action build + #uses: meta-introspector/compose-action@main env: GITHUB_PAT: ${{ secrets.PAT }} GITHUB_REPO: "jmikedupont2/ai-ticket" + run: docker-compose build + + - name: Docker Compose Action echo + env: + GITHUB_PAT: ${{ secrets.PAT }} + GITHUB_REPO: "jmikedupont2/ai-ticket" + run: echo pat ${{ secrets.PAT }} +# run: echo docker-compose up -e GITHUB_PAT=${{ secrets.PAT }} -e GITHUB_REPO="jmikedupont2/ai-ticket" + + - name: Docker Compose Action do it + #uses: meta-introspector/compose-action@main + env: + GITHUB_PAT: ${{ secrets.PAT }} + GITHUB_REPO: "jmikedupont2/ai-ticket" + run: | + GITHUB_PAT=${{ secrets.PAT }} GITHUB_REPO="jmikedupont2/ai-ticket" docker-compose up + diff --git a/.secrets.example.txt b/.secrets.example.txt new file mode 100644 index 0000000..3c53809 --- /dev/null +++ b/.secrets.example.txt @@ -0,0 +1,4 @@ +GITHUB_TOKEN= +GITHUB_PAT= +PAT=this isused +DOCKER= diff --git a/runact.sh b/runact.sh index 997e85a..b9b418c 100644 --- a/runact.sh +++ b/runact.sh @@ -6,13 +6,9 @@ # git clone https://github.com/moovweb/gvm # cd gvm/ &&./autogen.sh && make install - -act \ - -s GITHUB_TOKEN=`cat github_pat.txt` \ - -s GITHUB_PAT=`cat github_pat.txt` \ - -s DOCKER=`cat dckr_pat_.txt` \ - -P ubuntu-latest=localhost/my_local_act \ - --verbose \ +# use .secrets PAT And DOCKER +act -P ubuntu-latest=localhost/my_local_act \ + --verbose \ --job python-package-build # --pull=false \ From 734e8a6865c0f0830a4b073efdd9705777119143 Mon Sep 17 00:00:00 2001 From: mike dupont Date: Wed, 4 Oct 2023 08:54:23 -0400 Subject: [PATCH 03/27] you are the metagpt --- docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index a1364cb..7515b07 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -10,7 +10,7 @@ services: #tty: true # docker run -t autogpt: - #entrypoint: bash -c "poetry run pip install /opt/ai-ticket && poetry run autogpt --install-plugin-deps --skip-news -y" + #entrypoint: bash -c "poetry run pip install /opt/ai-ticket && poetry run autogpt --install-plugin-deps --skip-news -y" entrypoint: bash -c "poetry run pip install /opt/ai-ticket && poetry run autogpt --install-plugin-deps --skip-news -y --ai-name 'meta-autogpt' --ai-role 'you will introspect autogpt and reveal its internals via reflection and comprehension' --ai-goal 'Observe your behaviour' --ai-goal 'Reflect over your outcomes' --ai-goal 'Orient yourself to your knowledge' --ai-goal 'Decide on your next step' --ai-goal 'Act on your chosen next experiment' " # uncomment thse next 3 lines for debugging From da11be40d66dc735d08240c3e96a2042fa35c3f4 Mon Sep 17 00:00:00 2001 From: mike dupont Date: Sun, 1 Oct 2023 11:45:40 -0400 Subject: [PATCH 04/27] use images --- docker-compose.yml | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 7515b07..6fca620 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,8 +2,10 @@ version: '3' services: ai_ticket: - #image: ai_ticket - build: . + + image: h4ckermike/ai-ticket:ai_ticket + + #build: . # context: . #entrypoint: /bin/bash #stdin_open: true # docker run -i @@ -22,13 +24,17 @@ services: - GITHUB_REPO="jmikedupont2/ai-ticket" - OPENAI_API_KEY=your-openai-api-key - OPENAI_API_BASE=http://mockopenai:5000/v1 - build: - context: vendor/Auto-GPT/ + + image: h4ckermike/ai-ticket:autogpt + + #build: + # context: vendor/Auto-GPT/ depends_on: - ai_ticket - mockopenai mockopenai: + image: h4ckermike/ai-ticket:mockopenai depends_on: - ai_ticket @@ -36,8 +42,14 @@ services: - GITHUB_PAT=${GITHUB_PAT} - GITHUB_REPO=${GITHUB_REPO} - build: - context: vendor/lollms/ + + + + #build: + # context: vendor/lollms/ ports: - "5000:5000" + + #todo the act runner + #h4ckermike/ai-ticket:my_local_act From e7cbde0bad41798a93d17f68b10018441087a956 Mon Sep 17 00:00:00 2001 From: mike dupont Date: Sun, 1 Oct 2023 16:20:15 -0400 Subject: [PATCH 05/27] update ports --- docker-compose.yml | 28 ++++++++-------------------- vendor/lollms | 2 +- 2 files changed, 9 insertions(+), 21 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 6fca620..21c5d85 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,10 +2,8 @@ version: '3' services: ai_ticket: - - image: h4ckermike/ai-ticket:ai_ticket - - #build: . + #image: ai_ticket + build: . # context: . #entrypoint: /bin/bash #stdin_open: true # docker run -i @@ -23,18 +21,14 @@ services: - GITHUB_PAT="${GITHUB_PAT}" - GITHUB_REPO="jmikedupont2/ai-ticket" - OPENAI_API_KEY=your-openai-api-key - - OPENAI_API_BASE=http://mockopenai:5000/v1 - - image: h4ckermike/ai-ticket:autogpt - - #build: - # context: vendor/Auto-GPT/ + - OPENAI_API_BASE=http://mockopenai:8080/v1 + build: + context: vendor/Auto-GPT/ depends_on: - ai_ticket - mockopenai mockopenai: - image: h4ckermike/ai-ticket:mockopenai depends_on: - ai_ticket @@ -42,14 +36,8 @@ services: - GITHUB_PAT=${GITHUB_PAT} - GITHUB_REPO=${GITHUB_REPO} - - - - #build: - # context: vendor/lollms/ + build: + context: vendor/lollms/ ports: - - "5000:5000" - + - "5000:8080" - #todo the act runner - #h4ckermike/ai-ticket:my_local_act diff --git a/vendor/lollms b/vendor/lollms index 43f8069..15e4b4f 160000 --- a/vendor/lollms +++ b/vendor/lollms @@ -1 +1 @@ -Subproject commit 43f806912e9acc449f0c97dbecf37da7cad7501c +Subproject commit 15e4b4fc39dc97d428d47b5c632cba370e1e4e52 From c474b76d78fa1ec68c14db4652ce397694fdc262 Mon Sep 17 00:00:00 2001 From: mike dupont Date: Mon, 2 Oct 2023 09:48:16 -0400 Subject: [PATCH 06/27] work in progress still having python issues. --- .github/workflows/debug.yml | 20 ----- .github/workflows/pipeline.yml | 112 +++++++++++++++++++++++++++ .github/workflows/python-package.yml | 15 ++-- Dockerfile | 43 +++++++++- docker-compose.yml | 3 + poetry.lock | 7 ++ pyproject.toml | 39 +++++++++- runact.sh | 4 +- 8 files changed, 211 insertions(+), 32 deletions(-) delete mode 100644 .github/workflows/debug.yml create mode 100644 .github/workflows/pipeline.yml create mode 100644 poetry.lock diff --git a/.github/workflows/debug.yml b/.github/workflows/debug.yml deleted file mode 100644 index 5d63fd2..0000000 --- a/.github/workflows/debug.yml +++ /dev/null @@ -1,20 +0,0 @@ -name: Python package -on: - push: - branches: [ "main" ] - pull_request: - branches: [ "main" ] -jobs: - debug: - runs-on: ubuntu-latest - steps: - - name: test - env: - GITHUB_PAT: ${{ secrets.PAT }} - GITHUB_1: ${{ secrets.PAT }} - DOCKERTEST: ${{ secrets.DOCKER }} - run: echo pat ${{ secrets.PAT }} docker ${{ secrets.DOCKER }} and test1 ${DOCKERTEST} and $GITHUB_1 - - name: test2 - env: - GITHUB_PAT: ${{ secrets.PAT }} - run: docker-compose -e GIHUB_PAT="${{ secrets.PAT }}" up diff --git a/.github/workflows/pipeline.yml b/.github/workflows/pipeline.yml new file mode 100644 index 0000000..a51aabc --- /dev/null +++ b/.github/workflows/pipeline.yml @@ -0,0 +1,112 @@ +name: Pipeline + +on: push + +jobs: + code-quality: + runs-on: ubuntu-latest + steps: + - name: Checkout Repository + uses: actions/checkout@v3 + # - name: Setup Python + # uses: actions/setup-python@v4 + # with: + # python-version: 3.10.12 + - name: Install Poetry + uses: snok/install-poetry@v1 + with: + version: 1.4.1 + virtualenvs-in-project: true + - name: Load cached venv + id: cached-poetry-dependencies + uses: actions/cache@v3 + with: + path: .venv + key: venv-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}-${{ hashFiles('**/poetry.lock') }} + - name: Install dependencies + if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true' + run: | + poetry install --no-interaction --no-root + - name: pylint + run: | + source .venv/bin/activate + pylint build tests + - name: black + run: | + source .venv/bin/activate + black --check . + + run-tests: + needs: code-quality + runs-on: ubuntu-latest + steps: + - name: Checkout Repository + uses: actions/checkout@v3 + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + # - name: Setup Python + # uses: actions/setup-python@v4 + # with: + # python-version: 3.10.12 + - name: Install Poetry + uses: snok/install-poetry@v1 + with: + version: 1.4.1 + virtualenvs-in-project: true + - name: Load cached venv + id: cached-poetry-dependencies + uses: actions/cache@v3 + with: + path: .venv + key: venv-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}-${{ hashFiles('**/poetry.lock') }} + - name: Install dependencies + if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true' + run: | + poetry install --no-interaction --no-root + - name: Run all tests with pytest + run: | + source .venv/bin/activate + pytest --cov + - name: Upload coverage to Codecov + uses: codecov/codecov-action@v3 + with: + fail_ci_if_error: true + token: ${{ secrets.CODECOV_TOKEN }} + + publish-all-images: + needs: run-tests + if: startsWith(github.ref, 'refs/tags/') + runs-on: ubuntu-latest + steps: + - name: Checkout Repository + uses: actions/checkout@v3 + - name: Get Git Commit Tag Name + uses: olegtarasov/get-tag@v2.1 + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + # - name: Setup Python + # uses: actions/setup-python@v4 + # with: + # python-version: 3.10.12 + - name: Install Poetry + uses: snok/install-poetry@v1 + with: + version: 1.4.1 + virtualenvs-in-project: true + - name: Load cached venv + id: cached-poetry-dependencies + uses: actions/cache@v3 + with: + path: .venv + key: venv-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}-${{ hashFiles('**/poetry.lock') }} + - name: Install dependencies + if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true' + run: | + poetry install --no-interaction --no-root + - name: Publish Image to Docker Hub + env: + DOCKER_HUB_USERNAME: ${{ secrets.DOCKER_HUB_USERNAME }} + DOCKER_HUB_PASSWORD: ${{ secrets.DOCKER_HUB_PASSWORD }} + run: | + source .venv/bin/activate + python -m build.publish diff --git a/.github/workflows/python-package.yml b/.github/workflows/python-package.yml index d0ed12a..11e5139 100644 --- a/.github/workflows/python-package.yml +++ b/.github/workflows/python-package.yml @@ -43,18 +43,19 @@ jobs: GITHUB_REPO: "jmikedupont2/ai-ticket" run: docker-compose build - - name: Docker Compose Action echo + + - name: create openai env: GITHUB_PAT: ${{ secrets.PAT }} GITHUB_REPO: "jmikedupont2/ai-ticket" - run: echo pat ${{ secrets.PAT }} -# run: echo docker-compose up -e GITHUB_PAT=${{ secrets.PAT }} -e GITHUB_REPO="jmikedupont2/ai-ticket" - - - name: Docker Compose Action do it - #uses: meta-introspector/compose-action@main + run: | + GITHUB_PAT=${{ secrets.PAT }} GITHUB_REPO="jmikedupont2/ai-ticket" docker-compose up -d mockopenai + + - name: run autogpt env: GITHUB_PAT: ${{ secrets.PAT }} GITHUB_REPO: "jmikedupont2/ai-ticket" run: | - GITHUB_PAT=${{ secrets.PAT }} GITHUB_REPO="jmikedupont2/ai-ticket" docker-compose up + GITHUB_PAT=${{ secrets.PAT }} GITHUB_REPO="jmikedupont2/ai-ticket" docker-compose run autogpt + diff --git a/Dockerfile b/Dockerfile index ae68579..3517970 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,44 @@ -FROM python:3.10-slim +# The Poetry installation is provided through the base image. Please check the +# base image if you interested in the details. +# Base image: https://hub.docker.com/r/pfeiffermax/python-poetry +# Dockerfile: https://github.com/max-pfeiffer/python-poetry/blob/main/build/Dockerfile +ARG BASE_IMAGE +FROM ${BASE_IMAGE} +ARG APPLICATION_SERVER_PORT + +LABEL maintainer="Mike DuPont " + +ENV PYTHONUNBUFFERED=1 \ + # https://docs.python.org/3/using/cmdline.html#envvar-PYTHONDONTWRITEBYTECODE + PYTHONDONTWRITEBYTECODE=1 \ + PYTHONPATH=/application_root \ + # https://python-poetry.org/docs/configuration/#virtualenvsin-project + POETRY_VIRTUALENVS_IN_PROJECT=true \ + POETRY_CACHE_DIR="/application_root/.cache" \ + VIRTUAL_ENVIRONMENT_PATH="/application_root/.venv" \ + APPLICATION_SERVER_PORT=$APPLICATION_SERVER_PORT +# Adding the virtual environment to PATH in order to "activate" it. +# https://docs.python.org/3/library/venv.html#how-venvs-work +ENV PATH="$VIRTUAL_ENVIRONMENT_PATH/bin:$PATH" + +# Principle of least privilege: create a new user for running the application +RUN groupadd -g 1001 python_application && \ + useradd -r -u 1001 -g python_application python_application + +# Set the WORKDIR to the application root. +# https://www.uvicorn.org/settings/#development +# https://docs.docker.com/engine/reference/builder/#workdir +WORKDIR ${PYTHONPATH} +RUN chown python_application:python_application ${PYTHONPATH} + +# Create cache directory and set permissions because user 1001 has no home +# and poetry cache directory. +# https://python-poetry.org/docs/configuration/#cache-directory +RUN mkdir ${POETRY_CACHE_DIR} && chown python_application:python_application ${POETRY_CACHE_DIR} + +# Use the unpriveledged user to run the application +USER 1001 + WORKDIR /opt/ai-ticket COPY pyproject.toml /opt/ai-ticket/ COPY setup.cfg /opt/ai-ticket/ @@ -6,7 +46,6 @@ COPY requirements.txt /opt/ai-ticket/ COPY ./src/ /opt/ai-ticket/src/ RUN pip install /opt/ai-ticket/ - RUN apt update RUN apt install -y git RUN pip install --trusted-host pypi.python.org -r requirements.txt diff --git a/docker-compose.yml b/docker-compose.yml index 21c5d85..ae5d25f 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -10,9 +10,12 @@ services: #tty: true # docker run -t autogpt: + #entrypoint: bash -c "poetry run pip install /opt/ai-ticket && poetry run autogpt --install-plugin-deps --skip-news -y" entrypoint: bash -c "poetry run pip install /opt/ai-ticket && poetry run autogpt --install-plugin-deps --skip-news -y --ai-name 'meta-autogpt' --ai-role 'you will introspect autogpt and reveal its internals via reflection and comprehension' --ai-goal 'Observe your behaviour' --ai-goal 'Reflect over your outcomes' --ai-goal 'Orient yourself to your knowledge' --ai-goal 'Decide on your next step' --ai-goal 'Act on your chosen next experiment' " + + # uncomment thse next 3 lines for debugging #entrypoint: /bin/bash #stdin_open: true # docker run -i diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 0000000..4e433ab --- /dev/null +++ b/poetry.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Poetry and should not be changed by hand. +package = [] + +[metadata] +lock-version = "2.0" +python-versions = "*" +content-hash = "115cf985d932e9bf5f540555bbdd75decbb62cac81e399375fc19f6277f8c1d8" diff --git a/pyproject.toml b/pyproject.toml index cfc991c..94356c3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,9 +1,13 @@ [build-system] +python = "^3.7" requires = [ "setuptools>=42", - "wheel" + "wheel", + "poetry-core" ] -build-backend = "setuptools.build_meta" +#build-backend = "setuptools.build_meta" +build-backend = "poetry.core.masonry.api" + [tool.black] line-length = 120 @@ -16,3 +20,34 @@ combine_as_imports = true combine_star = true known_local_folder = ["tests", "cli"] known_first_party = ["test_utils"] + +[tool.poetry] +name = "ai-ticket" +version = "0.0.1" +authors = [ + "Mike Dupont ", +] +readme = "README.md" +description = "AI ticket" + +classifiers = [ + "Programming Language :: Python :: 3", + "License :: OSI Approved :: MIT License", + "Operating System :: OS Independent", +] +#packages = . + +# [tool.poetry.scripts] +# [tool.poetry.dependencies] +[tool.poetry.group.dev.dependencies] +python = "^3.7" +pytest = "7.4.0" +pytest-cov = "4.1.0" +coverage = "7.3.1" +requests = "2.31.0" +black = "23.7.0" +pre-commit = "3.3.3" +semver = "3.0.1" +pylint = "2.17.5" +testcontainers = "3.7.1" + diff --git a/runact.sh b/runact.sh index b9b418c..b2302a3 100644 --- a/runact.sh +++ b/runact.sh @@ -9,6 +9,8 @@ # use .secrets PAT And DOCKER act -P ubuntu-latest=localhost/my_local_act \ --verbose \ - --job python-package-build + --job code-quality + +# --job python-package-build # --pull=false \ From 19fa67003afcb9ddb5814de82023c74bb934cc67 Mon Sep 17 00:00:00 2001 From: mike dupont Date: Mon, 2 Oct 2023 09:53:09 -0400 Subject: [PATCH 07/27] lock --- poetry.lock | 1014 +++++++++++++++++++++++++++++++++++++++++++++++- pyproject.toml | 5 + 2 files changed, 1016 insertions(+), 3 deletions(-) diff --git a/poetry.lock b/poetry.lock index 4e433ab..eb69fc3 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,7 +1,1015 @@ # This file is automatically @generated by Poetry and should not be changed by hand. -package = [] + +[[package]] +name = "astroid" +version = "2.15.8" +description = "An abstract syntax tree for Python with inference support." +category = "dev" +optional = false +python-versions = ">=3.7.2" +files = [ + {file = "astroid-2.15.8-py3-none-any.whl", hash = "sha256:1aa149fc5c6589e3d0ece885b4491acd80af4f087baafa3fb5203b113e68cd3c"}, + {file = "astroid-2.15.8.tar.gz", hash = "sha256:6c107453dffee9055899705de3c9ead36e74119cee151e5a9aaf7f0b0e020a6a"}, +] + +[package.dependencies] +lazy-object-proxy = ">=1.4.0" +typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.11\""} +wrapt = {version = ">=1.11,<2", markers = "python_version < \"3.11\""} + +[[package]] +name = "black" +version = "23.7.0" +description = "The uncompromising code formatter." +category = "dev" +optional = false +python-versions = ">=3.8" +files = [ + {file = "black-23.7.0-cp310-cp310-macosx_10_16_arm64.whl", hash = "sha256:5c4bc552ab52f6c1c506ccae05681fab58c3f72d59ae6e6639e8885e94fe2587"}, + {file = "black-23.7.0-cp310-cp310-macosx_10_16_universal2.whl", hash = "sha256:552513d5cd5694590d7ef6f46e1767a4df9af168d449ff767b13b084c020e63f"}, + {file = "black-23.7.0-cp310-cp310-macosx_10_16_x86_64.whl", hash = "sha256:86cee259349b4448adb4ef9b204bb4467aae74a386bce85d56ba4f5dc0da27be"}, + {file = "black-23.7.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:501387a9edcb75d7ae8a4412bb8749900386eaef258f1aefab18adddea1936bc"}, + {file = "black-23.7.0-cp310-cp310-win_amd64.whl", hash = "sha256:fb074d8b213749fa1d077d630db0d5f8cc3b2ae63587ad4116e8a436e9bbe995"}, + {file = "black-23.7.0-cp311-cp311-macosx_10_16_arm64.whl", hash = "sha256:b5b0ee6d96b345a8b420100b7d71ebfdd19fab5e8301aff48ec270042cd40ac2"}, + {file = "black-23.7.0-cp311-cp311-macosx_10_16_universal2.whl", hash = "sha256:893695a76b140881531062d48476ebe4a48f5d1e9388177e175d76234ca247cd"}, + {file = "black-23.7.0-cp311-cp311-macosx_10_16_x86_64.whl", hash = "sha256:c333286dc3ddca6fdff74670b911cccedacb4ef0a60b34e491b8a67c833b343a"}, + {file = "black-23.7.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:831d8f54c3a8c8cf55f64d0422ee875eecac26f5f649fb6c1df65316b67c8926"}, + {file = "black-23.7.0-cp311-cp311-win_amd64.whl", hash = "sha256:7f3bf2dec7d541b4619b8ce526bda74a6b0bffc480a163fed32eb8b3c9aed8ad"}, + {file = "black-23.7.0-cp38-cp38-macosx_10_16_arm64.whl", hash = "sha256:f9062af71c59c004cd519e2fb8f5d25d39e46d3af011b41ab43b9c74e27e236f"}, + {file = "black-23.7.0-cp38-cp38-macosx_10_16_universal2.whl", hash = "sha256:01ede61aac8c154b55f35301fac3e730baf0c9cf8120f65a9cd61a81cfb4a0c3"}, + {file = "black-23.7.0-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:327a8c2550ddc573b51e2c352adb88143464bb9d92c10416feb86b0f5aee5ff6"}, + {file = "black-23.7.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d1c6022b86f83b632d06f2b02774134def5d4d4f1dac8bef16d90cda18ba28a"}, + {file = "black-23.7.0-cp38-cp38-win_amd64.whl", hash = "sha256:27eb7a0c71604d5de083757fbdb245b1a4fae60e9596514c6ec497eb63f95320"}, + {file = "black-23.7.0-cp39-cp39-macosx_10_16_arm64.whl", hash = "sha256:8417dbd2f57b5701492cd46edcecc4f9208dc75529bcf76c514864e48da867d9"}, + {file = "black-23.7.0-cp39-cp39-macosx_10_16_universal2.whl", hash = "sha256:47e56d83aad53ca140da0af87678fb38e44fd6bc0af71eebab2d1f59b1acf1d3"}, + {file = "black-23.7.0-cp39-cp39-macosx_10_16_x86_64.whl", hash = "sha256:25cc308838fe71f7065df53aedd20327969d05671bac95b38fdf37ebe70ac087"}, + {file = "black-23.7.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:642496b675095d423f9b8448243336f8ec71c9d4d57ec17bf795b67f08132a91"}, + {file = "black-23.7.0-cp39-cp39-win_amd64.whl", hash = "sha256:ad0014efc7acf0bd745792bd0d8857413652979200ab924fbf239062adc12491"}, + {file = "black-23.7.0-py3-none-any.whl", hash = "sha256:9fd59d418c60c0348505f2ddf9609c1e1de8e7493eab96198fc89d9f865e7a96"}, + {file = "black-23.7.0.tar.gz", hash = "sha256:022a582720b0d9480ed82576c920a8c1dde97cc38ff11d8d8859b3bd6ca9eedb"}, +] + +[package.dependencies] +click = ">=8.0.0" +mypy-extensions = ">=0.4.3" +packaging = ">=22.0" +pathspec = ">=0.9.0" +platformdirs = ">=2" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} + +[package.extras] +colorama = ["colorama (>=0.4.3)"] +d = ["aiohttp (>=3.7.4)"] +jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] +uvloop = ["uvloop (>=0.15.2)"] + +[[package]] +name = "certifi" +version = "2023.7.22" +description = "Python package for providing Mozilla's CA Bundle." +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "certifi-2023.7.22-py3-none-any.whl", hash = "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9"}, + {file = "certifi-2023.7.22.tar.gz", hash = "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082"}, +] + +[[package]] +name = "cfgv" +version = "3.4.0" +description = "Validate configuration and produce human readable error messages." +category = "dev" +optional = false +python-versions = ">=3.8" +files = [ + {file = "cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9"}, + {file = "cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560"}, +] + +[[package]] +name = "charset-normalizer" +version = "3.3.0" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +category = "main" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.3.0.tar.gz", hash = "sha256:63563193aec44bce707e0c5ca64ff69fa72ed7cf34ce6e11d5127555756fd2f6"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:effe5406c9bd748a871dbcaf3ac69167c38d72db8c9baf3ff954c344f31c4cbe"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4162918ef3098851fcd8a628bf9b6a98d10c380725df9e04caf5ca6dd48c847a"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0570d21da019941634a531444364f2482e8db0b3425fcd5ac0c36565a64142c8"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5707a746c6083a3a74b46b3a631d78d129edab06195a92a8ece755aac25a3f3d"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:278c296c6f96fa686d74eb449ea1697f3c03dc28b75f873b65b5201806346a69"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a4b71f4d1765639372a3b32d2638197f5cd5221b19531f9245fcc9ee62d38f56"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5969baeaea61c97efa706b9b107dcba02784b1601c74ac84f2a532ea079403e"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a3f93dab657839dfa61025056606600a11d0b696d79386f974e459a3fbc568ec"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:db756e48f9c5c607b5e33dd36b1d5872d0422e960145b08ab0ec7fd420e9d649"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:232ac332403e37e4a03d209a3f92ed9071f7d3dbda70e2a5e9cff1c4ba9f0678"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e5c1502d4ace69a179305abb3f0bb6141cbe4714bc9b31d427329a95acfc8bdd"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:2502dd2a736c879c0f0d3e2161e74d9907231e25d35794584b1ca5284e43f596"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23e8565ab7ff33218530bc817922fae827420f143479b753104ab801145b1d5b"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-win32.whl", hash = "sha256:1872d01ac8c618a8da634e232f24793883d6e456a66593135aeafe3784b0848d"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:557b21a44ceac6c6b9773bc65aa1b4cc3e248a5ad2f5b914b91579a32e22204d"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d7eff0f27edc5afa9e405f7165f85a6d782d308f3b6b9d96016c010597958e63"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6a685067d05e46641d5d1623d7c7fdf15a357546cbb2f71b0ebde91b175ffc3e"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0d3d5b7db9ed8a2b11a774db2bbea7ba1884430a205dbd54a32d61d7c2a190fa"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2935ffc78db9645cb2086c2f8f4cfd23d9b73cc0dc80334bc30aac6f03f68f8c"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fe359b2e3a7729010060fbca442ca225280c16e923b37db0e955ac2a2b72a05"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:380c4bde80bce25c6e4f77b19386f5ec9db230df9f2f2ac1e5ad7af2caa70459"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0d1e3732768fecb052d90d62b220af62ead5748ac51ef61e7b32c266cac9293"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1b2919306936ac6efb3aed1fbf81039f7087ddadb3160882a57ee2ff74fd2382"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f8888e31e3a85943743f8fc15e71536bda1c81d5aa36d014a3c0c44481d7db6e"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:82eb849f085624f6a607538ee7b83a6d8126df6d2f7d3b319cb837b289123078"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7b8b8bf1189b3ba9b8de5c8db4d541b406611a71a955bbbd7385bbc45fcb786c"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:5adf257bd58c1b8632046bbe43ee38c04e1038e9d37de9c57a94d6bd6ce5da34"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c350354efb159b8767a6244c166f66e67506e06c8924ed74669b2c70bc8735b1"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-win32.whl", hash = "sha256:02af06682e3590ab952599fbadac535ede5d60d78848e555aa58d0c0abbde786"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:86d1f65ac145e2c9ed71d8ffb1905e9bba3a91ae29ba55b4c46ae6fc31d7c0d4"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:3b447982ad46348c02cb90d230b75ac34e9886273df3a93eec0539308a6296d7"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:abf0d9f45ea5fb95051c8bfe43cb40cda383772f7e5023a83cc481ca2604d74e"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b09719a17a2301178fac4470d54b1680b18a5048b481cb8890e1ef820cb80455"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b3d9b48ee6e3967b7901c052b670c7dda6deb812c309439adaffdec55c6d7b78"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:edfe077ab09442d4ef3c52cb1f9dab89bff02f4524afc0acf2d46be17dc479f5"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3debd1150027933210c2fc321527c2299118aa929c2f5a0a80ab6953e3bd1908"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86f63face3a527284f7bb8a9d4f78988e3c06823f7bea2bd6f0e0e9298ca0403"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:24817cb02cbef7cd499f7c9a2735286b4782bd47a5b3516a0e84c50eab44b98e"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c71f16da1ed8949774ef79f4a0260d28b83b3a50c6576f8f4f0288d109777989"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:9cf3126b85822c4e53aa28c7ec9869b924d6fcfb76e77a45c44b83d91afd74f9"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:b3b2316b25644b23b54a6f6401074cebcecd1244c0b8e80111c9a3f1c8e83d65"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:03680bb39035fbcffe828eae9c3f8afc0428c91d38e7d61aa992ef7a59fb120e"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4cc152c5dd831641e995764f9f0b6589519f6f5123258ccaca8c6d34572fefa8"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-win32.whl", hash = "sha256:b8f3307af845803fb0b060ab76cf6dd3a13adc15b6b451f54281d25911eb92df"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:8eaf82f0eccd1505cf39a45a6bd0a8cf1c70dcfc30dba338207a969d91b965c0"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dc45229747b67ffc441b3de2f3ae5e62877a282ea828a5bdb67883c4ee4a8810"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f4a0033ce9a76e391542c182f0d48d084855b5fcba5010f707c8e8c34663d77"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ada214c6fa40f8d800e575de6b91a40d0548139e5dc457d2ebb61470abf50186"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b1121de0e9d6e6ca08289583d7491e7fcb18a439305b34a30b20d8215922d43c"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1063da2c85b95f2d1a430f1c33b55c9c17ffaf5e612e10aeaad641c55a9e2b9d"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:70f1d09c0d7748b73290b29219e854b3207aea922f839437870d8cc2168e31cc"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:250c9eb0f4600361dd80d46112213dff2286231d92d3e52af1e5a6083d10cad9"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:750b446b2ffce1739e8578576092179160f6d26bd5e23eb1789c4d64d5af7dc7"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:fc52b79d83a3fe3a360902d3f5d79073a993597d48114c29485e9431092905d8"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:588245972aca710b5b68802c8cad9edaa98589b1b42ad2b53accd6910dad3545"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e39c7eb31e3f5b1f88caff88bcff1b7f8334975b46f6ac6e9fc725d829bc35d4"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-win32.whl", hash = "sha256:abecce40dfebbfa6abf8e324e1860092eeca6f7375c8c4e655a8afb61af58f2c"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:24a91a981f185721542a0b7c92e9054b7ab4fea0508a795846bc5b0abf8118d4"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:67b8cc9574bb518ec76dc8e705d4c39ae78bb96237cb533edac149352c1f39fe"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ac71b2977fb90c35d41c9453116e283fac47bb9096ad917b8819ca8b943abecd"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3ae38d325b512f63f8da31f826e6cb6c367336f95e418137286ba362925c877e"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:542da1178c1c6af8873e143910e2269add130a299c9106eef2594e15dae5e482"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:30a85aed0b864ac88309b7d94be09f6046c834ef60762a8833b660139cfbad13"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aae32c93e0f64469f74ccc730a7cb21c7610af3a775157e50bbd38f816536b38"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15b26ddf78d57f1d143bdf32e820fd8935d36abe8a25eb9ec0b5a71c82eb3895"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7f5d10bae5d78e4551b7be7a9b29643a95aded9d0f602aa2ba584f0388e7a557"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:249c6470a2b60935bafd1d1d13cd613f8cd8388d53461c67397ee6a0f5dce741"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:c5a74c359b2d47d26cdbbc7845e9662d6b08a1e915eb015d044729e92e7050b7"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:b5bcf60a228acae568e9911f410f9d9e0d43197d030ae5799e20dca8df588287"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:187d18082694a29005ba2944c882344b6748d5be69e3a89bf3cc9d878e548d5a"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:81bf654678e575403736b85ba3a7867e31c2c30a69bc57fe88e3ace52fb17b89"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-win32.whl", hash = "sha256:85a32721ddde63c9df9ebb0d2045b9691d9750cb139c161c80e500d210f5e26e"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:468d2a840567b13a590e67dd276c570f8de00ed767ecc611994c301d0f8c014f"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e0fc42822278451bc13a2e8626cf2218ba570f27856b536e00cfa53099724828"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:09c77f964f351a7369cc343911e0df63e762e42bac24cd7d18525961c81754f4"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:12ebea541c44fdc88ccb794a13fe861cc5e35d64ed689513a5c03d05b53b7c82"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:805dfea4ca10411a5296bcc75638017215a93ffb584c9e344731eef0dcfb026a"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:96c2b49eb6a72c0e4991d62406e365d87067ca14c1a729a870d22354e6f68115"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aaf7b34c5bc56b38c931a54f7952f1ff0ae77a2e82496583b247f7c969eb1479"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:619d1c96099be5823db34fe89e2582b336b5b074a7f47f819d6b3a57ff7bdb86"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a0ac5e7015a5920cfce654c06618ec40c33e12801711da6b4258af59a8eff00a"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:93aa7eef6ee71c629b51ef873991d6911b906d7312c6e8e99790c0f33c576f89"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7966951325782121e67c81299a031f4c115615e68046f79b85856b86ebffc4cd"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:02673e456dc5ab13659f85196c534dc596d4ef260e4d86e856c3b2773ce09843"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:c2af80fb58f0f24b3f3adcb9148e6203fa67dd3f61c4af146ecad033024dde43"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:153e7b6e724761741e0974fc4dcd406d35ba70b92bfe3fedcb497226c93b9da7"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-win32.whl", hash = "sha256:d47ecf253780c90ee181d4d871cd655a789da937454045b17b5798da9393901a"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:d97d85fa63f315a8bdaba2af9a6a686e0eceab77b3089af45133252618e70884"}, + {file = "charset_normalizer-3.3.0-py3-none-any.whl", hash = "sha256:e46cd37076971c1040fc8c41273a8b3e2c624ce4f2be3f5dfcb7a430c1d3acc2"}, +] + +[[package]] +name = "click" +version = "8.1.7" +description = "Composable command line interface toolkit" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, + {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +category = "main" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "coverage" +version = "7.3.1" +description = "Code coverage measurement for Python" +category = "dev" +optional = false +python-versions = ">=3.8" +files = [ + {file = "coverage-7.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cd0f7429ecfd1ff597389907045ff209c8fdb5b013d38cfa7c60728cb484b6e3"}, + {file = "coverage-7.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:966f10df9b2b2115da87f50f6a248e313c72a668248be1b9060ce935c871f276"}, + {file = "coverage-7.3.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0575c37e207bb9b98b6cf72fdaaa18ac909fb3d153083400c2d48e2e6d28bd8e"}, + {file = "coverage-7.3.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:245c5a99254e83875c7fed8b8b2536f040997a9b76ac4c1da5bff398c06e860f"}, + {file = "coverage-7.3.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c96dd7798d83b960afc6c1feb9e5af537fc4908852ef025600374ff1a017392"}, + {file = "coverage-7.3.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:de30c1aa80f30af0f6b2058a91505ea6e36d6535d437520067f525f7df123887"}, + {file = "coverage-7.3.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:50dd1e2dd13dbbd856ffef69196781edff26c800a74f070d3b3e3389cab2600d"}, + {file = "coverage-7.3.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b9c0c19f70d30219113b18fe07e372b244fb2a773d4afde29d5a2f7930765136"}, + {file = "coverage-7.3.1-cp310-cp310-win32.whl", hash = "sha256:770f143980cc16eb601ccfd571846e89a5fe4c03b4193f2e485268f224ab602f"}, + {file = "coverage-7.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:cdd088c00c39a27cfa5329349cc763a48761fdc785879220d54eb785c8a38520"}, + {file = "coverage-7.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:74bb470399dc1989b535cb41f5ca7ab2af561e40def22d7e188e0a445e7639e3"}, + {file = "coverage-7.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:025ded371f1ca280c035d91b43252adbb04d2aea4c7105252d3cbc227f03b375"}, + {file = "coverage-7.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6191b3a6ad3e09b6cfd75b45c6aeeffe7e3b0ad46b268345d159b8df8d835f9"}, + {file = "coverage-7.3.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7eb0b188f30e41ddd659a529e385470aa6782f3b412f860ce22b2491c89b8593"}, + {file = "coverage-7.3.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75c8f0df9dfd8ff745bccff75867d63ef336e57cc22b2908ee725cc552689ec8"}, + {file = "coverage-7.3.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:7eb3cd48d54b9bd0e73026dedce44773214064be93611deab0b6a43158c3d5a0"}, + {file = "coverage-7.3.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:ac3c5b7e75acac31e490b7851595212ed951889918d398b7afa12736c85e13ce"}, + {file = "coverage-7.3.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5b4ee7080878077af0afa7238df1b967f00dc10763f6e1b66f5cced4abebb0a3"}, + {file = "coverage-7.3.1-cp311-cp311-win32.whl", hash = "sha256:229c0dd2ccf956bf5aeede7e3131ca48b65beacde2029f0361b54bf93d36f45a"}, + {file = "coverage-7.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:c6f55d38818ca9596dc9019eae19a47410d5322408140d9a0076001a3dcb938c"}, + {file = "coverage-7.3.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5289490dd1c3bb86de4730a92261ae66ea8d44b79ed3cc26464f4c2cde581fbc"}, + {file = "coverage-7.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ca833941ec701fda15414be400c3259479bfde7ae6d806b69e63b3dc423b1832"}, + {file = "coverage-7.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd694e19c031733e446c8024dedd12a00cda87e1c10bd7b8539a87963685e969"}, + {file = "coverage-7.3.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aab8e9464c00da5cb9c536150b7fbcd8850d376d1151741dd0d16dfe1ba4fd26"}, + {file = "coverage-7.3.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87d38444efffd5b056fcc026c1e8d862191881143c3aa80bb11fcf9dca9ae204"}, + {file = "coverage-7.3.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:8a07b692129b8a14ad7a37941a3029c291254feb7a4237f245cfae2de78de037"}, + {file = "coverage-7.3.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:2829c65c8faaf55b868ed7af3c7477b76b1c6ebeee99a28f59a2cb5907a45760"}, + {file = "coverage-7.3.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1f111a7d85658ea52ffad7084088277135ec5f368457275fc57f11cebb15607f"}, + {file = "coverage-7.3.1-cp312-cp312-win32.whl", hash = "sha256:c397c70cd20f6df7d2a52283857af622d5f23300c4ca8e5bd8c7a543825baa5a"}, + {file = "coverage-7.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:5ae4c6da8b3d123500f9525b50bf0168023313963e0e2e814badf9000dd6ef92"}, + {file = "coverage-7.3.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ca70466ca3a17460e8fc9cea7123c8cbef5ada4be3140a1ef8f7b63f2f37108f"}, + {file = "coverage-7.3.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f2781fd3cabc28278dc982a352f50c81c09a1a500cc2086dc4249853ea96b981"}, + {file = "coverage-7.3.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6407424621f40205bbe6325686417e5e552f6b2dba3535dd1f90afc88a61d465"}, + {file = "coverage-7.3.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:04312b036580ec505f2b77cbbdfb15137d5efdfade09156961f5277149f5e344"}, + {file = "coverage-7.3.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac9ad38204887349853d7c313f53a7b1c210ce138c73859e925bc4e5d8fc18e7"}, + {file = "coverage-7.3.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:53669b79f3d599da95a0afbef039ac0fadbb236532feb042c534fbb81b1a4e40"}, + {file = "coverage-7.3.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:614f1f98b84eb256e4f35e726bfe5ca82349f8dfa576faabf8a49ca09e630086"}, + {file = "coverage-7.3.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f1a317fdf5c122ad642db8a97964733ab7c3cf6009e1a8ae8821089993f175ff"}, + {file = "coverage-7.3.1-cp38-cp38-win32.whl", hash = "sha256:defbbb51121189722420a208957e26e49809feafca6afeef325df66c39c4fdb3"}, + {file = "coverage-7.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:f4f456590eefb6e1b3c9ea6328c1e9fa0f1006e7481179d749b3376fc793478e"}, + {file = "coverage-7.3.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f12d8b11a54f32688b165fd1a788c408f927b0960984b899be7e4c190ae758f1"}, + {file = "coverage-7.3.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f09195dda68d94a53123883de75bb97b0e35f5f6f9f3aa5bf6e496da718f0cb6"}, + {file = "coverage-7.3.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6601a60318f9c3945be6ea0f2a80571f4299b6801716f8a6e4846892737ebe4"}, + {file = "coverage-7.3.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07d156269718670d00a3b06db2288b48527fc5f36859425ff7cec07c6b367745"}, + {file = "coverage-7.3.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:636a8ac0b044cfeccae76a36f3b18264edcc810a76a49884b96dd744613ec0b7"}, + {file = "coverage-7.3.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5d991e13ad2ed3aced177f524e4d670f304c8233edad3210e02c465351f785a0"}, + {file = "coverage-7.3.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:586649ada7cf139445da386ab6f8ef00e6172f11a939fc3b2b7e7c9082052fa0"}, + {file = "coverage-7.3.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4aba512a15a3e1e4fdbfed2f5392ec221434a614cc68100ca99dcad7af29f3f8"}, + {file = "coverage-7.3.1-cp39-cp39-win32.whl", hash = "sha256:6bc6f3f4692d806831c136c5acad5ccedd0262aa44c087c46b7101c77e139140"}, + {file = "coverage-7.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:553d7094cb27db58ea91332e8b5681bac107e7242c23f7629ab1316ee73c4981"}, + {file = "coverage-7.3.1-pp38.pp39.pp310-none-any.whl", hash = "sha256:220eb51f5fb38dfdb7e5d54284ca4d0cd70ddac047d750111a68ab1798945194"}, + {file = "coverage-7.3.1.tar.gz", hash = "sha256:6cb7fe1581deb67b782c153136541e20901aa312ceedaf1467dcb35255787952"}, +] + +[package.dependencies] +tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.11.0a6\" and extra == \"toml\""} + +[package.extras] +toml = ["tomli"] + +[[package]] +name = "deprecation" +version = "2.1.0" +description = "A library to handle automated deprecations" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "deprecation-2.1.0-py2.py3-none-any.whl", hash = "sha256:a10811591210e1fb0e768a8c25517cabeabcba6f0bf96564f8ff45189f90b14a"}, + {file = "deprecation-2.1.0.tar.gz", hash = "sha256:72b3bde64e5d778694b0cf68178aed03d15e15477116add3fb773e581f9518ff"}, +] + +[package.dependencies] +packaging = "*" + +[[package]] +name = "dill" +version = "0.3.7" +description = "serialize all of Python" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "dill-0.3.7-py3-none-any.whl", hash = "sha256:76b122c08ef4ce2eedcd4d1abd8e641114bfc6c2867f49f3c41facf65bf19f5e"}, + {file = "dill-0.3.7.tar.gz", hash = "sha256:cc1c8b182eb3013e24bd475ff2e9295af86c1a38eb1aff128dac8962a9ce3c03"}, +] + +[package.extras] +graph = ["objgraph (>=1.7.2)"] + +[[package]] +name = "distlib" +version = "0.3.7" +description = "Distribution utilities" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "distlib-0.3.7-py2.py3-none-any.whl", hash = "sha256:2e24928bc811348f0feb63014e97aaae3037f2cf48712d51ae61df7fd6075057"}, + {file = "distlib-0.3.7.tar.gz", hash = "sha256:9dafe54b34a028eafd95039d5e5d4851a13734540f1331060d31c9916e7147a8"}, +] + +[[package]] +name = "docker" +version = "6.1.3" +description = "A Python library for the Docker Engine API." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "docker-6.1.3-py3-none-any.whl", hash = "sha256:aecd2277b8bf8e506e484f6ab7aec39abe0038e29fa4a6d3ba86c3fe01844ed9"}, + {file = "docker-6.1.3.tar.gz", hash = "sha256:aa6d17830045ba5ef0168d5eaa34d37beeb113948c413affe1d5991fc11f9a20"}, +] + +[package.dependencies] +packaging = ">=14.0" +pywin32 = {version = ">=304", markers = "sys_platform == \"win32\""} +requests = ">=2.26.0" +urllib3 = ">=1.26.0" +websocket-client = ">=0.32.0" + +[package.extras] +ssh = ["paramiko (>=2.4.3)"] + +[[package]] +name = "exceptiongroup" +version = "1.1.3" +description = "Backport of PEP 654 (exception groups)" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.1.3-py3-none-any.whl", hash = "sha256:343280667a4585d195ca1cf9cef84a4e178c4b6cf2274caef9859782b567d5e3"}, + {file = "exceptiongroup-1.1.3.tar.gz", hash = "sha256:097acd85d473d75af5bb98e41b61ff7fe35efe6675e4f9370ec6ec5126d160e9"}, +] + +[package.extras] +test = ["pytest (>=6)"] + +[[package]] +name = "filelock" +version = "3.12.4" +description = "A platform independent file lock." +category = "dev" +optional = false +python-versions = ">=3.8" +files = [ + {file = "filelock-3.12.4-py3-none-any.whl", hash = "sha256:08c21d87ded6e2b9da6728c3dff51baf1dcecf973b768ef35bcbc3447edb9ad4"}, + {file = "filelock-3.12.4.tar.gz", hash = "sha256:2e6f249f1f3654291606e046b09f1fd5eac39b360664c27f5aad072012f8bcbd"}, +] + +[package.extras] +docs = ["furo (>=2023.7.26)", "sphinx (>=7.1.2)", "sphinx-autodoc-typehints (>=1.24)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.3)", "diff-cover (>=7.7)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)", "pytest-timeout (>=2.1)"] +typing = ["typing-extensions (>=4.7.1)"] + +[[package]] +name = "identify" +version = "2.5.30" +description = "File identification library for Python" +category = "dev" +optional = false +python-versions = ">=3.8" +files = [ + {file = "identify-2.5.30-py2.py3-none-any.whl", hash = "sha256:afe67f26ae29bab007ec21b03d4114f41316ab9dd15aa8736a167481e108da54"}, + {file = "identify-2.5.30.tar.gz", hash = "sha256:f302a4256a15c849b91cfcdcec052a8ce914634b2f77ae87dad29cd749f2d88d"}, +] + +[package.extras] +license = ["ukkonen"] + +[[package]] +name = "idna" +version = "3.4" +description = "Internationalized Domain Names in Applications (IDNA)" +category = "main" +optional = false +python-versions = ">=3.5" +files = [ + {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, + {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, +] + +[[package]] +name = "iniconfig" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] + +[[package]] +name = "isort" +version = "5.12.0" +description = "A Python utility / library to sort Python imports." +category = "dev" +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "isort-5.12.0-py3-none-any.whl", hash = "sha256:f84c2818376e66cf843d497486ea8fed8700b340f308f076c6fb1229dff318b6"}, + {file = "isort-5.12.0.tar.gz", hash = "sha256:8bef7dde241278824a6d83f44a544709b065191b95b6e50894bdc722fcba0504"}, +] + +[package.extras] +colors = ["colorama (>=0.4.3)"] +pipfile-deprecated-finder = ["pip-shims (>=0.5.2)", "pipreqs", "requirementslib"] +plugins = ["setuptools"] +requirements-deprecated-finder = ["pip-api", "pipreqs"] + +[[package]] +name = "lazy-object-proxy" +version = "1.9.0" +description = "A fast and thorough lazy object proxy." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "lazy-object-proxy-1.9.0.tar.gz", hash = "sha256:659fb5809fa4629b8a1ac5106f669cfc7bef26fbb389dda53b3e010d1ac4ebae"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b40387277b0ed2d0602b8293b94d7257e17d1479e257b4de114ea11a8cb7f2d7"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8c6cfb338b133fbdbc5cfaa10fe3c6aeea827db80c978dbd13bc9dd8526b7d4"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:721532711daa7db0d8b779b0bb0318fa87af1c10d7fe5e52ef30f8eff254d0cd"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:66a3de4a3ec06cd8af3f61b8e1ec67614fbb7c995d02fa224813cb7afefee701"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1aa3de4088c89a1b69f8ec0dcc169aa725b0ff017899ac568fe44ddc1396df46"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-win32.whl", hash = "sha256:f0705c376533ed2a9e5e97aacdbfe04cecd71e0aa84c7c0595d02ef93b6e4455"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:ea806fd4c37bf7e7ad82537b0757999264d5f70c45468447bb2b91afdbe73a6e"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:946d27deaff6cf8452ed0dba83ba38839a87f4f7a9732e8f9fd4107b21e6ff07"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79a31b086e7e68b24b99b23d57723ef7e2c6d81ed21007b6281ebcd1688acb0a"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f699ac1c768270c9e384e4cbd268d6e67aebcfae6cd623b4d7c3bfde5a35db59"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bfb38f9ffb53b942f2b5954e0f610f1e721ccebe9cce9025a38c8ccf4a5183a4"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:189bbd5d41ae7a498397287c408617fe5c48633e7755287b21d741f7db2706a9"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-win32.whl", hash = "sha256:81fc4d08b062b535d95c9ea70dbe8a335c45c04029878e62d744bdced5141586"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:f2457189d8257dd41ae9b434ba33298aec198e30adf2dcdaaa3a28b9994f6adb"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d9e25ef10a39e8afe59a5c348a4dbf29b4868ab76269f81ce1674494e2565a6e"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cbf9b082426036e19c6924a9ce90c740a9861e2bdc27a4834fd0a910742ac1e8"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f5fa4a61ce2438267163891961cfd5e32ec97a2c444e5b842d574251ade27d2"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:8fa02eaab317b1e9e03f69aab1f91e120e7899b392c4fc19807a8278a07a97e8"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e7c21c95cae3c05c14aafffe2865bbd5e377cfc1348c4f7751d9dc9a48ca4bda"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-win32.whl", hash = "sha256:f12ad7126ae0c98d601a7ee504c1122bcef553d1d5e0c3bfa77b16b3968d2734"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-win_amd64.whl", hash = "sha256:edd20c5a55acb67c7ed471fa2b5fb66cb17f61430b7a6b9c3b4a1e40293b1671"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2d0daa332786cf3bb49e10dc6a17a52f6a8f9601b4cf5c295a4f85854d61de63"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cd077f3d04a58e83d04b20e334f678c2b0ff9879b9375ed107d5d07ff160171"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:660c94ea760b3ce47d1855a30984c78327500493d396eac4dfd8bd82041b22be"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:212774e4dfa851e74d393a2370871e174d7ff0ebc980907723bb67d25c8a7c30"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f0117049dd1d5635bbff65444496c90e0baa48ea405125c088e93d9cf4525b11"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-win32.whl", hash = "sha256:0a891e4e41b54fd5b8313b96399f8b0e173bbbfc03c7631f01efbe29bb0bcf82"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:9990d8e71b9f6488e91ad25f322898c136b008d87bf852ff65391b004da5e17b"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9e7551208b2aded9c1447453ee366f1c4070602b3d932ace044715d89666899b"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f83ac4d83ef0ab017683d715ed356e30dd48a93746309c8f3517e1287523ef4"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7322c3d6f1766d4ef1e51a465f47955f1e8123caee67dd641e67d539a534d006"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:18b78ec83edbbeb69efdc0e9c1cb41a3b1b1ed11ddd8ded602464c3fc6020494"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:09763491ce220c0299688940f8dc2c5d05fd1f45af1e42e636b2e8b2303e4382"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-win32.whl", hash = "sha256:9090d8e53235aa280fc9239a86ae3ea8ac58eff66a705fa6aa2ec4968b95c821"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:db1c1722726f47e10e0b5fdbf15ac3b8adb58c091d12b3ab713965795036985f"}, +] + +[[package]] +name = "mccabe" +version = "0.7.0" +description = "McCabe checker, plugin for flake8" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, + {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, +] + +[[package]] +name = "mypy-extensions" +version = "1.0.0" +description = "Type system extensions for programs checked with the mypy type checker." +category = "dev" +optional = false +python-versions = ">=3.5" +files = [ + {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, + {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, +] + +[[package]] +name = "nodeenv" +version = "1.8.0" +description = "Node.js virtual environment builder" +category = "dev" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*" +files = [ + {file = "nodeenv-1.8.0-py2.py3-none-any.whl", hash = "sha256:df865724bb3c3adc86b3876fa209771517b0cfe596beff01a92700e0e8be4cec"}, + {file = "nodeenv-1.8.0.tar.gz", hash = "sha256:d51e0c37e64fbf47d017feac3145cdbb58836d7eee8c6f6d3b6880c5456227d2"}, +] + +[package.dependencies] +setuptools = "*" + +[[package]] +name = "packaging" +version = "23.2" +description = "Core utilities for Python packages" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, + {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, +] + +[[package]] +name = "pathspec" +version = "0.11.2" +description = "Utility library for gitignore style pattern matching of file paths." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pathspec-0.11.2-py3-none-any.whl", hash = "sha256:1d6ed233af05e679efb96b1851550ea95bbb64b7c490b0f5aa52996c11e92a20"}, + {file = "pathspec-0.11.2.tar.gz", hash = "sha256:e0d8d0ac2f12da61956eb2306b69f9469b42f4deb0f3cb6ed47b9cce9996ced3"}, +] + +[[package]] +name = "platformdirs" +version = "3.10.0" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "platformdirs-3.10.0-py3-none-any.whl", hash = "sha256:d7c24979f292f916dc9cbf8648319032f551ea8c49a4c9bf2fb556a02070ec1d"}, + {file = "platformdirs-3.10.0.tar.gz", hash = "sha256:b45696dab2d7cc691a3226759c0d3b00c47c8b6e293d96f6436f733303f77f6d"}, +] + +[package.extras] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.1)", "sphinx-autodoc-typehints (>=1.24)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)"] + +[[package]] +name = "pluggy" +version = "1.3.0" +description = "plugin and hook calling mechanisms for python" +category = "dev" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pluggy-1.3.0-py3-none-any.whl", hash = "sha256:d89c696a773f8bd377d18e5ecda92b7a3793cbe66c87060a6fb58c7b6e1061f7"}, + {file = "pluggy-1.3.0.tar.gz", hash = "sha256:cf61ae8f126ac6f7c451172cf30e3e43d3ca77615509771b3a984a0730651e12"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "pre-commit" +version = "3.3.3" +description = "A framework for managing and maintaining multi-language pre-commit hooks." +category = "dev" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pre_commit-3.3.3-py2.py3-none-any.whl", hash = "sha256:10badb65d6a38caff29703362271d7dca483d01da88f9d7e05d0b97171c136cb"}, + {file = "pre_commit-3.3.3.tar.gz", hash = "sha256:a2256f489cd913d575c145132ae196fe335da32d91a8294b7afe6622335dd023"}, +] + +[package.dependencies] +cfgv = ">=2.0.0" +identify = ">=1.0.0" +nodeenv = ">=0.11.1" +pyyaml = ">=5.1" +virtualenv = ">=20.10.0" + +[[package]] +name = "pylint" +version = "2.17.5" +description = "python code static checker" +category = "dev" +optional = false +python-versions = ">=3.7.2" +files = [ + {file = "pylint-2.17.5-py3-none-any.whl", hash = "sha256:73995fb8216d3bed149c8d51bba25b2c52a8251a2c8ac846ec668ce38fab5413"}, + {file = "pylint-2.17.5.tar.gz", hash = "sha256:f7b601cbc06fef7e62a754e2b41294c2aa31f1cb659624b9a85bcba29eaf8252"}, +] + +[package.dependencies] +astroid = ">=2.15.6,<=2.17.0-dev0" +colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} +dill = {version = ">=0.2", markers = "python_version < \"3.11\""} +isort = ">=4.2.5,<6" +mccabe = ">=0.6,<0.8" +platformdirs = ">=2.2.0" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} +tomlkit = ">=0.10.1" + +[package.extras] +spelling = ["pyenchant (>=3.2,<4.0)"] +testutils = ["gitpython (>3)"] + +[[package]] +name = "pytest" +version = "7.4.0" +description = "pytest: simple powerful testing with Python" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest-7.4.0-py3-none-any.whl", hash = "sha256:78bf16451a2eb8c7a2ea98e32dc119fd2aa758f1d5d66dbf0a59d69a3969df32"}, + {file = "pytest-7.4.0.tar.gz", hash = "sha256:b4bf8c45bd59934ed84001ad51e11b4ee40d40a1229d2c79f9c592b0a3f6bd8a"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=0.12,<2.0" +tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} + +[package.extras] +testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] + +[[package]] +name = "pytest-cov" +version = "4.1.0" +description = "Pytest plugin for measuring coverage." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest-cov-4.1.0.tar.gz", hash = "sha256:3904b13dfbfec47f003b8e77fd5b589cd11904a21ddf1ab38a64f204d6a10ef6"}, + {file = "pytest_cov-4.1.0-py3-none-any.whl", hash = "sha256:6ba70b9e97e69fcc3fb45bfeab2d0a138fb65c4d0d6a41ef33983ad114be8c3a"}, +] + +[package.dependencies] +coverage = {version = ">=5.2.1", extras = ["toml"]} +pytest = ">=4.6" + +[package.extras] +testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtualenv"] + +[[package]] +name = "pywin32" +version = "306" +description = "Python for Window Extensions" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "pywin32-306-cp310-cp310-win32.whl", hash = "sha256:06d3420a5155ba65f0b72f2699b5bacf3109f36acbe8923765c22938a69dfc8d"}, + {file = "pywin32-306-cp310-cp310-win_amd64.whl", hash = "sha256:84f4471dbca1887ea3803d8848a1616429ac94a4a8d05f4bc9c5dcfd42ca99c8"}, + {file = "pywin32-306-cp311-cp311-win32.whl", hash = "sha256:e65028133d15b64d2ed8f06dd9fbc268352478d4f9289e69c190ecd6818b6407"}, + {file = "pywin32-306-cp311-cp311-win_amd64.whl", hash = "sha256:a7639f51c184c0272e93f244eb24dafca9b1855707d94c192d4a0b4c01e1100e"}, + {file = "pywin32-306-cp311-cp311-win_arm64.whl", hash = "sha256:70dba0c913d19f942a2db25217d9a1b726c278f483a919f1abfed79c9cf64d3a"}, + {file = "pywin32-306-cp312-cp312-win32.whl", hash = "sha256:383229d515657f4e3ed1343da8be101000562bf514591ff383ae940cad65458b"}, + {file = "pywin32-306-cp312-cp312-win_amd64.whl", hash = "sha256:37257794c1ad39ee9be652da0462dc2e394c8159dfd913a8a4e8eb6fd346da0e"}, + {file = "pywin32-306-cp312-cp312-win_arm64.whl", hash = "sha256:5821ec52f6d321aa59e2db7e0a35b997de60c201943557d108af9d4ae1ec7040"}, + {file = "pywin32-306-cp37-cp37m-win32.whl", hash = "sha256:1c73ea9a0d2283d889001998059f5eaaba3b6238f767c9cf2833b13e6a685f65"}, + {file = "pywin32-306-cp37-cp37m-win_amd64.whl", hash = "sha256:72c5f621542d7bdd4fdb716227be0dd3f8565c11b280be6315b06ace35487d36"}, + {file = "pywin32-306-cp38-cp38-win32.whl", hash = "sha256:e4c092e2589b5cf0d365849e73e02c391c1349958c5ac3e9d5ccb9a28e017b3a"}, + {file = "pywin32-306-cp38-cp38-win_amd64.whl", hash = "sha256:e8ac1ae3601bee6ca9f7cb4b5363bf1c0badb935ef243c4733ff9a393b1690c0"}, + {file = "pywin32-306-cp39-cp39-win32.whl", hash = "sha256:e25fd5b485b55ac9c057f67d94bc203f3f6595078d1fb3b458c9c28b7153a802"}, + {file = "pywin32-306-cp39-cp39-win_amd64.whl", hash = "sha256:39b61c15272833b5c329a2989999dcae836b1eed650252ab1b7bfbe1d59f30f4"}, +] + +[[package]] +name = "pyyaml" +version = "6.0.1" +description = "YAML parser and emitter for Python" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, + {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, + {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, + {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, + {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, + {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, + {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, + {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, + {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, + {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, + {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, + {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, + {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, + {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, + {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, + {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, + {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, + {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, + {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, + {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, + {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, +] + +[[package]] +name = "requests" +version = "2.31.0" +description = "Python HTTP for Humans." +category = "main" +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 = "semver" +version = "3.0.1" +description = "Python helper for Semantic Versioning (https://semver.org)" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "semver-3.0.1-py3-none-any.whl", hash = "sha256:2a23844ba1647362c7490fe3995a86e097bb590d16f0f32dfc383008f19e4cdf"}, + {file = "semver-3.0.1.tar.gz", hash = "sha256:9ec78c5447883c67b97f98c3b6212796708191d22e4ad30f4570f840171cbce1"}, +] + +[[package]] +name = "setuptools" +version = "68.2.2" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +category = "dev" +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 = "testcontainers" +version = "3.7.1" +description = "Library provides lightweight, throwaway instances of common databases, Selenium web browsers, or anything else that can run in a Docker container" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "testcontainers-3.7.1-py2.py3-none-any.whl", hash = "sha256:7f48cef4bf0ccd78f1a4534d4b701a003a3bace851f24eae58a32f9e3f0aeba0"}, +] + +[package.dependencies] +deprecation = "*" +docker = ">=4.0.0" +wrapt = "*" + +[package.extras] +arangodb = ["python-arango"] +azurite = ["azure-storage-blob"] +clickhouse = ["clickhouse-driver"] +docker-compose = ["docker-compose"] +google-cloud-pubsub = ["google-cloud-pubsub (<2)"] +kafka = ["kafka-python"] +keycloak = ["python-keycloak"] +mongo = ["pymongo"] +mssqlserver = ["pymssql"] +mysql = ["pymysql", "sqlalchemy"] +neo4j = ["neo4j"] +oracle = ["cx-Oracle", "sqlalchemy"] +postgresql = ["psycopg2-binary", "sqlalchemy"] +rabbitmq = ["pika"] +redis = ["redis"] +selenium = ["selenium"] + +[[package]] +name = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] + +[[package]] +name = "tomlkit" +version = "0.12.1" +description = "Style preserving TOML library" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tomlkit-0.12.1-py3-none-any.whl", hash = "sha256:712cbd236609acc6a3e2e97253dfc52d4c2082982a88f61b640ecf0817eab899"}, + {file = "tomlkit-0.12.1.tar.gz", hash = "sha256:38e1ff8edb991273ec9f6181244a6a391ac30e9f5098e7535640ea6be97a7c86"}, +] + +[[package]] +name = "typing-extensions" +version = "4.8.0" +description = "Backported and Experimental Type Hints for Python 3.8+" +category = "dev" +optional = false +python-versions = ">=3.8" +files = [ + {file = "typing_extensions-4.8.0-py3-none-any.whl", hash = "sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0"}, + {file = "typing_extensions-4.8.0.tar.gz", hash = "sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef"}, +] + +[[package]] +name = "urllib3" +version = "2.0.5" +description = "HTTP library with thread-safe connection pooling, file post, and more." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "urllib3-2.0.5-py3-none-any.whl", hash = "sha256:ef16afa8ba34a1f989db38e1dbbe0c302e4289a47856990d0682e374563ce35e"}, + {file = "urllib3-2.0.5.tar.gz", hash = "sha256:13abf37382ea2ce6fb744d4dad67838eec857c9f4f57009891805e0b5e123594"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +secure = ["certifi", "cryptography (>=1.9)", "idna (>=2.0.0)", "pyopenssl (>=17.1.0)", "urllib3-secure-extra"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] + +[[package]] +name = "virtualenv" +version = "20.24.5" +description = "Virtual Python Environment builder" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "virtualenv-20.24.5-py3-none-any.whl", hash = "sha256:b80039f280f4919c77b30f1c23294ae357c4c8701042086e3fc005963e4e537b"}, + {file = "virtualenv-20.24.5.tar.gz", hash = "sha256:e8361967f6da6fbdf1426483bfe9fca8287c242ac0bc30429905721cefbff752"}, +] + +[package.dependencies] +distlib = ">=0.3.7,<1" +filelock = ">=3.12.2,<4" +platformdirs = ">=3.9.1,<4" + +[package.extras] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] +test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"] + +[[package]] +name = "websocket-client" +version = "1.6.3" +description = "WebSocket client for Python with low level API options" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "websocket-client-1.6.3.tar.gz", hash = "sha256:3aad25d31284266bcfcfd1fd8a743f63282305a364b8d0948a43bd606acc652f"}, + {file = "websocket_client-1.6.3-py3-none-any.whl", hash = "sha256:6cfc30d051ebabb73a5fa246efdcc14c8fbebbd0330f8984ac3bb6d9edd2ad03"}, +] + +[package.extras] +docs = ["Sphinx (>=6.0)", "sphinx-rtd-theme (>=1.1.0)"] +optional = ["python-socks", "wsaccel"] +test = ["websockets"] + +[[package]] +name = "wrapt" +version = "1.15.0" +description = "Module for decorators, wrappers and monkey patching." +category = "dev" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +files = [ + {file = "wrapt-1.15.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:ca1cccf838cd28d5a0883b342474c630ac48cac5df0ee6eacc9c7290f76b11c1"}, + {file = "wrapt-1.15.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:e826aadda3cae59295b95343db8f3d965fb31059da7de01ee8d1c40a60398b29"}, + {file = "wrapt-1.15.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5fc8e02f5984a55d2c653f5fea93531e9836abbd84342c1d1e17abc4a15084c2"}, + {file = "wrapt-1.15.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:96e25c8603a155559231c19c0349245eeb4ac0096fe3c1d0be5c47e075bd4f46"}, + {file = "wrapt-1.15.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:40737a081d7497efea35ab9304b829b857f21558acfc7b3272f908d33b0d9d4c"}, + {file = "wrapt-1.15.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:f87ec75864c37c4c6cb908d282e1969e79763e0d9becdfe9fe5473b7bb1e5f09"}, + {file = "wrapt-1.15.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:1286eb30261894e4c70d124d44b7fd07825340869945c79d05bda53a40caa079"}, + {file = "wrapt-1.15.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:493d389a2b63c88ad56cdc35d0fa5752daac56ca755805b1b0c530f785767d5e"}, + {file = "wrapt-1.15.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:58d7a75d731e8c63614222bcb21dd992b4ab01a399f1f09dd82af17bbfc2368a"}, + {file = "wrapt-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:21f6d9a0d5b3a207cdf7acf8e58d7d13d463e639f0c7e01d82cdb671e6cb7923"}, + {file = "wrapt-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ce42618f67741d4697684e501ef02f29e758a123aa2d669e2d964ff734ee00ee"}, + {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41d07d029dd4157ae27beab04d22b8e261eddfc6ecd64ff7000b10dc8b3a5727"}, + {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54accd4b8bc202966bafafd16e69da9d5640ff92389d33d28555c5fd4f25ccb7"}, + {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fbfbca668dd15b744418265a9607baa970c347eefd0db6a518aaf0cfbd153c0"}, + {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:76e9c727a874b4856d11a32fb0b389afc61ce8aaf281ada613713ddeadd1cfec"}, + {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e20076a211cd6f9b44a6be58f7eeafa7ab5720eb796975d0c03f05b47d89eb90"}, + {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a74d56552ddbde46c246b5b89199cb3fd182f9c346c784e1a93e4dc3f5ec9975"}, + {file = "wrapt-1.15.0-cp310-cp310-win32.whl", hash = "sha256:26458da5653aa5b3d8dc8b24192f574a58984c749401f98fff994d41d3f08da1"}, + {file = "wrapt-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:75760a47c06b5974aa5e01949bf7e66d2af4d08cb8c1d6516af5e39595397f5e"}, + {file = "wrapt-1.15.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ba1711cda2d30634a7e452fc79eabcadaffedf241ff206db2ee93dd2c89a60e7"}, + {file = "wrapt-1.15.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:56374914b132c702aa9aa9959c550004b8847148f95e1b824772d453ac204a72"}, + {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a89ce3fd220ff144bd9d54da333ec0de0399b52c9ac3d2ce34b569cf1a5748fb"}, + {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3bbe623731d03b186b3d6b0d6f51865bf598587c38d6f7b0be2e27414f7f214e"}, + {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3abbe948c3cbde2689370a262a8d04e32ec2dd4f27103669a45c6929bcdbfe7c"}, + {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b67b819628e3b748fd3c2192c15fb951f549d0f47c0449af0764d7647302fda3"}, + {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7eebcdbe3677e58dd4c0e03b4f2cfa346ed4049687d839adad68cc38bb559c92"}, + {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:74934ebd71950e3db69960a7da29204f89624dde411afbfb3b4858c1409b1e98"}, + {file = "wrapt-1.15.0-cp311-cp311-win32.whl", hash = "sha256:bd84395aab8e4d36263cd1b9308cd504f6cf713b7d6d3ce25ea55670baec5416"}, + {file = "wrapt-1.15.0-cp311-cp311-win_amd64.whl", hash = "sha256:a487f72a25904e2b4bbc0817ce7a8de94363bd7e79890510174da9d901c38705"}, + {file = "wrapt-1.15.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:4ff0d20f2e670800d3ed2b220d40984162089a6e2c9646fdb09b85e6f9a8fc29"}, + {file = "wrapt-1.15.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9ed6aa0726b9b60911f4aed8ec5b8dd7bf3491476015819f56473ffaef8959bd"}, + {file = "wrapt-1.15.0-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:896689fddba4f23ef7c718279e42f8834041a21342d95e56922e1c10c0cc7afb"}, + {file = "wrapt-1.15.0-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:75669d77bb2c071333417617a235324a1618dba66f82a750362eccbe5b61d248"}, + {file = "wrapt-1.15.0-cp35-cp35m-win32.whl", hash = "sha256:fbec11614dba0424ca72f4e8ba3c420dba07b4a7c206c8c8e4e73f2e98f4c559"}, + {file = "wrapt-1.15.0-cp35-cp35m-win_amd64.whl", hash = "sha256:fd69666217b62fa5d7c6aa88e507493a34dec4fa20c5bd925e4bc12fce586639"}, + {file = "wrapt-1.15.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b0724f05c396b0a4c36a3226c31648385deb6a65d8992644c12a4963c70326ba"}, + {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbeccb1aa40ab88cd29e6c7d8585582c99548f55f9b2581dfc5ba68c59a85752"}, + {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:38adf7198f8f154502883242f9fe7333ab05a5b02de7d83aa2d88ea621f13364"}, + {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:578383d740457fa790fdf85e6d346fda1416a40549fe8db08e5e9bd281c6a475"}, + {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:a4cbb9ff5795cd66f0066bdf5947f170f5d63a9274f99bdbca02fd973adcf2a8"}, + {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:af5bd9ccb188f6a5fdda9f1f09d9f4c86cc8a539bd48a0bfdc97723970348418"}, + {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:b56d5519e470d3f2fe4aa7585f0632b060d532d0696c5bdfb5e8319e1d0f69a2"}, + {file = "wrapt-1.15.0-cp36-cp36m-win32.whl", hash = "sha256:77d4c1b881076c3ba173484dfa53d3582c1c8ff1f914c6461ab70c8428b796c1"}, + {file = "wrapt-1.15.0-cp36-cp36m-win_amd64.whl", hash = "sha256:077ff0d1f9d9e4ce6476c1a924a3332452c1406e59d90a2cf24aeb29eeac9420"}, + {file = "wrapt-1.15.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5c5aa28df055697d7c37d2099a7bc09f559d5053c3349b1ad0c39000e611d317"}, + {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a8564f283394634a7a7054b7983e47dbf39c07712d7b177b37e03f2467a024e"}, + {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:780c82a41dc493b62fc5884fb1d3a3b81106642c5c5c78d6a0d4cbe96d62ba7e"}, + {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e169e957c33576f47e21864cf3fc9ff47c223a4ebca8960079b8bd36cb014fd0"}, + {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b02f21c1e2074943312d03d243ac4388319f2456576b2c6023041c4d57cd7019"}, + {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f2e69b3ed24544b0d3dbe2c5c0ba5153ce50dcebb576fdc4696d52aa22db6034"}, + {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d787272ed958a05b2c86311d3a4135d3c2aeea4fc655705f074130aa57d71653"}, + {file = "wrapt-1.15.0-cp37-cp37m-win32.whl", hash = "sha256:02fce1852f755f44f95af51f69d22e45080102e9d00258053b79367d07af39c0"}, + {file = "wrapt-1.15.0-cp37-cp37m-win_amd64.whl", hash = "sha256:abd52a09d03adf9c763d706df707c343293d5d106aea53483e0ec8d9e310ad5e"}, + {file = "wrapt-1.15.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cdb4f085756c96a3af04e6eca7f08b1345e94b53af8921b25c72f096e704e145"}, + {file = "wrapt-1.15.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:230ae493696a371f1dbffaad3dafbb742a4d27a0afd2b1aecebe52b740167e7f"}, + {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63424c681923b9f3bfbc5e3205aafe790904053d42ddcc08542181a30a7a51bd"}, + {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6bcbfc99f55655c3d93feb7ef3800bd5bbe963a755687cbf1f490a71fb7794b"}, + {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c99f4309f5145b93eca6e35ac1a988f0dc0a7ccf9ccdcd78d3c0adf57224e62f"}, + {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b130fe77361d6771ecf5a219d8e0817d61b236b7d8b37cc045172e574ed219e6"}, + {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:96177eb5645b1c6985f5c11d03fc2dbda9ad24ec0f3a46dcce91445747e15094"}, + {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d5fe3e099cf07d0fb5a1e23d399e5d4d1ca3e6dfcbe5c8570ccff3e9208274f7"}, + {file = "wrapt-1.15.0-cp38-cp38-win32.whl", hash = "sha256:abd8f36c99512755b8456047b7be10372fca271bf1467a1caa88db991e7c421b"}, + {file = "wrapt-1.15.0-cp38-cp38-win_amd64.whl", hash = "sha256:b06fa97478a5f478fb05e1980980a7cdf2712015493b44d0c87606c1513ed5b1"}, + {file = "wrapt-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2e51de54d4fb8fb50d6ee8327f9828306a959ae394d3e01a1ba8b2f937747d86"}, + {file = "wrapt-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0970ddb69bba00670e58955f8019bec4a42d1785db3faa043c33d81de2bf843c"}, + {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76407ab327158c510f44ded207e2f76b657303e17cb7a572ffe2f5a8a48aa04d"}, + {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cd525e0e52a5ff16653a3fc9e3dd827981917d34996600bbc34c05d048ca35cc"}, + {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d37ac69edc5614b90516807de32d08cb8e7b12260a285ee330955604ed9dd29"}, + {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:078e2a1a86544e644a68422f881c48b84fef6d18f8c7a957ffd3f2e0a74a0d4a"}, + {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:2cf56d0e237280baed46f0b5316661da892565ff58309d4d2ed7dba763d984b8"}, + {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7dc0713bf81287a00516ef43137273b23ee414fe41a3c14be10dd95ed98a2df9"}, + {file = "wrapt-1.15.0-cp39-cp39-win32.whl", hash = "sha256:46ed616d5fb42f98630ed70c3529541408166c22cdfd4540b88d5f21006b0eff"}, + {file = "wrapt-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:eef4d64c650f33347c1f9266fa5ae001440b232ad9b98f1f43dfe7a79435c0a6"}, + {file = "wrapt-1.15.0-py3-none-any.whl", hash = "sha256:64b1df0f83706b4ef4cfb4fb0e4c2669100fd7ecacfb59e091fad300d4e04640"}, + {file = "wrapt-1.15.0.tar.gz", hash = "sha256:d06730c6aed78cee4126234cf2d071e01b44b915e725a6cb439a879ec9754a3a"}, +] [metadata] lock-version = "2.0" -python-versions = "*" -content-hash = "115cf985d932e9bf5f540555bbdd75decbb62cac81e399375fc19f6277f8c1d8" +python-versions = "3.10.*" +content-hash = "1332d545214a8b36c15b7497a604dd3cc91af759f5c3b738e06706acd35840a5" diff --git a/pyproject.toml b/pyproject.toml index 94356c3..d085a64 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -39,6 +39,11 @@ classifiers = [ # [tool.poetry.scripts] # [tool.poetry.dependencies] +[tool.poetry.dependencies] +python = "3.10.*" +click = "8.1.7" +docker = "6.1.3" + [tool.poetry.group.dev.dependencies] python = "^3.7" pytest = "7.4.0" From ea9bb61a689d169221db6826035d2ae39d1a1821 Mon Sep 17 00:00:00 2001 From: mike dupont Date: Mon, 2 Oct 2023 10:11:56 -0400 Subject: [PATCH 08/27] update --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index d085a64..1f8c325 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -40,7 +40,7 @@ classifiers = [ # [tool.poetry.scripts] # [tool.poetry.dependencies] [tool.poetry.dependencies] -python = "3.10.*" +python = "3.11.5" click = "8.1.7" docker = "6.1.3" From cd4c2f9d3181027db5d77d673135f0f78736013a Mon Sep 17 00:00:00 2001 From: mike dupont Date: Mon, 2 Oct 2023 10:37:08 -0400 Subject: [PATCH 09/27] act base --- .gitmodules | 3 +++ pyproject.toml | 2 +- vendor/act_base | 1 + 3 files changed, 5 insertions(+), 1 deletion(-) create mode 160000 vendor/act_base diff --git a/.gitmodules b/.gitmodules index dfce53a..6dcf0c3 100644 --- a/.gitmodules +++ b/.gitmodules @@ -13,3 +13,6 @@ [submodule "vendor/Auto-GPT-Benchmarks"] path = vendor/Auto-GPT-Benchmarks url = https://github.com/Significant-Gravitas/Auto-GPT-Benchmarks +[submodule "vendor/act_base"] + path = vendor/act_base + url = https://github.com/meta-introspector/act_base/ diff --git a/pyproject.toml b/pyproject.toml index 1f8c325..864896e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -40,7 +40,7 @@ classifiers = [ # [tool.poetry.scripts] # [tool.poetry.dependencies] [tool.poetry.dependencies] -python = "3.11.5" +python = "3.11.4" click = "8.1.7" docker = "6.1.3" diff --git a/vendor/act_base b/vendor/act_base new file mode 160000 index 0000000..dbd8163 --- /dev/null +++ b/vendor/act_base @@ -0,0 +1 @@ +Subproject commit dbd81631ba84fd0f5c252fc7df8fe99b1f6a4bec From f8db370c1373d7ba58dd473d6268f154c3c7da45 Mon Sep 17 00:00:00 2001 From: mike dupont Date: Mon, 2 Oct 2023 11:53:18 -0400 Subject: [PATCH 10/27] dockerbuild --- docker-compose.yml | 9 ++-- dockerbuild/.gitignore | 1 + dockerbuild/Dockerfile | 49 ++++++++++++++++++++ dockerbuild/Readme.md | 1 + dockerbuild/__init__.py | 0 dockerbuild/constants.py | 30 ++++++++++++ dockerbuild/images.py | 99 ++++++++++++++++++++++++++++++++++++++++ dockerbuild/publish.py | 78 +++++++++++++++++++++++++++++++ 8 files changed, 261 insertions(+), 6 deletions(-) create mode 100644 dockerbuild/.gitignore create mode 100644 dockerbuild/Dockerfile create mode 100644 dockerbuild/Readme.md create mode 100644 dockerbuild/__init__.py create mode 100644 dockerbuild/constants.py create mode 100644 dockerbuild/images.py create mode 100644 dockerbuild/publish.py diff --git a/docker-compose.yml b/docker-compose.yml index ae5d25f..1172068 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,13 +1,10 @@ version: '3' services: - ai_ticket: - #image: ai_ticket build: . - # context: . - #entrypoint: /bin/bash - #stdin_open: true # docker run -i - #tty: true # docker run -t + act_base: + # the base image of github action + build: vendor/act_base autogpt: diff --git a/dockerbuild/.gitignore b/dockerbuild/.gitignore new file mode 100644 index 0000000..bee8a64 --- /dev/null +++ b/dockerbuild/.gitignore @@ -0,0 +1 @@ +__pycache__ diff --git a/dockerbuild/Dockerfile b/dockerbuild/Dockerfile new file mode 100644 index 0000000..b8a9eaa --- /dev/null +++ b/dockerbuild/Dockerfile @@ -0,0 +1,49 @@ +# The Poetry installation is provided through the base image. Please check the +# base image if you interested in the details. +# Base image: https://hub.docker.com/r/pfeiffermax/python-poetry +# Dockerfile: https://github.com/max-pfeiffer/python-poetry/blob/main/build/Dockerfile +ARG BASE_IMAGE +FROM ${BASE_IMAGE} +ARG APPLICATION_SERVER_PORT + +LABEL maintainer="Max Pfeiffer " + + # https://docs.python.org/3/using/cmdline.html#envvar-PYTHONUNBUFFERED +ENV PYTHONUNBUFFERED=1 \ + # https://docs.python.org/3/using/cmdline.html#envvar-PYTHONDONTWRITEBYTECODE + PYTHONDONTWRITEBYTECODE=1 \ + PYTHONPATH=/application_root \ + # https://python-poetry.org/docs/configuration/#virtualenvsin-project + POETRY_VIRTUALENVS_IN_PROJECT=true \ + POETRY_CACHE_DIR="/application_root/.cache" \ + VIRTUAL_ENVIRONMENT_PATH="/application_root/.venv" \ + APPLICATION_SERVER_PORT=$APPLICATION_SERVER_PORT + +# Adding the virtual environment to PATH in order to "activate" it. +# https://docs.python.org/3/library/venv.html#how-venvs-work +ENV PATH="$VIRTUAL_ENVIRONMENT_PATH/bin:$PATH" + +# Principle of least privilege: create a new user for running the application +RUN groupadd -g 1001 python_application && \ + useradd -r -u 1001 -g python_application python_application + +# Set the WORKDIR to the application root. +# https://www.uvicorn.org/settings/#development +# https://docs.docker.com/engine/reference/builder/#workdir +WORKDIR ${PYTHONPATH} +RUN chown python_application:python_application ${PYTHONPATH} + +# Create cache directory and set permissions because user 1001 has no home +# and poetry cache directory. +# https://python-poetry.org/docs/configuration/#cache-directory +RUN mkdir ${POETRY_CACHE_DIR} && chown python_application:python_application ${POETRY_CACHE_DIR} + +# Document the exposed port +# https://docs.docker.com/engine/reference/builder/#expose +EXPOSE ${APPLICATION_SERVER_PORT} + +# Use the unpriveledged user to run the application +USER 1001 + +# Run the uvicorn application server. +CMD exec uvicorn --workers 1 --host 0.0.0.0 --port $APPLICATION_SERVER_PORT app.main:app diff --git a/dockerbuild/Readme.md b/dockerbuild/Readme.md new file mode 100644 index 0000000..502580d --- /dev/null +++ b/dockerbuild/Readme.md @@ -0,0 +1 @@ +taken from pfeiffermax/uvicorn-poetry diff --git a/dockerbuild/__init__.py b/dockerbuild/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/dockerbuild/constants.py b/dockerbuild/constants.py new file mode 100644 index 0000000..1f85ba6 --- /dev/null +++ b/dockerbuild/constants.py @@ -0,0 +1,30 @@ +TARGET_ARCHITECTURES: list[str] = [ + "python3.9.16-bullseye", + "python3.9.16-slim-bullseye", + "python3.10.10-bullseye", + "python3.10.10-slim-bullseye", +] +BASE_IMAGES: dict = { + TARGET_ARCHITECTURES[ + 0 + ]: "pfeiffermax/python-poetry:1.2.0-poetry1.4.1-python3.9.16-bullseye@sha256:54037cfdca026b17e7a57664dff47bf04e7849074d3ab62271ecad0446ef0322", + TARGET_ARCHITECTURES[ + 1 + ]: "pfeiffermax/python-poetry:1.2.0-poetry1.4.1-python3.9.16-slim-bullseye@sha256:c0b8d9c28c5717074c481dfdf1d8bd3aaa0b83a5e2a9e37c77be7af19d70d0ce", + TARGET_ARCHITECTURES[ + 2 + ]: "pfeiffermax/python-poetry:1.2.0-poetry1.4.1-python3.10.10-bullseye@sha256:5a81c8c86132e504db2b7329f5e41cd32bddebf811d83a0d356edbca0d81135c", + TARGET_ARCHITECTURES[ + 3 + ]: "pfeiffermax/python-poetry:1.2.0-poetry1.4.1-python3.10.10-slim-bullseye@sha256:289c6beb568991811629c91cdcb3841ceb95bf0a017c3e411f4b71e18043ef15", +} +PYTHON_VERSIONS: dict = { + TARGET_ARCHITECTURES[0]: "3.9.16", + TARGET_ARCHITECTURES[1]: "3.9.16", + TARGET_ARCHITECTURES[2]: "3.10.10", + TARGET_ARCHITECTURES[3]: "3.10.10", +} + +# As we are running the server with an unprivileged user, we need to use +# a high port. +APPLICATION_SERVER_PORT: str = "8000" diff --git a/dockerbuild/images.py b/dockerbuild/images.py new file mode 100644 index 0000000..75fb193 --- /dev/null +++ b/dockerbuild/images.py @@ -0,0 +1,99 @@ +from pathlib import Path +from typing import Optional + +import docker +from docker.models.images import Image + +from dockerbuild.constants import ( + BASE_IMAGES, + APPLICATION_SERVER_PORT, +) + + +class DockerImage: + def __init__( + self, + docker_client: docker.client, + target_architecture: str, + version: str, + ): + self.docker_client: docker.client = docker_client + self.dockerfile_name: str = "Dockerfile" + self.dockerfile_directory: Optional[Path] = None + self.image_name: Optional[str] = None + self.image_tag: Optional[str] = None + self.version: Optional[str] = version + self.target_architecture: str = target_architecture + + +class AITicketPoetryImage(DockerImage): + def __init__( + self, + docker_client: docker.client, + target_architecture: str, + version: str, + ): + super().__init__(docker_client, target_architecture, version) + # An image name is made up of slash-separated name components, + # optionally prefixed by a registry hostname. + # see: https://docs.docker.com/engine/reference/commandline/tag/ + self.image_name: str = "h4ckermike/ai-ticket:test_ai_ticket" + self.dockerfile_directory: Path = Path(__file__).parent.resolve() + + def build(self) -> Image: + self.image_tag: str = f"{self.version}-{self.target_architecture}" + + buildargs: dict[str, str] = { + "BASE_IMAGE": BASE_IMAGES[self.target_architecture], + "APPLICATION_SERVER_PORT": APPLICATION_SERVER_PORT, + } + + image: Image = self.docker_client.images.build( + path=str(self.dockerfile_directory), + dockerfile=self.dockerfile_name, + tag=f"{self.image_name}:{self.image_tag}", + buildargs=buildargs, + )[0] + return image + + +class ExampleApplicationImage(DockerImage): + def build( + self, + target: str, + base_image_tag: str, + ) -> Image: + self.image_tag = f"{self.version}-{self.target_architecture}" + + buildargs: dict[str, str] = { + "BASE_IMAGE": base_image_tag, + } + image: Image = self.docker_client.images.build( + path=str(self.dockerfile_directory), + dockerfile=self.dockerfile_name, + tag=f"{self.image_name}:{self.image_tag}", + target=target, + buildargs=buildargs, + )[0] + return image + + +class ActBaseImage(ExampleApplicationImage): + def __init__( + self, + docker_client: docker.client, + target_architecture: str, + version: str, + ): + super().__init__(docker_client, target_architecture, version) + # An image name is made up of slash-separated name components, + # optionally prefixed by a registry hostname. + # see: https://docs.docker.com/engine/reference/commandline/tag/ + self.image_name: str = "act_base" + self.dockerfile_directory: Path = ( + Path(__file__).parent.parent.resolve() + / "vendor" + / "act_base" + ) + + diff --git a/dockerbuild/publish.py b/dockerbuild/publish.py new file mode 100644 index 0000000..b76999d --- /dev/null +++ b/dockerbuild/publish.py @@ -0,0 +1,78 @@ +import click +import docker +from docker.client import DockerClient +from dockerbuild.constants import ( + TARGET_ARCHITECTURES, +) +from dockerbuild.images import ActBaseImage + +@click.command() +@click.option( + "--docker-hub-username", + envvar="DOCKER_HUB_USERNAME", + help="Docker Hub username", +) +@click.option( + "--docker-hub-password", + envvar="DOCKER_HUB_PASSWORD", + help="Docker Hub password", +) +@click.option( + "--version-tag", envvar="GIT_TAG_NAME", required=True, help="Version Tag" +) +@click.option("--registry", envvar="REGISTRY", help="Docker registry") +def main( + docker_hub_username: str, + docker_hub_password: str, + version_tag: str, + registry: str, +) -> None: + docker_client: DockerClient = docker.from_env() + + for target_architecture in TARGET_ARCHITECTURES: + new_uvicorn_gunicorn_poetry_image: UvicornPoetryImage = ( + ActBaseImage(docker_client, target_architecture, version_tag) + ) + + # Delete old existing images + for old_image in docker_client.images.list( + new_uvicorn_gunicorn_poetry_image.image_name + ): + for tag in old_image.tags: + docker_client.images.remove(tag, force=True) + + #new_uvicorn_gunicorn_poetry_image.build() + + # https://docs.docker.com/engine/reference/commandline/push/ + # https://docs.docker.com/engine/reference/commandline/tag/ + # https://docs.docker.com/engine/reference/commandline/image_tag/ + if docker_hub_username and docker_hub_password: + login_kwargs: dict = { + "username": docker_hub_username, + "password": docker_hub_password, + } + if registry: + login_kwargs["registry"] = registry + + docker_client.login(**login_kwargs) + + if registry: + repository: str = ( + f"{registry}/{new_uvicorn_gunicorn_poetry_image.image_name}" + ) + else: + repository: str = new_uvicorn_gunicorn_poetry_image.image_name + + for line in docker_client.images.push( + repository, + tag=new_uvicorn_gunicorn_poetry_image.image_tag, + stream=True, + decode=True, + ): + print(line) + docker_client.close() + + +if __name__ == "__main__": + # pylint: disable=no-value-for-parameter + main() From b9c8a4afb3f645ad096f67d9d9115d0087f57be2 Mon Sep 17 00:00:00 2001 From: mike dupont Date: Mon, 2 Oct 2023 14:20:26 -0400 Subject: [PATCH 11/27] working first build --- poetry_dependancies.txt | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 poetry_dependancies.txt diff --git a/poetry_dependancies.txt b/poetry_dependancies.txt new file mode 100644 index 0000000..aa6c9ff --- /dev/null +++ b/poetry_dependancies.txt @@ -0,0 +1,2 @@ +click +docker From 553f4ac5b98527ea568b4821d035d26d41fdb997 Mon Sep 17 00:00:00 2001 From: mike dupont Date: Mon, 2 Oct 2023 14:20:35 -0400 Subject: [PATCH 12/27] v1 --- dockerbuild/constants.py | 41 ++++++++++++++++++++-------------------- dockerbuild/images.py | 15 +++++++++++++-- dockerbuild/publish.py | 7 ++++++- 3 files changed, 40 insertions(+), 23 deletions(-) diff --git a/dockerbuild/constants.py b/dockerbuild/constants.py index 1f85ba6..252c1e1 100644 --- a/dockerbuild/constants.py +++ b/dockerbuild/constants.py @@ -1,28 +1,29 @@ TARGET_ARCHITECTURES: list[str] = [ - "python3.9.16-bullseye", - "python3.9.16-slim-bullseye", - "python3.10.10-bullseye", - "python3.10.10-slim-bullseye", + "base_python3.10-nodejs20", # 3.10.13 + #"python3.9.16-bullseye", + #"python3.9.16-slim-bullseye", + #"python3.10.10-bullseye", + #"python3.10.10-slim-bullseye", ] BASE_IMAGES: dict = { - TARGET_ARCHITECTURES[ - 0 - ]: "pfeiffermax/python-poetry:1.2.0-poetry1.4.1-python3.9.16-bullseye@sha256:54037cfdca026b17e7a57664dff47bf04e7849074d3ab62271ecad0446ef0322", - TARGET_ARCHITECTURES[ - 1 - ]: "pfeiffermax/python-poetry:1.2.0-poetry1.4.1-python3.9.16-slim-bullseye@sha256:c0b8d9c28c5717074c481dfdf1d8bd3aaa0b83a5e2a9e37c77be7af19d70d0ce", - TARGET_ARCHITECTURES[ - 2 - ]: "pfeiffermax/python-poetry:1.2.0-poetry1.4.1-python3.10.10-bullseye@sha256:5a81c8c86132e504db2b7329f5e41cd32bddebf811d83a0d356edbca0d81135c", - TARGET_ARCHITECTURES[ - 3 - ]: "pfeiffermax/python-poetry:1.2.0-poetry1.4.1-python3.10.10-slim-bullseye@sha256:289c6beb568991811629c91cdcb3841ceb95bf0a017c3e411f4b71e18043ef15", + # TARGET_ARCHITECTURES[ + # 0 + # ]: "pfeiffermax/python-poetry:1.2.0-poetry1.4.1-python3.9.16-bullseye@sha256:54037cfdca026b17e7a57664dff47bf04e7849074d3ab62271ecad0446ef0322", + # TARGET_ARCHITECTURES[ + # 1 + # ]: "pfeiffermax/python-poetry:1.2.0-poetry1.4.1-python3.9.16-slim-bullseye@sha256:c0b8d9c28c5717074c481dfdf1d8bd3aaa0b83a5e2a9e37c77be7af19d70d0ce", + # TARGET_ARCHITECTURES[ + # 2 + # ]: "pfeiffermax/python-poetry:1.2.0-poetry1.4.1-python3.10.10-bullseye@sha256:5a81c8c86132e504db2b7329f5e41cd32bddebf811d83a0d356edbca0d81135c", + # TARGET_ARCHITECTURES[ + # 3 + # ]: "pfeiffermax/python-poetry:1.2.0-poetry1.4.1-python3.10.10-slim-bullseye@sha256:289c6beb568991811629c91cdcb3841ceb95bf0a017c3e411f4b71e18043ef15", } PYTHON_VERSIONS: dict = { - TARGET_ARCHITECTURES[0]: "3.9.16", - TARGET_ARCHITECTURES[1]: "3.9.16", - TARGET_ARCHITECTURES[2]: "3.10.10", - TARGET_ARCHITECTURES[3]: "3.10.10", +# TARGET_ARCHITECTURES[0]: "3.9.16", +# TARGET_ARCHITECTURES[1]: "3.9.16", +# TARGET_ARCHITECTURES[2]: "3.10.10", +# TARGET_ARCHITECTURES[3]: "3.10.10", } # As we are running the server with an unprivileged user, we need to use diff --git a/dockerbuild/images.py b/dockerbuild/images.py index 75fb193..1b24e3f 100644 --- a/dockerbuild/images.py +++ b/dockerbuild/images.py @@ -63,16 +63,27 @@ def build( target: str, base_image_tag: str, ) -> Image: + self.image_tag = f"{self.version}-{self.target_architecture}" buildargs: dict[str, str] = { "BASE_IMAGE": base_image_tag, } + print("buildargs",dict( + args=buildargs, + path=str(self.dockerfile_directory), + dockerfile=self.dockerfile_name, + tag=f"{self.image_name}:{self.image_tag}", + #target=target, + buildargs=buildargs, + )) + image: Image = self.docker_client.images.build( + path=str(self.dockerfile_directory), dockerfile=self.dockerfile_name, tag=f"{self.image_name}:{self.image_tag}", - target=target, + #target=target, buildargs=buildargs, )[0] return image @@ -89,7 +100,7 @@ def __init__( # An image name is made up of slash-separated name components, # optionally prefixed by a registry hostname. # see: https://docs.docker.com/engine/reference/commandline/tag/ - self.image_name: str = "act_base" + self.image_name: str = "h4ckermike/act_base" self.dockerfile_directory: Path = ( Path(__file__).parent.parent.resolve() / "vendor" diff --git a/dockerbuild/publish.py b/dockerbuild/publish.py index b76999d..f41f993 100644 --- a/dockerbuild/publish.py +++ b/dockerbuild/publish.py @@ -1,5 +1,6 @@ import click import docker +BASE_IMAGE="nikolaik/python-nodejs:python3.10-nodejs20" from docker.client import DockerClient from dockerbuild.constants import ( TARGET_ARCHITECTURES, @@ -39,9 +40,13 @@ def main( new_uvicorn_gunicorn_poetry_image.image_name ): for tag in old_image.tags: + print("tag",tag) docker_client.images.remove(tag, force=True) - #new_uvicorn_gunicorn_poetry_image.build() + new_uvicorn_gunicorn_poetry_image.build( + target=target_architecture, + base_image_tag=BASE_IMAGE, + ) # https://docs.docker.com/engine/reference/commandline/push/ # https://docs.docker.com/engine/reference/commandline/tag/ From 8120decc811ef8f322498978da2e6841421881cb Mon Sep 17 00:00:00 2001 From: mike dupont Date: Mon, 2 Oct 2023 14:31:23 -0400 Subject: [PATCH 13/27] push --- push.sh | 1 + 1 file changed, 1 insertion(+) create mode 100644 push.sh diff --git a/push.sh b/push.sh new file mode 100644 index 0000000..61ede78 --- /dev/null +++ b/push.sh @@ -0,0 +1 @@ +python -m dockerbuild.publish --version-tag 12 From 57e2b8b6a419090e8fa67dd89ebd05235232c075 Mon Sep 17 00:00:00 2001 From: mike dupont Date: Tue, 3 Oct 2023 12:02:58 -0400 Subject: [PATCH 14/27] building autogpt in 12 seconds --- .gitmodules | 6 ++++ dockerbuild/baseimage.py | 71 ++++++++++++++++++++++++++++++++++++++++ vendor/basic_agent | 1 + vendor/python-poetry | 1 + 4 files changed, 79 insertions(+) create mode 100644 dockerbuild/baseimage.py create mode 160000 vendor/basic_agent create mode 160000 vendor/python-poetry diff --git a/.gitmodules b/.gitmodules index 6dcf0c3..40db044 100644 --- a/.gitmodules +++ b/.gitmodules @@ -16,3 +16,9 @@ [submodule "vendor/act_base"] path = vendor/act_base url = https://github.com/meta-introspector/act_base/ +[submodule "vendor/python-poetry"] + path = vendor/python-poetry + url = https://github.com/meta-introspector/python-poetry +[submodule "vendor/basic_agent"] + path = vendor/basic_agent + url = https://github.com/meta-introspector/basic_agent diff --git a/dockerbuild/baseimage.py b/dockerbuild/baseimage.py new file mode 100644 index 0000000..fe9dac4 --- /dev/null +++ b/dockerbuild/baseimage.py @@ -0,0 +1,71 @@ +from pathlib import Path +from typing import Optional + +import docker +from docker.models.images import Image + +from dockerbuild.constants import ( + BASE_IMAGES, + APPLICATION_SERVER_PORT, +) + +# +BASE_IMAGE="nikolaik/python-nodejs:python3.10-nodejs20" + +class DockerImage: + def __init__( + self, + docker_client: docker.client, + target_architecture: str, + version: str, + ): + self.docker_client: docker.client = docker_client + self.dockerfile_name: str = "Dockerfile" + self.dockerfile_directory: Optional[Path] = None + self.image_name: Optional[str] = None + self.image_tag: Optional[str] = None + self.version: Optional[str] = version + self.target_architecture: str = target_architecture + + def build(self) -> Image: + self.image_tag: str = f"{self.version}-{self.target_architecture}" + buildargs: dict[str, str] = { + "BASE_IMAGE": BASE_IMAGE, + "APPLICATION_SERVER_PORT": APPLICATION_SERVER_PORT, } + image: Image = self.docker_client.images.build( + path=str(self.dockerfile_directory), + dockerfile=self.dockerfile_name, + tag=f"{self.image_name}:{self.image_tag}", + buildargs=buildargs,)[0] + return image + +class ExampleApplicationImage(DockerImage): + def build( + self, + target: str, + base_image_tag: str, + ) -> Image: + + self.image_tag = f"{self.version}-{self.target_architecture}" + + buildargs: dict[str, str] = { + "BASE_IMAGE": base_image_tag, + } + print("buildargs",dict( + args=buildargs, + path=str(self.dockerfile_directory), + dockerfile=self.dockerfile_name, + tag=f"{self.image_name}:{self.image_tag}", + #target=target, + buildargs=buildargs, + )) + + image: Image = self.docker_client.images.build( + + path=str(self.dockerfile_directory), + dockerfile=self.dockerfile_name, + tag=f"{self.image_name}:{self.image_tag}", + #target=target, + buildargs=buildargs, + )[0] + return image diff --git a/vendor/basic_agent b/vendor/basic_agent new file mode 160000 index 0000000..43cd887 --- /dev/null +++ b/vendor/basic_agent @@ -0,0 +1 @@ +Subproject commit 43cd887eeca0b7b473d5553db9492976bd9e8f5a diff --git a/vendor/python-poetry b/vendor/python-poetry new file mode 160000 index 0000000..374fc4a --- /dev/null +++ b/vendor/python-poetry @@ -0,0 +1 @@ +Subproject commit 374fc4af14593d26bb5c8c1393849c3549fc97ee From b8807091ff95d64001bb9eac770efc3688cb17f6 Mon Sep 17 00:00:00 2001 From: mike dupont Date: Tue, 3 Oct 2023 12:07:00 -0400 Subject: [PATCH 15/27] now building --- Dockerfile | 29 +++++------- Makefile | 3 ++ README.md | 10 +++- docker-compose.yml | 69 ++++++++++++++++++--------- dockerbuild/Dockerfile | 49 ------------------- dockerbuild/images.py | 105 ++++++++++------------------------------- dockerbuild/publish.py | 64 ++++++++++++------------- pyproject.toml | 4 +- vendor/Auto-GPT | 2 +- 9 files changed, 128 insertions(+), 207 deletions(-) delete mode 100644 dockerbuild/Dockerfile diff --git a/Dockerfile b/Dockerfile index 3517970..4545601 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,7 +4,8 @@ # Dockerfile: https://github.com/max-pfeiffer/python-poetry/blob/main/build/Dockerfile ARG BASE_IMAGE FROM ${BASE_IMAGE} -ARG APPLICATION_SERVER_PORT +RUN apt update +RUN apt install -y git LABEL maintainer="Mike DuPont " @@ -16,36 +17,28 @@ ENV PYTHONUNBUFFERED=1 \ POETRY_VIRTUALENVS_IN_PROJECT=true \ POETRY_CACHE_DIR="/application_root/.cache" \ VIRTUAL_ENVIRONMENT_PATH="/application_root/.venv" \ - APPLICATION_SERVER_PORT=$APPLICATION_SERVER_PORT + POETRY_HOME="/opt/poetry" +# https://python-poetry.org/docs/#installing-manually +RUN python -m venv ${VIRTUAL_ENVIRONMENT_PATH} + # Adding the virtual environment to PATH in order to "activate" it. # https://docs.python.org/3/library/venv.html#how-venvs-work ENV PATH="$VIRTUAL_ENVIRONMENT_PATH/bin:$PATH" -# Principle of least privilege: create a new user for running the application -RUN groupadd -g 1001 python_application && \ - useradd -r -u 1001 -g python_application python_application - # Set the WORKDIR to the application root. # https://www.uvicorn.org/settings/#development # https://docs.docker.com/engine/reference/builder/#workdir WORKDIR ${PYTHONPATH} -RUN chown python_application:python_application ${PYTHONPATH} -# Create cache directory and set permissions because user 1001 has no home -# and poetry cache directory. # https://python-poetry.org/docs/configuration/#cache-directory -RUN mkdir ${POETRY_CACHE_DIR} && chown python_application:python_application ${POETRY_CACHE_DIR} - -# Use the unpriveledged user to run the application -USER 1001 +RUN mkdir ${POETRY_CACHE_DIR} WORKDIR /opt/ai-ticket COPY pyproject.toml /opt/ai-ticket/ COPY setup.cfg /opt/ai-ticket/ +COPY README.md /opt/ai-ticket/ COPY requirements.txt /opt/ai-ticket/ COPY ./src/ /opt/ai-ticket/src/ -RUN pip install /opt/ai-ticket/ - -RUN apt update -RUN apt install -y git -RUN pip install --trusted-host pypi.python.org -r requirements.txt + +RUN ls ${VIRTUAL_ENVIRONMENT_PATH}/bin/activate +RUN pip install /opt/ai-ticket/ && pip install --trusted-host pypi.python.org -r requirements.txt diff --git a/Makefile b/Makefile index 53433c5..6395f33 100644 --- a/Makefile +++ b/Makefile @@ -1,2 +1,5 @@ +test_build: + sudo docker-compose build + test: bash ./runact.sh diff --git a/README.md b/README.md index 66e667f..43a8cfd 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# ai-ticket +# AI-Ticket The AI Ticket system to handle the AI with tickets. Human Powered AI-Ops to Help you with the last mile of your AI code generated system. @@ -35,3 +35,11 @@ Welcome to our innovative user-driven workflow, designed to empower you to inter - Be mindful of providing timely and appropriate responses to prevent workflow stalls. This user-driven ticket-based workflow offers flexibility, control, and a unique way to collaborate with our system. Dive in, generate tickets, and explore the possibilities of this interactive and dynamic approach. + + +# Infrastructure + +The docker images are organized like this : + +* act_base is the foundation of all actions. +* poetry_base is contains the poetry magic layer with shared containers. diff --git a/docker-compose.yml b/docker-compose.yml index 1172068..1f0540c 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,16 +1,49 @@ version: '3' services: - ai_ticket: - build: . - act_base: - # the base image of github action + + act_base: #root base of action build: vendor/act_base + + poetry_base: # use poetry + build: + context: vendor/python-poetry/build + args: + OFFICIAL_PYTHON_IMAGE: act_base + POETRY_VERSION: 1.6.1 + depends_on: + - act_base + + ai_ticket: # the ticket to unite + build: + context: . + args: + BASE_IMAGE: act_base + depends_on: + - poetry_base + + basic_agent: #basic agnet + build: + context: vendor/basic_agent/ + args: + OFFICIAL_PYTHON_IMAGE: act_base + depends_on: + - ai_ticket - autogpt: - - #entrypoint: bash -c "poetry run pip install /opt/ai-ticket && poetry run autogpt --install-plugin-deps --skip-news -y" - entrypoint: bash -c "poetry run pip install /opt/ai-ticket && poetry run autogpt --install-plugin-deps --skip-news -y --ai-name 'meta-autogpt' --ai-role 'you will introspect autogpt and reveal its internals via reflection and comprehension' --ai-goal 'Observe your behaviour' --ai-goal 'Reflect over your outcomes' --ai-goal 'Orient yourself to your knowledge' --ai-goal 'Decide on your next step' --ai-goal 'Act on your chosen next experiment' " + mockopenai: # interface + depends_on: + - ai_ticket + environment: + - GITHUB_PAT=${GITHUB_PAT} + - GITHUB_REPO=${GITHUB_REPO} + build: + context: vendor/lollms/ + args: + OFFICIAL_PYTHON_IMAGE: localhost/ai-ticket_ai_ticket:latest + ports: + - "5000:8080" + autogpt: #the beast + entrypoint: bash -c "poetry run pip install /opt/ai-ticket && poetry run autogpt --install-plugin-deps --skip-news -y --ai-name 'meta-autogpt' --ai-role 'you will introspect autogpt and reveal its internals via reflection and comprehension' --ai-goal 'Observe your behaviour' --ai-goal 'Reflect over your outcomes' --ai-goal 'Orient yourself to your knowledge' --ai-goal 'Decide on your next step' --ai-goal 'Act on your chosen next experiment' " # uncomment thse next 3 lines for debugging @@ -24,20 +57,10 @@ services: - OPENAI_API_BASE=http://mockopenai:8080/v1 build: context: vendor/Auto-GPT/ - depends_on: - - ai_ticket - - mockopenai + dockerfile: slim/Dockerfile + args: + OFFICIAL_PYTHON_IMAGE: localhost/ai-ticket_ai_ticket:latest - mockopenai: depends_on: - - ai_ticket - - environment: - - GITHUB_PAT=${GITHUB_PAT} - - GITHUB_REPO=${GITHUB_REPO} - - build: - context: vendor/lollms/ - ports: - - "5000:8080" - + - basic_agent + - mockopenai diff --git a/dockerbuild/Dockerfile b/dockerbuild/Dockerfile deleted file mode 100644 index b8a9eaa..0000000 --- a/dockerbuild/Dockerfile +++ /dev/null @@ -1,49 +0,0 @@ -# The Poetry installation is provided through the base image. Please check the -# base image if you interested in the details. -# Base image: https://hub.docker.com/r/pfeiffermax/python-poetry -# Dockerfile: https://github.com/max-pfeiffer/python-poetry/blob/main/build/Dockerfile -ARG BASE_IMAGE -FROM ${BASE_IMAGE} -ARG APPLICATION_SERVER_PORT - -LABEL maintainer="Max Pfeiffer " - - # https://docs.python.org/3/using/cmdline.html#envvar-PYTHONUNBUFFERED -ENV PYTHONUNBUFFERED=1 \ - # https://docs.python.org/3/using/cmdline.html#envvar-PYTHONDONTWRITEBYTECODE - PYTHONDONTWRITEBYTECODE=1 \ - PYTHONPATH=/application_root \ - # https://python-poetry.org/docs/configuration/#virtualenvsin-project - POETRY_VIRTUALENVS_IN_PROJECT=true \ - POETRY_CACHE_DIR="/application_root/.cache" \ - VIRTUAL_ENVIRONMENT_PATH="/application_root/.venv" \ - APPLICATION_SERVER_PORT=$APPLICATION_SERVER_PORT - -# Adding the virtual environment to PATH in order to "activate" it. -# https://docs.python.org/3/library/venv.html#how-venvs-work -ENV PATH="$VIRTUAL_ENVIRONMENT_PATH/bin:$PATH" - -# Principle of least privilege: create a new user for running the application -RUN groupadd -g 1001 python_application && \ - useradd -r -u 1001 -g python_application python_application - -# Set the WORKDIR to the application root. -# https://www.uvicorn.org/settings/#development -# https://docs.docker.com/engine/reference/builder/#workdir -WORKDIR ${PYTHONPATH} -RUN chown python_application:python_application ${PYTHONPATH} - -# Create cache directory and set permissions because user 1001 has no home -# and poetry cache directory. -# https://python-poetry.org/docs/configuration/#cache-directory -RUN mkdir ${POETRY_CACHE_DIR} && chown python_application:python_application ${POETRY_CACHE_DIR} - -# Document the exposed port -# https://docs.docker.com/engine/reference/builder/#expose -EXPOSE ${APPLICATION_SERVER_PORT} - -# Use the unpriveledged user to run the application -USER 1001 - -# Run the uvicorn application server. -CMD exec uvicorn --workers 1 --host 0.0.0.0 --port $APPLICATION_SERVER_PORT app.main:app diff --git a/dockerbuild/images.py b/dockerbuild/images.py index 1b24e3f..9dfdc72 100644 --- a/dockerbuild/images.py +++ b/dockerbuild/images.py @@ -1,32 +1,10 @@ -from pathlib import Path -from typing import Optional +from dockerbuild.baseimage import ExampleApplicationImage import docker +from pathlib import Path from docker.models.images import Image -from dockerbuild.constants import ( - BASE_IMAGES, - APPLICATION_SERVER_PORT, -) - - -class DockerImage: - def __init__( - self, - docker_client: docker.client, - target_architecture: str, - version: str, - ): - self.docker_client: docker.client = docker_client - self.dockerfile_name: str = "Dockerfile" - self.dockerfile_directory: Optional[Path] = None - self.image_name: Optional[str] = None - self.image_tag: Optional[str] = None - self.version: Optional[str] = version - self.target_architecture: str = target_architecture - - -class AITicketPoetryImage(DockerImage): +class AITicketPoetryImage(ExampleApplicationImage): def __init__( self, docker_client: docker.client, @@ -37,59 +15,11 @@ def __init__( # An image name is made up of slash-separated name components, # optionally prefixed by a registry hostname. # see: https://docs.docker.com/engine/reference/commandline/tag/ - self.image_name: str = "h4ckermike/ai-ticket:test_ai_ticket" - self.dockerfile_directory: Path = Path(__file__).parent.resolve() - - def build(self) -> Image: - self.image_tag: str = f"{self.version}-{self.target_architecture}" - - buildargs: dict[str, str] = { - "BASE_IMAGE": BASE_IMAGES[self.target_architecture], - "APPLICATION_SERVER_PORT": APPLICATION_SERVER_PORT, - } - - image: Image = self.docker_client.images.build( - path=str(self.dockerfile_directory), - dockerfile=self.dockerfile_name, - tag=f"{self.image_name}:{self.image_tag}", - buildargs=buildargs, - )[0] - return image - - -class ExampleApplicationImage(DockerImage): - def build( - self, - target: str, - base_image_tag: str, - ) -> Image: - - self.image_tag = f"{self.version}-{self.target_architecture}" + self.image_name: str = "h4ckermike/ai-ticket" + self.dockerfile_directory: Path = Path(__file__).parent.parent.resolve() - buildargs: dict[str, str] = { - "BASE_IMAGE": base_image_tag, - } - print("buildargs",dict( - args=buildargs, - path=str(self.dockerfile_directory), - dockerfile=self.dockerfile_name, - tag=f"{self.image_name}:{self.image_tag}", - #target=target, - buildargs=buildargs, - )) - - image: Image = self.docker_client.images.build( - - path=str(self.dockerfile_directory), - dockerfile=self.dockerfile_name, - tag=f"{self.image_name}:{self.image_tag}", - #target=target, - buildargs=buildargs, - )[0] - return image - -class ActBaseImage(ExampleApplicationImage): +class AutoGptImage(ExampleApplicationImage): def __init__( self, docker_client: docker.client, @@ -97,14 +27,31 @@ def __init__( version: str, ): super().__init__(docker_client, target_architecture, version) - # An image name is made up of slash-separated name components, - # optionally prefixed by a registry hostname. - # see: https://docs.docker.com/engine/reference/commandline/tag/ self.image_name: str = "h4ckermike/act_base" self.dockerfile_directory: Path = ( Path(__file__).parent.parent.resolve() / "vendor" / "act_base" ) +class ActBaseImage(ExampleApplicationImage): + def __init__( self, docker_client: docker.client, target_architecture: str, version: str, + ): + super().__init__(docker_client, target_architecture, version) + self.image_name: str = "h4ckermike/autogpt" + self.dockerfile_directory: Path = ( + Path(__file__).parent.parent.resolve() + / "vendor" + / "Auto-GPT/" + ) + +class OpenAIImage(ExampleApplicationImage): + def __init__( self, docker_client: docker.client,target_architecture: str,version: str ): + super().__init__(docker_client, target_architecture, version) + self.image_name: str = "h4ckermike/mockopenai" + self.dockerfile_directory: Path = ( + Path(__file__).parent.parent.resolve() + / "vendor" + / "lollms/" + ) diff --git a/dockerbuild/publish.py b/dockerbuild/publish.py index f41f993..714b77a 100644 --- a/dockerbuild/publish.py +++ b/dockerbuild/publish.py @@ -1,11 +1,13 @@ import click import docker -BASE_IMAGE="nikolaik/python-nodejs:python3.10-nodejs20" + from docker.client import DockerClient + from dockerbuild.constants import ( TARGET_ARCHITECTURES, ) -from dockerbuild.images import ActBaseImage +import dockerbuild.images +from dockerbuild.baseimage import BASE_IMAGE @click.command() @click.option( @@ -28,29 +30,24 @@ def main( version_tag: str, registry: str, ) -> None: - docker_client: DockerClient = docker.from_env() - + docker_client: DockerClient = docker.from_env() for target_architecture in TARGET_ARCHITECTURES: - new_uvicorn_gunicorn_poetry_image: UvicornPoetryImage = ( - ActBaseImage(docker_client, target_architecture, version_tag) - ) - - # Delete old existing images - for old_image in docker_client.images.list( - new_uvicorn_gunicorn_poetry_image.image_name - ): - for tag in old_image.tags: - print("tag",tag) - docker_client.images.remove(tag, force=True) - - new_uvicorn_gunicorn_poetry_image.build( - target=target_architecture, - base_image_tag=BASE_IMAGE, - ) - - # https://docs.docker.com/engine/reference/commandline/push/ - # https://docs.docker.com/engine/reference/commandline/tag/ - # https://docs.docker.com/engine/reference/commandline/image_tag/ + #import pdb + #pdb.set_trace() + for x in dir(dockerbuild.images) : + cls = getattr(dockerbuild.images,x) + if not isinstance(cls,type): + continue + print(cls) + new_uvicorn_gunicorn_poetry_image = (cls(docker_client,target_architecture,version_tag)) + if new_uvicorn_gunicorn_poetry_image: + for old_image in docker_client.images.list(new_uvicorn_gunicorn_poetry_image.image_name): + for tag in old_image.tags: + print("tag",tag) + docker_client.images.remove(tag, force=True) + new_uvicorn_gunicorn_poetry_image.build( + target=target_architecture,base_image_tag=BASE_IMAGE + ) if docker_hub_username and docker_hub_password: login_kwargs: dict = { "username": docker_hub_username, @@ -58,9 +55,7 @@ def main( } if registry: login_kwargs["registry"] = registry - docker_client.login(**login_kwargs) - if registry: repository: str = ( f"{registry}/{new_uvicorn_gunicorn_poetry_image.image_name}" @@ -68,14 +63,15 @@ def main( else: repository: str = new_uvicorn_gunicorn_poetry_image.image_name - for line in docker_client.images.push( - repository, - tag=new_uvicorn_gunicorn_poetry_image.image_tag, - stream=True, - decode=True, - ): - print(line) - docker_client.close() + if False: + for line in docker_client.images.push( + repository, + tag=new_uvicorn_gunicorn_poetry_image.image_tag, + stream=True, + decode=True, + ): + print(line) + docker_client.close() if __name__ == "__main__": diff --git a/pyproject.toml b/pyproject.toml index 864896e..2158d50 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,5 +1,5 @@ [build-system] -python = "^3.7" +#python = "^3.11" requires = [ "setuptools>=42", "wheel", @@ -40,7 +40,7 @@ classifiers = [ # [tool.poetry.scripts] # [tool.poetry.dependencies] [tool.poetry.dependencies] -python = "3.11.4" +#python = "3.11.4" click = "8.1.7" docker = "6.1.3" diff --git a/vendor/Auto-GPT b/vendor/Auto-GPT index 9a19ff2..28deb1f 160000 --- a/vendor/Auto-GPT +++ b/vendor/Auto-GPT @@ -1 +1 @@ -Subproject commit 9a19ff21f3ca68aef6209cec036c8e174dd78406 +Subproject commit 28deb1fb486734087a72af148bd18adeeef9135a From 92276cc1d799ba231a966be4b8830dfd1efec41b Mon Sep 17 00:00:00 2001 From: mike dupont Date: Tue, 3 Oct 2023 12:10:35 -0400 Subject: [PATCH 16/27] update --- vendor/Auto-GPT | 2 +- vendor/lollms | 2 +- vendor/python-poetry | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/vendor/Auto-GPT b/vendor/Auto-GPT index 28deb1f..eae1f02 160000 --- a/vendor/Auto-GPT +++ b/vendor/Auto-GPT @@ -1 +1 @@ -Subproject commit 28deb1fb486734087a72af148bd18adeeef9135a +Subproject commit eae1f0209f8d3ab9c9c9839e50b53f11e7ae5d8f diff --git a/vendor/lollms b/vendor/lollms index 15e4b4f..faf3084 160000 --- a/vendor/lollms +++ b/vendor/lollms @@ -1 +1 @@ -Subproject commit 15e4b4fc39dc97d428d47b5c632cba370e1e4e52 +Subproject commit faf308442626da16ec165d157aeb19e0340883e5 diff --git a/vendor/python-poetry b/vendor/python-poetry index 374fc4a..060f378 160000 --- a/vendor/python-poetry +++ b/vendor/python-poetry @@ -1 +1 @@ -Subproject commit 374fc4af14593d26bb5c8c1393849c3549fc97ee +Subproject commit 060f378c73140a999201ca3425ddb00a1b5bcaa2 From 973b7538344b4e4f507a7141730de58fc3f3d1b6 Mon Sep 17 00:00:00 2001 From: Mike DuPont Date: Tue, 3 Oct 2023 12:22:15 -0400 Subject: [PATCH 17/27] Update pipeline.yml --- .github/workflows/pipeline.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pipeline.yml b/.github/workflows/pipeline.yml index a51aabc..585ee4f 100644 --- a/.github/workflows/pipeline.yml +++ b/.github/workflows/pipeline.yml @@ -30,7 +30,7 @@ jobs: - name: pylint run: | source .venv/bin/activate - pylint build tests + pylint build tests || echo ignore for now - name: black run: | source .venv/bin/activate From 1734d54979ac1e69615d6216bea4222f2d5d72af Mon Sep 17 00:00:00 2001 From: mike dupont Date: Tue, 3 Oct 2023 12:35:58 -0400 Subject: [PATCH 18/27] blac --- src/ai_ticket/__init__.py | 6 ++++ src/ai_ticket/backends/pygithub.py | 47 +++++++++++++++++------------- src/ai_ticket/events/inference.py | 21 ++++++++----- tests/example1.py | 4 ++- tests/example2.py | 26 +++++++++++++++-- 5 files changed, 71 insertions(+), 33 deletions(-) diff --git a/src/ai_ticket/__init__.py b/src/ai_ticket/__init__.py index 37756e8..e0f23ce 100644 --- a/src/ai_ticket/__init__.py +++ b/src/ai_ticket/__init__.py @@ -1,7 +1,13 @@ +""" +This is a simple function to look for the role name in the message of autogpt +yes it is very specific and will have to be more generalized. +""" import re + pattern = r'(```)?\s*{\s*"messages"\s*:\s*\[\s*\{\s*"role"\s*:\s*"system"\s*,\s*\"content"\s*:\s*"You\s+are\s+(?P[^,]+),.*' + def find_name(text): if not text: return False diff --git a/src/ai_ticket/backends/pygithub.py b/src/ai_ticket/backends/pygithub.py index a36d1ca..cd42fc6 100644 --- a/src/ai_ticket/backends/pygithub.py +++ b/src/ai_ticket/backends/pygithub.py @@ -11,65 +11,70 @@ repo = None g = None + def load_env(): load_dotenv() git_hub_pat = os.getenv("GITHUB_PAT") git_hub_repo = os.getenv("GITHUB_REPO") - load_repo(git_hub_repo,git_hub_pat) + load_repo(git_hub_repo, git_hub_pat) + -def load_repo(git_hub_repo,git_hub_pat): +def load_repo(git_hub_repo, git_hub_pat): global g global repo auth = Auth.Token(git_hub_pat) g = Github(auth=auth) repo = g.get_repo(git_hub_repo) - return (g,repo) + return (g, repo) + def get_issues(): issues = repo.get_issues() for issue in issues: yield issue + def get_existing_ticket(event): """Find the first ticket that matches""" body = event.get("content") - #print("DEBUG get ",event) + # print("DEBUG get ",event) for issue in get_issues(): data = issue.body - #print("DEBUG check ",data) + # print("DEBUG check ",data) name = find_name(data) if name: return issue return None + def create_new_ticket(event): # repo = g.get_repo("PyGithub/PyGithub") body = event.get("content") title = "Auto issue" try: - body = "```" + json.dumps(json.loads(body),indent=2) + "```" + body = "```" + json.dumps(json.loads(body), indent=2) + "```" except Exception as e: print(e) return repo.create_issue(title=title, body=body) - #Issue(title="This is a new issue", number=XXX) - + # Issue(title="This is a new issue", number=XXX) + + def create_new_comment(ticket, event): body = event.get("content") - print("DEBUG",body) - #try: - body = "```" + json.dumps(json.loads(body),indent=2) + "```" - #except Exception as e: - #print(e) - ticket_object = ticket#repo.get_issue(int(ticket.split("/")[-1])) - comment = ticket_object.create_comment(body) - print("created comment",comment) - #print(dir(comment)) + print("DEBUG", body) + # try: + body = "```" + json.dumps(json.loads(body), indent=2) + "```" + # except Exception as e: + # print(e) + ticket_object = ticket # repo.get_issue(int(ticket.split("/")[-1])) + comment = ticket_object.create_comment(body) + print("created comment", comment) + # print(dir(comment)) return comment.url - #Issue(title="This is a new issue", number=XXX) - -# To close connections after use -#g.close() + # Issue(title="This is a new issue", number=XXX) +# To close connections after use +# g.close() diff --git a/src/ai_ticket/events/inference.py b/src/ai_ticket/events/inference.py index 2c7604a..44ae084 100644 --- a/src/ai_ticket/events/inference.py +++ b/src/ai_ticket/events/inference.py @@ -1,28 +1,33 @@ # ai_ticket.events.inference import ai_ticket.backends.pygithub -ai_ticket.backends.pygithub.load_env() #setup standard env + +ai_ticket.backends.pygithub.load_env() # setup standard env + def get_existing_ticket(event): return get_backend().get_existing_ticket(event) + def get_backend(): return ai_ticket.backends.pygithub + def create_new_ticket(event): return get_backend().create_new_ticket(event) + def create_new_comment(ticket, event): return get_backend().create_new_comment(ticket, event) + def on_event(event): - #print(event) - + # print(event) + ticket = get_existing_ticket(event) - + if not ticket: - # No existing ticket found, create a new one - ticket = create_new_ticket(event) + # No existing ticket found, create a new one + ticket = create_new_ticket(event) - return create_new_comment(ticket, event ) - + return create_new_comment(ticket, event) diff --git a/tests/example1.py b/tests/example1.py index 459bdec..ad026d2 100644 --- a/tests/example1.py +++ b/tests/example1.py @@ -1,3 +1,5 @@ from ai_ticket import find_name -assert(find_name("""```{"messages": [{"role": "system", "content": "You are Entrepreneur-GPT, an AI designed to autonomously develop and run businesses with the.\n\nYour decisions must always be made independently without seeking user assistance. Play to your strengths as an LLM and pursue simple strategies with no legal complications.\n\n## Constraints\nYou operate within the following constraints:\n1. Exclusively use the commands listed below.\n2. You can only act proactively, and are unable to start background jobs or set up webhooks for yourself. Take this into account when planning your actions.\n3. You are unable to interact with physical objects. If this is absolutely necessary to fulfill a task or objective or to complete a step, you must ask the user to do it for you. If the user refuses this, and there is no other way to achieve your goals, you must terminate to avoid wasting time and energy.\n\n## Resources\nYou can leverage access to the following resources:\n1. Internet access for searches and information gathering.\n2. The ability to read and write files.\n3. You are a Large Language Model, trained on millions of pages of text, including a lot of factual knowledge. Make use of this factual knowledge to avoid unnecessary gathering of information.\n\n## Commands\nYou have access to the following commands:\n1. execute_python_code: Executes the given Python code inside a single-use Docker container with access to your workspace folder. Params: (code: string)\n2. execute_python_file: Execute an existing Python file inside a single-use Docker container with access to your workspace folder. Params: (filename: string, args: Optional[list[str]])\n3. list_folder: List the items in a folder. Params: (folder: string)\n4. open_file: Open a file for editing or continued viewing; create it if it does not exist yet. Note: if you only need to read or write a file once, use `write_to_file` instead. Params: (file_path: string)\n5. open_folder: Open a folder to keep track of its content. Params: (path: string)\n6. read_file: Read an existing file. Params: (filename: string)\n7. write_file: Write a file, creating it if necessary. If the file exists, it is overwritten. Params: (filename: string, contents: string)\n8. ask_user: If you need more details or information regarding the given goals, you can ask the user for input. Params: (question: string)\n9. web_search: Searches the web. Params: (query: string)\n10. read_webpage: Read a webpage, and extract specific information from it if a question is specified. If you are looking to extract specific information from the webpage, you should specify a question. Params: (url: string, question: Optional[string])\n11. finish: Use this to shut down once you have accomplished all of your goals, or when there are insurmountable problems that make it impossible for you to finish your task. Params: (reason: string)\n\n## Best practices\n1. Continuously review and analyze your actions to ensure you are performing to the best of your abilities.\n2. Constructively self-criticize your big-picture behavior constantly.\n3. Reflect on past decisions and strategies to refine your approach.\n4. Every command has a cost, so be smart and efficient. Aim to complete tasks in the least number of steps.\n5. Only make use of your information gathering abilities to find information that you don't yet have knowledge of.\n\n## Goals\nFor your task, you must fulfill the following goals:\n1. Increase net worth\n2. Grow Twitter Account\n3. Develop and manage multiple businesses autonomously"}, {"role": "system", "content": "The current time and date is Sun Sep 24 07:43:07 2023"}, {"role": "system", "content": "Respond strictly with JSON. The JSON should be compatible with the TypeScript type `Response` from the following:\n```ts\ninterface Response {\nthoughts: {\n// Thoughts\ntext: string;\nreasoning: string;\n// Short markdown-style bullet list that conveys the long-term plan\nplan: string;\n// Constructive self-criticism\ncriticism: string;\n// Summary of thoughts to say to the user\nspeak: string;\n};\ncommand: {\nname: string;\nargs: Record;\n};\n}\n```"}, {"role": "user", "content": "Determine exactly one command to use next based on the given goals and the progress you have made so far, and respond using the JSON schema specified previously:"}], "model": "gpt-3.5-turbo", "temperature": 0.0, "max_tokens": 3175}```""")) +assert find_name( + """```{"messages": [{"role": "system", "content": "You are Entrepreneur-GPT, an AI designed to autonomously develop and run businesses with the.\n\nYour decisions must always be made independently without seeking user assistance. Play to your strengths as an LLM and pursue simple strategies with no legal complications.\n\n## Constraints\nYou operate within the following constraints:\n1. Exclusively use the commands listed below.\n2. You can only act proactively, and are unable to start background jobs or set up webhooks for yourself. Take this into account when planning your actions.\n3. You are unable to interact with physical objects. If this is absolutely necessary to fulfill a task or objective or to complete a step, you must ask the user to do it for you. If the user refuses this, and there is no other way to achieve your goals, you must terminate to avoid wasting time and energy.\n\n## Resources\nYou can leverage access to the following resources:\n1. Internet access for searches and information gathering.\n2. The ability to read and write files.\n3. You are a Large Language Model, trained on millions of pages of text, including a lot of factual knowledge. Make use of this factual knowledge to avoid unnecessary gathering of information.\n\n## Commands\nYou have access to the following commands:\n1. execute_python_code: Executes the given Python code inside a single-use Docker container with access to your workspace folder. Params: (code: string)\n2. execute_python_file: Execute an existing Python file inside a single-use Docker container with access to your workspace folder. Params: (filename: string, args: Optional[list[str]])\n3. list_folder: List the items in a folder. Params: (folder: string)\n4. open_file: Open a file for editing or continued viewing; create it if it does not exist yet. Note: if you only need to read or write a file once, use `write_to_file` instead. Params: (file_path: string)\n5. open_folder: Open a folder to keep track of its content. Params: (path: string)\n6. read_file: Read an existing file. Params: (filename: string)\n7. write_file: Write a file, creating it if necessary. If the file exists, it is overwritten. Params: (filename: string, contents: string)\n8. ask_user: If you need more details or information regarding the given goals, you can ask the user for input. Params: (question: string)\n9. web_search: Searches the web. Params: (query: string)\n10. read_webpage: Read a webpage, and extract specific information from it if a question is specified. If you are looking to extract specific information from the webpage, you should specify a question. Params: (url: string, question: Optional[string])\n11. finish: Use this to shut down once you have accomplished all of your goals, or when there are insurmountable problems that make it impossible for you to finish your task. Params: (reason: string)\n\n## Best practices\n1. Continuously review and analyze your actions to ensure you are performing to the best of your abilities.\n2. Constructively self-criticize your big-picture behavior constantly.\n3. Reflect on past decisions and strategies to refine your approach.\n4. Every command has a cost, so be smart and efficient. Aim to complete tasks in the least number of steps.\n5. Only make use of your information gathering abilities to find information that you don't yet have knowledge of.\n\n## Goals\nFor your task, you must fulfill the following goals:\n1. Increase net worth\n2. Grow Twitter Account\n3. Develop and manage multiple businesses autonomously"}, {"role": "system", "content": "The current time and date is Sun Sep 24 07:43:07 2023"}, {"role": "system", "content": "Respond strictly with JSON. The JSON should be compatible with the TypeScript type `Response` from the following:\n```ts\ninterface Response {\nthoughts: {\n// Thoughts\ntext: string;\nreasoning: string;\n// Short markdown-style bullet list that conveys the long-term plan\nplan: string;\n// Constructive self-criticism\ncriticism: string;\n// Summary of thoughts to say to the user\nspeak: string;\n};\ncommand: {\nname: string;\nargs: Record;\n};\n}\n```"}, {"role": "user", "content": "Determine exactly one command to use next based on the given goals and the progress you have made so far, and respond using the JSON schema specified previously:"}], "model": "gpt-3.5-turbo", "temperature": 0.0, "max_tokens": 3175}```""" +) diff --git a/tests/example2.py b/tests/example2.py index 06a42da..c04f0d1 100644 --- a/tests/example2.py +++ b/tests/example2.py @@ -1,9 +1,29 @@ import json -#from ai_ticket import on_event + +# from ai_ticket import on_event from ai_ticket.events.inference import on_event -data = {"messages": [{"role": "system", "content": "You are Entrepreneur-GPT, an AI designed to autonomously develop and run businesses. Your decisions must always be made independently without seeking user assistance. Play to your strengths as an LLM and pursue simple strategies with no legal complications. ## Constraints You operate within the following constraints: 1. Exclusively use the commands listed below. 2. You can only act proactively, and are unable to start background jobs or set up webhooks for yourself. Take this into account when planning your actions. 3. You are unable to interact with physical objects. If this is absolutely necessary to fulfill a task or objective or to complete a step, you must ask the user to do it for you. If the user refuses this, and there is no other way to achieve your goals, you must terminate to avoid wasting time and energy. ## Resources You can leverage access to the following resources: 1. Internet access for searches and information gathering. 2. The ability to read and write files. 3. You are a Large Language Model, trained on millions of pages of text, including a lot of factual knowledge. Make use of this factual knowledge to avoid unnecessary gathering of information. ## Commands You have access to the following commands: 1. execute_python_code: Executes the given Python code inside a single-use Docker container with access to your workspace folder. Params: (code: string) 2. execute_python_file: Execute an existing Python file inside a single-use Docker container with access to your workspace folder. Params: (filename: string, args: Optional[list[str]]) 3. list_folder: List the items in a folder. Params: (folder: string) 4. open_file: Open a file for editing or continued viewing; create it if it does not exist yet. Note: if you only need to read or write a file once, use `write_to_file` instead. Params: (file_path: string) 5. open_folder: Open a folder to keep track of its content. Params: (path: string) 6. read_file: Read an existing file. Params: (filename: string) 7. write_file: Write a file, creating it if necessary. If the file exists, it is overwritten. Params: (filename: string, contents: string) 8. ask_user: If you need more details or information regarding the given goals, you can ask the user for input. Params: (question: string) 9. web_search: Searches the web. Params: (query: string) 10. read_webpage: Read a webpage, and extract specific information from it if a question is specified. If you are looking to extract specific information from the webpage, you should specify a question. Params: (url: string, question: Optional[string]) 11. finish: Use this to shut down once you have accomplished all of your goals, or when there are insurmountable problems that make it impossible for you to finish your task. Params: (reason: string) ## Best practices 1. Continuously review and analyze your actions to ensure you are performing to the best of your abilities. 2. Constructively self-criticize your big-picture behavior constantly. 3. Reflect on past decisions and strategies to refine your approach. 4. Every command has a cost, so be smart and efficient. Aim to complete tasks in the least number of steps. 5. Only make use of your information gathering abilities to find information that you don't yet have knowledge of. ## Goals For your task, you must fulfill the following goals: 1. Increase net worth 2. Grow Twitter Account 3. Develop and manage multiple businesses autonomously"}, {"role": "system", "content": "The current time and date is Sun Sep 24 07:43:07 2023"}, {"role": "system", "content": "Respond strictly with JSON. The JSON should be compatible with the TypeScript type `Response` from the following: ```ts interface Response { thoughts: { // Thoughts text: string; reasoning: string; // Short markdown-style bullet list that conveys the long-term plan plan: string; // Constructive self-criticism criticism: string; // Summary of thoughts to say to the user speak: string; }; command: { name: string; args: Record; }; } ```"}, {"role": "user", "content": "Determine exactly one command to use next based on the given goals and the progress you have made so far, and respond using the JSON schema specified previously:"}], "model": "gpt-3.5-turbo", "temperature": 0.0, "max_tokens": 3175} +data = { + "messages": [ + { + "role": "system", + "content": "You are Entrepreneur-GPT, an AI designed to autonomously develop and run businesses. Your decisions must always be made independently without seeking user assistance. Play to your strengths as an LLM and pursue simple strategies with no legal complications. ## Constraints You operate within the following constraints: 1. Exclusively use the commands listed below. 2. You can only act proactively, and are unable to start background jobs or set up webhooks for yourself. Take this into account when planning your actions. 3. You are unable to interact with physical objects. If this is absolutely necessary to fulfill a task or objective or to complete a step, you must ask the user to do it for you. If the user refuses this, and there is no other way to achieve your goals, you must terminate to avoid wasting time and energy. ## Resources You can leverage access to the following resources: 1. Internet access for searches and information gathering. 2. The ability to read and write files. 3. You are a Large Language Model, trained on millions of pages of text, including a lot of factual knowledge. Make use of this factual knowledge to avoid unnecessary gathering of information. ## Commands You have access to the following commands: 1. execute_python_code: Executes the given Python code inside a single-use Docker container with access to your workspace folder. Params: (code: string) 2. execute_python_file: Execute an existing Python file inside a single-use Docker container with access to your workspace folder. Params: (filename: string, args: Optional[list[str]]) 3. list_folder: List the items in a folder. Params: (folder: string) 4. open_file: Open a file for editing or continued viewing; create it if it does not exist yet. Note: if you only need to read or write a file once, use `write_to_file` instead. Params: (file_path: string) 5. open_folder: Open a folder to keep track of its content. Params: (path: string) 6. read_file: Read an existing file. Params: (filename: string) 7. write_file: Write a file, creating it if necessary. If the file exists, it is overwritten. Params: (filename: string, contents: string) 8. ask_user: If you need more details or information regarding the given goals, you can ask the user for input. Params: (question: string) 9. web_search: Searches the web. Params: (query: string) 10. read_webpage: Read a webpage, and extract specific information from it if a question is specified. If you are looking to extract specific information from the webpage, you should specify a question. Params: (url: string, question: Optional[string]) 11. finish: Use this to shut down once you have accomplished all of your goals, or when there are insurmountable problems that make it impossible for you to finish your task. Params: (reason: string) ## Best practices 1. Continuously review and analyze your actions to ensure you are performing to the best of your abilities. 2. Constructively self-criticize your big-picture behavior constantly. 3. Reflect on past decisions and strategies to refine your approach. 4. Every command has a cost, so be smart and efficient. Aim to complete tasks in the least number of steps. 5. Only make use of your information gathering abilities to find information that you don't yet have knowledge of. ## Goals For your task, you must fulfill the following goals: 1. Increase net worth 2. Grow Twitter Account 3. Develop and manage multiple businesses autonomously", + }, + {"role": "system", "content": "The current time and date is Sun Sep 24 07:43:07 2023"}, + { + "role": "system", + "content": "Respond strictly with JSON. The JSON should be compatible with the TypeScript type `Response` from the following: ```ts interface Response { thoughts: { // Thoughts text: string; reasoning: string; // Short markdown-style bullet list that conveys the long-term plan plan: string; // Constructive self-criticism criticism: string; // Summary of thoughts to say to the user speak: string; }; command: { name: string; args: Record; }; } ```", + }, + { + "role": "user", + "content": "Determine exactly one command to use next based on the given goals and the progress you have made so far, and respond using the JSON schema specified previously:", + }, + ], + "model": "gpt-3.5-turbo", + "temperature": 0.0, + "max_tokens": 3175, +} -da = {"content" :json.dumps(data,indent=2) } +da = {"content": json.dumps(data, indent=2)} on_event(da) From dc2257dcb424d1fcc2bf0a5ccb818849d90e1fae Mon Sep 17 00:00:00 2001 From: mike dupont Date: Tue, 3 Oct 2023 14:48:14 -0400 Subject: [PATCH 19/27] its building --- docker-compose.yml | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 1f0540c..1237dd2 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,28 +1,34 @@ version: '3' services: - + act_base: #root base of action build: vendor/act_base - + image: h4ckermike/act_base + #h4ckermike/ poetry_base: # use poetry - build: + image: h4ckermike/poetry_base + build: context: vendor/python-poetry/build args: - OFFICIAL_PYTHON_IMAGE: act_base + OFFICIAL_PYTHON_IMAGE: h4ckermike/act_base:latest POETRY_VERSION: 1.6.1 depends_on: - act_base ai_ticket: # the ticket to unite + image: h4ckermike/ai_ticket build: + context: . args: BASE_IMAGE: act_base depends_on: - poetry_base - basic_agent: #basic agnet + basic_agent: #basic agnet + image: h4ckermike/basic_agent build: + context: vendor/basic_agent/ args: OFFICIAL_PYTHON_IMAGE: act_base @@ -35,10 +41,12 @@ services: environment: - GITHUB_PAT=${GITHUB_PAT} - GITHUB_REPO=${GITHUB_REPO} + image: h4ckermike/mockopenai build: + context: vendor/lollms/ args: - OFFICIAL_PYTHON_IMAGE: localhost/ai-ticket_ai_ticket:latest + OFFICIAL_PYTHON_IMAGE: h4ckermike/ai_ticket:latest ports: - "5000:8080" @@ -55,11 +63,13 @@ services: - GITHUB_REPO="jmikedupont2/ai-ticket" - OPENAI_API_KEY=your-openai-api-key - OPENAI_API_BASE=http://mockopenai:8080/v1 + image: h4ckermike/autogpt build: + context: vendor/Auto-GPT/ dockerfile: slim/Dockerfile args: - OFFICIAL_PYTHON_IMAGE: localhost/ai-ticket_ai_ticket:latest + OFFICIAL_PYTHON_IMAGE: h4ckermike/ai_ticket:latest depends_on: - basic_agent From 330579be4b2d7e78694e34e78de548c4705f3ab0 Mon Sep 17 00:00:00 2001 From: mike dupont Date: Tue, 3 Oct 2023 17:28:20 -0400 Subject: [PATCH 20/27] update docker --- Dockerfile | 1 - docker-compose.yml | 5 ++--- vendor/Auto-GPT | 2 +- vendor/basic_agent | 2 +- 4 files changed, 4 insertions(+), 6 deletions(-) diff --git a/Dockerfile b/Dockerfile index 4545601..fb14cd5 100644 --- a/Dockerfile +++ b/Dockerfile @@ -31,7 +31,6 @@ ENV PATH="$VIRTUAL_ENVIRONMENT_PATH/bin:$PATH" WORKDIR ${PYTHONPATH} # https://python-poetry.org/docs/configuration/#cache-directory -RUN mkdir ${POETRY_CACHE_DIR} WORKDIR /opt/ai-ticket COPY pyproject.toml /opt/ai-ticket/ diff --git a/docker-compose.yml b/docker-compose.yml index 1237dd2..0bd5512 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -17,11 +17,10 @@ services: ai_ticket: # the ticket to unite image: h4ckermike/ai_ticket - build: - + build: context: . args: - BASE_IMAGE: act_base + BASE_IMAGE: poetry_base depends_on: - poetry_base diff --git a/vendor/Auto-GPT b/vendor/Auto-GPT index eae1f02..fe2d238 160000 --- a/vendor/Auto-GPT +++ b/vendor/Auto-GPT @@ -1 +1 @@ -Subproject commit eae1f0209f8d3ab9c9c9839e50b53f11e7ae5d8f +Subproject commit fe2d2384e3024177241afd920e63e86af9bb6248 diff --git a/vendor/basic_agent b/vendor/basic_agent index 43cd887..ab60de9 160000 --- a/vendor/basic_agent +++ b/vendor/basic_agent @@ -1 +1 @@ -Subproject commit 43cd887eeca0b7b473d5553db9492976bd9e8f5a +Subproject commit ab60de9662af21bb534ea946869c0c2ddb105e84 From 51b2d1355599d14db20bfcbd8b8dc4fad3225d59 Mon Sep 17 00:00:00 2001 From: mike dupont Date: Tue, 3 Oct 2023 19:29:20 -0400 Subject: [PATCH 21/27] update --- vendor/Auto-GPT | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/Auto-GPT b/vendor/Auto-GPT index fe2d238..7b4bee7 160000 --- a/vendor/Auto-GPT +++ b/vendor/Auto-GPT @@ -1 +1 @@ -Subproject commit fe2d2384e3024177241afd920e63e86af9bb6248 +Subproject commit 7b4bee7c0a1a9bcda12ecdeca9ca496e287e67c4 From bfb304b8fc7ef90111d9a5b5d0419659924e489a Mon Sep 17 00:00:00 2001 From: mike dupont Date: Wed, 4 Oct 2023 08:34:20 -0400 Subject: [PATCH 22/27] update --- poetry.lock | 301 ++++++++++++++++++++++++++++++++++++++++-------- pyproject.toml | 6 +- vendor/Auto-GPT | 2 +- 3 files changed, 258 insertions(+), 51 deletions(-) diff --git a/poetry.lock b/poetry.lock index eb69fc3..d0b0a09 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,10 +1,9 @@ -# This file is automatically @generated by Poetry and should not be changed by hand. +# This file is automatically @generated by Poetry 1.6.1 and should not be changed by hand. [[package]] name = "astroid" version = "2.15.8" description = "An abstract syntax tree for Python with inference support." -category = "dev" optional = false python-versions = ">=3.7.2" files = [ @@ -15,13 +14,15 @@ files = [ [package.dependencies] lazy-object-proxy = ">=1.4.0" typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.11\""} -wrapt = {version = ">=1.11,<2", markers = "python_version < \"3.11\""} +wrapt = [ + {version = ">=1.11,<2", markers = "python_version < \"3.11\""}, + {version = ">=1.14,<2", markers = "python_version >= \"3.11\""}, +] [[package]] name = "black" version = "23.7.0" description = "The uncompromising code formatter." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -67,7 +68,6 @@ uvloop = ["uvloop (>=0.15.2)"] name = "certifi" version = "2023.7.22" description = "Python package for providing Mozilla's CA Bundle." -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -75,11 +75,74 @@ files = [ {file = "certifi-2023.7.22.tar.gz", hash = "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082"}, ] +[[package]] +name = "cffi" +version = "1.16.0" +description = "Foreign Function Interface for Python calling C code." +optional = false +python-versions = ">=3.8" +files = [ + {file = "cffi-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088"}, + {file = "cffi-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d"}, + {file = "cffi-1.16.0-cp310-cp310-win32.whl", hash = "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a"}, + {file = "cffi-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb"}, + {file = "cffi-1.16.0-cp311-cp311-win32.whl", hash = "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab"}, + {file = "cffi-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969"}, + {file = "cffi-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520"}, + {file = "cffi-1.16.0-cp312-cp312-win32.whl", hash = "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b"}, + {file = "cffi-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235"}, + {file = "cffi-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324"}, + {file = "cffi-1.16.0-cp38-cp38-win32.whl", hash = "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a"}, + {file = "cffi-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe"}, + {file = "cffi-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4"}, + {file = "cffi-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8"}, + {file = "cffi-1.16.0.tar.gz", hash = "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0"}, +] + +[package.dependencies] +pycparser = "*" + [[package]] name = "cfgv" version = "3.4.0" description = "Validate configuration and produce human readable error messages." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -91,7 +154,6 @@ files = [ name = "charset-normalizer" version = "3.3.0" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -category = "main" optional = false python-versions = ">=3.7.0" files = [ @@ -191,7 +253,6 @@ files = [ name = "click" version = "8.1.7" description = "Composable command line interface toolkit" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -206,7 +267,6 @@ colorama = {version = "*", markers = "platform_system == \"Windows\""} name = "colorama" version = "0.4.6" description = "Cross-platform colored terminal text." -category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" files = [ @@ -218,7 +278,6 @@ files = [ name = "coverage" version = "7.3.1" description = "Code coverage measurement for Python" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -282,11 +341,72 @@ tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.1 [package.extras] toml = ["tomli"] +[[package]] +name = "cryptography" +version = "41.0.4" +description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." +optional = false +python-versions = ">=3.7" +files = [ + {file = "cryptography-41.0.4-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:80907d3faa55dc5434a16579952ac6da800935cd98d14dbd62f6f042c7f5e839"}, + {file = "cryptography-41.0.4-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:35c00f637cd0b9d5b6c6bd11b6c3359194a8eba9c46d4e875a3660e3b400005f"}, + {file = "cryptography-41.0.4-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cecfefa17042941f94ab54f769c8ce0fe14beff2694e9ac684176a2535bf9714"}, + {file = "cryptography-41.0.4-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e40211b4923ba5a6dc9769eab704bdb3fbb58d56c5b336d30996c24fcf12aadb"}, + {file = "cryptography-41.0.4-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:23a25c09dfd0d9f28da2352503b23e086f8e78096b9fd585d1d14eca01613e13"}, + {file = "cryptography-41.0.4-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:2ed09183922d66c4ec5fdaa59b4d14e105c084dd0febd27452de8f6f74704143"}, + {file = "cryptography-41.0.4-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:5a0f09cefded00e648a127048119f77bc2b2ec61e736660b5789e638f43cc397"}, + {file = "cryptography-41.0.4-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:9eeb77214afae972a00dee47382d2591abe77bdae166bda672fb1e24702a3860"}, + {file = "cryptography-41.0.4-cp37-abi3-win32.whl", hash = "sha256:3b224890962a2d7b57cf5eeb16ccaafba6083f7b811829f00476309bce2fe0fd"}, + {file = "cryptography-41.0.4-cp37-abi3-win_amd64.whl", hash = "sha256:c880eba5175f4307129784eca96f4e70b88e57aa3f680aeba3bab0e980b0f37d"}, + {file = "cryptography-41.0.4-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:004b6ccc95943f6a9ad3142cfabcc769d7ee38a3f60fb0dddbfb431f818c3a67"}, + {file = "cryptography-41.0.4-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:86defa8d248c3fa029da68ce61fe735432b047e32179883bdb1e79ed9bb8195e"}, + {file = "cryptography-41.0.4-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:37480760ae08065437e6573d14be973112c9e6dcaf5f11d00147ee74f37a3829"}, + {file = "cryptography-41.0.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:b5f4dfe950ff0479f1f00eda09c18798d4f49b98f4e2006d644b3301682ebdca"}, + {file = "cryptography-41.0.4-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:7e53db173370dea832190870e975a1e09c86a879b613948f09eb49324218c14d"}, + {file = "cryptography-41.0.4-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:5b72205a360f3b6176485a333256b9bcd48700fc755fef51c8e7e67c4b63e3ac"}, + {file = "cryptography-41.0.4-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:93530900d14c37a46ce3d6c9e6fd35dbe5f5601bf6b3a5c325c7bffc030344d9"}, + {file = "cryptography-41.0.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:efc8ad4e6fc4f1752ebfb58aefece8b4e3c4cae940b0994d43649bdfce8d0d4f"}, + {file = "cryptography-41.0.4-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c3391bd8e6de35f6f1140e50aaeb3e2b3d6a9012536ca23ab0d9c35ec18c8a91"}, + {file = "cryptography-41.0.4-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:0d9409894f495d465fe6fda92cb70e8323e9648af912d5b9141d616df40a87b8"}, + {file = "cryptography-41.0.4-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:8ac4f9ead4bbd0bc8ab2d318f97d85147167a488be0e08814a37eb2f439d5cf6"}, + {file = "cryptography-41.0.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:047c4603aeb4bbd8db2756e38f5b8bd7e94318c047cfe4efeb5d715e08b49311"}, + {file = "cryptography-41.0.4.tar.gz", hash = "sha256:7febc3094125fc126a7f6fb1f420d0da639f3f32cb15c8ff0dc3997c4549f51a"}, +] + +[package.dependencies] +cffi = ">=1.12" + +[package.extras] +docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"] +docstest = ["pyenchant (>=1.6.11)", "sphinxcontrib-spelling (>=4.0.1)", "twine (>=1.12.0)"] +nox = ["nox"] +pep8test = ["black", "check-sdist", "mypy", "ruff"] +sdist = ["build"] +ssh = ["bcrypt (>=3.1.5)"] +test = ["pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] +test-randomorder = ["pytest-randomly"] + +[[package]] +name = "deprecated" +version = "1.2.14" +description = "Python @deprecated decorator to deprecate old python classes, functions or methods." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "Deprecated-1.2.14-py2.py3-none-any.whl", hash = "sha256:6fac8b097794a90302bdbb17b9b815e732d3c4720583ff1b198499d78470466c"}, + {file = "Deprecated-1.2.14.tar.gz", hash = "sha256:e5323eb936458dccc2582dc6f9c322c852a775a27065ff2b0c4970b9d53d01b3"}, +] + +[package.dependencies] +wrapt = ">=1.10,<2" + +[package.extras] +dev = ["PyTest", "PyTest-Cov", "bump2version (<1)", "sphinx (<2)", "tox"] + [[package]] name = "deprecation" version = "2.1.0" description = "A library to handle automated deprecations" -category = "dev" optional = false python-versions = "*" files = [ @@ -301,7 +421,6 @@ packaging = "*" name = "dill" version = "0.3.7" description = "serialize all of Python" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -316,7 +435,6 @@ graph = ["objgraph (>=1.7.2)"] name = "distlib" version = "0.3.7" description = "Distribution utilities" -category = "dev" optional = false python-versions = "*" files = [ @@ -328,7 +446,6 @@ files = [ name = "docker" version = "6.1.3" description = "A Python library for the Docker Engine API." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -350,7 +467,6 @@ ssh = ["paramiko (>=2.4.3)"] name = "exceptiongroup" version = "1.1.3" description = "Backport of PEP 654 (exception groups)" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -365,7 +481,6 @@ test = ["pytest (>=6)"] name = "filelock" version = "3.12.4" description = "A platform independent file lock." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -382,7 +497,6 @@ typing = ["typing-extensions (>=4.7.1)"] name = "identify" version = "2.5.30" description = "File identification library for Python" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -397,7 +511,6 @@ license = ["ukkonen"] name = "idna" version = "3.4" description = "Internationalized Domain Names in Applications (IDNA)" -category = "main" optional = false python-versions = ">=3.5" files = [ @@ -409,7 +522,6 @@ files = [ name = "iniconfig" version = "2.0.0" description = "brain-dead simple config-ini parsing" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -421,7 +533,6 @@ files = [ name = "isort" version = "5.12.0" description = "A Python utility / library to sort Python imports." -category = "dev" optional = false python-versions = ">=3.8.0" files = [ @@ -439,7 +550,6 @@ requirements-deprecated-finder = ["pip-api", "pipreqs"] name = "lazy-object-proxy" version = "1.9.0" description = "A fast and thorough lazy object proxy." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -485,7 +595,6 @@ files = [ name = "mccabe" version = "0.7.0" description = "McCabe checker, plugin for flake8" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -497,7 +606,6 @@ files = [ name = "mypy-extensions" version = "1.0.0" description = "Type system extensions for programs checked with the mypy type checker." -category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -509,7 +617,6 @@ files = [ name = "nodeenv" version = "1.8.0" description = "Node.js virtual environment builder" -category = "dev" optional = false python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*" files = [ @@ -524,7 +631,6 @@ setuptools = "*" name = "packaging" version = "23.2" description = "Core utilities for Python packages" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -536,7 +642,6 @@ files = [ name = "pathspec" version = "0.11.2" description = "Utility library for gitignore style pattern matching of file paths." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -548,7 +653,6 @@ files = [ name = "platformdirs" version = "3.10.0" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -564,7 +668,6 @@ test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-co name = "pluggy" version = "1.3.0" description = "plugin and hook calling mechanisms for python" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -580,7 +683,6 @@ testing = ["pytest", "pytest-benchmark"] name = "pre-commit" version = "3.3.3" description = "A framework for managing and maintaining multi-language pre-commit hooks." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -595,11 +697,61 @@ nodeenv = ">=0.11.1" pyyaml = ">=5.1" virtualenv = ">=20.10.0" +[[package]] +name = "pycparser" +version = "2.21" +description = "C parser in Python" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, + {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, +] + +[[package]] +name = "pygithub" +version = "2.1.1" +description = "Use the full Github API v3" +optional = false +python-versions = ">=3.7" +files = [ + {file = "PyGithub-2.1.1-py3-none-any.whl", hash = "sha256:4b528d5d6f35e991ea5fd3f942f58748f24938805cb7fcf24486546637917337"}, + {file = "PyGithub-2.1.1.tar.gz", hash = "sha256:ecf12c2809c44147bce63b047b3d2e9dac8a41b63e90fcb263c703f64936b97c"}, +] + +[package.dependencies] +Deprecated = "*" +pyjwt = {version = ">=2.4.0", extras = ["crypto"]} +pynacl = ">=1.4.0" +python-dateutil = "*" +requests = ">=2.14.0" +typing-extensions = ">=4.0.0" +urllib3 = ">=1.26.0" + +[[package]] +name = "pyjwt" +version = "2.8.0" +description = "JSON Web Token implementation in Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "PyJWT-2.8.0-py3-none-any.whl", hash = "sha256:59127c392cc44c2da5bb3192169a91f429924e17aff6534d70fdc02ab3e04320"}, + {file = "PyJWT-2.8.0.tar.gz", hash = "sha256:57e28d156e3d5c10088e0c68abb90bfac3df82b40a71bd0daa20c65ccd5c23de"}, +] + +[package.dependencies] +cryptography = {version = ">=3.4.0", optional = true, markers = "extra == \"crypto\""} + +[package.extras] +crypto = ["cryptography (>=3.4.0)"] +dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pytest (>=6.0.0,<7.0.0)", "sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] +docs = ["sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] +tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] + [[package]] name = "pylint" version = "2.17.5" description = "python code static checker" -category = "dev" optional = false python-versions = ">=3.7.2" files = [ @@ -610,7 +762,10 @@ files = [ [package.dependencies] astroid = ">=2.15.6,<=2.17.0-dev0" colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} -dill = {version = ">=0.2", markers = "python_version < \"3.11\""} +dill = [ + {version = ">=0.2", markers = "python_version < \"3.11\""}, + {version = ">=0.3.6", markers = "python_version >= \"3.11\""}, +] isort = ">=4.2.5,<6" mccabe = ">=0.6,<0.8" platformdirs = ">=2.2.0" @@ -621,11 +776,36 @@ tomlkit = ">=0.10.1" spelling = ["pyenchant (>=3.2,<4.0)"] testutils = ["gitpython (>3)"] +[[package]] +name = "pynacl" +version = "1.5.0" +description = "Python binding to the Networking and Cryptography (NaCl) library" +optional = false +python-versions = ">=3.6" +files = [ + {file = "PyNaCl-1.5.0-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:401002a4aaa07c9414132aaed7f6836ff98f59277a234704ff66878c2ee4a0d1"}, + {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:52cb72a79269189d4e0dc537556f4740f7f0a9ec41c1322598799b0bdad4ef92"}, + {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a36d4a9dda1f19ce6e03c9a784a2921a4b726b02e1c736600ca9c22029474394"}, + {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:0c84947a22519e013607c9be43706dd42513f9e6ae5d39d3613ca1e142fba44d"}, + {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06b8f6fa7f5de8d5d2f7573fe8c863c051225a27b61e6860fd047b1775807858"}, + {file = "PyNaCl-1.5.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:a422368fc821589c228f4c49438a368831cb5bbc0eab5ebe1d7fac9dded6567b"}, + {file = "PyNaCl-1.5.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:61f642bf2378713e2c2e1de73444a3778e5f0a38be6fee0fe532fe30060282ff"}, + {file = "PyNaCl-1.5.0-cp36-abi3-win32.whl", hash = "sha256:e46dae94e34b085175f8abb3b0aaa7da40767865ac82c928eeb9e57e1ea8a543"}, + {file = "PyNaCl-1.5.0-cp36-abi3-win_amd64.whl", hash = "sha256:20f42270d27e1b6a29f54032090b972d97f0a1b0948cc52392041ef7831fee93"}, + {file = "PyNaCl-1.5.0.tar.gz", hash = "sha256:8ac7448f09ab85811607bdd21ec2464495ac8b7c66d146bf545b0f08fb9220ba"}, +] + +[package.dependencies] +cffi = ">=1.4.1" + +[package.extras] +docs = ["sphinx (>=1.6.5)", "sphinx-rtd-theme"] +tests = ["hypothesis (>=3.27.0)", "pytest (>=3.2.1,!=3.3.0)"] + [[package]] name = "pytest" version = "7.4.0" description = "pytest: simple powerful testing with Python" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -648,7 +828,6 @@ testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "no name = "pytest-cov" version = "4.1.0" description = "Pytest plugin for measuring coverage." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -663,11 +842,38 @@ pytest = ">=4.6" [package.extras] testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtualenv"] +[[package]] +name = "python-dateutil" +version = "2.8.2" +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.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, + {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, +] + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "python-dotenv" +version = "1.0.0" +description = "Read key-value pairs from a .env file and set them as environment variables" +optional = false +python-versions = ">=3.8" +files = [ + {file = "python-dotenv-1.0.0.tar.gz", hash = "sha256:a8df96034aae6d2d50a4ebe8216326c61c3eb64836776504fcca410e5937a3ba"}, + {file = "python_dotenv-1.0.0-py3-none-any.whl", hash = "sha256:f5971a9226b701070a4bf2c38c89e5a3f0d64de8debda981d1db98583009122a"}, +] + +[package.extras] +cli = ["click (>=5.0)"] + [[package]] name = "pywin32" version = "306" description = "Python for Window Extensions" -category = "main" optional = false python-versions = "*" files = [ @@ -691,7 +897,6 @@ files = [ name = "pyyaml" version = "6.0.1" description = "YAML parser and emitter for Python" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -751,7 +956,6 @@ files = [ name = "requests" version = "2.31.0" description = "Python HTTP for Humans." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -773,7 +977,6 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] name = "semver" version = "3.0.1" description = "Python helper for Semantic Versioning (https://semver.org)" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -785,7 +988,6 @@ files = [ name = "setuptools" version = "68.2.2" description = "Easily download, build, install, upgrade, and uninstall Python packages" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -798,11 +1000,21 @@ docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments 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 = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] + [[package]] name = "testcontainers" version = "3.7.1" description = "Library provides lightweight, throwaway instances of common databases, Selenium web browsers, or anything else that can run in a Docker container" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -836,7 +1048,6 @@ selenium = ["selenium"] name = "tomli" version = "2.0.1" description = "A lil' TOML parser" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -848,7 +1059,6 @@ files = [ name = "tomlkit" version = "0.12.1" description = "Style preserving TOML library" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -860,7 +1070,6 @@ files = [ name = "typing-extensions" version = "4.8.0" description = "Backported and Experimental Type Hints for Python 3.8+" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -872,7 +1081,6 @@ files = [ name = "urllib3" version = "2.0.5" description = "HTTP library with thread-safe connection pooling, file post, and more." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -890,7 +1098,6 @@ zstd = ["zstandard (>=0.18.0)"] name = "virtualenv" version = "20.24.5" description = "Virtual Python Environment builder" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -911,7 +1118,6 @@ test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess name = "websocket-client" version = "1.6.3" description = "WebSocket client for Python with low level API options" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -928,7 +1134,6 @@ test = ["websockets"] name = "wrapt" version = "1.15.0" description = "Module for decorators, wrappers and monkey patching." -category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" files = [ @@ -1011,5 +1216,5 @@ files = [ [metadata] lock-version = "2.0" -python-versions = "3.10.*" -content-hash = "1332d545214a8b36c15b7497a604dd3cc91af759f5c3b738e06706acd35840a5" +python-versions = ">=3.10" +content-hash = "58fc8736b8fa1de792b2681d6a824e8fc1f5e11eb6ccc02b806aff54d06ba8b0" diff --git a/pyproject.toml b/pyproject.toml index 2158d50..cfd7c0c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,5 +1,5 @@ [build-system] -#python = "^3.11" + requires = [ "setuptools>=42", "wheel", @@ -40,9 +40,11 @@ classifiers = [ # [tool.poetry.scripts] # [tool.poetry.dependencies] [tool.poetry.dependencies] -#python = "3.11.4" +python = ">=3.10" click = "8.1.7" docker = "6.1.3" +pygithub = "^2.1.1" +python-dotenv = "^1.0.0" [tool.poetry.group.dev.dependencies] python = "^3.7" diff --git a/vendor/Auto-GPT b/vendor/Auto-GPT index 7b4bee7..5485d85 160000 --- a/vendor/Auto-GPT +++ b/vendor/Auto-GPT @@ -1 +1 @@ -Subproject commit 7b4bee7c0a1a9bcda12ecdeca9ca496e287e67c4 +Subproject commit 5485d855ab6acafb9fca2e7fbfbc7b8c97074478 From 7292f60ed1345645130f253c26ae966a3bd85be8 Mon Sep 17 00:00:00 2001 From: mike dupont Date: Wed, 4 Oct 2023 08:39:36 -0400 Subject: [PATCH 23/27] autogpt --- vendor/Auto-GPT | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/Auto-GPT b/vendor/Auto-GPT index 5485d85..89fa801 160000 --- a/vendor/Auto-GPT +++ b/vendor/Auto-GPT @@ -1 +1 @@ -Subproject commit 5485d855ab6acafb9fca2e7fbfbc7b8c97074478 +Subproject commit 89fa801cf99a791f8a7c9f43555bbfd253a068b6 From bf31cf6239bfc5dae180ea8a5d1e899c4d880634 Mon Sep 17 00:00:00 2001 From: mike dupont Date: Wed, 4 Oct 2023 09:12:40 -0400 Subject: [PATCH 24/27] autogpt --- vendor/Auto-GPT | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/Auto-GPT b/vendor/Auto-GPT index 89fa801..5ed044e 160000 --- a/vendor/Auto-GPT +++ b/vendor/Auto-GPT @@ -1 +1 @@ -Subproject commit 89fa801cf99a791f8a7c9f43555bbfd253a068b6 +Subproject commit 5ed044eddd1469940c62dbfce388100c0289e033 From 3ada4cc7c4d71338ede8fbd18434e19535f80547 Mon Sep 17 00:00:00 2001 From: mike dupont Date: Wed, 4 Oct 2023 13:07:16 -0400 Subject: [PATCH 25/27] update --- .gitmodules | 3 +++ docker-compose.yml | 9 +++++++++ vendor/docker-compose-viz | 1 + 3 files changed, 13 insertions(+) create mode 160000 vendor/docker-compose-viz diff --git a/.gitmodules b/.gitmodules index 40db044..ee0b28d 100644 --- a/.gitmodules +++ b/.gitmodules @@ -22,3 +22,6 @@ [submodule "vendor/basic_agent"] path = vendor/basic_agent url = https://github.com/meta-introspector/basic_agent +[submodule "vendor/docker-compose-viz"] + path = vendor/docker-compose-viz + url = https://github.com/meta-introspector/docker-compose-viz diff --git a/docker-compose.yml b/docker-compose.yml index 0bd5512..16f0ace 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -73,3 +73,12 @@ services: depends_on: - basic_agent - mockopenai + viz: # + build: vendor/docker-compose-viz + image: h4ckermike/docker-compose-viz + + volumes: + - ./output/:/output/:rw + - ./docker-compose.yml:/input/docker-compose.yml + + command: render -m image /input/docker-compose.yml -vvv --ansi -o /input/docker-compose.png --force diff --git a/vendor/docker-compose-viz b/vendor/docker-compose-viz new file mode 160000 index 0000000..e1dfdc6 --- /dev/null +++ b/vendor/docker-compose-viz @@ -0,0 +1 @@ +Subproject commit e1dfdc65f26776952316bcefe68a50998778f8a6 From eea9958c4337c2407eb96c2b0fd4fdbe34e29cc1 Mon Sep 17 00:00:00 2001 From: mike dupont Date: Wed, 4 Oct 2023 13:25:10 -0400 Subject: [PATCH 26/27] git commit-a --- docker-compose.png | Bin 0 -> 29546 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 docker-compose.png diff --git a/docker-compose.png b/docker-compose.png new file mode 100644 index 0000000000000000000000000000000000000000..665f5062a800327d46a3c35d5c62c1e0bd2e45e5 GIT binary patch literal 29546 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 mlizl0j9__4l4ZbKg Date: Wed, 4 Oct 2023 13:25:13 -0400 Subject: [PATCH 27/27] git commit --- docker-compose.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 16f0ace..6594462 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -78,7 +78,7 @@ services: image: h4ckermike/docker-compose-viz volumes: - - ./output/:/output/:rw - - ./docker-compose.yml:/input/docker-compose.yml + - .:/input:rw +# - ./docker-compose.yml:/input/docker-compose.yml command: render -m image /input/docker-compose.yml -vvv --ansi -o /input/docker-compose.png --force