From 897691baff0fc7ffceb29e23c8d9e27051299dc5 Mon Sep 17 00:00:00 2001 From: konstantinos Date: Sat, 11 Nov 2023 11:39:17 +0200 Subject: [PATCH 01/39] ci(docker): run Docker Job from reusable workflow emphemeral: shutdown some job s to test CI ci(docker): pass DOCKER_USER to Docker Job, from output of preparatory Job emphemeral: turn OFF Test, expect NO Docker emphemeral: set Pol to 11, expect RUN Docker emphemeral: turn OFF Docker, expect NO Docker fix ci emphemeral: turn OFF Docker, expect NO Docker emphemeral: set Pol to 10, expect NO Docker emphemeral: FORCE Docker, expect RUN Docker emphemeral: turn ON Test, expect RUN Docker fix ci emphemeral: turn OFF Test, expect NO Docker emphemeral: FORCE Docker, expect RUN Docker emphemeral: set state 0011, expect RUN Docker emphemeral: set state 0000, expect NO Docker emphemeral: set state 0011, expect RUN Docker emphemeral: set state 1110, expect RUN Docker wip: ci debug policy wip: turn off CI tests wip: debug CI Docker wip: set Pol to 11 and debug CI Docker wip: try diff syntax wip: try diff syntax 1 wip: try diff syntax 2 wip: try diff syntax 3 wip: remove debug code ci(docker): add 'always()' in the 'if' key of Docker Caller Job wip: turn OFF Docker, expect NO Docker wip: test 0010, expect NO Docker wip: test 0001, expect YES Docker wip: test 1110, expect YES Docker wip: empemerally deactivate codecov wire Job result to Docker Job Input Signals --- .github/workflows/test.yaml | 341 +++++++++++++----------------------- 1 file changed, 125 insertions(+), 216 deletions(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index dc0a1db..4ce0266 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -32,21 +32,22 @@ env: ##### Pipeline Settings #### + ### JOB ON/OFF SWITCHES ### # On/Off switches for the various CI/CD steps # If false the step prevented from running # If true the step is allowed to run (it still may be skipped on other runtime conditions) RUN_UNIT_TESTS: "true" - RUN_LINT_CHECKS: "true" - PUBLISH_ON_PYPI: "true" - DRAW_DEPENDENCIES: "true" + RUN_LINT_CHECKS: "false" + PUBLISH_ON_PYPI: "false" + DRAW_DEPENDENCIES: "false" PREVENT_CODECOV_TEST_COVERAGE: "false" # Codecov Job runs only on 'false' # Hard switch to turn on/off the Docker build and publish to Dockerhub DOCKER_JOB_ON: "true" - + ### END JOB ON/OFF SWITCHES ### #### Behaviour - Docker build and Publich #### - + # Override policy-dependent decision-making and # Accept any ALL (branch/build) to Publish to Dockerhub ALWAYS_BUILD_N_PUBLSIH_DOCKER: "false" @@ -61,53 +62,6 @@ env: ## CDelivery : Builds and Publishes if Tests Passed or if Tests were Skipped # DOCKER_JOB_POLICY: "CDelivery" - - ## Lower level config ## - - # 2 bit state machine - # 0 0 pure CI/CD mode, aka Admit if Pass, Require Pass, guarantee quality - # 0 1 Always build and publish, aka Admit All - # 1 0 CI/CD with Bypass Opt, aka Admit Tested and when Test is OFF, Admit when Test OFF - # 1 1 Never build and publish, aka No Admitance, guarantee NO Dockerhub publish - - # alternative 2 bits representations: - # 1. Accept all for Docker 1/0 (1bit), Mode (CICD, or CICD + allow if test OFF) (1bit) - # 2. No Docker Bypass 0/1 (1 bit), Accept all 0/1 (1 bit). - - # Define the Policy that our Job uses to decide whether to run the Docker build and publish to Dockerhub - - # Pol 1: Run Docker build and publish to Dockerhub only if Tests passed (and ran!) - # aka: Continous Integration / Continuous Deployment - # aka: guranteed quality, everything published is tested - # aka: 'required succesful evaluation', 'accept only a Pass' - - # accepted criteria (any of which suffices): [PASS] - # if Docker Job is - - # DOCKER_JOB_POLICY: "CI_CD" - - # Pol 2: Always run Docker build and publish to Dockerhub - # aka 'Free Admitance', 'No Entry Barrier', 'Free Entrance' - - # DOCKER_JOB_POLICY: "ALWAYS_RUN" - - # Pol 3: Run Docker build and publish to Dockerhub, if Tests ran and passed, but also if Tests were skipped - # aka: Continous Integration / Continuous Delivery - # aka: 'accepted_when_Test_OFF', 'accept a Pass or a Skip' - # aka: - - # accepted criteria (any of which suffices): [PASS, TESTS_SKIPPED] - - # DOCKER_JOB_POLICY: "RUN_ON_TEST_PASS_OR_SKIP" - - # WIP Pol 4: Never run Docker build and publish to Dockerhub - # aka: garantee that nothing is published - # aka: 'Shutdown', 'No Admitance' - - # DOCKER_JOB_POLICY: "NEVER_RUN" - - #### End Behaviour #### - ##### END Pipeline Settings ###### @@ -299,10 +253,10 @@ jobs: echo "SEMVER_PIP_FORMAT=$WHEEL_VERSION" >> $GITHUB_OUTPUT # to be used in other jobs ## TEST SUITE: By Default executes only unit-tests (ie no integration, or network-dependent tests) - - name: Run Unit Tests - run: tox -vv -s false - env: - PLATFORM: ${{ matrix.platform }} + # - name: Run Unit Tests + # run: tox -vv -s false + # env: + # PLATFORM: ${{ matrix.platform }} # if sdist tests ran, then we expect file to ahve been created # .tox/${DIST_DIR}/cookiecutter_python-${PKG_VERSION}.tar.gz @@ -315,71 +269,71 @@ jobs: # no compiled code # .tox/${DIST_DIR}/cookiecutter_python-${PKG_VERSION}-py3-none-any.whl - - name: "Aggregate Code Coverage & make XML Reports" - id: produce_coverage_xml_file - env: - # just "destructure" (aka extract) needed values from the matrix, to use in step code - PLATFORM: ${{ matrix.platform }} - PY_VERSION: ${{ matrix.python-version }} - run: | - tox -e coverage --sitepackages -vv -s false + # - name: "Aggregate Code Coverage & make XML Reports" + # id: produce_coverage_xml_file + # env: + # # just "destructure" (aka extract) needed values from the matrix, to use in step code + # PLATFORM: ${{ matrix.platform }} + # PY_VERSION: ${{ matrix.python-version }} + # run: | + # tox -e coverage --sitepackages -vv -s false - RUNNER_COVERAGE_XML_FILE_PATH="coverage-${PLATFORM}-${PY_VERSION}.xml" - - mv ./.tox/coverage.xml "${RUNNER_COVERAGE_XML_FILE_PATH}" - - # leverages ./scripts/post-tests-run.sh which returns the path of the XML Aggregated Coverage DataXML Filecoverage report - # chmod +x ./scripts/post-tests-run.sh - # RUNNER_COVERAGE_XML_FILE_PATH=$(./scripts/post-tests-run.sh "${PLATFORM}-${PY_VERSION}") - - echo "CI_COVERAGE_XML=$RUNNER_COVERAGE_XML_FILE_PATH" >> $GITHUB_OUTPUT - echo "CI_COVERAGE_XML_THIS=$RUNNER_COVERAGE_XML_FILE_PATH" >> $GITHUB_ENV - - - name: "Upload Test Coverage as Artifacts" - uses: actions/upload-artifact@v3 - with: - name: all_coverage_raw - path: ${{ env.CI_COVERAGE_XML_THIS }} - # steps.produce_coverage_xml_file.outputs.retval - # path: coverage-${{ matrix.platform }}-${{ matrix.python-version }}.xml - if-no-files-found: error - - - name: Check for compliance with Python Best Practices - shell: bash - run: | - DIST_DIR=dist - echo "DIST_DIR=dist" >> $GITHUB_ENV # can be uesd in a with body of a next step in the Job, as eg: path: ${{ env.DIST_DIR }} - mkdir ${DIST_DIR} + # RUNNER_COVERAGE_XML_FILE_PATH="coverage-${PLATFORM}-${PY_VERSION}.xml" + + # mv ./.tox/coverage.xml "${RUNNER_COVERAGE_XML_FILE_PATH}" + + # # leverages ./scripts/post-tests-run.sh which returns the path of the XML Aggregated Coverage DataXML Filecoverage report + # # chmod +x ./scripts/post-tests-run.sh + # # RUNNER_COVERAGE_XML_FILE_PATH=$(./scripts/post-tests-run.sh "${PLATFORM}-${PY_VERSION}") + + # echo "CI_COVERAGE_XML=$RUNNER_COVERAGE_XML_FILE_PATH" >> $GITHUB_OUTPUT + # echo "CI_COVERAGE_XML_THIS=$RUNNER_COVERAGE_XML_FILE_PATH" >> $GITHUB_ENV + + # - name: "Upload Test Coverage as Artifacts" + # uses: actions/upload-artifact@v3 + # with: + # name: all_coverage_raw + # path: ${{ env.CI_COVERAGE_XML_THIS }} + # # steps.produce_coverage_xml_file.outputs.retval + # # path: coverage-${{ matrix.platform }}-${{ matrix.python-version }}.xml + # if-no-files-found: error + + # - name: Check for compliance with Python Best Practices + # shell: bash + # run: | + # DIST_DIR=dist + # echo "DIST_DIR=dist" >> $GITHUB_ENV # can be uesd in a with body of a next step in the Job, as eg: path: ${{ env.DIST_DIR }} + # mkdir ${DIST_DIR} - TOXENV_DIST_DIR=".tox/${DIST_DIR}" + # TOXENV_DIST_DIR=".tox/${DIST_DIR}" - # Sanity check of files inside - echo "[DEBUG] ls -la ${TOXENV_DIST_DIR}" - ls -la ${TOXENV_DIST_DIR} + # # Sanity check of files inside + # echo "[DEBUG] ls -la ${TOXENV_DIST_DIR}" + # ls -la ${TOXENV_DIST_DIR} - # Sanity check that among all files there onle one tar.gz and one .whl - # if not, Fail Job (aka exit with 1) + # # Sanity check that among all files there onle one tar.gz and one .whl + # # if not, Fail Job (aka exit with 1) - # if [[ $(find ${TOXENV_DIST_DIR} -type f -name "*.tar.gz" | wc -l) -ne 1 ]]; then - # echo "ERROR: Expected to find 1 tar.gz file in ${TOXENV_DIST_DIR}, but found $(find ${TOXENV_DIST_DIR} -type f -name "*.tar.gz" | wc -l)" - # exit 1 - # fi - # if [[ $(find ${TOXENV_DIST_DIR} -type f -name "*.whl" | wc -l) -ne 1 ]]; then - # echo "ERROR: Expected to find 1 .whl file in ${TOXENV_DIST_DIR}, but found $(find ${TOXENV_DIST_DIR} -type f -name "*.whl" | wc -l)" - # exit 1 - # fi + # # if [[ $(find ${TOXENV_DIST_DIR} -type f -name "*.tar.gz" | wc -l) -ne 1 ]]; then + # # echo "ERROR: Expected to find 1 tar.gz file in ${TOXENV_DIST_DIR}, but found $(find ${TOXENV_DIST_DIR} -type f -name "*.tar.gz" | wc -l)" + # # exit 1 + # # fi + # # if [[ $(find ${TOXENV_DIST_DIR} -type f -name "*.whl" | wc -l) -ne 1 ]]; then + # # echo "ERROR: Expected to find 1 .whl file in ${TOXENV_DIST_DIR}, but found $(find ${TOXENV_DIST_DIR} -type f -name "*.whl" | wc -l)" + # # exit 1 + # # fi - # REQUIRED existing 'Source Distribution' (SD) aka .tar.gz file, has already been built from source code - # ie previous code/step ran a tox env, such as with cmd `tox -e py38-sdist-linux`, or any `sdist` tox env, - # which runs Unit Tests against the .tar.gz (sdist installation), after building it from source code, + # # REQUIRED existing 'Source Distribution' (SD) aka .tar.gz file, has already been built from source code + # # ie previous code/step ran a tox env, such as with cmd `tox -e py38-sdist-linux`, or any `sdist` tox env, + # # which runs Unit Tests against the .tar.gz (sdist installation), after building it from source code, - # move .tar.gz - mv ".tox/${DIST_DIR}/artificial_artwork-${PKG_VERSION}.tar.gz" "${DIST_DIR}" + # # move .tar.gz + # mv ".tox/${DIST_DIR}/artificial_artwork-${PKG_VERSION}.tar.gz" "${DIST_DIR}" - # move .whl - # mv ".tox/${DIST_DIR}/artificial_artwork-${PKG_VERSION}-py3-none-any.whl" "${DIST_DIR}" + # # move .whl + # # mv ".tox/${DIST_DIR}/artificial_artwork-${PKG_VERSION}-py3-none-any.whl" "${DIST_DIR}" - # tox -e check -vv -s false + # # tox -e check -vv -s false # - name: Install documentation test dependencies # if: ${{ matrix.platform == 'macos-latest' && matrix.python-version != '3.6' }} @@ -388,38 +342,38 @@ jobs: # if: ${{ matrix.platform == 'ubuntu-latest' || matrix.python-version != '3.6' }} # run: tox -e docs --sitepackages -vv -s false - - name: Upload Source & Wheel distributions as Artefacts - uses: actions/upload-artifact@v3 - with: - name: ${{ env.DIST_DIR }}-${{ matrix.platform }}-${{ matrix.python-version }} - path: ${{ env.DIST_DIR }} - if-no-files-found: error + # - name: Upload Source & Wheel distributions as Artefacts + # uses: actions/upload-artifact@v3 + # with: + # name: ${{ env.DIST_DIR }}-${{ matrix.platform }}-${{ matrix.python-version }} + # path: ${{ env.DIST_DIR }} + # if-no-files-found: error ### JOB: UPLOAD COVERAGE REPORTS TO CODECOV ### - codecov_coverage_host: - runs-on: ubuntu-latest - needs: test_suite - if: ${{ needs.set_github_outputs.outputs.PREVENT_CODECOV_TEST_COVERAGE == 'false' }} - steps: - - uses: actions/checkout@v3 - - name: Get Codecov binary - run: | - curl -Os https://uploader.codecov.io/latest/linux/codecov - chmod +x codecov - - name: Download XML Test Coverage Results, from CI Artifacts - uses: actions/download-artifact@v3 - with: - name: all_coverage_raw - - name: Upload Coverage Reports to Codecov - run: | - for file in coverage*.xml; do - OS_NAME=$(echo $file | sed -E "s/coverage-(\w\+)-/\1/") - PY_VERSION=$(echo $file | sed -E "s/coverage-\w\+-(\d\.)\+/\1/") - ./codecov -f $file -e "OS=$OS_NAME,PYTHON=$PY_VERSION" --flags unittests --verbose - echo "Sent to Codecov: $file !" - done + # codecov_coverage_host: + # runs-on: ubuntu-latest + # needs: test_suite + # if: ${{ needs.set_github_outputs.outputs.PREVENT_CODECOV_TEST_COVERAGE == 'false' }} + # steps: + # - uses: actions/checkout@v3 + # - name: Get Codecov binary + # run: | + # curl -Os https://uploader.codecov.io/latest/linux/codecov + # chmod +x codecov + # - name: Download XML Test Coverage Results, from CI Artifacts + # uses: actions/download-artifact@v3 + # with: + # name: all_coverage_raw + # - name: Upload Coverage Reports to Codecov + # run: | + # for file in coverage*.xml; do + # OS_NAME=$(echo $file | sed -E "s/coverage-(\w\+)-/\1/") + # PY_VERSION=$(echo $file | sed -E "s/coverage-\w\+-(\d\.)\+/\1/") + # ./codecov -f $file -e "OS=$OS_NAME,PYTHON=$PY_VERSION" --flags unittests --verbose + # echo "Sent to Codecov: $file !" + # done ## DEPLOY to PYPI: PROD and STAGING @@ -603,85 +557,40 @@ jobs: ## AUTOMATED DOCKER BUILD and PUBLISH ON DOCKERHUB ## - docker_build: + read_docker_settings: runs-on: ubuntu-latest - needs: test_suite - # always() is REQUIRED to implement any run if skipped, thing! - if: always() && (needs.set_github_outputs.outputs.DOCKER_POLICY == '1' || ( - (!contains(needs.test_suite.result, 'failure') && !contains(needs.test_suite.result, 'cancelled') && needs.test_suite.result == 'success') || - (needs.set_github_outputs.outputs.DOCKER_POLICY == '2' && !contains(needs.test_suite.result, 'failure') && needs.test_suite.result == 'skipped') - )) - env: - DOCKER_USER: ${{ secrets.DOCKER_USER }} + outputs: + CASE_POLICY: ${{ steps.derive_docker_policy.outputs.CASE_POLICY }} steps: - - uses: actions/checkout@v3 - - name: Build Docker Image - run: | - echo " DOCKER JOB TRIGGERED " - - # assuming workflow is enabled for branches and v* tags - IMAGE_TAG="${GITHUB_REF_NAME}" # this is branch name or tag name - - # --target prod_install --> Image with NST CLI (no vgg baked in) - PREFIX=cli - - IMAGE_SLUG=neural-style-transfer-${PREFIX} - IMAGE_REF="${DOCKER_USER}/${IMAGE_SLUG}:${IMAGE_TAG}" - - echo " == Image Tag from Git Ref: $IMAGE_TAG == " - echo " == Image Slug: $IMAGE_SLUG == " - echo " == Image Ref: $IMAGE_REF == " - - echo "IMAGE_REF=${IMAGE_REF}" >> $GITHUB_ENV - - docker build --target prod_install -t "${IMAGE_REF}" . - # docker build --target prod_install -t "${DOCKER_USER}/neural-style-transfer:${IMAGE_TAG}" . - - # build an image that does not have vgg model weights - # TODO: add image model weights file in this env somehow - - echo " -- DOCKER BUILD DONE --" - echo " -- IMAGE: ${IMAGE_REF}" - - - name: Login to Dockerhub, public Image Registry - env: - DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} - run: echo "${DOCKER_PASSWORD}" | docker login --username "${DOCKER_USER}" --password-stdin - - - name: Publish to DockerHub; Push Docker Image - run: | - # docker push "${IMAGE_REF}" && job_status=0 || echo "[ERROR] Docker push failed!" && job_status=1 - # echo "job_status=$job_status" >> $GITHUB_ENV - - push_success=1 - - docker push "${IMAGE_REF}" || push_success=0 - - if [ $push_success -eq 1 ]; then - echo "Docker Image "${IMAGE_REF}" pushed to DockerHub!" - else - echo "[ERROR] Docker push failed!" - fi - - echo "push_success=$push_success" >> $GITHUB_ENV - - - name: Logout from Dockerhub - run: docker logout - - - name: Exit Job, with status code 0 if push was successful - run: | - # show success message or exit with non-zero if push Failed - if [ $push_success -eq 1 ]; then - job_status=0 - else - # echo "[ERROR] Docker push failed!" - job_status=1 - fi - echo "Exiting with status code: $job_status" - exit $job_status - - # [ "$job_status" = 0 ] && echo "Docker Image "${IMAGE_REF}" pushed to DockerHub!" || exit $job_status + - run: | + if [[ $DOCKER_JOB_ON == "true" ]]; then + if [[ $ALWAYS_BUILD_N_PUBLSIH_DOCKER == "true" ]]; then + DOCKER_POLICY=1 + elif [[ $DOCKER_JOB_POLICY == "CDeployment" ]]; then + DOCKER_POLICY=2 + elif [[ $DOCKER_JOB_POLICY == "CDelivery" ]]; then + DOCKER_POLICY=3 + fi + else + DOCKER_POLICY=0 + fi + echo "CASE_POLICY=$DOCKER_POLICY" >> $GITHUB_ENV + - run: echo "CASE_POLICY=$CASE_POLICY" >> $GITHUB_OUTPUT + id: derive_docker_policy + docker_build: + needs: [read_docker_settings, test_suite] + uses: boromir674/automated-workflows/.github/workflows/docker.yml@test + if: always() + with: + DOCKER_USER: ${{ vars.DOCKER_USER }} + acceptance_policy: ${{ needs.read_docker_settings.outputs.CASE_POLICY }} + tests_pass: ${{ needs.test_suite.result == 'success' }} + tests_run: ${{ !contains(fromJSON('["skipped", "cancelled"]'), needs.test_suite.result) }} + image_slug: "neural-style-transfer-cli" + target_stage: "prod_install" + secrets: + DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} # STATIC CODE ANALYSIS & LINTING From ae9a74408b94587a2010312a9bf8db959db42c3c Mon Sep 17 00:00:00 2001 From: konstantinos Date: Sun, 12 Nov 2023 19:50:01 +0200 Subject: [PATCH 02/39] ci(pypi): call reusable workflow to handle PyPI Publish Job ci(test): enable wheel building and testing wip: revert pipeline to prod state deactivate doc tests --- .github/workflows/test.yaml | 413 ++++++++++++++++++------------------ tox.ini | 4 +- 2 files changed, 209 insertions(+), 208 deletions(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 4ce0266..a940a86 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -38,12 +38,12 @@ env: # If true the step is allowed to run (it still may be skipped on other runtime conditions) RUN_UNIT_TESTS: "true" RUN_LINT_CHECKS: "false" - PUBLISH_ON_PYPI: "false" + PUBLISH_ON_PYPI: "true" DRAW_DEPENDENCIES: "false" PREVENT_CODECOV_TEST_COVERAGE: "false" # Codecov Job runs only on 'false' # Hard switch to turn on/off the Docker build and publish to Dockerhub - DOCKER_JOB_ON: "true" + DOCKER_JOB_ON: "false" ### END JOB ON/OFF SWITCHES ### #### Behaviour - Docker build and Publich #### @@ -253,15 +253,17 @@ jobs: echo "SEMVER_PIP_FORMAT=$WHEEL_VERSION" >> $GITHUB_OUTPUT # to be used in other jobs ## TEST SUITE: By Default executes only unit-tests (ie no integration, or network-dependent tests) - # - name: Run Unit Tests - # run: tox -vv -s false - # env: - # PLATFORM: ${{ matrix.platform }} - # if sdist tests ran, then we expect file to ahve been created + - name: Run Unit Tests + run: tox -vv -s false + env: + PLATFORM: ${{ matrix.platform }} + # if sdist tests ran, .tar.gz is in: # .tox/${DIST_DIR}/cookiecutter_python-${PKG_VERSION}.tar.gz - # if wheel tests ran, then we expect a file similar to below, to - # have been created. the file depends on the python version + # if wheel tests ran, .whl's are in: + # .tox/${DIST_DIR}/cookiecutter_python-${PKG_VERSION}-py3-none-any.whl + + # wheel file name depends on the python version # compiled (cpu architecture specific code) # the below exaple is what to expect from 'pure python' build ( @@ -269,112 +271,112 @@ jobs: # no compiled code # .tox/${DIST_DIR}/cookiecutter_python-${PKG_VERSION}-py3-none-any.whl - # - name: "Aggregate Code Coverage & make XML Reports" - # id: produce_coverage_xml_file - # env: - # # just "destructure" (aka extract) needed values from the matrix, to use in step code - # PLATFORM: ${{ matrix.platform }} - # PY_VERSION: ${{ matrix.python-version }} - # run: | - # tox -e coverage --sitepackages -vv -s false - - # RUNNER_COVERAGE_XML_FILE_PATH="coverage-${PLATFORM}-${PY_VERSION}.xml" - - # mv ./.tox/coverage.xml "${RUNNER_COVERAGE_XML_FILE_PATH}" - - # # leverages ./scripts/post-tests-run.sh which returns the path of the XML Aggregated Coverage DataXML Filecoverage report - # # chmod +x ./scripts/post-tests-run.sh - # # RUNNER_COVERAGE_XML_FILE_PATH=$(./scripts/post-tests-run.sh "${PLATFORM}-${PY_VERSION}") - - # echo "CI_COVERAGE_XML=$RUNNER_COVERAGE_XML_FILE_PATH" >> $GITHUB_OUTPUT - # echo "CI_COVERAGE_XML_THIS=$RUNNER_COVERAGE_XML_FILE_PATH" >> $GITHUB_ENV - - # - name: "Upload Test Coverage as Artifacts" - # uses: actions/upload-artifact@v3 - # with: - # name: all_coverage_raw - # path: ${{ env.CI_COVERAGE_XML_THIS }} - # # steps.produce_coverage_xml_file.outputs.retval - # # path: coverage-${{ matrix.platform }}-${{ matrix.python-version }}.xml - # if-no-files-found: error - - # - name: Check for compliance with Python Best Practices - # shell: bash - # run: | - # DIST_DIR=dist - # echo "DIST_DIR=dist" >> $GITHUB_ENV # can be uesd in a with body of a next step in the Job, as eg: path: ${{ env.DIST_DIR }} - # mkdir ${DIST_DIR} + - name: "Aggregate Code Coverage & make XML Reports" + id: produce_coverage_xml_file + env: + # just "destructure" (aka extract) needed values from the matrix, to use in step code + PLATFORM: ${{ matrix.platform }} + PY_VERSION: ${{ matrix.python-version }} + run: | + tox -e coverage --sitepackages -vv -s false + + RUNNER_COVERAGE_XML_FILE_PATH="coverage-${PLATFORM}-${PY_VERSION}.xml" + + mv ./.tox/coverage.xml "${RUNNER_COVERAGE_XML_FILE_PATH}" + + # leverages ./scripts/post-tests-run.sh which returns the path of the XML Aggregated Coverage DataXML Filecoverage report + # chmod +x ./scripts/post-tests-run.sh + # RUNNER_COVERAGE_XML_FILE_PATH=$(./scripts/post-tests-run.sh "${PLATFORM}-${PY_VERSION}") + + echo "CI_COVERAGE_XML=$RUNNER_COVERAGE_XML_FILE_PATH" >> $GITHUB_OUTPUT + echo "CI_COVERAGE_XML_THIS=$RUNNER_COVERAGE_XML_FILE_PATH" >> $GITHUB_ENV + + - name: "Upload Test Coverage as Artifacts" + uses: actions/upload-artifact@v3 + with: + name: all_coverage_raw + path: ${{ env.CI_COVERAGE_XML_THIS }} + # steps.produce_coverage_xml_file.outputs.retval + # path: coverage-${{ matrix.platform }}-${{ matrix.python-version }}.xml + if-no-files-found: error + + - name: Check for compliance with Python Best Practices + shell: bash + run: | + DIST_DIR=dist + echo "DIST_DIR=dist" >> $GITHUB_ENV # can be uesd in a with body of a next step in the Job, as eg: path: ${{ env.DIST_DIR }} + mkdir ${DIST_DIR} - # TOXENV_DIST_DIR=".tox/${DIST_DIR}" + TOXENV_DIST_DIR=".tox/${DIST_DIR}" - # # Sanity check of files inside - # echo "[DEBUG] ls -la ${TOXENV_DIST_DIR}" - # ls -la ${TOXENV_DIST_DIR} + # Sanity check of files inside + echo "[DEBUG] ls -la ${TOXENV_DIST_DIR}" + ls -la ${TOXENV_DIST_DIR} - # # Sanity check that among all files there onle one tar.gz and one .whl - # # if not, Fail Job (aka exit with 1) + # Sanity check that among all files there onle one tar.gz and one .whl + # if not, Fail Job (aka exit with 1) - # # if [[ $(find ${TOXENV_DIST_DIR} -type f -name "*.tar.gz" | wc -l) -ne 1 ]]; then - # # echo "ERROR: Expected to find 1 tar.gz file in ${TOXENV_DIST_DIR}, but found $(find ${TOXENV_DIST_DIR} -type f -name "*.tar.gz" | wc -l)" - # # exit 1 - # # fi - # # if [[ $(find ${TOXENV_DIST_DIR} -type f -name "*.whl" | wc -l) -ne 1 ]]; then - # # echo "ERROR: Expected to find 1 .whl file in ${TOXENV_DIST_DIR}, but found $(find ${TOXENV_DIST_DIR} -type f -name "*.whl" | wc -l)" - # # exit 1 - # # fi + # if [[ $(find ${TOXENV_DIST_DIR} -type f -name "*.tar.gz" | wc -l) -ne 1 ]]; then + # echo "ERROR: Expected to find 1 tar.gz file in ${TOXENV_DIST_DIR}, but found $(find ${TOXENV_DIST_DIR} -type f -name "*.tar.gz" | wc -l)" + # exit 1 + # fi + # if [[ $(find ${TOXENV_DIST_DIR} -type f -name "*.whl" | wc -l) -ne 1 ]]; then + # echo "ERROR: Expected to find 1 .whl file in ${TOXENV_DIST_DIR}, but found $(find ${TOXENV_DIST_DIR} -type f -name "*.whl" | wc -l)" + # exit 1 + # fi - # # REQUIRED existing 'Source Distribution' (SD) aka .tar.gz file, has already been built from source code - # # ie previous code/step ran a tox env, such as with cmd `tox -e py38-sdist-linux`, or any `sdist` tox env, - # # which runs Unit Tests against the .tar.gz (sdist installation), after building it from source code, + # REQUIRED existing 'Source Distribution' (SD) aka .tar.gz file, has already been built from source code + # ie previous code/step ran a tox env, such as with cmd `tox -e py38-sdist-linux`, or any `sdist` tox env, + # which runs Unit Tests against the .tar.gz (sdist installation), after building it from source code, - # # move .tar.gz - # mv ".tox/${DIST_DIR}/artificial_artwork-${PKG_VERSION}.tar.gz" "${DIST_DIR}" + # move .tar.gz + mv ".tox/${DIST_DIR}/artificial_artwork-${PKG_VERSION}.tar.gz" "${DIST_DIR}" - # # move .whl - # # mv ".tox/${DIST_DIR}/artificial_artwork-${PKG_VERSION}-py3-none-any.whl" "${DIST_DIR}" + # move .whl + # mv ".tox/${DIST_DIR}/artificial_artwork-${PKG_VERSION}-py3-none-any.whl" "${DIST_DIR}" - # # tox -e check -vv -s false + # tox -e check -vv -s false # - name: Install documentation test dependencies # if: ${{ matrix.platform == 'macos-latest' && matrix.python-version != '3.6' }} # run: brew install enchant + # - name: Run Documentation Tests # if: ${{ matrix.platform == 'ubuntu-latest' || matrix.python-version != '3.6' }} # run: tox -e docs --sitepackages -vv -s false - # - name: Upload Source & Wheel distributions as Artefacts - # uses: actions/upload-artifact@v3 - # with: - # name: ${{ env.DIST_DIR }}-${{ matrix.platform }}-${{ matrix.python-version }} - # path: ${{ env.DIST_DIR }} - # if-no-files-found: error + - name: Upload Source & Wheel distributions as Artefacts + uses: actions/upload-artifact@v3 + with: + name: ${{ env.DIST_DIR }}-${{ matrix.platform }}-${{ matrix.python-version }} + path: ${{ env.DIST_DIR }} + if-no-files-found: error ### JOB: UPLOAD COVERAGE REPORTS TO CODECOV ### - # codecov_coverage_host: - # runs-on: ubuntu-latest - # needs: test_suite - # if: ${{ needs.set_github_outputs.outputs.PREVENT_CODECOV_TEST_COVERAGE == 'false' }} - # steps: - # - uses: actions/checkout@v3 - # - name: Get Codecov binary - # run: | - # curl -Os https://uploader.codecov.io/latest/linux/codecov - # chmod +x codecov - # - name: Download XML Test Coverage Results, from CI Artifacts - # uses: actions/download-artifact@v3 - # with: - # name: all_coverage_raw - # - name: Upload Coverage Reports to Codecov - # run: | - # for file in coverage*.xml; do - # OS_NAME=$(echo $file | sed -E "s/coverage-(\w\+)-/\1/") - # PY_VERSION=$(echo $file | sed -E "s/coverage-\w\+-(\d\.)\+/\1/") - # ./codecov -f $file -e "OS=$OS_NAME,PYTHON=$PY_VERSION" --flags unittests --verbose - # echo "Sent to Codecov: $file !" - # done - + codecov_coverage_host: + runs-on: ubuntu-latest + needs: test_suite + if: ${{ needs.set_github_outputs.outputs.PREVENT_CODECOV_TEST_COVERAGE == 'false' }} + steps: + - uses: actions/checkout@v3 + - name: Get Codecov binary + run: | + curl -Os https://uploader.codecov.io/latest/linux/codecov + chmod +x codecov + - name: Download XML Test Coverage Results, from CI Artifacts + uses: actions/download-artifact@v3 + with: + name: all_coverage_raw + - name: Upload Coverage Reports to Codecov + run: | + for file in coverage*.xml; do + OS_NAME=$(echo $file | sed -E "s/coverage-(\w\+)-/\1/") + PY_VERSION=$(echo $file | sed -E "s/coverage-\w\+-(\d\.)\+/\1/") + ./codecov -f $file -e "OS=$OS_NAME,PYTHON=$PY_VERSION" --flags unittests --verbose + echo "Sent to Codecov: $file !" + done ## DEPLOY to PYPI: PROD and STAGING # Automated Upload of Builds (.tar.gz, .whl), triggered by git push (aka git ops) @@ -397,16 +399,8 @@ jobs: # - to trigger the automated deployment, push a git tag, that starts with 'v' (eg: v1.0.0, v1.2.3-dev, etc) - # PUBLISH DISTRIBUTIONS ON PYPI -# 1st Job -# Check if PUBLISH_ON_PYPI switch is ON, else do not attempt to deploy to PyPI -# Check if git ref is a tag, which starts with 'v', and that tag is on master or dev branches, -# else Signal that we 'do not handle such cases' (eg we want want to avoid accidental automated deployments to happen) - -# 2nd Job -# If the Signal indicates that conditions are met for an Automated Deployment -# ... + check_which_git_branch_we_are_on: runs-on: ubuntu-latest needs: set_github_outputs @@ -420,13 +414,13 @@ jobs: with: reference: "master" tag: "${{ github.ref }}" - - run: echo "ON_MAIN_BRANCH=${{ steps.main_contains_tag.outputs.retval }}" >> $GITHUB_OUTPUT + - uses: rickstaa/action-contains-tag@v1 id: release_contains_tag with: reference: "release" tag: "${{ github.ref }}" - - run: echo "ON_RELEASE_BRANCH=${{ steps.release_contains_tag.outputs.retval }}" >> $GITHUB_OUTPUT + - name: Pick Production or Test Environment, if tag on master or release branch respectively id: set_environment_name run: | @@ -443,117 +437,124 @@ jobs: echo "[DEBUG] ${{ github.ref }}" DEPLOY=false fi - echo "SELECTED_ENVIRONMENT=$ENVIRONMENT_NAME" >> $GITHUB_ENV - echo "AUTOMATED_DEPLOY=$DEPLOY" >> $GITHUB_ENV - - - run: echo "[DEBUG] Branch name ${GITHUB_REF_NAME}" - - run: echo " ==== ${SELECTED_ENVIRONMENT} ====" - - run: echo " ==== ${AUTOMATED_DEPLOY} ====" - - - name: Set Output for other Jobs to receive - id: set_job_outputs - run: | - echo " --- Selected ENV NAME: $SELECTED_ENVIRONMENT " - echo "ENVIRONMENT_NAME=${SELECTED_ENVIRONMENT}" >> $GITHUB_OUTPUT - echo " --- Signal OK for Automated Deployment?: $AUTOMATED_DEPLOY " - echo "AUTOMATED_DEPLOY=${AUTOMATED_DEPLOY}" >> $GITHUB_OUTPUT + echo "SELECTED_ENVIRONMENT=$ENVIRONMENT_NAME" >> $GITHUB_OUTPUT + echo "AUTOMATED_DEPLOY=$DEPLOY" >> $GITHUB_OUTPUT + - run: echo "ENVIRONMENT_NAME=${{ steps.set_environment_name.outputs.SELECTED_ENVIRONMENT }}" >> $GITHUB_OUTPUT + id: select_pypi_env + - run: echo "AUTOMATED_DEPLOY=${{ steps.set_environment_name.outputs.AUTOMATED_DEPLOY }}" >> $GITHUB_OUTPUT + id: auto_pypi_deploy outputs: - ENVIRONMENT_NAME: ${{ steps.set_job_outputs.outputs.ENVIRONMENT_NAME }} - AUTOMATED_DEPLOY: ${{ steps.set_job_outputs.outputs.AUTOMATED_DEPLOY }} + ENVIRONMENT_NAME: ${{ steps.select_pypi_env.outputs.ENVIRONMENT_NAME }} + AUTOMATED_DEPLOY: ${{ steps.auto_pypi_deploy.outputs.AUTOMATED_DEPLOY }} ### PYPI UPLOAD JOB ### - pypi_publish: + pypi_publ: needs: [test_suite, check_which_git_branch_we_are_on] - # needs: check_which_git_branch_we_are_on - runs-on: ubuntu-latest - # if we are on tag starting with "v" and if we are on master or release branch - if: ${{ startsWith(github.event.ref, 'refs/tags/v') && needs.check_which_git_branch_we_are_on.outputs.AUTOMATED_DEPLOY == 'true' }} - environment: - name: ${{ needs.check_which_git_branch_we_are_on.outputs.ENVIRONMENT_NAME }} - env: - DIST_DIR: dist - DISTRO_SEMVER: ${{ needs.test_suite.outputs.SEMVER_PIP_FORMAT }} # required env var by deploy script (tox -e deploy) - TWINE_USERNAME: ${{ vars.TWINE_USERNAME }} - TWINE_PASSWORD: ${{ secrets.TWINE_PASSWORD }} - PYPI_SERVER: ${{ vars.PYPI_SERVER }} - steps: - - uses: actions/checkout@v3 - - name: Download Source & Wheel distributions - uses: actions/download-artifact@v3 - with: - path: downloaded-artifacts - - name: Get Publishable files from the Artifacts - run: | - TAG="${GITHUB_REF_NAME}" - TAG_SEM_VER="${TAG:1}" # remove the first character (v) + if: startsWith(github.event.ref, 'refs/tags/v') && needs.check_which_git_branch_we_are_on.outputs.AUTOMATED_DEPLOY + uses: boromir674/automated-workflows/.github/workflows/pypi_env.yml@test + with: + distro_name: "artificial_artwork" + distro_version: ${{ needs.test_suite.outputs.SEMVER_PIP_FORMAT }} + should_trigger: true + # does not affect the job, but is used to name the artifacts folder + artifacts_path: "downloaded-artifacts" + pypi_env: ${{ needs.check_which_git_branch_we_are_on.outputs.ENVIRONMENT_NAME }} + # optional + dist_folder: "dist" - # Make sure the distro semver ($DISTRO_SEMVER), which is identical - # to the version string in the source code, when its format is - # Major.Minor.Patch (and slightly different when its format is M.m.p-prerelase), - # is simillarly either identical or slightly different - # when compared to the git tag ($TAG_SEM_VER) + ### PYPI UPLOAD JOB ### + # pypi_publish: + # needs: [test_suite, check_which_git_branch_we_are_on] + # # needs: check_which_git_branch_we_are_on + # runs-on: ubuntu-latest + # # if we are on tag starting with "v" and if we are on master or release branch + # if: ${{ startsWith(github.event.ref, 'refs/tags/v') && needs.check_which_git_branch_we_are_on.outputs.AUTOMATED_DEPLOY == 'true' }} + # environment: + # name: ${{ needs.check_which_git_branch_we_are_on.outputs.ENVIRONMENT_NAME }} + # env: + # DIST_DIR: dist + # DISTRO_SEMVER: ${{ needs.test_suite.outputs.SEMVER_PIP_FORMAT }} # required env var by deploy script (tox -e deploy) + # TWINE_USERNAME: ${{ vars.TWINE_USERNAME }} + # TWINE_PASSWORD: ${{ secrets.TWINE_PASSWORD }} + # PYPI_SERVER: ${{ vars.PYPI_SERVER }} + # steps: + # - uses: actions/checkout@v3 + # - name: Download Source & Wheel distributions + # uses: actions/download-artifact@v3 + # with: + # path: downloaded-artifacts + # - name: Get Publishable files from the Artifacts + # run: | + # TAG="${GITHUB_REF_NAME}" + # TAG_SEM_VER="${TAG:1}" # remove the first character (v) + + # # Make sure the distro semver ($DISTRO_SEMVER), which is identical + # # to the version string in the source code, when its format is + # # Major.Minor.Patch (and slightly different when its format is M.m.p-prerelase), + # # is simillarly either identical or slightly different + # # when compared to the git tag ($TAG_SEM_VER) - # for now MUST match only the Major.Minor.Patch part + # # for now MUST match only the Major.Minor.Patch part - # Extract Major.Minor.Patch parts from DISTRO_SEMVER and TAG_SEM_VER - DISTRO_MMP=$(echo "$DISTRO_SEMVER" | grep -oE '^[0-9]+\.[0-9]+\.[0-9]+') - TAG_MMP=$(echo "$TAG_SEM_VER" | grep -oE '^[0-9]+\.[0-9]+\.[0-9]+') - if [ "$DISTRO_MMP" = "$TAG_MMP" ]; then - echo "Major.Minor.Patch part of DISTRO_SEMVER matches TAG_SEM_VER" - else - echo "[ERROR] Major.Minor.Patch part of DISTRO_SEMVER does not match TAG_SEM_VER" - echo "DISTRO_SEMVER=$DISTRO_SEMVER" - echo "TAG_SEM_VER=$TAG_SEM_VER" - echo "DISTRO_MMP=$DISTRO_MMP" - echo "TAG_MMP=$TAG_MMP" - exit 1 - fi - echo "PACKAGE_DIST_VERSION=$DISTRO_SEMVER" >> $GITHUB_ENV - - run: mkdir ${DIST_DIR} - - run: | - # Get Source Distribution (tar.gz of source code) - source_distributions=$(find downloaded-artifacts -type f -name artificial_artwork*.tar.gz) - source_distributions_array=($source_distributions) - source_distribution=${source_distributions_array[0]} # a *.tar.gz file path - # Extract the base name (without the path) - source_distribution_name=$(basename "$source_distribution") - # Check if all source distribution (.tar.gz) files have the same name - for file in "${source_distributions_array[@]}"; do - if [ "$source_distribution_name" != "$(basename "$file")" ]; then - echo "Error: Not all Source Distribution .tar.gz files have the same name!" - exit 1 - fi - done - echo " -- Will Upload : $source_distribution_name -- " - echo "source_distribution=$source_distribution" >> $GITHUB_ENV - cp "$source_distribution" ${DIST_DIR} - - - run: | - # Get all built Wheels and copy to dist folder - for f in `find downloaded-artifacts -type f -name artificial_artwork*.whl`; do - echo "F: $f"; - # TODO check for duplicates, which means that our build matrix produces the same wheel (need a different compiler that python such as pypy, cython, etc) - cp $f ${DIST_DIR} - done - - name: Install Dependencies - run: pip install tox==3.28 - - - run: echo "Publishing $PACKAGE_DIST_VERSION to $PYPI_SERVER PyPI" - - - name: Publish to PyPI - # env: - # TWINE_USERNAME: ${{ vars.TWINE_USERNAME }} - # TWINE_PASSWORD: ${{ secrets.TWINE_PASSWORD }} - # PYPI_SERVER: ${{ vars.PYPI_SERVER }} - # run: tox -vv -s false -e deploy - run: tox -vv -s false -e deploy -- upload --non-interactive --skip-existing + # # Extract Major.Minor.Patch parts from DISTRO_SEMVER and TAG_SEM_VER + # DISTRO_MMP=$(echo "$DISTRO_SEMVER" | grep -oE '^[0-9]+\.[0-9]+\.[0-9]+') + # TAG_MMP=$(echo "$TAG_SEM_VER" | grep -oE '^[0-9]+\.[0-9]+\.[0-9]+') + # if [ "$DISTRO_MMP" = "$TAG_MMP" ]; then + # echo "Major.Minor.Patch part of DISTRO_SEMVER matches TAG_SEM_VER" + # else + # echo "[ERROR] Major.Minor.Patch part of DISTRO_SEMVER does not match TAG_SEM_VER" + # echo "DISTRO_SEMVER=$DISTRO_SEMVER" + # echo "TAG_SEM_VER=$TAG_SEM_VER" + # echo "DISTRO_MMP=$DISTRO_MMP" + # echo "TAG_MMP=$TAG_MMP" + # exit 1 + # fi + # echo "PACKAGE_DIST_VERSION=$DISTRO_SEMVER" >> $GITHUB_ENV + # - run: mkdir ${DIST_DIR} + # - run: | + # # Get Source Distribution (tar.gz of source code) + # source_distributions=$(find downloaded-artifacts -type f -name artificial_artwork*.tar.gz) + # source_distributions_array=($source_distributions) + # source_distribution=${source_distributions_array[0]} # a *.tar.gz file path + # # Extract the base name (without the path) + # source_distribution_name=$(basename "$source_distribution") + # # Check if all source distribution (.tar.gz) files have the same name + # for file in "${source_distributions_array[@]}"; do + # if [ "$source_distribution_name" != "$(basename "$file")" ]; then + # echo "Error: Not all Source Distribution .tar.gz files have the same name!" + # exit 1 + # fi + # done + # echo " -- Will Upload : $source_distribution_name -- " + # echo "source_distribution=$source_distribution" >> $GITHUB_ENV + # cp "$source_distribution" ${DIST_DIR} + + # - run: | + # # Get all built Wheels and copy to dist folder + # for f in `find downloaded-artifacts -type f -name artificial_artwork*.whl`; do + # echo "F: $f"; + # # TODO check for duplicates, which means that our build matrix produces the same wheel (need a different compiler that python such as pypy, cython, etc) + # cp $f ${DIST_DIR} + # done + # - name: Install Dependencies + # run: pip install tox==3.28 + + # - run: echo "Publishing $PACKAGE_DIST_VERSION to $PYPI_SERVER PyPI" + + # - name: Publish to PyPI + # # env: + # # TWINE_USERNAME: ${{ vars.TWINE_USERNAME }} + # # TWINE_PASSWORD: ${{ secrets.TWINE_PASSWORD }} + # # PYPI_SERVER: ${{ vars.PYPI_SERVER }} + # # run: tox -vv -s false -e deploy + # run: tox -vv -s false -e deploy -- upload --non-interactive --skip-existing - # runs: twine upload --non-interactive --repository testpypi --skip-existing ./dist/PY_PACKAGE-:Version.tar.gz --verbose + # # runs: twine upload --non-interactive --repository testpypi --skip-existing ./dist/PY_PACKAGE-:Version.tar.gz --verbose - # runs: twine upload --non-interactive --skip-existing --repository testpypi --skip-existing ./dist/PY_PACKAGE-:Version.tar.gz --verbose + # # runs: twine upload --non-interactive --skip-existing --repository testpypi --skip-existing ./dist/PY_PACKAGE-:Version.tar.gz --verbose - - run: echo "Published :\)" + # - run: echo "Published :\)" ## AUTOMATED DOCKER BUILD and PUBLISH ON DOCKERHUB ## diff --git a/tox.ini b/tox.ini index 1aa148d..47d01d0 100644 --- a/tox.ini +++ b/tox.ini @@ -1,7 +1,7 @@ [tox] envlist = ; {py311, py310, py39, py38}-{dev, sdist, wheel}-{linux, macos, windows} - {py311, py310, py39, py38}-{sdist}-{linux, macos, windows} + {py311, py310, py39, py38}-{sdist, wheel}-{linux, macos, windows} ; coverage isolated_build = true skip_missing_interpreters = false @@ -51,7 +51,7 @@ commands = pytest -ra --cov --cov-report=term-missing \ --cov-report=html:{envdir}/htmlcov --cov-context=test \ --cov-report=xml:{toxworkdir}/coverage.{envname}.xml \ - {posargs:-n auto} tests -k test_cli + {posargs:-n auto} tests ## CI oriented Envs integrating with GH Actions Tox Plugin ## From 0c0eb9b6244a1a4dc82d7afffa9a2f9ecaf4c704 Mon Sep 17 00:00:00 2001 From: konstantinos Date: Sun, 12 Nov 2023 21:49:49 +0200 Subject: [PATCH 03/39] feat(wheel): include wheel into the python distributoin for PyPI temp: run 1 unit-test in ci for quick feedback fix ci syntax fix ci tox: refactor wip: test PyPI Job behaviour triggerr PyPI only based on prev Job signal test ci pypi, by hardcoding Called Job trigger condition ci: try to pass boolean value for the 'should_trigger' Pypi input ci: use reusable workflows to delegate Jobs point ci Jobs to v1.1.0 of CICD Workflows --- .github/workflows/test.yaml | 149 +++++++++--------------------------- scripts/process_sem_ver.py | 1 - tox.ini | 25 +++--- 3 files changed, 46 insertions(+), 129 deletions(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index a940a86..124d002 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -40,13 +40,13 @@ env: RUN_LINT_CHECKS: "false" PUBLISH_ON_PYPI: "true" DRAW_DEPENDENCIES: "false" - PREVENT_CODECOV_TEST_COVERAGE: "false" # Codecov Job runs only on 'false' + PREVENT_CODECOV_TEST_COVERAGE: "true" # Codecov Job runs only on 'false' # Hard switch to turn on/off the Docker build and publish to Dockerhub DOCKER_JOB_ON: "false" ### END JOB ON/OFF SWITCHES ### - #### Behaviour - Docker build and Publich #### + #### Behaviour - Docker build and Publish #### # Override policy-dependent decision-making and # Accept any ALL (branch/build) to Publish to Dockerhub @@ -154,6 +154,7 @@ jobs: matrix: ${{fromJSON(needs.set_github_outputs.outputs.matrix)}} outputs: SEMVER_PIP_FORMAT: ${{ steps.parse_version.outputs.SEMVER_PIP_FORMAT }} + ARTIFACTS: ${{ steps.set_artifacts_ref.outputs.ARTIFACTS }} steps: - run: echo "[INFO] Platform/OS ${{ matrix.platform }} , Python -> ${{ matrix.python-version }}" - uses: actions/checkout@v3 @@ -258,10 +259,10 @@ jobs: env: PLATFORM: ${{ matrix.platform }} # if sdist tests ran, .tar.gz is in: - # .tox/${DIST_DIR}/cookiecutter_python-${PKG_VERSION}.tar.gz + # .tox/${DIST_DIR}/artificial_artwork-${PKG_VERSION}.tar.gz # if wheel tests ran, .whl's are in: - # .tox/${DIST_DIR}/cookiecutter_python-${PKG_VERSION}-py3-none-any.whl + # .tox/${DIST_DIR}/artificial_artwork-${PKG_VERSION}-py3-none-any.whl # wheel file name depends on the python version # compiled (cpu architecture specific code) @@ -269,7 +270,7 @@ jobs: # the below exaple is what to expect from 'pure python' build ( # meaning in theory there is no machine/cpu-specific code, no byte code, # no compiled code - # .tox/${DIST_DIR}/cookiecutter_python-${PKG_VERSION}-py3-none-any.whl + # .tox/${DIST_DIR}/artificial_artwork-${PKG_VERSION}-py3-none-any.whl - name: "Aggregate Code Coverage & make XML Reports" id: produce_coverage_xml_file @@ -307,35 +308,20 @@ jobs: echo "DIST_DIR=dist" >> $GITHUB_ENV # can be uesd in a with body of a next step in the Job, as eg: path: ${{ env.DIST_DIR }} mkdir ${DIST_DIR} - TOXENV_DIST_DIR=".tox/${DIST_DIR}" + TOXENV_DIST_DIR=".tox/dist" + echo TOXENV_DIST_DIR="${TOXENV_DIST_DIR}" >> $GITHUB_ENV - # Sanity check of files inside echo "[DEBUG] ls -la ${TOXENV_DIST_DIR}" ls -la ${TOXENV_DIST_DIR} + + # move .tar.gz + - run: cp "${TOXENV_DIST_DIR}/artificial_artwork-${PKG_VERSION}.tar.gz" "${DIST_DIR}" + + # move .whl + - run: cp "${TOXENV_DIST_DIR}/artificial_artwork-${PKG_VERSION}-py3-none-any.whl" "${DIST_DIR}" - # Sanity check that among all files there onle one tar.gz and one .whl - # if not, Fail Job (aka exit with 1) - - # if [[ $(find ${TOXENV_DIST_DIR} -type f -name "*.tar.gz" | wc -l) -ne 1 ]]; then - # echo "ERROR: Expected to find 1 tar.gz file in ${TOXENV_DIST_DIR}, but found $(find ${TOXENV_DIST_DIR} -type f -name "*.tar.gz" | wc -l)" - # exit 1 - # fi - # if [[ $(find ${TOXENV_DIST_DIR} -type f -name "*.whl" | wc -l) -ne 1 ]]; then - # echo "ERROR: Expected to find 1 .whl file in ${TOXENV_DIST_DIR}, but found $(find ${TOXENV_DIST_DIR} -type f -name "*.whl" | wc -l)" - # exit 1 - # fi - - # REQUIRED existing 'Source Distribution' (SD) aka .tar.gz file, has already been built from source code - # ie previous code/step ran a tox env, such as with cmd `tox -e py38-sdist-linux`, or any `sdist` tox env, - # which runs Unit Tests against the .tar.gz (sdist installation), after building it from source code, - - # move .tar.gz - mv ".tox/${DIST_DIR}/artificial_artwork-${PKG_VERSION}.tar.gz" "${DIST_DIR}" - - # move .whl - # mv ".tox/${DIST_DIR}/artificial_artwork-${PKG_VERSION}-py3-none-any.whl" "${DIST_DIR}" + # - run: tox -e check -vv -s false - # tox -e check -vv -s false # - name: Install documentation test dependencies # if: ${{ matrix.platform == 'macos-latest' && matrix.python-version != '3.6' }} @@ -345,10 +331,13 @@ jobs: # if: ${{ matrix.platform == 'ubuntu-latest' || matrix.python-version != '3.6' }} # run: tox -e docs --sitepackages -vv -s false + - run: echo ARTIFACTS="${{ env.DIST_DIR }}-${{ matrix.platform }}-${{ matrix.python-version }}" >> $GITHUB_OUTPUT + id: set_artifacts_ref + - name: Upload Source & Wheel distributions as Artefacts uses: actions/upload-artifact@v3 with: - name: ${{ env.DIST_DIR }}-${{ matrix.platform }}-${{ matrix.python-version }} + name: ${{ steps.set_artifacts_ref.outputs.ARTIFACTS }} path: ${{ env.DIST_DIR }} if-no-files-found: error @@ -357,7 +346,7 @@ jobs: codecov_coverage_host: runs-on: ubuntu-latest - needs: test_suite + needs: [test_suite, set_github_outputs] if: ${{ needs.set_github_outputs.outputs.PREVENT_CODECOV_TEST_COVERAGE == 'false' }} steps: - uses: actions/checkout@v3 @@ -451,50 +440,26 @@ jobs: ### PYPI UPLOAD JOB ### pypi_publ: needs: [test_suite, check_which_git_branch_we_are_on] - if: startsWith(github.event.ref, 'refs/tags/v') && needs.check_which_git_branch_we_are_on.outputs.AUTOMATED_DEPLOY - uses: boromir674/automated-workflows/.github/workflows/pypi_env.yml@test + name: PyPI Upload + uses: boromir674/automated-workflows/.github/workflows/pypi_env.yml@v1.1.0 with: distro_name: "artificial_artwork" - distro_version: ${{ needs.test_suite.outputs.SEMVER_PIP_FORMAT }} - should_trigger: true - # does not affect the job, but is used to name the artifacts folder - artifacts_path: "downloaded-artifacts" - pypi_env: ${{ needs.check_which_git_branch_we_are_on.outputs.ENVIRONMENT_NAME }} - # optional - dist_folder: "dist" + distro_version: "${{ needs.test_suite.outputs.SEMVER_PIP_FORMAT }}" + should_trigger: ${{ needs.check_which_git_branch_we_are_on.outputs.AUTOMATED_DEPLOY == 'true' }} + pypi_env: "${{ needs.check_which_git_branch_we_are_on.outputs.ENVIRONMENT_NAME }}" + artifacts_path: ${{ needs.test_suite.outputs.ARTIFACTS }} + require_wheel: true + allow_existing: true + secrets: + # This magically works, and the environment secret will be loaded + # it is really weird to pass a secret here because it feels that is comming from outside, + # from the repository secrets, not from the environment. But it doesn't! + TWINE_PASSWORD: ${{ secrets.TWINE_PASSWORD }} + - ### PYPI UPLOAD JOB ### - # pypi_publish: - # needs: [test_suite, check_which_git_branch_we_are_on] - # # needs: check_which_git_branch_we_are_on - # runs-on: ubuntu-latest - # # if we are on tag starting with "v" and if we are on master or release branch - # if: ${{ startsWith(github.event.ref, 'refs/tags/v') && needs.check_which_git_branch_we_are_on.outputs.AUTOMATED_DEPLOY == 'true' }} - # environment: - # name: ${{ needs.check_which_git_branch_we_are_on.outputs.ENVIRONMENT_NAME }} - # env: - # DIST_DIR: dist - # DISTRO_SEMVER: ${{ needs.test_suite.outputs.SEMVER_PIP_FORMAT }} # required env var by deploy script (tox -e deploy) - # TWINE_USERNAME: ${{ vars.TWINE_USERNAME }} - # TWINE_PASSWORD: ${{ secrets.TWINE_PASSWORD }} - # PYPI_SERVER: ${{ vars.PYPI_SERVER }} - # steps: - # - uses: actions/checkout@v3 - # - name: Download Source & Wheel distributions - # uses: actions/download-artifact@v3 - # with: - # path: downloaded-artifacts - # - name: Get Publishable files from the Artifacts - # run: | # TAG="${GITHUB_REF_NAME}" # TAG_SEM_VER="${TAG:1}" # remove the first character (v) - # # Make sure the distro semver ($DISTRO_SEMVER), which is identical - # # to the version string in the source code, when its format is - # # Major.Minor.Patch (and slightly different when its format is M.m.p-prerelase), - # # is simillarly either identical or slightly different - # # when compared to the git tag ($TAG_SEM_VER) - # # for now MUST match only the Major.Minor.Patch part # # Extract Major.Minor.Patch parts from DISTRO_SEMVER and TAG_SEM_VER @@ -511,50 +476,6 @@ jobs: # exit 1 # fi # echo "PACKAGE_DIST_VERSION=$DISTRO_SEMVER" >> $GITHUB_ENV - # - run: mkdir ${DIST_DIR} - # - run: | - # # Get Source Distribution (tar.gz of source code) - # source_distributions=$(find downloaded-artifacts -type f -name artificial_artwork*.tar.gz) - # source_distributions_array=($source_distributions) - # source_distribution=${source_distributions_array[0]} # a *.tar.gz file path - # # Extract the base name (without the path) - # source_distribution_name=$(basename "$source_distribution") - # # Check if all source distribution (.tar.gz) files have the same name - # for file in "${source_distributions_array[@]}"; do - # if [ "$source_distribution_name" != "$(basename "$file")" ]; then - # echo "Error: Not all Source Distribution .tar.gz files have the same name!" - # exit 1 - # fi - # done - # echo " -- Will Upload : $source_distribution_name -- " - # echo "source_distribution=$source_distribution" >> $GITHUB_ENV - # cp "$source_distribution" ${DIST_DIR} - - # - run: | - # # Get all built Wheels and copy to dist folder - # for f in `find downloaded-artifacts -type f -name artificial_artwork*.whl`; do - # echo "F: $f"; - # # TODO check for duplicates, which means that our build matrix produces the same wheel (need a different compiler that python such as pypy, cython, etc) - # cp $f ${DIST_DIR} - # done - # - name: Install Dependencies - # run: pip install tox==3.28 - - # - run: echo "Publishing $PACKAGE_DIST_VERSION to $PYPI_SERVER PyPI" - - # - name: Publish to PyPI - # # env: - # # TWINE_USERNAME: ${{ vars.TWINE_USERNAME }} - # # TWINE_PASSWORD: ${{ secrets.TWINE_PASSWORD }} - # # PYPI_SERVER: ${{ vars.PYPI_SERVER }} - # # run: tox -vv -s false -e deploy - # run: tox -vv -s false -e deploy -- upload --non-interactive --skip-existing - - # # runs: twine upload --non-interactive --repository testpypi --skip-existing ./dist/PY_PACKAGE-:Version.tar.gz --verbose - - # # runs: twine upload --non-interactive --skip-existing --repository testpypi --skip-existing ./dist/PY_PACKAGE-:Version.tar.gz --verbose - - # - run: echo "Published :\)" ## AUTOMATED DOCKER BUILD and PUBLISH ON DOCKERHUB ## @@ -581,7 +502,7 @@ jobs: docker_build: needs: [read_docker_settings, test_suite] - uses: boromir674/automated-workflows/.github/workflows/docker.yml@test + uses: boromir674/automated-workflows/.github/workflows/docker.yml@v1.1.0 if: always() with: DOCKER_USER: ${{ vars.DOCKER_USER }} diff --git a/scripts/process_sem_ver.py b/scripts/process_sem_ver.py index 7b02f2a..dd7e3c4 100644 --- a/scripts/process_sem_ver.py +++ b/scripts/process_sem_ver.py @@ -186,7 +186,6 @@ # https://peps.python.org/pep-0440/#compatibility-with-other-version-schemes -# TODO use pep440 _regex (see top of cript) parsed_versions_string = _regex.match(semver) prerelease = parsed_versions_string.group("pre") or parsed_versions_string.group("dev") or '' diff --git a/tox.ini b/tox.ini index 47d01d0..9c0109e 100644 --- a/tox.ini +++ b/tox.ini @@ -51,7 +51,7 @@ commands = pytest -ra --cov --cov-report=term-missing \ --cov-report=html:{envdir}/htmlcov --cov-context=test \ --cov-report=xml:{toxworkdir}/coverage.{envname}.xml \ - {posargs:-n auto} tests + {posargs:-n auto} tests -k test_cli ## CI oriented Envs integrating with GH Actions Tox Plugin ## @@ -65,12 +65,12 @@ usedevelop = true [testenv:{py311-, py310-, py39-, py38-,}sdist{, -linux, -macos, -windows}] description = Install as Source Distribution & Test basepython = {env:TOXPYTHON:python3} -commands = -# --cov-config pyproject.toml - pytest -ra --cov --cov-report=term-missing \ - --cov-report=html:{envdir}/htmlcov --cov-context=test \ - --cov-report=xml:{toxworkdir}/coverage.{envname}.xml \ - {posargs:-n auto} tests +; commands = +; # --cov-config pyproject.toml +; pytest -ra --cov --cov-report=term-missing \ +; --cov-report=html:{envdir}/htmlcov --cov-context=test \ +; --cov-report=xml:{toxworkdir}/coverage.{envname}.xml \ +; {posargs:-n auto} tests # WHEEL [testenv:{py311-, py310-, py39-, py38-,}wheel{, -linux, -macos, -windows}] @@ -309,7 +309,7 @@ commands_pre = - python -c 'import os; tw_pypi = os.environ.get("PYPI_SERVER", "testpypi"); exec("if tw_pypi not in {\"pypi\", \"testpypi\"}:\n print(f\"\\n[ERROR]: Requested to set Target PyPI server to \{tw_pypi\}, but supported alias are [pypi, testpypi], which correspond to setting Target PyPI to production pypi.org or staging test.pypi.org, respectively. Please leverage the PYPI_SERVER env var for indicating the Target PyPI server to deploy to. For production PyPI, use PYPI_SERVER=pypi, for test PyPI use PYPI_SERVER=testpypi or do not set the PYPI_SERVER env var at all.\\n\")\n exit(1)");' # PRINT MESSAGE to USER - - python -c 'import os; tw_pypi = os.environ.get("PYPI_SERVER", "testpypi"); exec("if tw_pypi == \"pypi\":\n print(f\"\\nWill do a PRODUCTION Deployment to PyPI server at pypi.org\\n\")\nelse:\n print(f\"\\nWill do a STAGING Deployment to test PyPI server at test.pypi.org\\n\")");' + - python -c 'import os; tw_pypi = os.environ.get("PYPI_SERVER", "testpypi"); exec("if tw_pypi == \"pypi\":\n print(f\"\\n[INFO] Will do a PRODUCTION Deployment to PyPI server at pypi.org\\n\")\nelse:\n print(f\"\\nWill do a STAGING Deployment to test PyPI server at test.pypi.org\\n\")");' # VERIFY PACKAGE_DIST_VERSION is set - python -c 'import os; exec("if not os.environ.get(\"PACKAGE_DIST_VERSION\"):\n print(f\"\\n[ERROR]: Requested to deploy to PyPI, but the PACKAGE_DIST_VERSION env var is not set.\\n\")\n exit(1)");' @@ -321,13 +321,10 @@ commands_pre = ; twine check dist/artificial[\-_]artwork-{env:PACKAGE_DIST_VERSION:PLEASE_INDICATE_THE_SEM_VER_FOR_RELEASE}* commands = # TAR GZ - python -m twine {posargs:upload --non-interactive} --repository {env:PYPI_SERVER:testpypi --skip-existing} {toxinidir}{/}dist/{env:PY_PACKAGE}-{env:PACKAGE_DIST_VERSION:PLEASE_INDICATE_THE_SEM_VER_FOR_RELEASE}.tar.gz --verbose - ; python -m twine {posargs:upload --non-interactive --repository testpypi --skip-existing} {toxinidir}{/}dist/{env:PY_PACKAGE}-{env:PACKAGE_DIST_VERSION:PLEASE_INDICATE_THE_SEM_VER_FOR_RELEASE}.tar.gz --verbose + ; python -m twine {posargs:upload --non-interactive} --repository {env:PYPI_SERVER:testpypi --skip-existing} {toxinidir}{/}dist/{env:PY_PACKAGE}-{env:PACKAGE_DIST_VERSION:PLEASE_INDICATE_THE_SEM_VER_FOR_RELEASE}.tar.gz --verbose - # WHEEL - ; python -m twine {posargs:upload --non-interactive} --repository {env:PYPI_SERVER:testpypi --skip-existing} dist/artificial[\-_]artwork-{env:PACKAGE_DIST_VERSION:PLEASE_INDICATE_THE_SEM_VER_FOR_RELEASE}* --verbose -; commands_post = - ; pip install --index-url https://test.pypi.org/simple/ --no-deps {env:PY_PACKAGE}=={env:PACKAGE_DIST_VERSION} + # TAR GZ and WHEEL + python -m twine {posargs:upload --non-interactive} --repository {env:PYPI_SERVER:testpypi --skip-existing} {toxinidir}{/}dist/{env:PY_PACKAGE}-{env:PACKAGE_DIST_VERSION:PLEASE_INDICATE_THE_SEM_VER_FOR_RELEASE}* --verbose ## STATIC ANALYSIS OF CODE From 69a8453037ade04cb65ad3bec16493337f5359cd Mon Sep 17 00:00:00 2001 From: konstantinos Date: Tue, 14 Nov 2023 23:05:52 +0200 Subject: [PATCH 04/39] enable production settings for CICD --- .github/workflows/test.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 124d002..2b9aeec 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -37,13 +37,13 @@ env: # If false the step prevented from running # If true the step is allowed to run (it still may be skipped on other runtime conditions) RUN_UNIT_TESTS: "true" - RUN_LINT_CHECKS: "false" + RUN_LINT_CHECKS: "true" PUBLISH_ON_PYPI: "true" - DRAW_DEPENDENCIES: "false" - PREVENT_CODECOV_TEST_COVERAGE: "true" # Codecov Job runs only on 'false' + DRAW_DEPENDENCIES: "true" + PREVENT_CODECOV_TEST_COVERAGE: "false" # Codecov Job runs only on 'false' # Hard switch to turn on/off the Docker build and publish to Dockerhub - DOCKER_JOB_ON: "false" + DOCKER_JOB_ON: "true" ### END JOB ON/OFF SWITCHES ### #### Behaviour - Docker build and Publish #### From b4518655d6402080bb79b54fe6f9281807ccaee3 Mon Sep 17 00:00:00 2001 From: konstantinos Date: Tue, 14 Nov 2023 23:06:18 +0200 Subject: [PATCH 05/39] build(poetry): poetry lock --- poetry.lock | 686 ++++++++++++++++++++++++------------------------- pyproject.toml | 1 + 2 files changed, 341 insertions(+), 346 deletions(-) diff --git a/poetry.lock b/poetry.lock index c76fe75..2f7c325 100644 --- a/poetry.lock +++ b/poetry.lock @@ -73,102 +73,102 @@ files = [ [[package]] name = "charset-normalizer" -version = "3.3.1" +version = "3.3.2" 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.1.tar.gz", hash = "sha256:d9137a876020661972ca6eec0766d81aef8a5627df628b664b234b73396e727e"}, - {file = "charset_normalizer-3.3.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8aee051c89e13565c6bd366813c386939f8e928af93c29fda4af86d25b73d8f8"}, - {file = "charset_normalizer-3.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:352a88c3df0d1fa886562384b86f9a9e27563d4704ee0e9d56ec6fcd270ea690"}, - {file = "charset_normalizer-3.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:223b4d54561c01048f657fa6ce41461d5ad8ff128b9678cfe8b2ecd951e3f8a2"}, - {file = "charset_normalizer-3.3.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f861d94c2a450b974b86093c6c027888627b8082f1299dfd5a4bae8e2292821"}, - {file = "charset_normalizer-3.3.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1171ef1fc5ab4693c5d151ae0fdad7f7349920eabbaca6271f95969fa0756c2d"}, - {file = "charset_normalizer-3.3.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28f512b9a33235545fbbdac6a330a510b63be278a50071a336afc1b78781b147"}, - {file = "charset_normalizer-3.3.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0e842112fe3f1a4ffcf64b06dc4c61a88441c2f02f373367f7b4c1aa9be2ad5"}, - {file = "charset_normalizer-3.3.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3f9bc2ce123637a60ebe819f9fccc614da1bcc05798bbbaf2dd4ec91f3e08846"}, - {file = "charset_normalizer-3.3.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:f194cce575e59ffe442c10a360182a986535fd90b57f7debfaa5c845c409ecc3"}, - {file = "charset_normalizer-3.3.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:9a74041ba0bfa9bc9b9bb2cd3238a6ab3b7618e759b41bd15b5f6ad958d17605"}, - {file = "charset_normalizer-3.3.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:b578cbe580e3b41ad17b1c428f382c814b32a6ce90f2d8e39e2e635d49e498d1"}, - {file = "charset_normalizer-3.3.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:6db3cfb9b4fcecb4390db154e75b49578c87a3b9979b40cdf90d7e4b945656e1"}, - {file = "charset_normalizer-3.3.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:debb633f3f7856f95ad957d9b9c781f8e2c6303ef21724ec94bea2ce2fcbd056"}, - {file = "charset_normalizer-3.3.1-cp310-cp310-win32.whl", hash = "sha256:87071618d3d8ec8b186d53cb6e66955ef2a0e4fa63ccd3709c0c90ac5a43520f"}, - {file = "charset_normalizer-3.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:e372d7dfd154009142631de2d316adad3cc1c36c32a38b16a4751ba78da2a397"}, - {file = "charset_normalizer-3.3.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ae4070f741f8d809075ef697877fd350ecf0b7c5837ed68738607ee0a2c572cf"}, - {file = "charset_normalizer-3.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:58e875eb7016fd014c0eea46c6fa92b87b62c0cb31b9feae25cbbe62c919f54d"}, - {file = "charset_normalizer-3.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dbd95e300367aa0827496fe75a1766d198d34385a58f97683fe6e07f89ca3e3c"}, - {file = "charset_normalizer-3.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:de0b4caa1c8a21394e8ce971997614a17648f94e1cd0640fbd6b4d14cab13a72"}, - {file = "charset_normalizer-3.3.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:985c7965f62f6f32bf432e2681173db41336a9c2611693247069288bcb0c7f8b"}, - {file = "charset_normalizer-3.3.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a15c1fe6d26e83fd2e5972425a772cca158eae58b05d4a25a4e474c221053e2d"}, - {file = "charset_normalizer-3.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae55d592b02c4349525b6ed8f74c692509e5adffa842e582c0f861751701a673"}, - {file = "charset_normalizer-3.3.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:be4d9c2770044a59715eb57c1144dedea7c5d5ae80c68fb9959515037cde2008"}, - {file = "charset_normalizer-3.3.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:851cf693fb3aaef71031237cd68699dded198657ec1e76a76eb8be58c03a5d1f"}, - {file = "charset_normalizer-3.3.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:31bbaba7218904d2eabecf4feec0d07469284e952a27400f23b6628439439fa7"}, - {file = "charset_normalizer-3.3.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:871d045d6ccc181fd863a3cd66ee8e395523ebfbc57f85f91f035f50cee8e3d4"}, - {file = "charset_normalizer-3.3.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:501adc5eb6cd5f40a6f77fbd90e5ab915c8fd6e8c614af2db5561e16c600d6f3"}, - {file = "charset_normalizer-3.3.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f5fb672c396d826ca16a022ac04c9dce74e00a1c344f6ad1a0fdc1ba1f332213"}, - {file = "charset_normalizer-3.3.1-cp311-cp311-win32.whl", hash = "sha256:bb06098d019766ca16fc915ecaa455c1f1cd594204e7f840cd6258237b5079a8"}, - {file = "charset_normalizer-3.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:8af5a8917b8af42295e86b64903156b4f110a30dca5f3b5aedea123fbd638bff"}, - {file = "charset_normalizer-3.3.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:7ae8e5142dcc7a49168f4055255dbcced01dc1714a90a21f87448dc8d90617d1"}, - {file = "charset_normalizer-3.3.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5b70bab78accbc672f50e878a5b73ca692f45f5b5e25c8066d748c09405e6a55"}, - {file = "charset_normalizer-3.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5ceca5876032362ae73b83347be8b5dbd2d1faf3358deb38c9c88776779b2e2f"}, - {file = "charset_normalizer-3.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:34d95638ff3613849f473afc33f65c401a89f3b9528d0d213c7037c398a51296"}, - {file = "charset_normalizer-3.3.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9edbe6a5bf8b56a4a84533ba2b2f489d0046e755c29616ef8830f9e7d9cf5728"}, - {file = "charset_normalizer-3.3.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f6a02a3c7950cafaadcd46a226ad9e12fc9744652cc69f9e5534f98b47f3bbcf"}, - {file = "charset_normalizer-3.3.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10b8dd31e10f32410751b3430996f9807fc4d1587ca69772e2aa940a82ab571a"}, - {file = "charset_normalizer-3.3.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edc0202099ea1d82844316604e17d2b175044f9bcb6b398aab781eba957224bd"}, - {file = "charset_normalizer-3.3.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b891a2f68e09c5ef989007fac11476ed33c5c9994449a4e2c3386529d703dc8b"}, - {file = "charset_normalizer-3.3.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:71ef3b9be10070360f289aea4838c784f8b851be3ba58cf796262b57775c2f14"}, - {file = "charset_normalizer-3.3.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:55602981b2dbf8184c098bc10287e8c245e351cd4fdcad050bd7199d5a8bf514"}, - {file = "charset_normalizer-3.3.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:46fb9970aa5eeca547d7aa0de5d4b124a288b42eaefac677bde805013c95725c"}, - {file = "charset_normalizer-3.3.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:520b7a142d2524f999447b3a0cf95115df81c4f33003c51a6ab637cbda9d0bf4"}, - {file = "charset_normalizer-3.3.1-cp312-cp312-win32.whl", hash = "sha256:8ec8ef42c6cd5856a7613dcd1eaf21e5573b2185263d87d27c8edcae33b62a61"}, - {file = "charset_normalizer-3.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:baec8148d6b8bd5cee1ae138ba658c71f5b03e0d69d5907703e3e1df96db5e41"}, - {file = "charset_normalizer-3.3.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:63a6f59e2d01310f754c270e4a257426fe5a591dc487f1983b3bbe793cf6bac6"}, - {file = "charset_normalizer-3.3.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d6bfc32a68bc0933819cfdfe45f9abc3cae3877e1d90aac7259d57e6e0f85b1"}, - {file = "charset_normalizer-3.3.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4f3100d86dcd03c03f7e9c3fdb23d92e32abbca07e7c13ebd7ddfbcb06f5991f"}, - {file = "charset_normalizer-3.3.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:39b70a6f88eebe239fa775190796d55a33cfb6d36b9ffdd37843f7c4c1b5dc67"}, - {file = "charset_normalizer-3.3.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e12f8ee80aa35e746230a2af83e81bd6b52daa92a8afaef4fea4a2ce9b9f4fa"}, - {file = "charset_normalizer-3.3.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b6cefa579e1237ce198619b76eaa148b71894fb0d6bcf9024460f9bf30fd228"}, - {file = "charset_normalizer-3.3.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:61f1e3fb621f5420523abb71f5771a204b33c21d31e7d9d86881b2cffe92c47c"}, - {file = "charset_normalizer-3.3.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:4f6e2a839f83a6a76854d12dbebde50e4b1afa63e27761549d006fa53e9aa80e"}, - {file = "charset_normalizer-3.3.1-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:1ec937546cad86d0dce5396748bf392bb7b62a9eeb8c66efac60e947697f0e58"}, - {file = "charset_normalizer-3.3.1-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:82ca51ff0fc5b641a2d4e1cc8c5ff108699b7a56d7f3ad6f6da9dbb6f0145b48"}, - {file = "charset_normalizer-3.3.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:633968254f8d421e70f91c6ebe71ed0ab140220469cf87a9857e21c16687c034"}, - {file = "charset_normalizer-3.3.1-cp37-cp37m-win32.whl", hash = "sha256:c0c72d34e7de5604df0fde3644cc079feee5e55464967d10b24b1de268deceb9"}, - {file = "charset_normalizer-3.3.1-cp37-cp37m-win_amd64.whl", hash = "sha256:63accd11149c0f9a99e3bc095bbdb5a464862d77a7e309ad5938fbc8721235ae"}, - {file = "charset_normalizer-3.3.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5a3580a4fdc4ac05f9e53c57f965e3594b2f99796231380adb2baaab96e22761"}, - {file = "charset_normalizer-3.3.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2465aa50c9299d615d757c1c888bc6fef384b7c4aec81c05a0172b4400f98557"}, - {file = "charset_normalizer-3.3.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cb7cd68814308aade9d0c93c5bd2ade9f9441666f8ba5aa9c2d4b389cb5e2a45"}, - {file = "charset_normalizer-3.3.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:91e43805ccafa0a91831f9cd5443aa34528c0c3f2cc48c4cb3d9a7721053874b"}, - {file = "charset_normalizer-3.3.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:854cc74367180beb327ab9d00f964f6d91da06450b0855cbbb09187bcdb02de5"}, - {file = "charset_normalizer-3.3.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c15070ebf11b8b7fd1bfff7217e9324963c82dbdf6182ff7050519e350e7ad9f"}, - {file = "charset_normalizer-3.3.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c4c99f98fc3a1835af8179dcc9013f93594d0670e2fa80c83aa36346ee763d2"}, - {file = "charset_normalizer-3.3.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3fb765362688821404ad6cf86772fc54993ec11577cd5a92ac44b4c2ba52155b"}, - {file = "charset_normalizer-3.3.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:dced27917823df984fe0c80a5c4ad75cf58df0fbfae890bc08004cd3888922a2"}, - {file = "charset_normalizer-3.3.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a66bcdf19c1a523e41b8e9d53d0cedbfbac2e93c649a2e9502cb26c014d0980c"}, - {file = "charset_normalizer-3.3.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:ecd26be9f112c4f96718290c10f4caea6cc798459a3a76636b817a0ed7874e42"}, - {file = "charset_normalizer-3.3.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:3f70fd716855cd3b855316b226a1ac8bdb3caf4f7ea96edcccc6f484217c9597"}, - {file = "charset_normalizer-3.3.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:17a866d61259c7de1bdadef418a37755050ddb4b922df8b356503234fff7932c"}, - {file = "charset_normalizer-3.3.1-cp38-cp38-win32.whl", hash = "sha256:548eefad783ed787b38cb6f9a574bd8664468cc76d1538215d510a3cd41406cb"}, - {file = "charset_normalizer-3.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:45f053a0ece92c734d874861ffe6e3cc92150e32136dd59ab1fb070575189c97"}, - {file = "charset_normalizer-3.3.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:bc791ec3fd0c4309a753f95bb6c749ef0d8ea3aea91f07ee1cf06b7b02118f2f"}, - {file = "charset_normalizer-3.3.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0c8c61fb505c7dad1d251c284e712d4e0372cef3b067f7ddf82a7fa82e1e9a93"}, - {file = "charset_normalizer-3.3.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2c092be3885a1b7899cd85ce24acedc1034199d6fca1483fa2c3a35c86e43041"}, - {file = "charset_normalizer-3.3.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c2000c54c395d9e5e44c99dc7c20a64dc371f777faf8bae4919ad3e99ce5253e"}, - {file = "charset_normalizer-3.3.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4cb50a0335382aac15c31b61d8531bc9bb657cfd848b1d7158009472189f3d62"}, - {file = "charset_normalizer-3.3.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c30187840d36d0ba2893bc3271a36a517a717f9fd383a98e2697ee890a37c273"}, - {file = "charset_normalizer-3.3.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe81b35c33772e56f4b6cf62cf4aedc1762ef7162a31e6ac7fe5e40d0149eb67"}, - {file = "charset_normalizer-3.3.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d0bf89afcbcf4d1bb2652f6580e5e55a840fdf87384f6063c4a4f0c95e378656"}, - {file = "charset_normalizer-3.3.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:06cf46bdff72f58645434d467bf5228080801298fbba19fe268a01b4534467f5"}, - {file = "charset_normalizer-3.3.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:3c66df3f41abee950d6638adc7eac4730a306b022570f71dd0bd6ba53503ab57"}, - {file = "charset_normalizer-3.3.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:cd805513198304026bd379d1d516afbf6c3c13f4382134a2c526b8b854da1c2e"}, - {file = "charset_normalizer-3.3.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:9505dc359edb6a330efcd2be825fdb73ee3e628d9010597aa1aee5aa63442e97"}, - {file = "charset_normalizer-3.3.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:31445f38053476a0c4e6d12b047b08ced81e2c7c712e5a1ad97bc913256f91b2"}, - {file = "charset_normalizer-3.3.1-cp39-cp39-win32.whl", hash = "sha256:bd28b31730f0e982ace8663d108e01199098432a30a4c410d06fe08fdb9e93f4"}, - {file = "charset_normalizer-3.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:555fe186da0068d3354cdf4bbcbc609b0ecae4d04c921cc13e209eece7720727"}, - {file = "charset_normalizer-3.3.1-py3-none-any.whl", hash = "sha256:800561453acdecedaac137bf09cd719c7a440b6800ec182f077bb8e7025fb708"}, + {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, + {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, ] [[package]] @@ -356,70 +356,70 @@ tests = ["pytest", "pytest-cov", "pytest-xdist"] [[package]] name = "cython" -version = "3.0.4" +version = "3.0.5" description = "The Cython compiler for writing C extensions in the Python language." category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ - {file = "Cython-3.0.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:096cb461bf8d913a4327d93ea38d18bc3dbc577a71d805be04754e4b2cc2c45d"}, - {file = "Cython-3.0.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf671d712816b48fa2731799017ed68e5e440922d0c7e13dc825c226639ff766"}, - {file = "Cython-3.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:beb367fd88fc6ba8c204786f680229106d99da72a60f5906c85fc8d73640b01a"}, - {file = "Cython-3.0.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6619264ed43d8d8819d4f1cdb8a62ab66f87e92f06f3ff3e2533fd95a9945e59"}, - {file = "Cython-3.0.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:c0fb9e7cf9db38918f19a803fab9bc7b2ed3f33a9e8319c616c464a0a8501b8d"}, - {file = "Cython-3.0.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c214f6e88ecdc8ff5d13f0914890445fdaad21bddc34a90cd14aeb3ad5e55e2e"}, - {file = "Cython-3.0.4-cp310-cp310-win32.whl", hash = "sha256:c9b1322f0d8ce5445fcc3a625b966f10c4182190026713e217d6f38d29930cb1"}, - {file = "Cython-3.0.4-cp310-cp310-win_amd64.whl", hash = "sha256:146bfaab567157f4aa34114a37e3f98a3d9c4527ee99d4fd730cab56482bd3cf"}, - {file = "Cython-3.0.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c8e0f98d950987b0f9d5e10c41236bef5cb4fba701c6e680af0b9734faa3a85e"}, - {file = "Cython-3.0.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0fe227d6d8e2ea030e82abc8a3e361e31447b66849f8c069caa783999e54a8f2"}, - {file = "Cython-3.0.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6da74000a672eac0d7cf02adc140b2f9c7d54eae6c196e615a1b5deb694d9203"}, - {file = "Cython-3.0.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:48cda82eb82ad2014d2ad194442ed3c46156366be98e4e02f3e29742cdbf94a0"}, - {file = "Cython-3.0.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:4355a2cb03b257773c0d2bb6af9818c72e836a9b09986e28f52e323d87b1fc67"}, - {file = "Cython-3.0.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:10b426adc3027d66303f5c7aa8b254d10ed80827ff5cce9e892d550b708dc044"}, - {file = "Cython-3.0.4-cp311-cp311-win32.whl", hash = "sha256:28de18f0d07eb34e2dd7b022ac30beab0fdd277846d07b7a08e69e6294f0762b"}, - {file = "Cython-3.0.4-cp311-cp311-win_amd64.whl", hash = "sha256:9d31d76ed777a8a85be3f8f7f1cfef09b3bc33f6ec4abee1067dcef107f49778"}, - {file = "Cython-3.0.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d5a55749509c7f9f8a33bf9cc02cf76fd6564fcb38f486e43d2858145d735953"}, - {file = "Cython-3.0.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58cdfdd942cf5ffcee974aabfe9b9e26c0c1538fd31c1b03596d40405f7f4d40"}, - {file = "Cython-3.0.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b906997e7b98d7d29b84d10a5318993eba1aaff82ff7e1a0ac00254307913d7"}, - {file = "Cython-3.0.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f24114e1777604a28ae1c7a56a2c9964655f1031edecc448ad51e5abb19a279b"}, - {file = "Cython-3.0.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:07d0e69959f267b79ffd18ece8599711ad2f3d3ed1eddd0d4812d2a97de2b912"}, - {file = "Cython-3.0.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:f7fcd93d15deceb2747b10266a39deccd94f257d610f3bbd52a7e16bc5908eda"}, - {file = "Cython-3.0.4-cp312-cp312-win32.whl", hash = "sha256:0aa2a6bb3ff67794d8d1dafaed22913adcbb327e96eca3ac44e2f3ba4a0ae446"}, - {file = "Cython-3.0.4-cp312-cp312-win_amd64.whl", hash = "sha256:0021350f6d7022a37f598320460b84b2c0daccf6bb65641bbdbc8b990bdf4ad2"}, - {file = "Cython-3.0.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b72c426df1586f967b1c61d2f8236702d75c6bbf34abdc258a59e09155a16414"}, - {file = "Cython-3.0.4-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a9262408f05eef039981479b38b38252d5b853992e5bc54a2d2dd05a2a0178e"}, - {file = "Cython-3.0.4-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28af4e7dff1742cb0f0a4823102c89c62a2d94115b68f718145fcfe0763c6e21"}, - {file = "Cython-3.0.4-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4e8c144e2c5814e46868d1f81e2f4265ca1f314a8187d0420cd76e9563294cf8"}, - {file = "Cython-3.0.4-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:19a64bf2591272348ab08bcd4a5f884259cc3186f008c9038b8ec7d01f847fd5"}, - {file = "Cython-3.0.4-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:fc96efa617184b8581a02663e261b41c13a605da8ef4ba1ed735bf46184f815e"}, - {file = "Cython-3.0.4-cp36-cp36m-win32.whl", hash = "sha256:15d52f7f9d08b264c042aa508bf457f53654b55f533e0262e146002b1c15d1cd"}, - {file = "Cython-3.0.4-cp36-cp36m-win_amd64.whl", hash = "sha256:0650460b5fd6f16da4186e0a769b47db5532601e306f3b5d17941283d5e36d24"}, - {file = "Cython-3.0.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b3ddfc6f05410095ec11491dde05f50973e501567d21cbfcf5832d95f141878a"}, - {file = "Cython-3.0.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a0b92adfcac68dcf549daddec83c87a86995caa6f87bfb6f72de4797e1a6ad6"}, - {file = "Cython-3.0.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ada3659608795bb36930d9a206b8dd6b865d85e2999a02ce8b34f3195d88301"}, - {file = "Cython-3.0.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:061dec1be8d8b601b160582609a78eb08324a4ccf21bee0d04853a3e9dfcbefd"}, - {file = "Cython-3.0.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:bc42004f181373cd3b39bbacfb71a5b0606ed6e4c199c940cca2212ba0f79525"}, - {file = "Cython-3.0.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:f124ac9ee41e1bfdfb16f53f1db85de296cd2144a4e8fdee8c3560a8fe9b6d5d"}, - {file = "Cython-3.0.4-cp37-cp37m-win32.whl", hash = "sha256:48b35ab009227ee6188991b5666aae1936b82a944f707c042cef267709de12b5"}, - {file = "Cython-3.0.4-cp37-cp37m-win_amd64.whl", hash = "sha256:861979428f749faa9883dc4e11e8c3fc2c29bd0031cf49661604459b53ea7c66"}, - {file = "Cython-3.0.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c7a7dd7c50d07718a5ac2bdea166085565f7217cf1e030cc07c22a8b80a406a7"}, - {file = "Cython-3.0.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d40d4135f76fb0ed4caa2d422fdb4231616615698709d3c421ecc733f1ac7ca0"}, - {file = "Cython-3.0.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:207f53893ca22d8c8f5db533f38382eb7ddc2d0b4ab51699bf052423a6febdad"}, - {file = "Cython-3.0.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0422a40a58dcfbb54c8b4e125461d741031ff046bc678475cc7a6c801d2a7721"}, - {file = "Cython-3.0.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ef4b144c5b29b4ea0b40c401458b86df8d75382b2e5d03e9f67f607c05b516a9"}, - {file = "Cython-3.0.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0612439f810cc281e51fead69de0545c4d9772a1e82149c119d1aafc1f6210ba"}, - {file = "Cython-3.0.4-cp38-cp38-win32.whl", hash = "sha256:b86871862bd65806ba0d0aa2b9c77fcdcc6cbd8d36196688f4896a34bb626334"}, - {file = "Cython-3.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:6603a287188dcbc36358a73a7be43e8a2ecf0c6a06835bdfdd1b113943afdd6f"}, - {file = "Cython-3.0.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0fc9e974419cc0393072b1e9a669f71c3b34209636d2005ff8620687daa82b8c"}, - {file = "Cython-3.0.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e84988d384dfba678387ea7e4f68786c3703543018d473605d9299c69a07f197"}, - {file = "Cython-3.0.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36299ffd5663203c25d3a76980f077e23b6d4f574d142f0f43943f57be445639"}, - {file = "Cython-3.0.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8529cf09919263a6826adc04c5dde9f1406dd7920929b16be19ee9848110e353"}, - {file = "Cython-3.0.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:8692249732d62e049df3884fa601b70fad3358703e137aceeb581e5860e7d9b7"}, - {file = "Cython-3.0.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f234bc46043856d118ebd94b13ea29df674503bc94ced3d81ca46a1ad5b5b9ae"}, - {file = "Cython-3.0.4-cp39-cp39-win32.whl", hash = "sha256:c2215f436ce3cce49e6e318cb8f7253cfc4d3bea690777c2a5dd52ae93342504"}, - {file = "Cython-3.0.4-cp39-cp39-win_amd64.whl", hash = "sha256:003ccc40e0867770db0018274977d1874e4df64983d5e3e36937f107e0b2fdf6"}, - {file = "Cython-3.0.4-py2.py3-none-any.whl", hash = "sha256:e5e2859f97e9cceb8e70b0934c56157038b8b083245898593008162a70536d7e"}, - {file = "Cython-3.0.4.tar.gz", hash = "sha256:2e379b491ee985d31e5faaf050f79f4a8f59f482835906efe4477b33b4fbe9ff"}, + {file = "Cython-3.0.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4faf17ea6e8fc3065a862d4b24be84048fd58ed7abe59aa2f9141446a7a72335"}, + {file = "Cython-3.0.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1cab30c11880f38a27911b569ea38b0bd67fcf32f8a8a8519b613c70562dae2"}, + {file = "Cython-3.0.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c4d4d92182002b2878adb3329de1ccb7f3f7571d3586f92602e790bfeab45d0"}, + {file = "Cython-3.0.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b94f58e05e69e1a43da551c8f532e9fad057df1641f0f8ae8f103d4ede5a80fe"}, + {file = "Cython-3.0.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:a90f9c7b6635967eacafebe439d518b7dc720aaaf19cb9553f5aad03c13296f4"}, + {file = "Cython-3.0.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c95bd21d87b08c88fe5296381a5f39cd979a775bf1a1d7379a6ff87c703e510b"}, + {file = "Cython-3.0.5-cp310-cp310-win32.whl", hash = "sha256:ebc901131057c115a8868e14c1df6e56b9190df774b72664c03ebd858296bb81"}, + {file = "Cython-3.0.5-cp310-cp310-win_amd64.whl", hash = "sha256:0759868b4a4d103578375e031e89abd578c26774d957ee4f591764ef8003b363"}, + {file = "Cython-3.0.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3679a6693456f5f7ccca9ab2a91408e99ee257e145024fe380da7c78a07e98b6"}, + {file = "Cython-3.0.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ad4eb2608661d63fb57c674dafb9955f5141d748d4579c7722c1a3c6b86a0c2"}, + {file = "Cython-3.0.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b37f4b0d983316242b4b9241ecbbe55220aa92af93ff04626441fe0ea90a54f9"}, + {file = "Cython-3.0.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34059c3ea6e342ba388cd9774a61761bb4200ca18bd475de65c9cc70ef4e0204"}, + {file = "Cython-3.0.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:4db9eea298e982aee7ba12b3432c66eb2e91bb2f5d026bbd57c35698ea0f557f"}, + {file = "Cython-3.0.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:452679284c15a7d5a88bff675e1dd660349360f0665aea50be2d98b7650925f8"}, + {file = "Cython-3.0.5-cp311-cp311-win32.whl", hash = "sha256:2d6bb318ddce8b978c81cf78caf8b3836db84f6235d721952685e87871f506e4"}, + {file = "Cython-3.0.5-cp311-cp311-win_amd64.whl", hash = "sha256:fcfd2255458a5779dbab813550695331d541b24f0ef831ace83f04f9516ddf26"}, + {file = "Cython-3.0.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:0d9fcfc09d67218fce114fe9fd97bba4f9d56add0f775c588d8c626ed47f1aef"}, + {file = "Cython-3.0.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ac1cf1f2ed01656b33618352f7e42bf75d027425b83cc96cfe13ce4b6cba5de"}, + {file = "Cython-3.0.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d9d17a6ceb301c5dbd3820e62c1b10a4ad3a6eea3e07e7afaf736b5f490c2e32"}, + {file = "Cython-3.0.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dd9cab3b862bec2b110886aedb11765e9deda363c4c7ab5ea205f3d8f143c411"}, + {file = "Cython-3.0.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:45277bb54c35b11bcdd6cf0f56eb950eb280b67146db0cb57853fb6334c6d11d"}, + {file = "Cython-3.0.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:77f4d001fb7a03a68b53be20571acd17452d1dda7907d9c325dff0cc704b1ef9"}, + {file = "Cython-3.0.5-cp312-cp312-win32.whl", hash = "sha256:57b44f789794d74c1feddae054dd045b9f601bdffd7288e069b4ca7ed607ec61"}, + {file = "Cython-3.0.5-cp312-cp312-win_amd64.whl", hash = "sha256:05c4efd36879ff8020af00407e4c14246b894558ea41dc6486f60dd71601fc67"}, + {file = "Cython-3.0.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:048fe89c2c753c24e1a7a05496907173dab17e238c8dc3c7cad90b3679b0d846"}, + {file = "Cython-3.0.5-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c016b3e859b41cf4ce1b8107f364ad5a83c086f75ea4d8d3990b24691f626a1"}, + {file = "Cython-3.0.5-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f31d02b831d0fa9bf099b1b714b5a8252eabd8db34b7d33c48e7e808a2dabf9"}, + {file = "Cython-3.0.5-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:485f8a3087392e2287e2869adc0385b439f69b9cfbd262fdf39b00417690c988"}, + {file = "Cython-3.0.5-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:063220a6dc0909b576ef068c7e2acf5c608d64423a6d231aacb72d06352cd95b"}, + {file = "Cython-3.0.5-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:abb2362783521bd9a22fe69b2141abab4db97237665a36a034b161ddee5b3e72"}, + {file = "Cython-3.0.5-cp36-cp36m-win32.whl", hash = "sha256:a993002fe28c840dc29805fde7341c775b7878b311b85f21560fdebf220c247b"}, + {file = "Cython-3.0.5-cp36-cp36m-win_amd64.whl", hash = "sha256:13491f1bfcf020fd02751c4a55294aa8957e21b7ecd2542b0521a7aa50c58bb2"}, + {file = "Cython-3.0.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:45aaceb082ad89365f2f783a40db42359591ad55914fb298841196edf88afdc5"}, + {file = "Cython-3.0.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e3e011fa2ae9e953fe1ab8394329a21bdb54357c7fe509bcfb02b88bc15bffbb"}, + {file = "Cython-3.0.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f18c13d5ed6fde5efd3b1c039f6a34296d1a0409bb00fbf45bec6f9bcf63ddf5"}, + {file = "Cython-3.0.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:039877e57dc10abf0d30d2de2c7476f0881d8ecef1f29bdeed1a6a06a8d89141"}, + {file = "Cython-3.0.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:4fbc8f62b8d50f9a2eef99927a9dcb8d0a42e5a801ab14c2e4aeab622c88f54b"}, + {file = "Cython-3.0.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:3cffbba1888f795de2103e6fb1482c8ea8d457e638fa813e090fe747f9e549bb"}, + {file = "Cython-3.0.5-cp37-cp37m-win32.whl", hash = "sha256:c18e125537a96e76c8c34201e5a9aad8625e3d872dd26a63155573462e54e185"}, + {file = "Cython-3.0.5-cp37-cp37m-win_amd64.whl", hash = "sha256:93502f45948ae8d7f874ba4c113b50cb6fb4ee664caa82e1ddc398500ee0ffb3"}, + {file = "Cython-3.0.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0a9206b0720f0cad3e70c018722f6d10e81b32e65477e14ffedd3fbfadfaddca"}, + {file = "Cython-3.0.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:530a474a79fa6c2127bb7e3ba00857b1f26a563615863f17b7434331aa3fe404"}, + {file = "Cython-3.0.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:115e76fbe9288119526b66963f614042222d1587f1ba5ddb90088215a3d2a25a"}, + {file = "Cython-3.0.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:035cb6930a8534f865a3f4616543f78bd27e4de9c3e117b2826e395085ffc4c0"}, + {file = "Cython-3.0.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:077d9a61e6042174dabf68b8e92c0a80f5aff529439ed314aa6e6a233af80b95"}, + {file = "Cython-3.0.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ba3f7b433c1721a43674c0889d5fad746bf608416c8f849343859e6d4d3a7113"}, + {file = "Cython-3.0.5-cp38-cp38-win32.whl", hash = "sha256:a95ed0e6f481462a3ff2be4c2e4ffffc5d00fc3884d4ccd1fe5b702d4938ec09"}, + {file = "Cython-3.0.5-cp38-cp38-win_amd64.whl", hash = "sha256:f687539ead9fbc17f499e33ee20c1dc41598f70ad95edb4990c576447cec9d23"}, + {file = "Cython-3.0.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f6fcfef825edb44cf3c6ba2c091ad76a83da62ac9c79553e80e0c2a1f75eda2e"}, + {file = "Cython-3.0.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0d9431101f600d5a557d55989658cbfd02b7c0dcd1e4675dac8ad7e0da8ea5b"}, + {file = "Cython-3.0.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db21997270e943aee9cb7694112d24a4702fbe1977fbe53b3cb4db3d02be73d9"}, + {file = "Cython-3.0.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:808f56d4cd0511723b787c341f3cc995fd72893e608102268298c188f4a4f2e7"}, + {file = "Cython-3.0.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:dee39967168d6326ea2df56ad215a4d5049aa52f44cd5aad45bfb63d5b4fb9e5"}, + {file = "Cython-3.0.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b77f2b45535bcf3741592fa03183558bd42198b872c1584b896fa0ba5f2ac68d"}, + {file = "Cython-3.0.5-cp39-cp39-win32.whl", hash = "sha256:5742ef31e1e2c9a4824ef6b05af0f4949047a6f73af1d4b238ce12935174aede"}, + {file = "Cython-3.0.5-cp39-cp39-win_amd64.whl", hash = "sha256:ada4852db0e33dbdd1425322db081d22b9725cb9f5eba42885467b4e2c4f2ac0"}, + {file = "Cython-3.0.5-py2.py3-none-any.whl", hash = "sha256:75206369504fc442c10a86ecf57b91592dca744e4592af22a47e9a774d53dd10"}, + {file = "Cython-3.0.5.tar.gz", hash = "sha256:39318348db488a2f24e7c84e08bdc82f2624853c0fea8b475ea0b70b27176492"}, ] [[package]] @@ -454,58 +454,58 @@ testing = ["hatch", "pre-commit", "pytest", "tox"] [[package]] name = "fonttools" -version = "4.43.1" +version = "4.44.1" description = "Tools to manipulate font files" category = "main" optional = true python-versions = ">=3.8" files = [ - {file = "fonttools-4.43.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:bf11e2cca121df35e295bd34b309046c29476ee739753bc6bc9d5050de319273"}, - {file = "fonttools-4.43.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:10b3922875ffcba636674f406f9ab9a559564fdbaa253d66222019d569db869c"}, - {file = "fonttools-4.43.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f727c3e3d08fd25352ed76cc3cb61486f8ed3f46109edf39e5a60fc9fecf6ca"}, - {file = "fonttools-4.43.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad0b3f6342cfa14be996971ea2b28b125ad681c6277c4cd0fbdb50340220dfb6"}, - {file = "fonttools-4.43.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3b7ad05b2beeebafb86aa01982e9768d61c2232f16470f9d0d8e385798e37184"}, - {file = "fonttools-4.43.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4c54466f642d2116686268c3e5f35ebb10e49b0d48d41a847f0e171c785f7ac7"}, - {file = "fonttools-4.43.1-cp310-cp310-win32.whl", hash = "sha256:1e09da7e8519e336239fbd375156488a4c4945f11c4c5792ee086dd84f784d02"}, - {file = "fonttools-4.43.1-cp310-cp310-win_amd64.whl", hash = "sha256:1cf9e974f63b1080b1d2686180fc1fbfd3bfcfa3e1128695b5de337eb9075cef"}, - {file = "fonttools-4.43.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5db46659cfe4e321158de74c6f71617e65dc92e54980086823a207f1c1c0e24b"}, - {file = "fonttools-4.43.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1952c89a45caceedf2ab2506d9a95756e12b235c7182a7a0fff4f5e52227204f"}, - {file = "fonttools-4.43.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c36da88422e0270fbc7fd959dc9749d31a958506c1d000e16703c2fce43e3d0"}, - {file = "fonttools-4.43.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7bbbf8174501285049e64d174e29f9578495e1b3b16c07c31910d55ad57683d8"}, - {file = "fonttools-4.43.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d4071bd1c183b8d0b368cc9ed3c07a0f6eb1bdfc4941c4c024c49a35429ac7cd"}, - {file = "fonttools-4.43.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d21099b411e2006d3c3e1f9aaf339e12037dbf7bf9337faf0e93ec915991f43b"}, - {file = "fonttools-4.43.1-cp311-cp311-win32.whl", hash = "sha256:b84a1c00f832feb9d0585ca8432fba104c819e42ff685fcce83537e2e7e91204"}, - {file = "fonttools-4.43.1-cp311-cp311-win_amd64.whl", hash = "sha256:9a2f0aa6ca7c9bc1058a9d0b35483d4216e0c1bbe3962bc62ce112749954c7b8"}, - {file = "fonttools-4.43.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:4d9740e3783c748521e77d3c397dc0662062c88fd93600a3c2087d3d627cd5e5"}, - {file = "fonttools-4.43.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:884ef38a5a2fd47b0c1291647b15f4e88b9de5338ffa24ee52c77d52b4dfd09c"}, - {file = "fonttools-4.43.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9648518ef687ba818db3fcc5d9aae27a369253ac09a81ed25c3867e8657a0680"}, - {file = "fonttools-4.43.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95e974d70238fc2be5f444fa91f6347191d0e914d5d8ae002c9aa189572cc215"}, - {file = "fonttools-4.43.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:34f713dad41aa21c637b4e04fe507c36b986a40f7179dcc86402237e2d39dcd3"}, - {file = "fonttools-4.43.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:360201d46165fc0753229afe785900bc9596ee6974833124f4e5e9f98d0f592b"}, - {file = "fonttools-4.43.1-cp312-cp312-win32.whl", hash = "sha256:bb6d2f8ef81ea076877d76acfb6f9534a9c5f31dc94ba70ad001267ac3a8e56f"}, - {file = "fonttools-4.43.1-cp312-cp312-win_amd64.whl", hash = "sha256:25d3da8a01442cbc1106490eddb6d31d7dffb38c1edbfabbcc8db371b3386d72"}, - {file = "fonttools-4.43.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8da417431bfc9885a505e86ba706f03f598c85f5a9c54f67d63e84b9948ce590"}, - {file = "fonttools-4.43.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:51669b60ee2a4ad6c7fc17539a43ffffc8ef69fd5dbed186a38a79c0ac1f5db7"}, - {file = "fonttools-4.43.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:748015d6f28f704e7d95cd3c808b483c5fb87fd3eefe172a9da54746ad56bfb6"}, - {file = "fonttools-4.43.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f7a58eb5e736d7cf198eee94844b81c9573102ae5989ebcaa1d1a37acd04b33d"}, - {file = "fonttools-4.43.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6bb5ea9076e0e39defa2c325fc086593ae582088e91c0746bee7a5a197be3da0"}, - {file = "fonttools-4.43.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5f37e31291bf99a63328668bb83b0669f2688f329c4c0d80643acee6e63cd933"}, - {file = "fonttools-4.43.1-cp38-cp38-win32.whl", hash = "sha256:9c60ecfa62839f7184f741d0509b5c039d391c3aff71dc5bc57b87cc305cff3b"}, - {file = "fonttools-4.43.1-cp38-cp38-win_amd64.whl", hash = "sha256:fe9b1ec799b6086460a7480e0f55c447b1aca0a4eecc53e444f639e967348896"}, - {file = "fonttools-4.43.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:13a9a185259ed144def3682f74fdcf6596f2294e56fe62dfd2be736674500dba"}, - {file = "fonttools-4.43.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b2adca1b46d69dce4a37eecc096fe01a65d81a2f5c13b25ad54d5430ae430b13"}, - {file = "fonttools-4.43.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18eefac1b247049a3a44bcd6e8c8fd8b97f3cad6f728173b5d81dced12d6c477"}, - {file = "fonttools-4.43.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2062542a7565091cea4cc14dd99feff473268b5b8afdee564f7067dd9fff5860"}, - {file = "fonttools-4.43.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:18a2477c62a728f4d6e88c45ee9ee0229405e7267d7d79ce1f5ce0f3e9f8ab86"}, - {file = "fonttools-4.43.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a7a06f8d95b7496e53af80d974d63516ffb263a468e614978f3899a6df52d4b3"}, - {file = "fonttools-4.43.1-cp39-cp39-win32.whl", hash = "sha256:10003ebd81fec0192c889e63a9c8c63f88c7d72ae0460b7ba0cd2a1db246e5ad"}, - {file = "fonttools-4.43.1-cp39-cp39-win_amd64.whl", hash = "sha256:e117a92b07407a061cde48158c03587ab97e74e7d73cb65e6aadb17af191162a"}, - {file = "fonttools-4.43.1-py3-none-any.whl", hash = "sha256:4f88cae635bfe4bbbdc29d479a297bb525a94889184bb69fa9560c2d4834ddb9"}, - {file = "fonttools-4.43.1.tar.gz", hash = "sha256:17dbc2eeafb38d5d0e865dcce16e313c58265a6d2d20081c435f84dc5a9d8212"}, + {file = "fonttools-4.44.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8acf50c20bae9880169ff133768a54f587d956676d28894401835a28f450935e"}, + {file = "fonttools-4.44.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:02939e423540e05843a5c2b84704f45d307144f761a42a299d9b0b481e497225"}, + {file = "fonttools-4.44.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d96cc1395dbf82dedfd4eb127d320004088df6007383c25db676e5f42fe414"}, + {file = "fonttools-4.44.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aff3c12fba2525e5b7f7ba73fab10ddac386f8019b6cf2b8701239cf9f3e2a8a"}, + {file = "fonttools-4.44.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3675499e11a2332a867c1ce98792d29615ac143186c1c1d3e1bb7a13f1929b52"}, + {file = "fonttools-4.44.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fcf6c0c2bf2b0baeb55b5e44e9d6f2b71ede808949b8ab4daca077cc3f9cfff5"}, + {file = "fonttools-4.44.1-cp310-cp310-win32.whl", hash = "sha256:147c9f5fbe12486fa186b5ccdc64a537d581e4f9bbddfbc40f2a15a55c66f54e"}, + {file = "fonttools-4.44.1-cp310-cp310-win_amd64.whl", hash = "sha256:0bd45092788dbfb781fae299905695a3fe5c1956a515ee331c9f034da3a9d0e5"}, + {file = "fonttools-4.44.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d22d9a4cb3f0c96991d4dccab66c7377302c9ca09dcf0cbce968d73919585120"}, + {file = "fonttools-4.44.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0c1ac78c60b155ce709b50e28321baa3813dfae648bf55ac80d5a97c70d088e0"}, + {file = "fonttools-4.44.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6065578bdf96d4b69dd53d8b49ff02412b2a46d461b0d1ee5eddb81c3a953a46"}, + {file = "fonttools-4.44.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17702266ba92cef9a0d7418609f8f8b8e019192c62e8014f10b89a485af9d8ce"}, + {file = "fonttools-4.44.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c1d22a61a247262f178819f0331e0692e27c88be5770bf1c2404d0d52799f711"}, + {file = "fonttools-4.44.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:61b794e6a9208e7ee3abf11a9f56b9c1409967817dfd732f97b44812686cab1d"}, + {file = "fonttools-4.44.1-cp311-cp311-win32.whl", hash = "sha256:a02747ac741abe1fe994ac55b143432637d136e4a5a472e7a90574a015b57dc4"}, + {file = "fonttools-4.44.1-cp311-cp311-win_amd64.whl", hash = "sha256:8dd81470227c53ab78788f1b21b7e655b2c3aa66f0f670d9011f2deb64bed034"}, + {file = "fonttools-4.44.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:63efb6b66c275cb2c750576ed743f9995b92bcd733b72699599c6f74dce277c6"}, + {file = "fonttools-4.44.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:25504368ce3dbdc5df1e6bee1980674b60216c543ad2647c85333f8daf5e9dd2"}, + {file = "fonttools-4.44.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc4acf7f1684d234d788cbb1976fbced4e1ae7c51abaf4314e11d1d86498ba76"}, + {file = "fonttools-4.44.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6698abcbb43f68ecfe473169d5928adf0a09ab8e6439322f80bc10a80ab9195d"}, + {file = "fonttools-4.44.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:6dce674ba22419a9f3822f9c1b6bd823fce11d3a34372c580216167b6d9e232b"}, + {file = "fonttools-4.44.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8493c84ac86fdc5dde68b720959b79865cf5216a5c1ee9b4a161eac8c56dc310"}, + {file = "fonttools-4.44.1-cp312-cp312-win32.whl", hash = "sha256:a4a8734ddb91647d9545caae4dfb4633045c5dccb2fccb2d6c2a09424d975ef1"}, + {file = "fonttools-4.44.1-cp312-cp312-win_amd64.whl", hash = "sha256:7debaae9f267702ac4e89944bbfc4e55bc2d0ef891aa6c18d6afd9184a14554a"}, + {file = "fonttools-4.44.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:748d21764665209d5e0729ce8386fd01c92258699db732c7dbe4c9abf9e7c392"}, + {file = "fonttools-4.44.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:753de1235ac308111f80eacb9d92b328088adfec7147fd101692cc49ad53a3fe"}, + {file = "fonttools-4.44.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c142c11d28af532c7edddf191367d6acf2a2884bb4e2ba329c265f58ca865d0a"}, + {file = "fonttools-4.44.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6dd10d40028bf71e9604279875e4c258a36b2a42fff349fdf20141813d83cc61"}, + {file = "fonttools-4.44.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8e4961e26423ddd713672746c110e708c0094deae74493e21198d85f54f7d88c"}, + {file = "fonttools-4.44.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:af89a9370dc463ffed3010af6fad1aa58998ce5eb5d94c2c2688768e6b108cc8"}, + {file = "fonttools-4.44.1-cp38-cp38-win32.whl", hash = "sha256:6d2d0e0d64a21b07c30206d500f8e77f4beaf80e7cc0ffd65a304a9ae1c0e197"}, + {file = "fonttools-4.44.1-cp38-cp38-win_amd64.whl", hash = "sha256:dc16e26668ec2ae01a37ff8293ce0326cf8c043e24fcf86fc38e6c25ddd98926"}, + {file = "fonttools-4.44.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a04ad39ac67c523c9f8f102706ac05d7e5cee3148a3519c6afc6ffbb3f0af7aa"}, + {file = "fonttools-4.44.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:11e9cba26fd658a491c82fdf5dc5bdb8078ca69ca70ba5724f63a66d486fa8b3"}, + {file = "fonttools-4.44.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fa904fb50c9f1b3ffbe352c7c4ed35eb16558933f011ff74f86f33504358e4d"}, + {file = "fonttools-4.44.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:caf014bcc24673b681e7f768180f063691b301e2eccd9a53c43b5eebfb448bd8"}, + {file = "fonttools-4.44.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:97fb6f806694268d0c35abfc1f33662a1a96d12875a790b2b69d7b8d4fadbea5"}, + {file = "fonttools-4.44.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ac523156bf227f009102cf33c116bcc18d6b9a05ea9a3a6eaa57e3adb42620a9"}, + {file = "fonttools-4.44.1-cp39-cp39-win32.whl", hash = "sha256:50aacecec89ca07ba97a63a949f9b273ccbdc105602ec4426c8a9a143f9e6aa3"}, + {file = "fonttools-4.44.1-cp39-cp39-win_amd64.whl", hash = "sha256:994c62a46cb2cfd670edc360d87c902ee475790fbddb267abd9fd8a83199423a"}, + {file = "fonttools-4.44.1-py3-none-any.whl", hash = "sha256:e775851c6884c16ed3831e461a0d5e271d9ebcd05204122d3a21ca2465a5d8c1"}, + {file = "fonttools-4.44.1.tar.gz", hash = "sha256:0d8ed83815a125b25c10404736a2cd43d60eb6479fe2d68373418cd1822ec330"}, ] [package.extras] -all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0,<5)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.0.0)", "xattr", "zopfli (>=0.1.4)"] +all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0,<5)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0)", "xattr", "zopfli (>=0.1.4)"] graphite = ["lz4 (>=1.7.4.2)"] interpolatable = ["munkres", "scipy"] lxml = ["lxml (>=4.0,<5)"] @@ -515,7 +515,7 @@ repacker = ["uharfbuzz (>=0.23.0)"] symfont = ["sympy"] type1 = ["xattr"] ufo = ["fs (>=2.2.0,<3)"] -unicode = ["unicodedata2 (>=15.0.0)"] +unicode = ["unicodedata2 (>=15.1.0)"] woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] [[package]] @@ -591,70 +591,70 @@ six = "*" [[package]] name = "grpcio" -version = "1.59.0" +version = "1.59.2" description = "HTTP/2-based RPC framework" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "grpcio-1.59.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:225e5fa61c35eeaebb4e7491cd2d768cd8eb6ed00f2664fa83a58f29418b39fd"}, - {file = "grpcio-1.59.0-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:b95ec8ecc4f703f5caaa8d96e93e40c7f589bad299a2617bdb8becbcce525539"}, - {file = "grpcio-1.59.0-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:1a839ba86764cc48226f50b924216000c79779c563a301586a107bda9cbe9dcf"}, - {file = "grpcio-1.59.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f6cfe44a5d7c7d5f1017a7da1c8160304091ca5dc64a0f85bca0d63008c3137a"}, - {file = "grpcio-1.59.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d0fcf53df684fcc0154b1e61f6b4a8c4cf5f49d98a63511e3f30966feff39cd0"}, - {file = "grpcio-1.59.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa66cac32861500f280bb60fe7d5b3e22d68c51e18e65367e38f8669b78cea3b"}, - {file = "grpcio-1.59.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8cd2d38c2d52f607d75a74143113174c36d8a416d9472415eab834f837580cf7"}, - {file = "grpcio-1.59.0-cp310-cp310-win32.whl", hash = "sha256:228b91ce454876d7eed74041aff24a8f04c0306b7250a2da99d35dd25e2a1211"}, - {file = "grpcio-1.59.0-cp310-cp310-win_amd64.whl", hash = "sha256:ca87ee6183421b7cea3544190061f6c1c3dfc959e0b57a5286b108511fd34ff4"}, - {file = "grpcio-1.59.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:c173a87d622ea074ce79be33b952f0b424fa92182063c3bda8625c11d3585d09"}, - {file = "grpcio-1.59.0-cp311-cp311-macosx_10_10_universal2.whl", hash = "sha256:ec78aebb9b6771d6a1de7b6ca2f779a2f6113b9108d486e904bde323d51f5589"}, - {file = "grpcio-1.59.0-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:0b84445fa94d59e6806c10266b977f92fa997db3585f125d6b751af02ff8b9fe"}, - {file = "grpcio-1.59.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c251d22de8f9f5cca9ee47e4bade7c5c853e6e40743f47f5cc02288ee7a87252"}, - {file = "grpcio-1.59.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:956f0b7cb465a65de1bd90d5a7475b4dc55089b25042fe0f6c870707e9aabb1d"}, - {file = "grpcio-1.59.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:38da5310ef84e16d638ad89550b5b9424df508fd5c7b968b90eb9629ca9be4b9"}, - {file = "grpcio-1.59.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:63982150a7d598281fa1d7ffead6096e543ff8be189d3235dd2b5604f2c553e5"}, - {file = "grpcio-1.59.0-cp311-cp311-win32.whl", hash = "sha256:50eff97397e29eeee5df106ea1afce3ee134d567aa2c8e04fabab05c79d791a7"}, - {file = "grpcio-1.59.0-cp311-cp311-win_amd64.whl", hash = "sha256:15f03bd714f987d48ae57fe092cf81960ae36da4e520e729392a59a75cda4f29"}, - {file = "grpcio-1.59.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:f1feb034321ae2f718172d86b8276c03599846dc7bb1792ae370af02718f91c5"}, - {file = "grpcio-1.59.0-cp312-cp312-macosx_10_10_universal2.whl", hash = "sha256:d09bd2a4e9f5a44d36bb8684f284835c14d30c22d8ec92ce796655af12163588"}, - {file = "grpcio-1.59.0-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:2f120d27051e4c59db2f267b71b833796770d3ea36ca712befa8c5fff5da6ebd"}, - {file = "grpcio-1.59.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba0ca727a173ee093f49ead932c051af463258b4b493b956a2c099696f38aa66"}, - {file = "grpcio-1.59.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5711c51e204dc52065f4a3327dca46e69636a0b76d3e98c2c28c4ccef9b04c52"}, - {file = "grpcio-1.59.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:d74f7d2d7c242a6af9d4d069552ec3669965b74fed6b92946e0e13b4168374f9"}, - {file = "grpcio-1.59.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3859917de234a0a2a52132489c4425a73669de9c458b01c9a83687f1f31b5b10"}, - {file = "grpcio-1.59.0-cp312-cp312-win32.whl", hash = "sha256:de2599985b7c1b4ce7526e15c969d66b93687571aa008ca749d6235d056b7205"}, - {file = "grpcio-1.59.0-cp312-cp312-win_amd64.whl", hash = "sha256:598f3530231cf10ae03f4ab92d48c3be1fee0c52213a1d5958df1a90957e6a88"}, - {file = "grpcio-1.59.0-cp37-cp37m-linux_armv7l.whl", hash = "sha256:b34c7a4c31841a2ea27246a05eed8a80c319bfc0d3e644412ec9ce437105ff6c"}, - {file = "grpcio-1.59.0-cp37-cp37m-macosx_10_10_universal2.whl", hash = "sha256:c4dfdb49f4997dc664f30116af2d34751b91aa031f8c8ee251ce4dcfc11277b0"}, - {file = "grpcio-1.59.0-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:61bc72a00ecc2b79d9695220b4d02e8ba53b702b42411397e831c9b0589f08a3"}, - {file = "grpcio-1.59.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f367e4b524cb319e50acbdea57bb63c3b717c5d561974ace0b065a648bb3bad3"}, - {file = "grpcio-1.59.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:849c47ef42424c86af069a9c5e691a765e304079755d5c29eff511263fad9c2a"}, - {file = "grpcio-1.59.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c0488c2b0528e6072010182075615620071371701733c63ab5be49140ed8f7f0"}, - {file = "grpcio-1.59.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:611d9aa0017fa386809bddcb76653a5ab18c264faf4d9ff35cb904d44745f575"}, - {file = "grpcio-1.59.0-cp37-cp37m-win_amd64.whl", hash = "sha256:e5378785dce2b91eb2e5b857ec7602305a3b5cf78311767146464bfa365fc897"}, - {file = "grpcio-1.59.0-cp38-cp38-linux_armv7l.whl", hash = "sha256:fe976910de34d21057bcb53b2c5e667843588b48bf11339da2a75f5c4c5b4055"}, - {file = "grpcio-1.59.0-cp38-cp38-macosx_10_10_universal2.whl", hash = "sha256:c041a91712bf23b2a910f61e16565a05869e505dc5a5c025d429ca6de5de842c"}, - {file = "grpcio-1.59.0-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:0ae444221b2c16d8211b55326f8ba173ba8f8c76349bfc1768198ba592b58f74"}, - {file = "grpcio-1.59.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ceb1e68135788c3fce2211de86a7597591f0b9a0d2bb80e8401fd1d915991bac"}, - {file = "grpcio-1.59.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c4b1cc3a9dc1924d2eb26eec8792fedd4b3fcd10111e26c1d551f2e4eda79ce"}, - {file = "grpcio-1.59.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:871371ce0c0055d3db2a86fdebd1e1d647cf21a8912acc30052660297a5a6901"}, - {file = "grpcio-1.59.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:93e9cb546e610829e462147ce724a9cb108e61647a3454500438a6deef610be1"}, - {file = "grpcio-1.59.0-cp38-cp38-win32.whl", hash = "sha256:f21917aa50b40842b51aff2de6ebf9e2f6af3fe0971c31960ad6a3a2b24988f4"}, - {file = "grpcio-1.59.0-cp38-cp38-win_amd64.whl", hash = "sha256:14890da86a0c0e9dc1ea8e90101d7a3e0e7b1e71f4487fab36e2bfd2ecadd13c"}, - {file = "grpcio-1.59.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:34341d9e81a4b669a5f5dca3b2a760b6798e95cdda2b173e65d29d0b16692857"}, - {file = "grpcio-1.59.0-cp39-cp39-macosx_10_10_universal2.whl", hash = "sha256:986de4aa75646e963466b386a8c5055c8b23a26a36a6c99052385d6fe8aaf180"}, - {file = "grpcio-1.59.0-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:aca8a24fef80bef73f83eb8153f5f5a0134d9539b4c436a716256b311dda90a6"}, - {file = "grpcio-1.59.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:936b2e04663660c600d5173bc2cc84e15adbad9c8f71946eb833b0afc205b996"}, - {file = "grpcio-1.59.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc8bf2e7bc725e76c0c11e474634a08c8f24bcf7426c0c6d60c8f9c6e70e4d4a"}, - {file = "grpcio-1.59.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:81d86a096ccd24a57fa5772a544c9e566218bc4de49e8c909882dae9d73392df"}, - {file = "grpcio-1.59.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2ea95cd6abbe20138b8df965b4a8674ec312aaef3147c0f46a0bac661f09e8d0"}, - {file = "grpcio-1.59.0-cp39-cp39-win32.whl", hash = "sha256:3b8ff795d35a93d1df6531f31c1502673d1cebeeba93d0f9bd74617381507e3f"}, - {file = "grpcio-1.59.0-cp39-cp39-win_amd64.whl", hash = "sha256:38823bd088c69f59966f594d087d3a929d1ef310506bee9e3648317660d65b81"}, - {file = "grpcio-1.59.0.tar.gz", hash = "sha256:acf70a63cf09dd494000007b798aff88a436e1c03b394995ce450be437b8e54f"}, + {file = "grpcio-1.59.2-cp310-cp310-linux_armv7l.whl", hash = "sha256:d2fa68a96a30dd240be80bbad838a0ac81a61770611ff7952b889485970c4c71"}, + {file = "grpcio-1.59.2-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:cf0dead5a2c5a3347af2cfec7131d4f2a2e03c934af28989c9078f8241a491fa"}, + {file = "grpcio-1.59.2-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:e420ced29b5904cdf9ee5545e23f9406189d8acb6750916c2db4793dada065c6"}, + {file = "grpcio-1.59.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b230028a008ae1d0f430acb227d323ff8a619017415cf334c38b457f814119f"}, + {file = "grpcio-1.59.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a4a3833c0e067f3558538727235cd8a49709bff1003200bbdefa2f09334e4b1"}, + {file = "grpcio-1.59.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6b25ed37c27e652db01be341af93fbcea03d296c024d8a0e680017a268eb85dd"}, + {file = "grpcio-1.59.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:73abb8584b0cf74d37f5ef61c10722adc7275502ab71789a8fe3cb7ef04cf6e2"}, + {file = "grpcio-1.59.2-cp310-cp310-win32.whl", hash = "sha256:d6f70406695e3220f09cd7a2f879333279d91aa4a8a1d34303b56d61a8180137"}, + {file = "grpcio-1.59.2-cp310-cp310-win_amd64.whl", hash = "sha256:3c61d641d4f409c5ae46bfdd89ea42ce5ea233dcf69e74ce9ba32b503c727e29"}, + {file = "grpcio-1.59.2-cp311-cp311-linux_armv7l.whl", hash = "sha256:3059668df17627f0e0fa680e9ef8c995c946c792612e9518f5cc1503be14e90b"}, + {file = "grpcio-1.59.2-cp311-cp311-macosx_10_10_universal2.whl", hash = "sha256:72ca2399097c0b758198f2ff30f7178d680de8a5cfcf3d9b73a63cf87455532e"}, + {file = "grpcio-1.59.2-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:c978f864b35f2261e0819f5cd88b9830b04dc51bcf055aac3c601e525a10d2ba"}, + {file = "grpcio-1.59.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9411e24328a2302e279e70cae6e479f1fddde79629fcb14e03e6d94b3956eabf"}, + {file = "grpcio-1.59.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb7e0fe6ad73b7f06d7e2b689c19a71cf5cc48f0c2bf8608469e51ffe0bd2867"}, + {file = "grpcio-1.59.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c2504eed520958a5b77cc99458297cb7906308cb92327f35fb7fbbad4e9b2188"}, + {file = "grpcio-1.59.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2171c39f355ba5b551c5d5928d65aa6c69807fae195b86ef4a7d125bcdb860a9"}, + {file = "grpcio-1.59.2-cp311-cp311-win32.whl", hash = "sha256:d2794f0e68b3085d99b4f6ff9c089f6fdd02b32b9d3efdfbb55beac1bf22d516"}, + {file = "grpcio-1.59.2-cp311-cp311-win_amd64.whl", hash = "sha256:2067274c88bc6de89c278a672a652b4247d088811ece781a4858b09bdf8448e3"}, + {file = "grpcio-1.59.2-cp312-cp312-linux_armv7l.whl", hash = "sha256:535561990e075fa6bd4b16c4c3c1096b9581b7bb35d96fac4650f1181e428268"}, + {file = "grpcio-1.59.2-cp312-cp312-macosx_10_10_universal2.whl", hash = "sha256:a213acfbf186b9f35803b52e4ca9addb153fc0b67f82a48f961be7000ecf6721"}, + {file = "grpcio-1.59.2-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:6959fb07e8351e20501ffb8cc4074c39a0b7ef123e1c850a7f8f3afdc3a3da01"}, + {file = "grpcio-1.59.2-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e82c5cf1495244adf5252f925ac5932e5fd288b3e5ab6b70bec5593074b7236c"}, + {file = "grpcio-1.59.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:023088764012411affe7db183d1ada3ad9daf2e23ddc719ff46d7061de661340"}, + {file = "grpcio-1.59.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:da2d94c15f88cd40d7e67f7919d4f60110d2b9d5b1e08cf354c2be773ab13479"}, + {file = "grpcio-1.59.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:6009386a2df66159f64ac9f20425ae25229b29b9dd0e1d3dd60043f037e2ad7e"}, + {file = "grpcio-1.59.2-cp312-cp312-win32.whl", hash = "sha256:75c6ecb70e809cf1504465174343113f51f24bc61e22a80ae1c859f3f7034c6d"}, + {file = "grpcio-1.59.2-cp312-cp312-win_amd64.whl", hash = "sha256:cbe946b3e6e60a7b4618f091e62a029cb082b109a9d6b53962dd305087c6e4fd"}, + {file = "grpcio-1.59.2-cp37-cp37m-linux_armv7l.whl", hash = "sha256:f8753a6c88d1d0ba64302309eecf20f70d2770f65ca02d83c2452279085bfcd3"}, + {file = "grpcio-1.59.2-cp37-cp37m-macosx_10_10_universal2.whl", hash = "sha256:f1ef0d39bc1feb420caf549b3c657c871cad4ebbcf0580c4d03816b0590de0cf"}, + {file = "grpcio-1.59.2-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:4c93f4abbb54321ee6471e04a00139c80c754eda51064187963ddf98f5cf36a4"}, + {file = "grpcio-1.59.2-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:08d77e682f2bf730a4961eea330e56d2f423c6a9b91ca222e5b1eb24a357b19f"}, + {file = "grpcio-1.59.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ff16d68bf453275466a9a46739061a63584d92f18a0f5b33d19fc97eb69867c"}, + {file = "grpcio-1.59.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:4abb717e320e74959517dc8e84a9f48fbe90e9abe19c248541e9418b1ce60acd"}, + {file = "grpcio-1.59.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:36f53c2b3449c015880e7d55a89c992c357f176327b0d2873cdaaf9628a37c69"}, + {file = "grpcio-1.59.2-cp37-cp37m-win_amd64.whl", hash = "sha256:cc3e4cd087f07758b16bef8f31d88dbb1b5da5671d2f03685ab52dece3d7a16e"}, + {file = "grpcio-1.59.2-cp38-cp38-linux_armv7l.whl", hash = "sha256:27f879ae604a7fcf371e59fba6f3ff4635a4c2a64768bd83ff0cac503142fef4"}, + {file = "grpcio-1.59.2-cp38-cp38-macosx_10_10_universal2.whl", hash = "sha256:7cf05053242f61ba94014dd3a986e11a083400a32664058f80bf4cf817c0b3a1"}, + {file = "grpcio-1.59.2-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:e1727c1c0e394096bb9af185c6923e8ea55a5095b8af44f06903bcc0e06800a2"}, + {file = "grpcio-1.59.2-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5d573e70a6fe77555fb6143c12d3a7d3fa306632a3034b4e7c59ca09721546f8"}, + {file = "grpcio-1.59.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31176aa88f36020055ace9adff2405a33c8bdbfa72a9c4980e25d91b2f196873"}, + {file = "grpcio-1.59.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:11168ef43e4a43ff1b1a65859f3e0ef1a173e277349e7fb16923ff108160a8cd"}, + {file = "grpcio-1.59.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:53c9aa5ddd6857c0a1cd0287225a2a25873a8e09727c2e95c4aebb1be83a766a"}, + {file = "grpcio-1.59.2-cp38-cp38-win32.whl", hash = "sha256:3b4368b33908f683a363f376dfb747d40af3463a6e5044afee07cf9436addf96"}, + {file = "grpcio-1.59.2-cp38-cp38-win_amd64.whl", hash = "sha256:0a754aff9e3af63bdc4c75c234b86b9d14e14a28a30c4e324aed1a9b873d755f"}, + {file = "grpcio-1.59.2-cp39-cp39-linux_armv7l.whl", hash = "sha256:1f9524d1d701e399462d2c90ba7c193e49d1711cf429c0d3d97c966856e03d00"}, + {file = "grpcio-1.59.2-cp39-cp39-macosx_10_10_universal2.whl", hash = "sha256:f93dbf58f03146164048be5426ffde298b237a5e059144847e4940f5b80172c3"}, + {file = "grpcio-1.59.2-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:6da6dea3a1bacf99b3c2187e296db9a83029ed9c38fd4c52b7c9b7326d13c828"}, + {file = "grpcio-1.59.2-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c5f09cffa619adfb44799fa4a81c2a1ad77c887187613fb0a8f201ab38d89ba1"}, + {file = "grpcio-1.59.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c35aa9657f5d5116d23b934568e0956bd50c615127810fffe3ac356a914c176a"}, + {file = "grpcio-1.59.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:74100fecaec8a535e380cf5f2fb556ff84957d481c13e54051c52e5baac70541"}, + {file = "grpcio-1.59.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:128e20f57c5f27cb0157e73756d1586b83c1b513ebecc83ea0ac37e4b0e4e758"}, + {file = "grpcio-1.59.2-cp39-cp39-win32.whl", hash = "sha256:686e975a5d16602dc0982c7c703948d17184bd1397e16c8ee03511ecb8c4cdda"}, + {file = "grpcio-1.59.2-cp39-cp39-win_amd64.whl", hash = "sha256:242adc47725b9a499ee77c6a2e36688fa6c96484611f33b1be4c57ab075a92dd"}, + {file = "grpcio-1.59.2.tar.gz", hash = "sha256:d8f9cd4ad1be90b0cf350a2f04a38a36e44a026cac1e036ac593dc48efe91d52"}, ] [package.extras] -protobuf = ["grpcio-tools (>=1.59.0)"] +protobuf = ["grpcio-tools (>=1.59.2)"] [[package]] name = "h5py" @@ -762,14 +762,14 @@ testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs [[package]] name = "importlib-resources" -version = "6.1.0" +version = "6.1.1" description = "Read resources from Python packages" category = "main" optional = true python-versions = ">=3.8" files = [ - {file = "importlib_resources-6.1.0-py3-none-any.whl", hash = "sha256:aa50258bbfa56d4e33fbd8aa3ef48ded10d1735f11532b8df95388cc6bdb7e83"}, - {file = "importlib_resources-6.1.0.tar.gz", hash = "sha256:9d48dcccc213325e810fd723e7fbb45ccb39f6cf5c31f00cf2b965f5f10f3cb9"}, + {file = "importlib_resources-6.1.1-py3-none-any.whl", hash = "sha256:e8bf90d8213b486f428c9c39714b920041cb02c184686a3dee24905aaa8105d6"}, + {file = "importlib_resources-6.1.1.tar.gz", hash = "sha256:3893a00122eafde6894c59914446a512f728a0c1a45f9bb9b63721b6bacf0b4a"}, ] [package.dependencies] @@ -928,14 +928,14 @@ files = [ [[package]] name = "markdown" -version = "3.5" +version = "3.5.1" description = "Python implementation of John Gruber's Markdown." category = "main" optional = false python-versions = ">=3.8" files = [ - {file = "Markdown-3.5-py3-none-any.whl", hash = "sha256:4afb124395ce5fc34e6d9886dab977fd9ae987fc6e85689f08278cf0c69d4bf3"}, - {file = "Markdown-3.5.tar.gz", hash = "sha256:a807eb2e4778d9156c8f07876c6e4d50b5494c5665c4834f67b06459dfd877b3"}, + {file = "Markdown-3.5.1-py3-none-any.whl", hash = "sha256:5874b47d4ee3f0b14d764324d2c94c03ea66bee56f2d929da9f2508d65e722dc"}, + {file = "Markdown-3.5.1.tar.gz", hash = "sha256:b65d7beb248dc22f2e8a31fb706d93798093c308dc1aba295aedeb9d41a813bd"}, ] [package.dependencies] @@ -1410,14 +1410,14 @@ tests = ["flake8", "mypy"] [[package]] name = "pytest-xdist" -version = "3.3.1" +version = "3.4.0" description = "pytest xdist plugin for distributed testing, most importantly across multiple CPUs" category = "main" optional = true python-versions = ">=3.7" files = [ - {file = "pytest-xdist-3.3.1.tar.gz", hash = "sha256:d5ee0520eb1b7bcca50a60a518ab7a7707992812c578198f8b44fdfac78e8c93"}, - {file = "pytest_xdist-3.3.1-py3-none-any.whl", hash = "sha256:ff9daa7793569e6a68544850fd3927cd257cc03a7ef76c95e86915355e82b5f2"}, + {file = "pytest-xdist-3.4.0.tar.gz", hash = "sha256:3a94a931dd9e268e0b871a877d09fe2efb6175c2c23d60d56a6001359002b832"}, + {file = "pytest_xdist-3.4.0-py3-none-any.whl", hash = "sha256:e513118bf787677a427e025606f55e95937565e06dfaac8d87f55301e57ae607"}, ] [package.dependencies] @@ -1728,19 +1728,18 @@ files = [ [[package]] name = "urllib3" -version = "2.0.7" +version = "2.1.0" description = "HTTP library with thread-safe connection pooling, file post, and more." category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "urllib3-2.0.7-py3-none-any.whl", hash = "sha256:fdb6d215c776278489906c2f8916e6e7d4f5a9b602ccbcfdf7f016fc8da0596e"}, - {file = "urllib3-2.0.7.tar.gz", hash = "sha256:c97dfde1f7bd43a71c8d2a58e369e9b2bf692d1334ea9f9cae55add7d0dd0f84"}, + {file = "urllib3-2.1.0-py3-none-any.whl", hash = "sha256:55901e917a5896a349ff771be919f8bd99aff50b79fe58fec595eb37bbc56bb3"}, + {file = "urllib3-2.1.0.tar.gz", hash = "sha256:df7aa8afb0148fa78488e7899b2c59b5f4ffcfa82e6c54ccb9dd37c1d7b52d54"}, ] [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)"] @@ -1764,14 +1763,14 @@ watchdog = ["watchdog (>=2.3)"] [[package]] name = "wheel" -version = "0.41.2" +version = "0.41.3" description = "A built-package format for Python" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "wheel-0.41.2-py3-none-any.whl", hash = "sha256:75909db2664838d015e3d9139004ee16711748a52c8f336b52882266540215d8"}, - {file = "wheel-0.41.2.tar.gz", hash = "sha256:0c5ac5ff2afb79ac23ab82bab027a0be7b5dbcf2e54dc50efe4bf507de1f7985"}, + {file = "wheel-0.41.3-py3-none-any.whl", hash = "sha256:488609bc63a29322326e05560731bf7bfea8e48ad646e1f5e40d366607de0942"}, + {file = "wheel-0.41.3.tar.gz", hash = "sha256:4d4987ce51a49370ea65c0bfd2234e8ce80a12780820d9dc462597a6e60d0841"}, ] [package.extras] @@ -1779,87 +1778,82 @@ test = ["pytest (>=6.0.0)", "setuptools (>=65)"] [[package]] name = "wrapt" -version = "1.15.0" +version = "1.16.0" description = "Module for decorators, wrappers and monkey patching." category = "main" 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"}, +python-versions = ">=3.6" +files = [ + {file = "wrapt-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ffa565331890b90056c01db69c0fe634a776f8019c143a5ae265f9c6bc4bd6d4"}, + {file = "wrapt-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e4fdb9275308292e880dcbeb12546df7f3e0f96c6b41197e0cf37d2826359020"}, + {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb2dee3874a500de01c93d5c71415fcaef1d858370d405824783e7a8ef5db440"}, + {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2a88e6010048489cda82b1326889ec075a8c856c2e6a256072b28eaee3ccf487"}, + {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac83a914ebaf589b69f7d0a1277602ff494e21f4c2f743313414378f8f50a4cf"}, + {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:73aa7d98215d39b8455f103de64391cb79dfcad601701a3aa0dddacf74911d72"}, + {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:807cc8543a477ab7422f1120a217054f958a66ef7314f76dd9e77d3f02cdccd0"}, + {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bf5703fdeb350e36885f2875d853ce13172ae281c56e509f4e6eca049bdfb136"}, + {file = "wrapt-1.16.0-cp310-cp310-win32.whl", hash = "sha256:f6b2d0c6703c988d334f297aa5df18c45e97b0af3679bb75059e0e0bd8b1069d"}, + {file = "wrapt-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:decbfa2f618fa8ed81c95ee18a387ff973143c656ef800c9f24fb7e9c16054e2"}, + {file = "wrapt-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1a5db485fe2de4403f13fafdc231b0dbae5eca4359232d2efc79025527375b09"}, + {file = "wrapt-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:75ea7d0ee2a15733684badb16de6794894ed9c55aa5e9903260922f0482e687d"}, + {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a452f9ca3e3267cd4d0fcf2edd0d035b1934ac2bd7e0e57ac91ad6b95c0c6389"}, + {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:43aa59eadec7890d9958748db829df269f0368521ba6dc68cc172d5d03ed8060"}, + {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72554a23c78a8e7aa02abbd699d129eead8b147a23c56e08d08dfc29cfdddca1"}, + {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d2efee35b4b0a347e0d99d28e884dfd82797852d62fcd7ebdeee26f3ceb72cf3"}, + {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6dcfcffe73710be01d90cae08c3e548d90932d37b39ef83969ae135d36ef3956"}, + {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:eb6e651000a19c96f452c85132811d25e9264d836951022d6e81df2fff38337d"}, + {file = "wrapt-1.16.0-cp311-cp311-win32.whl", hash = "sha256:66027d667efe95cc4fa945af59f92c5a02c6f5bb6012bff9e60542c74c75c362"}, + {file = "wrapt-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:aefbc4cb0a54f91af643660a0a150ce2c090d3652cf4052a5397fb2de549cd89"}, + {file = "wrapt-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5eb404d89131ec9b4f748fa5cfb5346802e5ee8836f57d516576e61f304f3b7b"}, + {file = "wrapt-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9090c9e676d5236a6948330e83cb89969f433b1943a558968f659ead07cb3b36"}, + {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94265b00870aa407bd0cbcfd536f17ecde43b94fb8d228560a1e9d3041462d73"}, + {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2058f813d4f2b5e3a9eb2eb3faf8f1d99b81c3e51aeda4b168406443e8ba809"}, + {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98b5e1f498a8ca1858a1cdbffb023bfd954da4e3fa2c0cb5853d40014557248b"}, + {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:14d7dc606219cdd7405133c713f2c218d4252f2a469003f8c46bb92d5d095d81"}, + {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:49aac49dc4782cb04f58986e81ea0b4768e4ff197b57324dcbd7699c5dfb40b9"}, + {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:418abb18146475c310d7a6dc71143d6f7adec5b004ac9ce08dc7a34e2babdc5c"}, + {file = "wrapt-1.16.0-cp312-cp312-win32.whl", hash = "sha256:685f568fa5e627e93f3b52fda002c7ed2fa1800b50ce51f6ed1d572d8ab3e7fc"}, + {file = "wrapt-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:dcdba5c86e368442528f7060039eda390cc4091bfd1dca41e8046af7c910dda8"}, + {file = "wrapt-1.16.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d462f28826f4657968ae51d2181a074dfe03c200d6131690b7d65d55b0f360f8"}, + {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a33a747400b94b6d6b8a165e4480264a64a78c8a4c734b62136062e9a248dd39"}, + {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3646eefa23daeba62643a58aac816945cadc0afaf21800a1421eeba5f6cfb9c"}, + {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ebf019be5c09d400cf7b024aa52b1f3aeebeff51550d007e92c3c1c4afc2a40"}, + {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:0d2691979e93d06a95a26257adb7bfd0c93818e89b1406f5a28f36e0d8c1e1fc"}, + {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:1acd723ee2a8826f3d53910255643e33673e1d11db84ce5880675954183ec47e"}, + {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:bc57efac2da352a51cc4658878a68d2b1b67dbe9d33c36cb826ca449d80a8465"}, + {file = "wrapt-1.16.0-cp36-cp36m-win32.whl", hash = "sha256:da4813f751142436b075ed7aa012a8778aa43a99f7b36afe9b742d3ed8bdc95e"}, + {file = "wrapt-1.16.0-cp36-cp36m-win_amd64.whl", hash = "sha256:6f6eac2360f2d543cc875a0e5efd413b6cbd483cb3ad7ebf888884a6e0d2e966"}, + {file = "wrapt-1.16.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a0ea261ce52b5952bf669684a251a66df239ec6d441ccb59ec7afa882265d593"}, + {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bd2d7ff69a2cac767fbf7a2b206add2e9a210e57947dd7ce03e25d03d2de292"}, + {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9159485323798c8dc530a224bd3ffcf76659319ccc7bbd52e01e73bd0241a0c5"}, + {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a86373cf37cd7764f2201b76496aba58a52e76dedfaa698ef9e9688bfd9e41cf"}, + {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:73870c364c11f03ed072dda68ff7aea6d2a3a5c3fe250d917a429c7432e15228"}, + {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b935ae30c6e7400022b50f8d359c03ed233d45b725cfdd299462f41ee5ffba6f"}, + {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:db98ad84a55eb09b3c32a96c576476777e87c520a34e2519d3e59c44710c002c"}, + {file = "wrapt-1.16.0-cp37-cp37m-win32.whl", hash = "sha256:9153ed35fc5e4fa3b2fe97bddaa7cbec0ed22412b85bcdaf54aeba92ea37428c"}, + {file = "wrapt-1.16.0-cp37-cp37m-win_amd64.whl", hash = "sha256:66dfbaa7cfa3eb707bbfcd46dab2bc6207b005cbc9caa2199bcbc81d95071a00"}, + {file = "wrapt-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1dd50a2696ff89f57bd8847647a1c363b687d3d796dc30d4dd4a9d1689a706f0"}, + {file = "wrapt-1.16.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:44a2754372e32ab315734c6c73b24351d06e77ffff6ae27d2ecf14cf3d229202"}, + {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e9723528b9f787dc59168369e42ae1c3b0d3fadb2f1a71de14531d321ee05b0"}, + {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dbed418ba5c3dce92619656802cc5355cb679e58d0d89b50f116e4a9d5a9603e"}, + {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:941988b89b4fd6b41c3f0bfb20e92bd23746579736b7343283297c4c8cbae68f"}, + {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6a42cd0cfa8ffc1915aef79cb4284f6383d8a3e9dcca70c445dcfdd639d51267"}, + {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1ca9b6085e4f866bd584fb135a041bfc32cab916e69f714a7d1d397f8c4891ca"}, + {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d5e49454f19ef621089e204f862388d29e6e8d8b162efce05208913dde5b9ad6"}, + {file = "wrapt-1.16.0-cp38-cp38-win32.whl", hash = "sha256:c31f72b1b6624c9d863fc095da460802f43a7c6868c5dda140f51da24fd47d7b"}, + {file = "wrapt-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:490b0ee15c1a55be9c1bd8609b8cecd60e325f0575fc98f50058eae366e01f41"}, + {file = "wrapt-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9b201ae332c3637a42f02d1045e1d0cccfdc41f1f2f801dafbaa7e9b4797bfc2"}, + {file = "wrapt-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2076fad65c6736184e77d7d4729b63a6d1ae0b70da4868adeec40989858eb3fb"}, + {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5cd603b575ebceca7da5a3a251e69561bec509e0b46e4993e1cac402b7247b8"}, + {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b47cfad9e9bbbed2339081f4e346c93ecd7ab504299403320bf85f7f85c7d46c"}, + {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8212564d49c50eb4565e502814f694e240c55551a5f1bc841d4fcaabb0a9b8a"}, + {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5f15814a33e42b04e3de432e573aa557f9f0f56458745c2074952f564c50e664"}, + {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db2e408d983b0e61e238cf579c09ef7020560441906ca990fe8412153e3b291f"}, + {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:edfad1d29c73f9b863ebe7082ae9321374ccb10879eeabc84ba3b69f2579d537"}, + {file = "wrapt-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed867c42c268f876097248e05b6117a65bcd1e63b779e916fe2e33cd6fd0d3c3"}, + {file = "wrapt-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:eb1b046be06b0fce7249f1d025cd359b4b80fc1c3e24ad9eca33e0dcdb2e4a35"}, + {file = "wrapt-1.16.0-py3-none-any.whl", hash = "sha256:6906c4100a8fcbf2fa735f6059214bb13b97f75b1a61777fcf6432121ef12ef1"}, + {file = "wrapt-1.16.0.tar.gz", hash = "sha256:5f370f952971e7d17c7d1ead40e49f32345a7f7a5373571ef44d800d06b1899d"}, ] [[package]] diff --git a/pyproject.toml b/pyproject.toml index 1297be8..9bc9513 100755 --- a/pyproject.toml +++ b/pyproject.toml @@ -72,6 +72,7 @@ classifiers = [ # ~1 >=1.0.0 <2.0.0 [tool.poetry.dependencies] +# no extensive tests for > 3.8 (ie 3.9, 3.10, 3.11) python = "~3.8" cython = "^3.0.2" From f550b5cae9ccec359676f28611000212d595ee1d Mon Sep 17 00:00:00 2001 From: konstantinos Date: Tue, 14 Nov 2023 23:13:06 +0200 Subject: [PATCH 06/39] build(docs): poetry add mkdocs --optional -E docs --- poetry.lock | 207 ++++++++++++++++++++++++++++++++++++++++++++++++- pyproject.toml | 1 + 2 files changed, 207 insertions(+), 1 deletion(-) diff --git a/poetry.lock b/poetry.lock index 2f7c325..f94310e 100644 --- a/poetry.lock +++ b/poetry.lock @@ -791,6 +791,24 @@ files = [ {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, ] +[[package]] +name = "jinja2" +version = "3.1.2" +description = "A very fast and expressive template engine." +category = "main" +optional = true +python-versions = ">=3.7" +files = [ + {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, + {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, +] + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + [[package]] name = "keras-preprocessing" version = "1.1.2" @@ -1085,6 +1103,50 @@ pyparsing = ">=2.3.1" python-dateutil = ">=2.7" setuptools_scm = ">=7" +[[package]] +name = "mergedeep" +version = "1.3.4" +description = "A deep merge function for 🐍." +category = "main" +optional = true +python-versions = ">=3.6" +files = [ + {file = "mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307"}, + {file = "mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8"}, +] + +[[package]] +name = "mkdocs" +version = "1.5.3" +description = "Project documentation with Markdown." +category = "main" +optional = true +python-versions = ">=3.7" +files = [ + {file = "mkdocs-1.5.3-py3-none-any.whl", hash = "sha256:3b3a78e736b31158d64dbb2f8ba29bd46a379d0c6e324c2246c3bc3d2189cfc1"}, + {file = "mkdocs-1.5.3.tar.gz", hash = "sha256:eb7c99214dcb945313ba30426c2451b735992c73c2e10838f76d09e39ff4d0e2"}, +] + +[package.dependencies] +click = ">=7.0" +colorama = {version = ">=0.4", markers = "platform_system == \"Windows\""} +ghp-import = ">=1.0" +importlib-metadata = {version = ">=4.3", markers = "python_version < \"3.10\""} +jinja2 = ">=2.11.1" +markdown = ">=3.2.1" +markupsafe = ">=2.0.1" +mergedeep = ">=1.3.4" +packaging = ">=20.5" +pathspec = ">=0.11.1" +platformdirs = ">=2.2.0" +pyyaml = ">=5.1" +pyyaml-env-tag = ">=0.1" +watchdog = ">=2.0" + +[package.extras] +i18n = ["babel (>=2.9.0)"] +min-versions = ["babel (==2.9.0)", "click (==7.0)", "colorama (==0.4)", "ghp-import (==1.0)", "importlib-metadata (==4.3)", "jinja2 (==2.11.1)", "markdown (==3.2.1)", "markupsafe (==2.0.1)", "mergedeep (==1.3.4)", "packaging (==20.5)", "pathspec (==0.11.1)", "platformdirs (==2.2.0)", "pyyaml (==5.1)", "pyyaml-env-tag (==0.1)", "typing-extensions (==3.10)", "watchdog (==2.0)"] + [[package]] name = "numpy" version = "1.21.6" @@ -1174,6 +1236,18 @@ files = [ {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 = "main" +optional = true +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 = "pillow" version = "10.1.0" @@ -1242,6 +1316,22 @@ files = [ docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"] tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] +[[package]] +name = "platformdirs" +version = "4.0.0" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +category = "main" +optional = true +python-versions = ">=3.7" +files = [ + {file = "platformdirs-4.0.0-py3-none-any.whl", hash = "sha256:118c954d7e949b35437270383a3f2531e99dd93cf7ce4dc8340d3356d30f173b"}, + {file = "platformdirs-4.0.0.tar.gz", hash = "sha256:cb633b2bcf10c51af60beb0ab06d2f1d69064b43abf4c185ca6b28865f3f9731"}, +] + +[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" @@ -1444,6 +1534,81 @@ files = [ [package.dependencies] six = ">=1.5" +[[package]] +name = "pyyaml" +version = "6.0.1" +description = "YAML parser and emitter for Python" +category = "main" +optional = true +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 = "pyyaml-env-tag" +version = "0.1" +description = "A custom YAML tag for referencing environment variables in YAML files. " +category = "main" +optional = true +python-versions = ">=3.6" +files = [ + {file = "pyyaml_env_tag-0.1-py3-none-any.whl", hash = "sha256:af31106dec8a4d68c60207c1886031cbf839b68aa7abccdb19868200532c2069"}, + {file = "pyyaml_env_tag-0.1.tar.gz", hash = "sha256:70092675bda14fdec33b31ba77e7543de9ddc88f2e5b99160396572d11525bdb"}, +] + +[package.dependencies] +pyyaml = "*" + [[package]] name = "requests" version = "2.31.0" @@ -1743,6 +1908,46 @@ brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] zstd = ["zstandard (>=0.18.0)"] +[[package]] +name = "watchdog" +version = "3.0.0" +description = "Filesystem events monitoring" +category = "main" +optional = true +python-versions = ">=3.7" +files = [ + {file = "watchdog-3.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:336adfc6f5cc4e037d52db31194f7581ff744b67382eb6021c868322e32eef41"}, + {file = "watchdog-3.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a70a8dcde91be523c35b2bf96196edc5730edb347e374c7de7cd20c43ed95397"}, + {file = "watchdog-3.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:adfdeab2da79ea2f76f87eb42a3ab1966a5313e5a69a0213a3cc06ef692b0e96"}, + {file = "watchdog-3.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2b57a1e730af3156d13b7fdddfc23dea6487fceca29fc75c5a868beed29177ae"}, + {file = "watchdog-3.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7ade88d0d778b1b222adebcc0927428f883db07017618a5e684fd03b83342bd9"}, + {file = "watchdog-3.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7e447d172af52ad204d19982739aa2346245cc5ba6f579d16dac4bfec226d2e7"}, + {file = "watchdog-3.0.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:9fac43a7466eb73e64a9940ac9ed6369baa39b3bf221ae23493a9ec4d0022674"}, + {file = "watchdog-3.0.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8ae9cda41fa114e28faf86cb137d751a17ffd0316d1c34ccf2235e8a84365c7f"}, + {file = "watchdog-3.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:25f70b4aa53bd743729c7475d7ec41093a580528b100e9a8c5b5efe8899592fc"}, + {file = "watchdog-3.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4f94069eb16657d2c6faada4624c39464f65c05606af50bb7902e036e3219be3"}, + {file = "watchdog-3.0.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7c5f84b5194c24dd573fa6472685b2a27cc5a17fe5f7b6fd40345378ca6812e3"}, + {file = "watchdog-3.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3aa7f6a12e831ddfe78cdd4f8996af9cf334fd6346531b16cec61c3b3c0d8da0"}, + {file = "watchdog-3.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:233b5817932685d39a7896b1090353fc8efc1ef99c9c054e46c8002561252fb8"}, + {file = "watchdog-3.0.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:13bbbb462ee42ec3c5723e1205be8ced776f05b100e4737518c67c8325cf6100"}, + {file = "watchdog-3.0.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:8f3ceecd20d71067c7fd4c9e832d4e22584318983cabc013dbf3f70ea95de346"}, + {file = "watchdog-3.0.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c9d8c8ec7efb887333cf71e328e39cffbf771d8f8f95d308ea4125bf5f90ba64"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:0e06ab8858a76e1219e68c7573dfeba9dd1c0219476c5a44d5333b01d7e1743a"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:d00e6be486affb5781468457b21a6cbe848c33ef43f9ea4a73b4882e5f188a44"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:c07253088265c363d1ddf4b3cdb808d59a0468ecd017770ed716991620b8f77a"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:5113334cf8cf0ac8cd45e1f8309a603291b614191c9add34d33075727a967709"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:51f90f73b4697bac9c9a78394c3acbbd331ccd3655c11be1a15ae6fe289a8c83"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:ba07e92756c97e3aca0912b5cbc4e5ad802f4557212788e72a72a47ff376950d"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:d429c2430c93b7903914e4db9a966c7f2b068dd2ebdd2fa9b9ce094c7d459f33"}, + {file = "watchdog-3.0.0-py3-none-win32.whl", hash = "sha256:3ed7c71a9dccfe838c2f0b6314ed0d9b22e77d268c67e015450a29036a81f60f"}, + {file = "watchdog-3.0.0-py3-none-win_amd64.whl", hash = "sha256:4c9956d27be0bb08fc5f30d9d0179a855436e655f046d288e2bcc11adfae893c"}, + {file = "watchdog-3.0.0-py3-none-win_ia64.whl", hash = "sha256:5d9f3a10e02d7371cd929b5d8f11e87d4bad890212ed3901f9b4d68767bee759"}, + {file = "watchdog-3.0.0.tar.gz", hash = "sha256:4d98a320595da7a7c5a18fc48cb633c2e73cda78f93cac2ef42d42bf609a33f9"}, +] + +[package.extras] +watchmedo = ["PyYAML (>=3.10)"] + [[package]] name = "werkzeug" version = "3.0.1" @@ -1879,4 +2084,4 @@ test = ["pytest", "pytest-click", "pytest-cov", "pytest-explicit", "pytest-xdist [metadata] lock-version = "2.0" python-versions = "~3.8" -content-hash = "5bc04aa794a8762311a3f4d2abbd5706d1ce6f30806a14c5e141cee204ada5df" +content-hash = "098e580fff4065074d5a9d5554c23dc81da74af9381e471f4cf85b5eb827c4a9" diff --git a/pyproject.toml b/pyproject.toml index 9bc9513..d09190d 100755 --- a/pyproject.toml +++ b/pyproject.toml @@ -98,6 +98,7 @@ pytest-xdist = {version = "^3.3.1", optional = true} # Support running a tkinter GUI client matplotlib = {version = "~3.7", optional = true} +mkdocs = {version = "^1.5.3", optional = true, extras = ["docs"]} [tool.poetry.extras] From 97cd418c05376b2fc3129770fb594da155fb0b95 Mon Sep 17 00:00:00 2001 From: konstantinos Date: Tue, 14 Nov 2023 23:15:18 +0200 Subject: [PATCH 07/39] build(docs): manually populate the tool.poetry.extras.docs list in pyproject and do `poetry lock` --- poetry.lock | 21 ++++++++++++++++++++- pyproject.toml | 8 ++++++-- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/poetry.lock b/poetry.lock index f94310e..bac6602 100644 --- a/poetry.lock +++ b/poetry.lock @@ -530,6 +530,24 @@ files = [ {file = "gast-0.3.3.tar.gz", hash = "sha256:b881ef288a49aa81440d2c5eb8aeefd4c2bb8993d5f50edae7413a85bfdb3b57"}, ] +[[package]] +name = "ghp-import" +version = "2.1.0" +description = "Copy your docs directly to the gh-pages branch." +category = "main" +optional = true +python-versions = "*" +files = [ + {file = "ghp-import-2.1.0.tar.gz", hash = "sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343"}, + {file = "ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619"}, +] + +[package.dependencies] +python-dateutil = ">=2.8.1" + +[package.extras] +dev = ["flake8", "markdown", "twine", "wheel"] + [[package]] name = "google-auth" version = "1.35.0" @@ -2078,10 +2096,11 @@ docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.link testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy (>=0.9.1)", "pytest-ruff"] [extras] +docs = ["mkdocs"] gui = ["matplotlib"] test = ["pytest", "pytest-click", "pytest-cov", "pytest-explicit", "pytest-xdist"] [metadata] lock-version = "2.0" python-versions = "~3.8" -content-hash = "098e580fff4065074d5a9d5554c23dc81da74af9381e471f4cf85b5eb827c4a9" +content-hash = "11d44cc323d1e9da1c0cbe8014eb09aadb4db4e6e1cad0098dbf3c81abe0e945" diff --git a/pyproject.toml b/pyproject.toml index d09190d..5f0bc92 100755 --- a/pyproject.toml +++ b/pyproject.toml @@ -98,7 +98,9 @@ pytest-xdist = {version = "^3.3.1", optional = true} # Support running a tkinter GUI client matplotlib = {version = "~3.7", optional = true} -mkdocs = {version = "^1.5.3", optional = true, extras = ["docs"]} + +# DOCS +mkdocs = {version = "^1.5.3", optional = true} [tool.poetry.extras] @@ -112,7 +114,9 @@ test = [ gui = [ "matplotlib", ] - +docs = [ + "mkdocs", +] # CLI / ENTRYPOINTS [tool.poetry.scripts] From c09ed08e9224b14bd214b076f58abb5443da0e4b Mon Sep 17 00:00:00 2001 From: konstantinos Date: Tue, 14 Nov 2023 23:45:25 +0200 Subject: [PATCH 08/39] build(docs): poetry add mkdocs-click --optional -E docs --- poetry.lock | 18 +++++++++++++++++- pyproject.toml | 1 + 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/poetry.lock b/poetry.lock index bac6602..0cafa60 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1165,6 +1165,22 @@ watchdog = ">=2.0" i18n = ["babel (>=2.9.0)"] min-versions = ["babel (==2.9.0)", "click (==7.0)", "colorama (==0.4)", "ghp-import (==1.0)", "importlib-metadata (==4.3)", "jinja2 (==2.11.1)", "markdown (==3.2.1)", "markupsafe (==2.0.1)", "mergedeep (==1.3.4)", "packaging (==20.5)", "pathspec (==0.11.1)", "platformdirs (==2.2.0)", "pyyaml (==5.1)", "pyyaml-env-tag (==0.1)", "typing-extensions (==3.10)", "watchdog (==2.0)"] +[[package]] +name = "mkdocs-click" +version = "0.8.1" +description = "An MkDocs extension to generate documentation for Click command line applications" +category = "main" +optional = true +python-versions = ">=3.7" +files = [ + {file = "mkdocs_click-0.8.1-py3-none-any.whl", hash = "sha256:a100ff938be63911f86465a1c21d29a669a7c51932b700fdb3daa90d13b61ee4"}, + {file = "mkdocs_click-0.8.1.tar.gz", hash = "sha256:0a88cce04870c5d70ff63138e2418219c3c4119cc928a59c66b76eb5214edba6"}, +] + +[package.dependencies] +click = ">=8.1" +markdown = ">=3.3" + [[package]] name = "numpy" version = "1.21.6" @@ -2103,4 +2119,4 @@ test = ["pytest", "pytest-click", "pytest-cov", "pytest-explicit", "pytest-xdist [metadata] lock-version = "2.0" python-versions = "~3.8" -content-hash = "11d44cc323d1e9da1c0cbe8014eb09aadb4db4e6e1cad0098dbf3c81abe0e945" +content-hash = "a3ba96ae68236b2bf694439ec77e62b7225cfb44ad309167f59a16d6aa2ea1a8" diff --git a/pyproject.toml b/pyproject.toml index 5f0bc92..8d9d84d 100755 --- a/pyproject.toml +++ b/pyproject.toml @@ -101,6 +101,7 @@ matplotlib = {version = "~3.7", optional = true} # DOCS mkdocs = {version = "^1.5.3", optional = true} +mkdocs-click = {version = "^0.8.1", optional = true, extras = ["docs"]} [tool.poetry.extras] From a019a68f0caff9b851982ef7bbbe746dd82e4970 Mon Sep 17 00:00:00 2001 From: konstantinos Date: Tue, 14 Nov 2023 23:47:00 +0200 Subject: [PATCH 09/39] build(docs): manually populate the tool.poetry.extras.docs list in pyproject and do `poetry lock` --- poetry.lock | 4 ++-- pyproject.toml | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/poetry.lock b/poetry.lock index 0cafa60..9b59cdf 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2112,11 +2112,11 @@ docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.link testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy (>=0.9.1)", "pytest-ruff"] [extras] -docs = ["mkdocs"] +docs = ["mkdocs", "mkdocs-click"] gui = ["matplotlib"] test = ["pytest", "pytest-click", "pytest-cov", "pytest-explicit", "pytest-xdist"] [metadata] lock-version = "2.0" python-versions = "~3.8" -content-hash = "a3ba96ae68236b2bf694439ec77e62b7225cfb44ad309167f59a16d6aa2ea1a8" +content-hash = "be9e0017256a42966bf10aa49b9625406c97d214ad07bbd4eae56c6ac39a66f3" diff --git a/pyproject.toml b/pyproject.toml index 8d9d84d..4e5e747 100755 --- a/pyproject.toml +++ b/pyproject.toml @@ -101,7 +101,7 @@ matplotlib = {version = "~3.7", optional = true} # DOCS mkdocs = {version = "^1.5.3", optional = true} -mkdocs-click = {version = "^0.8.1", optional = true, extras = ["docs"]} +mkdocs-click = {version = "^0.8.1", optional = true} [tool.poetry.extras] @@ -117,6 +117,7 @@ gui = [ ] docs = [ "mkdocs", + "mkdocs-click", ] # CLI / ENTRYPOINTS From 9005035397eebed4f1aaf36e3267b8b1d39e00e2 Mon Sep 17 00:00:00 2001 From: konstantinos Date: Tue, 14 Nov 2023 23:57:04 +0200 Subject: [PATCH 10/39] build(docs): poetry add mkdocs-material --optional -E docs --- poetry.lock | 217 ++++++++++++++++++++++++++++++++++++++++++++++++- pyproject.toml | 1 + 2 files changed, 217 insertions(+), 1 deletion(-) diff --git a/poetry.lock b/poetry.lock index 9b59cdf..5d63fd9 100644 --- a/poetry.lock +++ b/poetry.lock @@ -47,6 +47,24 @@ docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib- tests = ["attrs[tests-no-zope]", "zope-interface"] tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +[[package]] +name = "babel" +version = "2.13.1" +description = "Internationalization utilities" +category = "main" +optional = true +python-versions = ">=3.7" +files = [ + {file = "Babel-2.13.1-py3-none-any.whl", hash = "sha256:7077a4984b02b6727ac10f1f7294484f737443d7e2e66c5e4380e41a3ae0b4ed"}, + {file = "Babel-2.13.1.tar.gz", hash = "sha256:33e0952d7dd6374af8dbf6768cc4ddf3ccfefc244f9986d4074704f2fbd18900"}, +] + +[package.dependencies] +pytz = {version = ">=2015.7", markers = "python_version < \"3.9\""} + +[package.extras] +dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"] + [[package]] name = "cachetools" version = "4.2.4" @@ -1181,6 +1199,48 @@ files = [ click = ">=8.1" markdown = ">=3.3" +[[package]] +name = "mkdocs-material" +version = "9.4.8" +description = "Documentation that simply works" +category = "main" +optional = true +python-versions = ">=3.8" +files = [ + {file = "mkdocs_material-9.4.8-py3-none-any.whl", hash = "sha256:8b20f6851bddeef37dced903893cd176cf13a21a482e97705a103c45f06ce9b9"}, + {file = "mkdocs_material-9.4.8.tar.gz", hash = "sha256:f0c101453e8bc12b040e8b64ca39a405d950d8402609b1378cc2b98976e74b5f"}, +] + +[package.dependencies] +babel = ">=2.10,<3.0" +colorama = ">=0.4,<1.0" +jinja2 = ">=3.0,<4.0" +markdown = ">=3.2,<4.0" +mkdocs = ">=1.5.3,<2.0" +mkdocs-material-extensions = ">=1.3,<2.0" +paginate = ">=0.5,<1.0" +pygments = ">=2.16,<3.0" +pymdown-extensions = ">=10.2,<11.0" +regex = ">=2022.4" +requests = ">=2.26,<3.0" + +[package.extras] +git = ["mkdocs-git-committers-plugin-2 (>=1.1,<2.0)", "mkdocs-git-revision-date-localized-plugin (>=1.2,<2.0)"] +imaging = ["cairosvg (>=2.6,<3.0)", "pillow (>=9.4,<10.0)"] +recommended = ["mkdocs-minify-plugin (>=0.7,<1.0)", "mkdocs-redirects (>=1.2,<2.0)", "mkdocs-rss-plugin (>=1.6,<2.0)"] + +[[package]] +name = "mkdocs-material-extensions" +version = "1.3" +description = "Extension pack for Python Markdown and MkDocs Material." +category = "main" +optional = true +python-versions = ">=3.8" +files = [ + {file = "mkdocs_material_extensions-1.3-py3-none-any.whl", hash = "sha256:0297cc48ba68a9fdd1ef3780a3b41b534b0d0df1d1181a44676fda5f464eeadc"}, + {file = "mkdocs_material_extensions-1.3.tar.gz", hash = "sha256:f0446091503acb110a7cab9349cbc90eeac51b58d1caa92a704a81ca1e24ddbd"}, +] + [[package]] name = "numpy" version = "1.21.6" @@ -1270,6 +1330,17 @@ files = [ {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, ] +[[package]] +name = "paginate" +version = "0.5.6" +description = "Divides large result sets into pages for easier browsing" +category = "main" +optional = true +python-versions = "*" +files = [ + {file = "paginate-0.5.6.tar.gz", hash = "sha256:5e6007b6a9398177a7e1648d04fdd9f8c9766a1a945bceac82f1929e8c78af2d"}, +] + [[package]] name = "pathspec" version = "0.11.2" @@ -1441,6 +1512,40 @@ files = [ [package.dependencies] pyasn1 = ">=0.4.6,<0.6.0" +[[package]] +name = "pygments" +version = "2.16.1" +description = "Pygments is a syntax highlighting package written in Python." +category = "main" +optional = true +python-versions = ">=3.7" +files = [ + {file = "Pygments-2.16.1-py3-none-any.whl", hash = "sha256:13fc09fa63bc8d8671a6d247e1eb303c4b343eaee81d861f3404db2935653692"}, + {file = "Pygments-2.16.1.tar.gz", hash = "sha256:1daff0494820c69bc8941e407aa20f577374ee88364ee10a98fdbe0aece96e29"}, +] + +[package.extras] +plugins = ["importlib-metadata"] + +[[package]] +name = "pymdown-extensions" +version = "10.4" +description = "Extension pack for Python Markdown." +category = "main" +optional = true +python-versions = ">=3.8" +files = [ + {file = "pymdown_extensions-10.4-py3-none-any.whl", hash = "sha256:cfc28d6a09d19448bcbf8eee3ce098c7d17ff99f7bd3069db4819af181212037"}, + {file = "pymdown_extensions-10.4.tar.gz", hash = "sha256:bc46f11749ecd4d6b71cf62396104b4a200bad3498cb0f5dad1b8502fe461a35"}, +] + +[package.dependencies] +markdown = ">=3.2" +pyyaml = "*" + +[package.extras] +extra = ["pygments (>=2.12)"] + [[package]] name = "pyparsing" version = "3.1.1" @@ -1568,6 +1673,18 @@ files = [ [package.dependencies] six = ">=1.5" +[[package]] +name = "pytz" +version = "2023.3.post1" +description = "World timezone definitions, modern and historical" +category = "main" +optional = true +python-versions = "*" +files = [ + {file = "pytz-2023.3.post1-py2.py3-none-any.whl", hash = "sha256:ce42d816b81b68506614c11e8937d3aa9e41007ceb50bfdcb0749b921bf646c7"}, + {file = "pytz-2023.3.post1.tar.gz", hash = "sha256:7b4fddbeb94a1eba4b557da24f19fdf9db575192544270a9101d8509f9f43d7b"}, +] + [[package]] name = "pyyaml" version = "6.0.1" @@ -1643,6 +1760,104 @@ files = [ [package.dependencies] pyyaml = "*" +[[package]] +name = "regex" +version = "2023.10.3" +description = "Alternative regular expression module, to replace re." +category = "main" +optional = true +python-versions = ">=3.7" +files = [ + {file = "regex-2023.10.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4c34d4f73ea738223a094d8e0ffd6d2c1a1b4c175da34d6b0de3d8d69bee6bcc"}, + {file = "regex-2023.10.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a8f4e49fc3ce020f65411432183e6775f24e02dff617281094ba6ab079ef0915"}, + {file = "regex-2023.10.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4cd1bccf99d3ef1ab6ba835308ad85be040e6a11b0977ef7ea8c8005f01a3c29"}, + {file = "regex-2023.10.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:81dce2ddc9f6e8f543d94b05d56e70d03a0774d32f6cca53e978dc01e4fc75b8"}, + {file = "regex-2023.10.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c6b4d23c04831e3ab61717a707a5d763b300213db49ca680edf8bf13ab5d91b"}, + {file = "regex-2023.10.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c15ad0aee158a15e17e0495e1e18741573d04eb6da06d8b84af726cfc1ed02ee"}, + {file = "regex-2023.10.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6239d4e2e0b52c8bd38c51b760cd870069f0bdf99700a62cd509d7a031749a55"}, + {file = "regex-2023.10.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4a8bf76e3182797c6b1afa5b822d1d5802ff30284abe4599e1247be4fd6b03be"}, + {file = "regex-2023.10.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d9c727bbcf0065cbb20f39d2b4f932f8fa1631c3e01fcedc979bd4f51fe051c5"}, + {file = "regex-2023.10.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:3ccf2716add72f80714b9a63899b67fa711b654be3fcdd34fa391d2d274ce767"}, + {file = "regex-2023.10.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:107ac60d1bfdc3edb53be75e2a52aff7481b92817cfdddd9b4519ccf0e54a6ff"}, + {file = "regex-2023.10.3-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:00ba3c9818e33f1fa974693fb55d24cdc8ebafcb2e4207680669d8f8d7cca79a"}, + {file = "regex-2023.10.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f0a47efb1dbef13af9c9a54a94a0b814902e547b7f21acb29434504d18f36e3a"}, + {file = "regex-2023.10.3-cp310-cp310-win32.whl", hash = "sha256:36362386b813fa6c9146da6149a001b7bd063dabc4d49522a1f7aa65b725c7ec"}, + {file = "regex-2023.10.3-cp310-cp310-win_amd64.whl", hash = "sha256:c65a3b5330b54103e7d21cac3f6bf3900d46f6d50138d73343d9e5b2900b2353"}, + {file = "regex-2023.10.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:90a79bce019c442604662d17bf69df99090e24cdc6ad95b18b6725c2988a490e"}, + {file = "regex-2023.10.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c7964c2183c3e6cce3f497e3a9f49d182e969f2dc3aeeadfa18945ff7bdd7051"}, + {file = "regex-2023.10.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ef80829117a8061f974b2fda8ec799717242353bff55f8a29411794d635d964"}, + {file = "regex-2023.10.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5addc9d0209a9afca5fc070f93b726bf7003bd63a427f65ef797a931782e7edc"}, + {file = "regex-2023.10.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c148bec483cc4b421562b4bcedb8e28a3b84fcc8f0aa4418e10898f3c2c0eb9b"}, + {file = "regex-2023.10.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d1f21af4c1539051049796a0f50aa342f9a27cde57318f2fc41ed50b0dbc4ac"}, + {file = "regex-2023.10.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0b9ac09853b2a3e0d0082104036579809679e7715671cfbf89d83c1cb2a30f58"}, + {file = "regex-2023.10.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ebedc192abbc7fd13c5ee800e83a6df252bec691eb2c4bedc9f8b2e2903f5e2a"}, + {file = "regex-2023.10.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:d8a993c0a0ffd5f2d3bda23d0cd75e7086736f8f8268de8a82fbc4bd0ac6791e"}, + {file = "regex-2023.10.3-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:be6b7b8d42d3090b6c80793524fa66c57ad7ee3fe9722b258aec6d0672543fd0"}, + {file = "regex-2023.10.3-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4023e2efc35a30e66e938de5aef42b520c20e7eda7bb5fb12c35e5d09a4c43f6"}, + {file = "regex-2023.10.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0d47840dc05e0ba04fe2e26f15126de7c755496d5a8aae4a08bda4dd8d646c54"}, + {file = "regex-2023.10.3-cp311-cp311-win32.whl", hash = "sha256:9145f092b5d1977ec8c0ab46e7b3381b2fd069957b9862a43bd383e5c01d18c2"}, + {file = "regex-2023.10.3-cp311-cp311-win_amd64.whl", hash = "sha256:b6104f9a46bd8743e4f738afef69b153c4b8b592d35ae46db07fc28ae3d5fb7c"}, + {file = "regex-2023.10.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:bff507ae210371d4b1fe316d03433ac099f184d570a1a611e541923f78f05037"}, + {file = "regex-2023.10.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:be5e22bbb67924dea15039c3282fa4cc6cdfbe0cbbd1c0515f9223186fc2ec5f"}, + {file = "regex-2023.10.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a992f702c9be9c72fa46f01ca6e18d131906a7180950958f766c2aa294d4b41"}, + {file = "regex-2023.10.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7434a61b158be563c1362d9071358f8ab91b8d928728cd2882af060481244c9e"}, + {file = "regex-2023.10.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c2169b2dcabf4e608416f7f9468737583ce5f0a6e8677c4efbf795ce81109d7c"}, + {file = "regex-2023.10.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9e908ef5889cda4de038892b9accc36d33d72fb3e12c747e2799a0e806ec841"}, + {file = "regex-2023.10.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:12bd4bc2c632742c7ce20db48e0d99afdc05e03f0b4c1af90542e05b809a03d9"}, + {file = "regex-2023.10.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:bc72c231f5449d86d6c7d9cc7cd819b6eb30134bb770b8cfdc0765e48ef9c420"}, + {file = "regex-2023.10.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bce8814b076f0ce5766dc87d5a056b0e9437b8e0cd351b9a6c4e1134a7dfbda9"}, + {file = "regex-2023.10.3-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:ba7cd6dc4d585ea544c1412019921570ebd8a597fabf475acc4528210d7c4a6f"}, + {file = "regex-2023.10.3-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b0c7d2f698e83f15228ba41c135501cfe7d5740181d5903e250e47f617eb4292"}, + {file = "regex-2023.10.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5a8f91c64f390ecee09ff793319f30a0f32492e99f5dc1c72bc361f23ccd0a9a"}, + {file = "regex-2023.10.3-cp312-cp312-win32.whl", hash = "sha256:ad08a69728ff3c79866d729b095872afe1e0557251da4abb2c5faff15a91d19a"}, + {file = "regex-2023.10.3-cp312-cp312-win_amd64.whl", hash = "sha256:39cdf8d141d6d44e8d5a12a8569d5a227f645c87df4f92179bd06e2e2705e76b"}, + {file = "regex-2023.10.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4a3ee019a9befe84fa3e917a2dd378807e423d013377a884c1970a3c2792d293"}, + {file = "regex-2023.10.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76066d7ff61ba6bf3cb5efe2428fc82aac91802844c022d849a1f0f53820502d"}, + {file = "regex-2023.10.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bfe50b61bab1b1ec260fa7cd91106fa9fece57e6beba05630afe27c71259c59b"}, + {file = "regex-2023.10.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fd88f373cb71e6b59b7fa597e47e518282455c2734fd4306a05ca219a1991b0"}, + {file = "regex-2023.10.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b3ab05a182c7937fb374f7e946f04fb23a0c0699c0450e9fb02ef567412d2fa3"}, + {file = "regex-2023.10.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dac37cf08fcf2094159922edc7a2784cfcc5c70f8354469f79ed085f0328ebdf"}, + {file = "regex-2023.10.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e54ddd0bb8fb626aa1f9ba7b36629564544954fff9669b15da3610c22b9a0991"}, + {file = "regex-2023.10.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:3367007ad1951fde612bf65b0dffc8fd681a4ab98ac86957d16491400d661302"}, + {file = "regex-2023.10.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:16f8740eb6dbacc7113e3097b0a36065a02e37b47c936b551805d40340fb9971"}, + {file = "regex-2023.10.3-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:f4f2ca6df64cbdd27f27b34f35adb640b5d2d77264228554e68deda54456eb11"}, + {file = "regex-2023.10.3-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:39807cbcbe406efca2a233884e169d056c35aa7e9f343d4e78665246a332f597"}, + {file = "regex-2023.10.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:7eece6fbd3eae4a92d7c748ae825cbc1ee41a89bb1c3db05b5578ed3cfcfd7cb"}, + {file = "regex-2023.10.3-cp37-cp37m-win32.whl", hash = "sha256:ce615c92d90df8373d9e13acddd154152645c0dc060871abf6bd43809673d20a"}, + {file = "regex-2023.10.3-cp37-cp37m-win_amd64.whl", hash = "sha256:0f649fa32fe734c4abdfd4edbb8381c74abf5f34bc0b3271ce687b23729299ed"}, + {file = "regex-2023.10.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9b98b7681a9437262947f41c7fac567c7e1f6eddd94b0483596d320092004533"}, + {file = "regex-2023.10.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:91dc1d531f80c862441d7b66c4505cd6ea9d312f01fb2f4654f40c6fdf5cc37a"}, + {file = "regex-2023.10.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82fcc1f1cc3ff1ab8a57ba619b149b907072e750815c5ba63e7aa2e1163384a4"}, + {file = "regex-2023.10.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7979b834ec7a33aafae34a90aad9f914c41fd6eaa8474e66953f3f6f7cbd4368"}, + {file = "regex-2023.10.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ef71561f82a89af6cfcbee47f0fabfdb6e63788a9258e913955d89fdd96902ab"}, + {file = "regex-2023.10.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd829712de97753367153ed84f2de752b86cd1f7a88b55a3a775eb52eafe8a94"}, + {file = "regex-2023.10.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:00e871d83a45eee2f8688d7e6849609c2ca2a04a6d48fba3dff4deef35d14f07"}, + {file = "regex-2023.10.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:706e7b739fdd17cb89e1fbf712d9dc21311fc2333f6d435eac2d4ee81985098c"}, + {file = "regex-2023.10.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:cc3f1c053b73f20c7ad88b0d1d23be7e7b3901229ce89f5000a8399746a6e039"}, + {file = "regex-2023.10.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:6f85739e80d13644b981a88f529d79c5bdf646b460ba190bffcaf6d57b2a9863"}, + {file = "regex-2023.10.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:741ba2f511cc9626b7561a440f87d658aabb3d6b744a86a3c025f866b4d19e7f"}, + {file = "regex-2023.10.3-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:e77c90ab5997e85901da85131fd36acd0ed2221368199b65f0d11bca44549711"}, + {file = "regex-2023.10.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:979c24cbefaf2420c4e377ecd1f165ea08cc3d1fbb44bdc51bccbbf7c66a2cb4"}, + {file = "regex-2023.10.3-cp38-cp38-win32.whl", hash = "sha256:58837f9d221744d4c92d2cf7201c6acd19623b50c643b56992cbd2b745485d3d"}, + {file = "regex-2023.10.3-cp38-cp38-win_amd64.whl", hash = "sha256:c55853684fe08d4897c37dfc5faeff70607a5f1806c8be148f1695be4a63414b"}, + {file = "regex-2023.10.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2c54e23836650bdf2c18222c87f6f840d4943944146ca479858404fedeb9f9af"}, + {file = "regex-2023.10.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:69c0771ca5653c7d4b65203cbfc5e66db9375f1078689459fe196fe08b7b4930"}, + {file = "regex-2023.10.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ac965a998e1388e6ff2e9781f499ad1eaa41e962a40d11c7823c9952c77123e"}, + {file = "regex-2023.10.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1c0e8fae5b27caa34177bdfa5a960c46ff2f78ee2d45c6db15ae3f64ecadde14"}, + {file = "regex-2023.10.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6c56c3d47da04f921b73ff9415fbaa939f684d47293f071aa9cbb13c94afc17d"}, + {file = "regex-2023.10.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ef1e014eed78ab650bef9a6a9cbe50b052c0aebe553fb2881e0453717573f52"}, + {file = "regex-2023.10.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d29338556a59423d9ff7b6eb0cb89ead2b0875e08fe522f3e068b955c3e7b59b"}, + {file = "regex-2023.10.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9c6d0ced3c06d0f183b73d3c5920727268d2201aa0fe6d55c60d68c792ff3588"}, + {file = "regex-2023.10.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:994645a46c6a740ee8ce8df7911d4aee458d9b1bc5639bc968226763d07f00fa"}, + {file = "regex-2023.10.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:66e2fe786ef28da2b28e222c89502b2af984858091675044d93cb50e6f46d7af"}, + {file = "regex-2023.10.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:11175910f62b2b8c055f2b089e0fedd694fe2be3941b3e2633653bc51064c528"}, + {file = "regex-2023.10.3-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:06e9abc0e4c9ab4779c74ad99c3fc10d3967d03114449acc2c2762ad4472b8ca"}, + {file = "regex-2023.10.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:fb02e4257376ae25c6dd95a5aec377f9b18c09be6ebdefa7ad209b9137b73d48"}, + {file = "regex-2023.10.3-cp39-cp39-win32.whl", hash = "sha256:3b2c3502603fab52d7619b882c25a6850b766ebd1b18de3df23b2f939360e1bd"}, + {file = "regex-2023.10.3-cp39-cp39-win_amd64.whl", hash = "sha256:adbccd17dcaff65704c856bd29951c58a1bd4b2b0f8ad6b826dbd543fe740988"}, + {file = "regex-2023.10.3.tar.gz", hash = "sha256:3fef4f844d2290ee0ba57addcec17eec9e3df73f10a2748485dfd6a3a188cc0f"}, +] + [[package]] name = "requests" version = "2.31.0" @@ -2119,4 +2334,4 @@ test = ["pytest", "pytest-click", "pytest-cov", "pytest-explicit", "pytest-xdist [metadata] lock-version = "2.0" python-versions = "~3.8" -content-hash = "be9e0017256a42966bf10aa49b9625406c97d214ad07bbd4eae56c6ac39a66f3" +content-hash = "13ebf534c28171898631f5a432bd9744b2b07d1eebbfb40eb10a09f6e87fa2ad" diff --git a/pyproject.toml b/pyproject.toml index 4e5e747..1a99567 100755 --- a/pyproject.toml +++ b/pyproject.toml @@ -102,6 +102,7 @@ matplotlib = {version = "~3.7", optional = true} # DOCS mkdocs = {version = "^1.5.3", optional = true} mkdocs-click = {version = "^0.8.1", optional = true} +mkdocs-material = {version = "^9.4.8", optional = true, extras = ["docs"]} [tool.poetry.extras] From 1d18b084ff2037e6dcfd51df369bea0beec0d82a Mon Sep 17 00:00:00 2001 From: konstantinos Date: Tue, 14 Nov 2023 23:57:54 +0200 Subject: [PATCH 11/39] build(docs): manually populate the tool.poetry.extras.docs list in pyproject and do `poetry lock` --- poetry.lock | 4 ++-- pyproject.toml | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/poetry.lock b/poetry.lock index 5d63fd9..c9a280e 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2327,11 +2327,11 @@ docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.link testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy (>=0.9.1)", "pytest-ruff"] [extras] -docs = ["mkdocs", "mkdocs-click"] +docs = ["mkdocs", "mkdocs-click", "mkdocs-material"] gui = ["matplotlib"] test = ["pytest", "pytest-click", "pytest-cov", "pytest-explicit", "pytest-xdist"] [metadata] lock-version = "2.0" python-versions = "~3.8" -content-hash = "13ebf534c28171898631f5a432bd9744b2b07d1eebbfb40eb10a09f6e87fa2ad" +content-hash = "fd22728c0977c56f1136c81da6a7c1cb670046c5aa92c67f7287c4fc9031c223" diff --git a/pyproject.toml b/pyproject.toml index 1a99567..e95e96c 100755 --- a/pyproject.toml +++ b/pyproject.toml @@ -102,7 +102,7 @@ matplotlib = {version = "~3.7", optional = true} # DOCS mkdocs = {version = "^1.5.3", optional = true} mkdocs-click = {version = "^0.8.1", optional = true} -mkdocs-material = {version = "^9.4.8", optional = true, extras = ["docs"]} +mkdocs-material = {version = "^9.4.8", optional = true} [tool.poetry.extras] @@ -119,6 +119,7 @@ gui = [ docs = [ "mkdocs", "mkdocs-click", + "mkdocs-material", ] # CLI / ENTRYPOINTS From 7e317281ae1579d9a363d505f2c396e7202e1639 Mon Sep 17 00:00:00 2001 From: konstantinos Date: Wed, 15 Nov 2023 00:03:53 +0200 Subject: [PATCH 12/39] build(docs): poetry add pymdown-extensions --optional -E docs --- poetry.lock | 2 +- pyproject.toml | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/poetry.lock b/poetry.lock index c9a280e..c20efe7 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2334,4 +2334,4 @@ test = ["pytest", "pytest-click", "pytest-cov", "pytest-explicit", "pytest-xdist [metadata] lock-version = "2.0" python-versions = "~3.8" -content-hash = "fd22728c0977c56f1136c81da6a7c1cb670046c5aa92c67f7287c4fc9031c223" +content-hash = "ba14d21e41ae2b6c73df14c8d728cbb96c0ce89aa9f7cb4a927835d6550d7e3e" diff --git a/pyproject.toml b/pyproject.toml index e95e96c..e328e1e 100755 --- a/pyproject.toml +++ b/pyproject.toml @@ -103,6 +103,7 @@ matplotlib = {version = "~3.7", optional = true} mkdocs = {version = "^1.5.3", optional = true} mkdocs-click = {version = "^0.8.1", optional = true} mkdocs-material = {version = "^9.4.8", optional = true} +pymdown-extensions = {version = "^10.4", optional = true, extras = ["docs"]} [tool.poetry.extras] From ab4e8c0984365caff8b25256d31bc83d39847859 Mon Sep 17 00:00:00 2001 From: konstantinos Date: Wed, 15 Nov 2023 00:04:49 +0200 Subject: [PATCH 13/39] build(docs): manually populate the tool.poetry.extras.docs list in pyproject and do `poetry lock` --- poetry.lock | 4 ++-- pyproject.toml | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/poetry.lock b/poetry.lock index c20efe7..d276c04 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2327,11 +2327,11 @@ docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.link testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy (>=0.9.1)", "pytest-ruff"] [extras] -docs = ["mkdocs", "mkdocs-click", "mkdocs-material"] +docs = ["mkdocs", "mkdocs-click", "mkdocs-material", "pymdown-extensions"] gui = ["matplotlib"] test = ["pytest", "pytest-click", "pytest-cov", "pytest-explicit", "pytest-xdist"] [metadata] lock-version = "2.0" python-versions = "~3.8" -content-hash = "ba14d21e41ae2b6c73df14c8d728cbb96c0ce89aa9f7cb4a927835d6550d7e3e" +content-hash = "bf59f6f417576013cb78f34822de2b15db5309de9a043b7dce250f2718ecd128" diff --git a/pyproject.toml b/pyproject.toml index e328e1e..cf170b3 100755 --- a/pyproject.toml +++ b/pyproject.toml @@ -103,7 +103,7 @@ matplotlib = {version = "~3.7", optional = true} mkdocs = {version = "^1.5.3", optional = true} mkdocs-click = {version = "^0.8.1", optional = true} mkdocs-material = {version = "^9.4.8", optional = true} -pymdown-extensions = {version = "^10.4", optional = true, extras = ["docs"]} +pymdown-extensions = {version = "^10.4", optional = true} [tool.poetry.extras] @@ -121,6 +121,7 @@ docs = [ "mkdocs", "mkdocs-click", "mkdocs-material", + "pymdown-extensions", ] # CLI / ENTRYPOINTS From c65a591630ee75e1798aff372fc4d3460916a880 Mon Sep 17 00:00:00 2001 From: konstantinos Date: Wed, 15 Nov 2023 16:17:33 +0200 Subject: [PATCH 14/39] docs(pages): poc of infra for semi-auto python API reference pages generation --- README.rst | 35 ++--- docs/build-process_DAG.md | 6 +- docs/index.md | 20 +++ mkdocs.yml | 30 ++++ poetry.lock | 262 ++++++++++++++++++++++++++++------ pyproject.toml | 9 ++ scripts/gen_api_refs_pages.py | 37 +++++ 7 files changed, 326 insertions(+), 73 deletions(-) create mode 100644 docs/index.md create mode 100644 mkdocs.yml create mode 100644 scripts/gen_api_refs_pages.py diff --git a/README.rst b/README.rst index 055a2ba..72f1652 100755 --- a/README.rst +++ b/README.rst @@ -53,48 +53,33 @@ Key features of the package: Installation ------------ -| The Neural Style Transfer - CLI heavely depends on Tensorflow (tf) and therefore it is crucial that tf is installed correctly in your Python environment. - -Sample commands to install the NST CLI from source, using a terminal: :: - # Get the Code - git clone https://github.com/boromir674/neural-style-transfer.git - cd neural-style-transfer + pip install artificial-artwork - # Activate a python virtual environment - virtualenv env --python=python3 - source env/bin/activate - # Install dependencies - pip install -r requirements/dex.txt +Currently, one pre-built wheel, for python3.8, is included, along with the source distribution. - # Install NST CLI (in virtual environment) - pip install -e . - -Alternative command to install the NST CLI by downloading the `artificial_artwork` python package from pypi: +Sample commands to install the NST CLI from source, using a terminal: :: - pip install artificial_artwork + git clone https://github.com/boromir674/neural-style-transfer.git + pip install ./neural-style-transfer -Make the cli available for your host system: -:: +| The Neural Style Transfer - CLI heavely depends on Tensorflow (tf) and therefore it is crucial that tf is installed correctly in your Python environment. - # Setup a symbolic link (in your host system) in a location in your PATH - # Assuming ~/.local/bin is in your PATH - ln -s $PWD/env/bin/neural-style-transfer ~/.local/bin/neural-style-transfer +Usage +----- - # Deactivate environment since the symbolic link is available in "global scope" by now - deactivate +:: + nst --help -Usage ------ Download the Vgg-Verydeep-19 pretrained `model` from https://drive.protonmail.com/urls/7RXGN23ZRR#hsw4STil0Hgc. diff --git a/docs/build-process_DAG.md b/docs/build-process_DAG.md index 75b31f6..239c7a9 100644 --- a/docs/build-process_DAG.md +++ b/docs/build-process_DAG.md @@ -4,12 +4,10 @@ Flow Chart, of how exection navigates docker stages (see --target of docker build). -If you run `docker build .` the `target` used by default is the `default` Stage in the Graph. +If you run `docker build .` the `target` used by default is the `default_with_demo` Stage in the Graph. **Dockerfile: ./Dockerfile** -Note, The below Graph represents only `FROM first_stage AS second_stage`. -We will add representation for `COPY --from=other_stage .`, later. ```mermaid graph TB; @@ -17,7 +15,9 @@ graph TB; base --> source source --> prod base --> prod_install + prod -. "COPY" .-> prod_install prod_install --> prod_ready prod_ready --> prod_demo prod_ready --> default + prod_demo --> default_with_demo ``` diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 0000000..2491c45 --- /dev/null +++ b/docs/index.md @@ -0,0 +1,20 @@ +# Artificial Artwork + + +## API Reference + +::: artificial_artwork.nst_math + +```mermaid +graph LR + hello --> world + world --> again + again --> hello +``` + +## Project layout + + mkdocs.yml # The configuration file. + docs/ + index.md # The documentation homepage. + ... # Other markdown pages, images and other files. diff --git a/mkdocs.yml b/mkdocs.yml new file mode 100644 index 0000000..c3d54d5 --- /dev/null +++ b/mkdocs.yml @@ -0,0 +1,30 @@ +site_name: Artificial Artwork +repo_name: neural-style-transfer +plugins: + - search + - mermaid2 + - mkdocstrings + # - mkdocstrings: + # default_handler: python + # handlers: + # python: + # paths: [src] + - gen-files: + scripts: + - scripts/gen_api_refs_pages.py +markdown_extensions: + - mkdocs-click + - pymdownx.highlight + - pymdownx.superfences + +nav: + - "Home": index.md + - "CLI": cli.md + - "Docker": build-process_DAG.md + - Code Reference: + - artificial_artwork: + - nst_math: reference/artificial_artwork/nst_math.md +# rest of the navigation... + + +# LEGACY \ No newline at end of file diff --git a/poetry.lock b/poetry.lock index d276c04..31e656c 100644 --- a/poetry.lock +++ b/poetry.lock @@ -65,6 +65,25 @@ pytz = {version = ">=2015.7", markers = "python_version < \"3.9\""} [package.extras] dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"] +[[package]] +name = "beautifulsoup4" +version = "4.12.2" +description = "Screen-scraping library" +category = "main" +optional = true +python-versions = ">=3.6.0" +files = [ + {file = "beautifulsoup4-4.12.2-py3-none-any.whl", hash = "sha256:bd2520ca0d9d7d12694a53d44ac482d181b4ec1888909b035a3dbf40d0f57d4a"}, + {file = "beautifulsoup4-4.12.2.tar.gz", hash = "sha256:492bbc69dca35d12daac71c4db1bfff0c876c00ef4a2ffacce226d4638eb72da"}, +] + +[package.dependencies] +soupsieve = ">1.2" + +[package.extras] +html5lib = ["html5lib"] +lxml = ["lxml"] + [[package]] name = "cachetools" version = "4.2.4" @@ -440,6 +459,18 @@ files = [ {file = "Cython-3.0.5.tar.gz", hash = "sha256:39318348db488a2f24e7c84e08bdc82f2624853c0fea8b475ea0b70b27176492"}, ] +[[package]] +name = "editorconfig" +version = "0.12.3" +description = "EditorConfig File Locator and Interpreter for Python" +category = "main" +optional = true +python-versions = "*" +files = [ + {file = "EditorConfig-0.12.3-py3-none-any.whl", hash = "sha256:6b0851425aa875b08b16789ee0eeadbd4ab59666e9ebe728e526314c4a2e52c1"}, + {file = "EditorConfig-0.12.3.tar.gz", hash = "sha256:57f8ce78afcba15c8b18d46b5170848c88d56fd38f05c2ec60dbbfcb8996e89e"}, +] + [[package]] name = "exceptiongroup" version = "1.1.3" @@ -472,54 +503,54 @@ testing = ["hatch", "pre-commit", "pytest", "tox"] [[package]] name = "fonttools" -version = "4.44.1" +version = "4.44.0" description = "Tools to manipulate font files" category = "main" optional = true python-versions = ">=3.8" files = [ - {file = "fonttools-4.44.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8acf50c20bae9880169ff133768a54f587d956676d28894401835a28f450935e"}, - {file = "fonttools-4.44.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:02939e423540e05843a5c2b84704f45d307144f761a42a299d9b0b481e497225"}, - {file = "fonttools-4.44.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d96cc1395dbf82dedfd4eb127d320004088df6007383c25db676e5f42fe414"}, - {file = "fonttools-4.44.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aff3c12fba2525e5b7f7ba73fab10ddac386f8019b6cf2b8701239cf9f3e2a8a"}, - {file = "fonttools-4.44.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3675499e11a2332a867c1ce98792d29615ac143186c1c1d3e1bb7a13f1929b52"}, - {file = "fonttools-4.44.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fcf6c0c2bf2b0baeb55b5e44e9d6f2b71ede808949b8ab4daca077cc3f9cfff5"}, - {file = "fonttools-4.44.1-cp310-cp310-win32.whl", hash = "sha256:147c9f5fbe12486fa186b5ccdc64a537d581e4f9bbddfbc40f2a15a55c66f54e"}, - {file = "fonttools-4.44.1-cp310-cp310-win_amd64.whl", hash = "sha256:0bd45092788dbfb781fae299905695a3fe5c1956a515ee331c9f034da3a9d0e5"}, - {file = "fonttools-4.44.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d22d9a4cb3f0c96991d4dccab66c7377302c9ca09dcf0cbce968d73919585120"}, - {file = "fonttools-4.44.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0c1ac78c60b155ce709b50e28321baa3813dfae648bf55ac80d5a97c70d088e0"}, - {file = "fonttools-4.44.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6065578bdf96d4b69dd53d8b49ff02412b2a46d461b0d1ee5eddb81c3a953a46"}, - {file = "fonttools-4.44.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17702266ba92cef9a0d7418609f8f8b8e019192c62e8014f10b89a485af9d8ce"}, - {file = "fonttools-4.44.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c1d22a61a247262f178819f0331e0692e27c88be5770bf1c2404d0d52799f711"}, - {file = "fonttools-4.44.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:61b794e6a9208e7ee3abf11a9f56b9c1409967817dfd732f97b44812686cab1d"}, - {file = "fonttools-4.44.1-cp311-cp311-win32.whl", hash = "sha256:a02747ac741abe1fe994ac55b143432637d136e4a5a472e7a90574a015b57dc4"}, - {file = "fonttools-4.44.1-cp311-cp311-win_amd64.whl", hash = "sha256:8dd81470227c53ab78788f1b21b7e655b2c3aa66f0f670d9011f2deb64bed034"}, - {file = "fonttools-4.44.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:63efb6b66c275cb2c750576ed743f9995b92bcd733b72699599c6f74dce277c6"}, - {file = "fonttools-4.44.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:25504368ce3dbdc5df1e6bee1980674b60216c543ad2647c85333f8daf5e9dd2"}, - {file = "fonttools-4.44.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc4acf7f1684d234d788cbb1976fbced4e1ae7c51abaf4314e11d1d86498ba76"}, - {file = "fonttools-4.44.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6698abcbb43f68ecfe473169d5928adf0a09ab8e6439322f80bc10a80ab9195d"}, - {file = "fonttools-4.44.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:6dce674ba22419a9f3822f9c1b6bd823fce11d3a34372c580216167b6d9e232b"}, - {file = "fonttools-4.44.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8493c84ac86fdc5dde68b720959b79865cf5216a5c1ee9b4a161eac8c56dc310"}, - {file = "fonttools-4.44.1-cp312-cp312-win32.whl", hash = "sha256:a4a8734ddb91647d9545caae4dfb4633045c5dccb2fccb2d6c2a09424d975ef1"}, - {file = "fonttools-4.44.1-cp312-cp312-win_amd64.whl", hash = "sha256:7debaae9f267702ac4e89944bbfc4e55bc2d0ef891aa6c18d6afd9184a14554a"}, - {file = "fonttools-4.44.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:748d21764665209d5e0729ce8386fd01c92258699db732c7dbe4c9abf9e7c392"}, - {file = "fonttools-4.44.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:753de1235ac308111f80eacb9d92b328088adfec7147fd101692cc49ad53a3fe"}, - {file = "fonttools-4.44.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c142c11d28af532c7edddf191367d6acf2a2884bb4e2ba329c265f58ca865d0a"}, - {file = "fonttools-4.44.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6dd10d40028bf71e9604279875e4c258a36b2a42fff349fdf20141813d83cc61"}, - {file = "fonttools-4.44.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8e4961e26423ddd713672746c110e708c0094deae74493e21198d85f54f7d88c"}, - {file = "fonttools-4.44.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:af89a9370dc463ffed3010af6fad1aa58998ce5eb5d94c2c2688768e6b108cc8"}, - {file = "fonttools-4.44.1-cp38-cp38-win32.whl", hash = "sha256:6d2d0e0d64a21b07c30206d500f8e77f4beaf80e7cc0ffd65a304a9ae1c0e197"}, - {file = "fonttools-4.44.1-cp38-cp38-win_amd64.whl", hash = "sha256:dc16e26668ec2ae01a37ff8293ce0326cf8c043e24fcf86fc38e6c25ddd98926"}, - {file = "fonttools-4.44.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a04ad39ac67c523c9f8f102706ac05d7e5cee3148a3519c6afc6ffbb3f0af7aa"}, - {file = "fonttools-4.44.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:11e9cba26fd658a491c82fdf5dc5bdb8078ca69ca70ba5724f63a66d486fa8b3"}, - {file = "fonttools-4.44.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fa904fb50c9f1b3ffbe352c7c4ed35eb16558933f011ff74f86f33504358e4d"}, - {file = "fonttools-4.44.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:caf014bcc24673b681e7f768180f063691b301e2eccd9a53c43b5eebfb448bd8"}, - {file = "fonttools-4.44.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:97fb6f806694268d0c35abfc1f33662a1a96d12875a790b2b69d7b8d4fadbea5"}, - {file = "fonttools-4.44.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ac523156bf227f009102cf33c116bcc18d6b9a05ea9a3a6eaa57e3adb42620a9"}, - {file = "fonttools-4.44.1-cp39-cp39-win32.whl", hash = "sha256:50aacecec89ca07ba97a63a949f9b273ccbdc105602ec4426c8a9a143f9e6aa3"}, - {file = "fonttools-4.44.1-cp39-cp39-win_amd64.whl", hash = "sha256:994c62a46cb2cfd670edc360d87c902ee475790fbddb267abd9fd8a83199423a"}, - {file = "fonttools-4.44.1-py3-none-any.whl", hash = "sha256:e775851c6884c16ed3831e461a0d5e271d9ebcd05204122d3a21ca2465a5d8c1"}, - {file = "fonttools-4.44.1.tar.gz", hash = "sha256:0d8ed83815a125b25c10404736a2cd43d60eb6479fe2d68373418cd1822ec330"}, + {file = "fonttools-4.44.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e1cd1c6bb097e774d68402499ff66185190baaa2629ae2f18515a2c50b93db0c"}, + {file = "fonttools-4.44.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b9eab7f9837fdaa2a10a524fbcc2ec24bf60637c044b6e4a59c3f835b90f0fae"}, + {file = "fonttools-4.44.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f412954275e594f7a51c16f3b3edd850acb0d842fefc33856b63a17e18499a5"}, + {file = "fonttools-4.44.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50d25893885e80a5955186791eed5579f1e75921751539cc1dc3ffd1160b48cf"}, + {file = "fonttools-4.44.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:22ea8aa7b3712450b42b044702bd3a64fd118006bad09a6f94bd1b227088492e"}, + {file = "fonttools-4.44.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:df40daa6c03b98652ffe8110ae014fe695437f6e1cb5a07e16ea37f40e73ac86"}, + {file = "fonttools-4.44.0-cp310-cp310-win32.whl", hash = "sha256:bca49da868e8bde569ef36f0cc1b6de21d56bf9c3be185c503b629c19a185287"}, + {file = "fonttools-4.44.0-cp310-cp310-win_amd64.whl", hash = "sha256:dbac86d83d96099890e731cc2af97976ff2c98f4ba432fccde657c5653a32f1c"}, + {file = "fonttools-4.44.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e8ff7d19a6804bfd561cfcec9b4200dd1788e28f7de4be70189801530c47c1b3"}, + {file = "fonttools-4.44.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a8a1fa9a718de0bc026979c93e1e9b55c5efde60d76f91561fd713387573817d"}, + {file = "fonttools-4.44.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c05064f95aacdfc06f21e55096c964b2228d942b8675fa26995a2551f6329d2d"}, + {file = "fonttools-4.44.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31b38528f25bc662401e6ffae14b3eb7f1e820892fd80369a37155e3b636a2f4"}, + {file = "fonttools-4.44.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:05d7c4d2c95b9490e669f3cb83918799bf1c838619ac6d3bad9ea017cfc63f2e"}, + {file = "fonttools-4.44.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6999e80a125b0cd8e068d0210b63323f17338038c2ecd2e11b9209ec430fe7f2"}, + {file = "fonttools-4.44.0-cp311-cp311-win32.whl", hash = "sha256:a7aec7f5d14dfcd71fb3ebc299b3f000c21fdc4043079101777ed2042ba5b7c5"}, + {file = "fonttools-4.44.0-cp311-cp311-win_amd64.whl", hash = "sha256:518a945dbfe337744bfff31423c1430303b8813c5275dffb0f2577f0734a1189"}, + {file = "fonttools-4.44.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:59b6ad83cce067d10f4790c037a5904424f45bebb5e7be2eb2db90402f288267"}, + {file = "fonttools-4.44.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c2de1fb18198acd400c45ffe2aef5420c8d55fde903e91cba705596099550f3b"}, + {file = "fonttools-4.44.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:84f308b7a8d28208d54315d11d35f9888d6d607673dd4d42d60b463682ee0400"}, + {file = "fonttools-4.44.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66bc6efd829382f7a7e6cf33c2fb32b13edc8a239eb15f32acbf197dce7a0165"}, + {file = "fonttools-4.44.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a8b99713d3a0d0e876b6aecfaada5e7dc9fe979fcd90ef9fa0ba1d9b9aed03f2"}, + {file = "fonttools-4.44.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b63da598d9cbc52e2381f922da0e94d60c0429f92207bd3fb04d112fc82ea7cb"}, + {file = "fonttools-4.44.0-cp312-cp312-win32.whl", hash = "sha256:f611c97678604e302b725f71626edea113a5745a7fb557c958b39edb6add87d5"}, + {file = "fonttools-4.44.0-cp312-cp312-win_amd64.whl", hash = "sha256:58af428746fa73a2edcbf26aff33ac4ef3c11c8d75bb200eaea2f7e888d2de4e"}, + {file = "fonttools-4.44.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:9ee8692e23028564c13d924004495f284df8ac016a19f17a87251210e1f1f928"}, + {file = "fonttools-4.44.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:dab3d00d27b1a79ae4d4a240e8ceea8af0ff049fd45f05adb4f860d93744110d"}, + {file = "fonttools-4.44.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f53526668beccdb3409c6055a4ffe50987a7f05af6436fa55d61f5e7bd450219"}, + {file = "fonttools-4.44.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3da036b016c975c2d8c69005bdc4d5d16266f948a7fab950244e0f58301996a"}, + {file = "fonttools-4.44.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b99fe8ef4093f672d00841569d2d05691e50334d79f4d9c15c1265d76d5580d2"}, + {file = "fonttools-4.44.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6d16d9634ff1e5cea2cf4a8cbda9026f766e4b5f30b48f8180f0e99133d3abfc"}, + {file = "fonttools-4.44.0-cp38-cp38-win32.whl", hash = "sha256:3d29509f6e05e8d725db59c2d8c076223d793e4e35773040be6632a0349f2f97"}, + {file = "fonttools-4.44.0-cp38-cp38-win_amd64.whl", hash = "sha256:d4fa4f4bc8fd86579b8cdbe5e948f35d82c0eda0091c399d009b2a5a6b61c040"}, + {file = "fonttools-4.44.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c794de4086f06ae609b71ac944ec7deb09f34ecf73316fddc041087dd24bba39"}, + {file = "fonttools-4.44.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2db63941fee3122e31a21dd0f5b2138ce9906b661a85b63622421d3654a74ae2"}, + {file = "fonttools-4.44.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb01c49c8aa035d5346f46630209923d4927ed15c2493db38d31da9f811eb70d"}, + {file = "fonttools-4.44.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46c79af80a835410874683b5779b6c1ec1d5a285e11c45b5193e79dd691eb111"}, + {file = "fonttools-4.44.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b6e6aa2d066f8dafd06d8d0799b4944b5d5a1f015dd52ac01bdf2895ebe169a0"}, + {file = "fonttools-4.44.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:63a3112f753baef8c6ac2f5f574bb9ac8001b86c8c0c0380039db47a7f512d20"}, + {file = "fonttools-4.44.0-cp39-cp39-win32.whl", hash = "sha256:54efed22b2799a85475e6840e907c402ba49892c614565dc770aa97a53621b2b"}, + {file = "fonttools-4.44.0-cp39-cp39-win_amd64.whl", hash = "sha256:2e91e19b583961979e2e5a701269d3cfc07418963bee717f8160b0a24332826b"}, + {file = "fonttools-4.44.0-py3-none-any.whl", hash = "sha256:b9beb0fa6ff3ea808ad4a6962d68ac0f140ddab080957b20d9e268e4d67fb335"}, + {file = "fonttools-4.44.0.tar.gz", hash = "sha256:4e90dd81b6e0d97ebfe52c0d12a17a9ef7f305d6bfbb93081265057d6092f252"}, ] [package.extras] @@ -625,6 +656,21 @@ files = [ [package.dependencies] six = "*" +[[package]] +name = "griffe" +version = "0.38.0" +description = "Signatures for entire Python programs. Extract the structure, the frame, the skeleton of your project, to generate API documentation or find breaking changes in your API." +category = "main" +optional = true +python-versions = ">=3.8" +files = [ + {file = "griffe-0.38.0-py3-none-any.whl", hash = "sha256:6a5bc457320e8e199006aa5fbb03e162f5e21abe31aa6221f7a5c37ea0724c71"}, + {file = "griffe-0.38.0.tar.gz", hash = "sha256:9b97487b583042b543d1e28196caee638ecd766c8c4c98135071806cb5333ac2"}, +] + +[package.dependencies] +colorama = ">=0.4" + [[package]] name = "grpcio" version = "1.59.2" @@ -845,6 +891,21 @@ MarkupSafe = ">=2.0" [package.extras] i18n = ["Babel (>=2.7)"] +[[package]] +name = "jsbeautifier" +version = "1.14.11" +description = "JavaScript unobfuscator and beautifier." +category = "main" +optional = true +python-versions = "*" +files = [ + {file = "jsbeautifier-1.14.11.tar.gz", hash = "sha256:6b632581ea60dd1c133cd25a48ad187b4b91f526623c4b0fb5443ef805250505"}, +] + +[package.dependencies] +editorconfig = ">=0.12.2" +six = ">=1.13.0" + [[package]] name = "keras-preprocessing" version = "1.1.2" @@ -1183,6 +1244,22 @@ watchdog = ">=2.0" i18n = ["babel (>=2.9.0)"] min-versions = ["babel (==2.9.0)", "click (==7.0)", "colorama (==0.4)", "ghp-import (==1.0)", "importlib-metadata (==4.3)", "jinja2 (==2.11.1)", "markdown (==3.2.1)", "markupsafe (==2.0.1)", "mergedeep (==1.3.4)", "packaging (==20.5)", "pathspec (==0.11.1)", "platformdirs (==2.2.0)", "pyyaml (==5.1)", "pyyaml-env-tag (==0.1)", "typing-extensions (==3.10)", "watchdog (==2.0)"] +[[package]] +name = "mkdocs-autorefs" +version = "0.5.0" +description = "Automatically link across pages in MkDocs." +category = "main" +optional = true +python-versions = ">=3.8" +files = [ + {file = "mkdocs_autorefs-0.5.0-py3-none-any.whl", hash = "sha256:7930fcb8ac1249f10e683967aeaddc0af49d90702af111a5e390e8b20b3d97ff"}, + {file = "mkdocs_autorefs-0.5.0.tar.gz", hash = "sha256:9a5054a94c08d28855cfab967ada10ed5be76e2bfad642302a610b252c3274c0"}, +] + +[package.dependencies] +Markdown = ">=3.3" +mkdocs = ">=1.1" + [[package]] name = "mkdocs-click" version = "0.8.1" @@ -1199,6 +1276,21 @@ files = [ click = ">=8.1" markdown = ">=3.3" +[[package]] +name = "mkdocs-gen-files" +version = "0.5.0" +description = "MkDocs plugin to programmatically generate documentation pages during the build" +category = "main" +optional = true +python-versions = ">=3.7" +files = [ + {file = "mkdocs_gen_files-0.5.0-py3-none-any.whl", hash = "sha256:7ac060096f3f40bd19039e7277dd3050be9a453c8ac578645844d4d91d7978ea"}, + {file = "mkdocs_gen_files-0.5.0.tar.gz", hash = "sha256:4c7cf256b5d67062a788f6b1d035e157fc1a9498c2399be9af5257d4ff4d19bc"}, +] + +[package.dependencies] +mkdocs = ">=1.0.3" + [[package]] name = "mkdocs-material" version = "9.4.8" @@ -1241,6 +1333,74 @@ files = [ {file = "mkdocs_material_extensions-1.3.tar.gz", hash = "sha256:f0446091503acb110a7cab9349cbc90eeac51b58d1caa92a704a81ca1e24ddbd"}, ] +[[package]] +name = "mkdocs-mermaid2-plugin" +version = "1.1.1" +description = "A MkDocs plugin for including mermaid graphs in markdown sources" +category = "main" +optional = true +python-versions = ">=3.6" +files = [ + {file = "mkdocs-mermaid2-plugin-1.1.1.tar.gz", hash = "sha256:bea5f3cbe6cb76bad21b81e49a01e074427ed466666c5d404e62fe8698bc2d7c"}, + {file = "mkdocs_mermaid2_plugin-1.1.1-py3-none-any.whl", hash = "sha256:4e25876b59d1e151ca33a467207b346404b4a246f4f24af5e44c32408e175882"}, +] + +[package.dependencies] +beautifulsoup4 = ">=4.6.3" +jsbeautifier = "*" +mkdocs = ">=1.0.4" +pymdown-extensions = ">=8.0" +requests = "*" +setuptools = ">=18.5" + +[package.extras] +test = ["mkdocs-material"] + +[[package]] +name = "mkdocstrings" +version = "0.24.0" +description = "Automatic documentation from sources, for MkDocs." +category = "main" +optional = true +python-versions = ">=3.8" +files = [ + {file = "mkdocstrings-0.24.0-py3-none-any.whl", hash = "sha256:f4908560c10f587326d8f5165d1908817b2e280bbf707607f601c996366a2264"}, + {file = "mkdocstrings-0.24.0.tar.gz", hash = "sha256:222b1165be41257b494a9d29b14135d2b7ca43f38161d5b10caae03b87bd4f7e"}, +] + +[package.dependencies] +click = ">=7.0" +importlib-metadata = {version = ">=4.6", markers = "python_version < \"3.10\""} +Jinja2 = ">=2.11.1" +Markdown = ">=3.3" +MarkupSafe = ">=1.1" +mkdocs = ">=1.4" +mkdocs-autorefs = ">=0.3.1" +platformdirs = ">=2.2.0" +pymdown-extensions = ">=6.3" +typing-extensions = {version = ">=4.1", markers = "python_version < \"3.10\""} + +[package.extras] +crystal = ["mkdocstrings-crystal (>=0.3.4)"] +python = ["mkdocstrings-python (>=0.5.2)"] +python-legacy = ["mkdocstrings-python-legacy (>=0.2.1)"] + +[[package]] +name = "mkdocstrings-python" +version = "1.7.4" +description = "A Python handler for mkdocstrings." +category = "main" +optional = true +python-versions = ">=3.8" +files = [ + {file = "mkdocstrings_python-1.7.4-py3-none-any.whl", hash = "sha256:70eacbe5f2d5071f2e525ba0b35bc447d398437dfbcd90c63fe6e977551cfe26"}, + {file = "mkdocstrings_python-1.7.4.tar.gz", hash = "sha256:c2fc34efd70000ec31aee247910006e8dd9d1b9f3957bf46880c3f6e51a8f0d5"}, +] + +[package.dependencies] +griffe = ">=0.37" +mkdocstrings = ">=0.20" + [[package]] name = "numpy" version = "1.21.6" @@ -2012,6 +2172,18 @@ files = [ {file = "software_patterns-2.0.0.tar.gz", hash = "sha256:81775f0514e75b407371f109db12e49facc3daee30aa77a0d1d0578475dd3121"}, ] +[[package]] +name = "soupsieve" +version = "2.5" +description = "A modern CSS selector implementation for Beautiful Soup." +category = "main" +optional = true +python-versions = ">=3.8" +files = [ + {file = "soupsieve-2.5-py3-none-any.whl", hash = "sha256:eaa337ff55a1579b6549dc679565eac1e3d000563bcb1c8ab0d0fefbc0c2cdc7"}, + {file = "soupsieve-2.5.tar.gz", hash = "sha256:5663d5a7b3bfaeee0bc4372e7fc48f9cff4940b3eec54a6451cc5299f1097690"}, +] + [[package]] name = "tensorboard" version = "2.2.2" @@ -2327,11 +2499,11 @@ docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.link testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy (>=0.9.1)", "pytest-ruff"] [extras] -docs = ["mkdocs", "mkdocs-click", "mkdocs-material", "pymdown-extensions"] +docs = ["mkdocs", "mkdocs-click", "mkdocs-gen-files", "mkdocs-material", "mkdocs-mermaid2-plugin", "mkdocstrings", "mkdocstrings-python", "pymdown-extensions"] gui = ["matplotlib"] test = ["pytest", "pytest-click", "pytest-cov", "pytest-explicit", "pytest-xdist"] [metadata] lock-version = "2.0" python-versions = "~3.8" -content-hash = "bf59f6f417576013cb78f34822de2b15db5309de9a043b7dce250f2718ecd128" +content-hash = "a15ca2d0dbc9a9f3a50a48edfa534a3cf7c172138954b60970f8ddb0f7866766" diff --git a/pyproject.toml b/pyproject.toml index cf170b3..a502d70 100755 --- a/pyproject.toml +++ b/pyproject.toml @@ -104,6 +104,11 @@ mkdocs = {version = "^1.5.3", optional = true} mkdocs-click = {version = "^0.8.1", optional = true} mkdocs-material = {version = "^9.4.8", optional = true} pymdown-extensions = {version = "^10.4", optional = true} +mkdocs-mermaid2-plugin = {version = "^1.1.1", optional = true} +# mkdocstrings = {version = "^0.24.0", optional = true} +mkdocs-gen-files = {version = "^0.5.0", optional = true} +mkdocstrings = {version = "^0.24.0", optional = true} +mkdocstrings-python = {version = "^1.7.4", optional = true} [tool.poetry.extras] @@ -122,6 +127,10 @@ docs = [ "mkdocs-click", "mkdocs-material", "pymdown-extensions", + "mkdocs-mermaid2-plugin", + "mkdocstrings", + "mkdocs-gen-files", + "mkdocstrings-python", ] # CLI / ENTRYPOINTS diff --git a/scripts/gen_api_refs_pages.py b/scripts/gen_api_refs_pages.py new file mode 100644 index 0000000..38bec13 --- /dev/null +++ b/scripts/gen_api_refs_pages.py @@ -0,0 +1,37 @@ +"""Generate the code reference pages.""" + +from pathlib import Path + +import mkdocs_gen_files + + +src = Path(__file__).parent.parent / "src" + +for path in sorted(src.rglob("*.py")): + module_path = path.relative_to(src).with_suffix("") + doc_path = path.relative_to(src).with_suffix(".md") + full_doc_path = Path("reference", doc_path) + + parts = list(module_path.parts) + + if parts[-1] == "__init__": + parts = parts[:-1] + elif parts[-1] == "__main__": + continue + + with mkdocs_gen_files.open(full_doc_path, "w") as fd: + identifier = ".".join(parts) + print("::: " + identifier, file=fd) + + + # ROOT + # -> docs + # -> scripts + # -> src/python_package + mkdocs_gen_files.set_edit_path(full_doc_path, Path("../") / path) + # so that it correctly sets the edit path of (for example) nst_math.py to + # /blob/master/src/artificial_artwork/nst_math.py instead of + # /blob/master/docs/src/artificial_artwork/nst_math.py + + + # mkdocs_gen_files.set_edit_path(full_doc_path, path) \ No newline at end of file From 6e16835a6a89040cfb837f02c21976419ec087b5 Mon Sep 17 00:00:00 2001 From: konstantinos Date: Wed, 15 Nov 2023 17:07:12 +0200 Subject: [PATCH 15/39] build: default docker build stage includes vgg and demo cmd --- Dockerfile | 11 +++++-- README.rst | 82 +++++++++++++++------------------------------- docker-compose.yml | 21 ++++++++---- tox.ini | 49 +++++++++++++++++++++++++++ 4 files changed, 98 insertions(+), 65 deletions(-) diff --git a/Dockerfile b/Dockerfile index 4fdb42e..64114eb 100644 --- a/Dockerfile +++ b/Dockerfile @@ -119,6 +119,7 @@ ENV PATH="/root/.local/bin:$PATH" # END of POC ## Build Time Args ## +# not available at run time, like ENV vars ARG VGG_NAME="imagenet-vgg-verydeep-19.mat" @@ -157,8 +158,8 @@ FROM prod_ready AS prod_demo ARG REPO_DEMO_IMAGES_LOCATION="tests/data" -ARG DEMO_CONTENT_IMAGE="${REPO_DEMO_IMAGES_LOCATION}/blue-red_w300-h225.jpg" -ARG DEMO_STYLE_IMAGE="${REPO_DEMO_IMAGES_LOCATION}/canoe_water_w300-h225.jpg" +ARG DEMO_CONTENT_IMAGE="${REPO_DEMO_IMAGES_LOCATION}/canoe_water_w300-h225.jpg" +ARG DEMO_STYLE_IMAGE="${REPO_DEMO_IMAGES_LOCATION}/blue-red_w300-h225.jpg" WORKDIR /app @@ -178,10 +179,14 @@ ENV STYLE_IMAGE_DEMO="/app/${DEMO_STYLE_IMAGE}" CMD ["nst", "demo"] +FROM prod_ready as default + +CMD [ "nst" ] + ### Stage: Default Target (for Production) # Just to allow `docker buil` use this as target if not specified -FROM prod_ready as default +FROM prod_demo as default_with_demo # Define ENTRYPOINT, so that this is the default # runs the NST Algorithm on the Demo Content and Style Images for a few iterations diff --git a/README.rst b/README.rst index 72f1652..8f4f405 100755 --- a/README.rst +++ b/README.rst @@ -50,97 +50,67 @@ Key features of the package: * Persisting of generated images +Quick-start +----------- -Installation ------------- +| Run a demo NST, on sample `Content` and `Style` Images: :: - pip install artificial-artwork + mkdir art + export NST_HOST_MOUNT="$PWD/art" + docker-compose up -Currently, one pre-built wheel, for python3.8, is included, along with the source distribution. + # Process runs, in containerized environment, and exits. -Sample commands to install the NST CLI from source, using a terminal: +| Check out your `generated` artificial artwork! :: + + ls -l art/blue-red_w300-h225.jpg+canoe_water_w300-h225.jpg-100.png + xdg-open art/blue-red_w300-h225.jpg+canoe_water_w300-h225.jpg-100.png - git clone https://github.com/boromir674/neural-style-transfer.git - - pip install ./neural-style-transfer - - -| The Neural Style Transfer - CLI heavely depends on Tensorflow (tf) and therefore it is crucial that tf is installed correctly in your Python environment. Usage ----- -:: - - nst --help - - -Download the Vgg-Verydeep-19 pretrained `model` from https://drive.protonmail.com/urls/7RXGN23ZRR#hsw4STil0Hgc. - -Exctract the model (weights and layer architecture). - -For example use `tar -xvf imagenet-vgg-verydeep-19.tar` to extract in the current directory. - -Indicate to the program where to find the model: +Run the `nst` CLI with the `--help` option to see the available options. :: - export AA_VGG_19=$PWD/imagenet-vgg-verydeep-19.mat + docker run boromir674/neural-style-transfer:1.0.2 --help -We have included one 'content' and one 'style' image in the source repository, to facilitate testing. -You can use these images to quickly try running the program. -For example, you can get the code with `git clone git@github.com:boromir674/neural-style-transfer.git`, -then `cd neural-style-transfer`. +Development +----------- -Assuming you have installed using a symbolic link in your PATH (as shown above), or if you are still -operating withing your virtual environment, then you can create artificial artwork with the following command. +Installation +"""""""""""" -The algorithm will apply the style to the content iteratively. -It will iterate 100 times. +Install `nst` CLI and `artificial_artwork` python package from `pypi``: :: - # Create a directory where to store the artificial artwork - mkdir nst_output - - # Run a Neural Style Algorithm for 100 iterations and store output to nst_output directory - neural-style-transfer tests/data/canoe_water.jpg tests/data/blue-red-w400-h300.jpg --location nst_output - - -Note we are using as 'content' and 'style' images jpg files included in the distribution (artificial-artwork package). -We are using a photo of a canoe on water and an abstract painting with prevalence of blue and red color shades. - -Also note that to demonstrate quicker, both images have been already resized to just 400 pixels of width and 300 of height each. + pip install artificial_artwork -Navigating to `nst_output` you can find multiple image files generated from running the algorithm. Each file corresponds to the -image generated on a different iteration while running the algorithm. The bigger the iteration the more "style" has been applied. -Check out your artificial artwork! +Only python3.8 wheel is included atm. -Docker image ------------- - -We have included a docker file that we use to build an image where both the `artificial_artwork` package (source code) -and the pretrained model are present. That way you can immediately start creating artwork! +Sample commands to install the NST CLI from source, using a terminal: :: - docker pull boromir674/neural-style-transfer + git clone https://github.com/boromir674/neural-style-transfer.git + + pip install ./neural-style-transfer + - export NST_OUTPUT=/home/$USER/nst-output +| The Neural Style Transfer - CLI heavely depends on Tensorflow (tf) and therefore it is crucial that tf is installed correctly in your Python environment. - CONTENT=/path/to/content-image.jpg - STYLE=/path/to/style-image.jpg - docker run -it --rm -v $NST_OUTPUT:/nst-output boromir674/neural-style-transfer $STYLE $CONTENT --iteratins 200 --location /nst-output .. |ci_pipeline| image:: https://img.shields.io/github/actions/workflow/status/boromir674/neural-style-transfer/test.yaml?branch=master&label=build&logo=github-actions&logoColor=233392FF :alt: CI Pipeline Status diff --git a/docker-compose.yml b/docker-compose.yml index 4c4990e..5d03f77 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -5,15 +5,12 @@ version: '3' services: + # mkdir art && NST_HOST_MOUNT="$PWD/art" docker-compose up nst_demo: - build: - context: ./ - target: prod_demo - dockerfile: Dockerfile - - # NST_HOST_MOUNT=/custom/nst-output docker-compose up + image: boromir674/neural-style-transfer:1.0.2 volumes: - ${NST_HOST_MOUNT:-./nst-algo-output}:/app/demo-output + command: [ "demo" ] ## NST Service, where the Pretrained Model Weights are made available to it (so that @@ -61,3 +58,15 @@ services: # AA_VGG_19: pretrained_model_bundle/imagenet-vgg-verydeep-19.mat # volumes: # - ./pretrained_model_bundle:/app/pretrained_model_bundle + + + # mkdir art && NST_HOST_MOUNT="$PWD/art" docker-compose up + # nst_demo_dev: + # build: + # context: ./ + # # target: default_with_demo + # dockerfile: Dockerfile + # # OR just build: . + + # volumes: + # - ${NST_HOST_MOUNT:-./nst-algo-output}:/app/demo-output \ No newline at end of file diff --git a/tox.ini b/tox.ini index 9c0109e..ac20b78 100644 --- a/tox.ini +++ b/tox.ini @@ -500,3 +500,52 @@ commands = # PRINT message python -c 'import os; my_dir = os.getcwd(); print("\nGenerated uml diagram(s), as svg/png files."); print("The diagram(s) reside in the \"" + os.path.join(my_dir, "{env:UML_DIAGRAMS}") + "\" directory.\n")' + + + +### DOCS ### + +## BUILD DOCUMENTATION PAGES ## +[testenv:docs] +description = Build the documentation. The documentation is built using mkdocs. +basepython = {env:TOXPYTHON:python3} +setenv = + {[testenv]setenv} + SPELLCHECK=1 +extras = docs +usedevelop = true +commands = mkdocs {posargs} + +## ALT BUILD DOCUMENTATION PAGES ## +# poetry export -o req-docs.txt -E docs && tox -e docs2 +[testenv:docs2] +description = Mkdocs +basepython = {env:TOXPYTHON:python3} +setenv = + {[testenv]setenv} + SPELLCHECK=1 +deps = -r req-docs.txt +usedevelop = true +commands = + mkdocs {posargs} + +[testenv:docs1] +description = Mkdocs +setenv = + {[testenv]setenv} + SPELLCHECK=1 +deps = poetry +skip_install = true +commands = + poetry install --no-root -E docs + mkdocs {posargs} + +## SERVE LIVE DOCUMENTATION ## +[testenv:live-html] +description = Start documentation dev-server (with hot-reloading) for browser preview +setenv = + {[testenv]setenv} + SPELLCHECK=1 +extras = docs +usedevelop = true +commands = mkdocs serve \ No newline at end of file From 25c817f287fad90b47951008fdb309a81c017f8d Mon Sep 17 00:00:00 2001 From: konstantinos Date: Wed, 15 Nov 2023 17:30:22 +0200 Subject: [PATCH 16/39] docs: update README --- README.rst | 8 ++++---- docker-compose.yml | 3 ++- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/README.rst b/README.rst index 8f4f405..e0d7c78 100755 --- a/README.rst +++ b/README.rst @@ -65,12 +65,12 @@ Quick-start # Process runs, in containerized environment, and exits. -| Check out your `generated` artificial artwork! +| Check out your **Generated Image**! +| Artificial Artwork: **art/canoe_water_w300-h225.jpg+blue-red_w300-h225.jpg-100.png** :: - - ls -l art/blue-red_w300-h225.jpg+canoe_water_w300-h225.jpg-100.png - xdg-open art/blue-red_w300-h225.jpg+canoe_water_w300-h225.jpg-100.png + + xdg-open art/canoe_water_w300-h225.jpg+blue-red_w300-h225.jpg-100.png Usage diff --git a/docker-compose.yml b/docker-compose.yml index 5d03f77..da94608 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -5,7 +5,8 @@ version: '3' services: - # mkdir art && NST_HOST_MOUNT="$PWD/art" docker-compose up + # mkdir art + # NST_HOST_MOUNT="$PWD/art" docker-compose up nst_demo: image: boromir674/neural-style-transfer:1.0.2 volumes: From f04d2c7fb3f789029642589bc8a21749ba49ad79 Mon Sep 17 00:00:00 2001 From: konstantinos Date: Wed, 15 Nov 2023 17:32:41 +0200 Subject: [PATCH 17/39] docs(auto-api-pages): automatically create van tree of API refs, from discovered docstrings in *.py --- docs/index.md | 4 ---- mkdocs.yml | 10 +++++++--- poetry.lock | 19 +++++++++++++++++-- pyproject.toml | 2 ++ scripts/gen_api_refs_pages.py | 20 +++++++++++++++++++- 5 files changed, 45 insertions(+), 10 deletions(-) diff --git a/docs/index.md b/docs/index.md index 2491c45..cafffe0 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,10 +1,6 @@ # Artificial Artwork -## API Reference - -::: artificial_artwork.nst_math - ```mermaid graph LR hello --> world diff --git a/mkdocs.yml b/mkdocs.yml index c3d54d5..bb83782 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -12,6 +12,9 @@ plugins: - gen-files: scripts: - scripts/gen_api_refs_pages.py + - literate-nav: + nav_file: SUMMARY.md + markdown_extensions: - mkdocs-click - pymdownx.highlight @@ -21,9 +24,10 @@ nav: - "Home": index.md - "CLI": cli.md - "Docker": build-process_DAG.md - - Code Reference: - - artificial_artwork: - - nst_math: reference/artificial_artwork/nst_math.md + - Code Reference: reference/ + # - Code Reference: + # - artificial_artwork: + # - nst_math: reference/artificial_artwork/nst_math.md # rest of the navigation... diff --git a/poetry.lock b/poetry.lock index 31e656c..7ef2ed2 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1291,6 +1291,21 @@ files = [ [package.dependencies] mkdocs = ">=1.0.3" +[[package]] +name = "mkdocs-literate-nav" +version = "0.6.1" +description = "MkDocs plugin to specify the navigation in Markdown instead of YAML" +category = "main" +optional = true +python-versions = ">=3.7" +files = [ + {file = "mkdocs_literate_nav-0.6.1-py3-none-any.whl", hash = "sha256:e70bdc4a07050d32da79c0b697bd88e9a104cf3294282e9cb20eec94c6b0f401"}, + {file = "mkdocs_literate_nav-0.6.1.tar.gz", hash = "sha256:78a7ab6d878371728acb0cdc6235c9b0ffc6e83c997b037f4a5c6ff7cef7d759"}, +] + +[package.dependencies] +mkdocs = ">=1.0.3" + [[package]] name = "mkdocs-material" version = "9.4.8" @@ -2499,11 +2514,11 @@ docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.link testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy (>=0.9.1)", "pytest-ruff"] [extras] -docs = ["mkdocs", "mkdocs-click", "mkdocs-gen-files", "mkdocs-material", "mkdocs-mermaid2-plugin", "mkdocstrings", "mkdocstrings-python", "pymdown-extensions"] +docs = ["mkdocs", "mkdocs-click", "mkdocs-gen-files", "mkdocs-literate-nav", "mkdocs-material", "mkdocs-mermaid2-plugin", "mkdocstrings", "mkdocstrings-python", "pymdown-extensions"] gui = ["matplotlib"] test = ["pytest", "pytest-click", "pytest-cov", "pytest-explicit", "pytest-xdist"] [metadata] lock-version = "2.0" python-versions = "~3.8" -content-hash = "a15ca2d0dbc9a9f3a50a48edfa534a3cf7c172138954b60970f8ddb0f7866766" +content-hash = "7185ee571884082fde50d3c626f87e4a4682bee191512415ae018abbc577aca1" diff --git a/pyproject.toml b/pyproject.toml index a502d70..f79031e 100755 --- a/pyproject.toml +++ b/pyproject.toml @@ -109,6 +109,7 @@ mkdocs-mermaid2-plugin = {version = "^1.1.1", optional = true} mkdocs-gen-files = {version = "^0.5.0", optional = true} mkdocstrings = {version = "^0.24.0", optional = true} mkdocstrings-python = {version = "^1.7.4", optional = true} +mkdocs-literate-nav = {version = "^0.6.1", optional = true} [tool.poetry.extras] @@ -131,6 +132,7 @@ docs = [ "mkdocstrings", "mkdocs-gen-files", "mkdocstrings-python", + "mkdocs-literate-nav", ] # CLI / ENTRYPOINTS diff --git a/scripts/gen_api_refs_pages.py b/scripts/gen_api_refs_pages.py index 38bec13..f8873bb 100644 --- a/scripts/gen_api_refs_pages.py +++ b/scripts/gen_api_refs_pages.py @@ -4,6 +4,7 @@ import mkdocs_gen_files +nav = mkdocs_gen_files.Nav() src = Path(__file__).parent.parent / "src" @@ -18,6 +19,9 @@ parts = parts[:-1] elif parts[-1] == "__main__": continue + + # Progressively build the navigation object + nav[parts] = doc_path.as_posix() with mkdocs_gen_files.open(full_doc_path, "w") as fd: identifier = ".".join(parts) @@ -34,4 +38,18 @@ # /blob/master/docs/src/artificial_artwork/nst_math.py - # mkdocs_gen_files.set_edit_path(full_doc_path, path) \ No newline at end of file + # mkdocs_gen_files.set_edit_path(full_doc_path, path) + + +# At the end, create a magic, literate navigation file called SUMMARY.md in the +# reference folder. +with mkdocs_gen_files.open("reference/SUMMARY.md", "w") as nav_file: + # Write the navigation as a Markdown list in the literate navigation file + nav_file.writelines(nav.build_literate_nav()) + +# Now we are able to remove our hard-coded navigation in mkdocs.yml, +# and replace it with a single line! + +# IE: - Code Reference: reference/ +# Note the trailing slash! It is needed so that mkdocs-literate-nav knows it has +# to look for a SUMMARY.md file in that folder From 59dbd2fbce555331f2e0e94a68d5194e130f428f Mon Sep 17 00:00:00 2001 From: konstantinos Date: Wed, 15 Nov 2023 17:41:18 +0200 Subject: [PATCH 18/39] docs(pages-to-sections): bind pages to sections themselves --- mkdocs.yml | 1 + poetry.lock | 19 +++++++++++++++++-- pyproject.toml | 2 ++ scripts/gen_api_refs_pages.py | 4 ++++ 4 files changed, 24 insertions(+), 2 deletions(-) diff --git a/mkdocs.yml b/mkdocs.yml index bb83782..00eaa40 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -14,6 +14,7 @@ plugins: - scripts/gen_api_refs_pages.py - literate-nav: nav_file: SUMMARY.md + - section-index markdown_extensions: - mkdocs-click diff --git a/poetry.lock b/poetry.lock index 7ef2ed2..6e3a817 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1371,6 +1371,21 @@ setuptools = ">=18.5" [package.extras] test = ["mkdocs-material"] +[[package]] +name = "mkdocs-section-index" +version = "0.3.8" +description = "MkDocs plugin to allow clickable sections that lead to an index page" +category = "main" +optional = true +python-versions = ">=3.7" +files = [ + {file = "mkdocs_section_index-0.3.8-py3-none-any.whl", hash = "sha256:823d298d78bc1e73e23678ff60889f3c369c2167b03dba73fea88bd0e268a60d"}, + {file = "mkdocs_section_index-0.3.8.tar.gz", hash = "sha256:bbd209f0da79441baf136ef3a9c40665bb9681d1fb62c73ca2f116fd1388a404"}, +] + +[package.dependencies] +mkdocs = ">=1.2" + [[package]] name = "mkdocstrings" version = "0.24.0" @@ -2514,11 +2529,11 @@ docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.link testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy (>=0.9.1)", "pytest-ruff"] [extras] -docs = ["mkdocs", "mkdocs-click", "mkdocs-gen-files", "mkdocs-literate-nav", "mkdocs-material", "mkdocs-mermaid2-plugin", "mkdocstrings", "mkdocstrings-python", "pymdown-extensions"] +docs = ["mkdocs", "mkdocs-click", "mkdocs-gen-files", "mkdocs-literate-nav", "mkdocs-material", "mkdocs-mermaid2-plugin", "mkdocs-section-index", "mkdocstrings", "mkdocstrings-python", "pymdown-extensions"] gui = ["matplotlib"] test = ["pytest", "pytest-click", "pytest-cov", "pytest-explicit", "pytest-xdist"] [metadata] lock-version = "2.0" python-versions = "~3.8" -content-hash = "7185ee571884082fde50d3c626f87e4a4682bee191512415ae018abbc577aca1" +content-hash = "6a3ff83d970a7444a5a0b6b5aa5e58c396cdbbf9c4d85838abf83c72780e51a1" diff --git a/pyproject.toml b/pyproject.toml index f79031e..02ddc99 100755 --- a/pyproject.toml +++ b/pyproject.toml @@ -110,6 +110,7 @@ mkdocs-gen-files = {version = "^0.5.0", optional = true} mkdocstrings = {version = "^0.24.0", optional = true} mkdocstrings-python = {version = "^1.7.4", optional = true} mkdocs-literate-nav = {version = "^0.6.1", optional = true} +mkdocs-section-index = {version = "^0.3.8", optional = true} [tool.poetry.extras] @@ -133,6 +134,7 @@ docs = [ "mkdocs-gen-files", "mkdocstrings-python", "mkdocs-literate-nav", + "mkdocs-section-index", ] # CLI / ENTRYPOINTS diff --git a/scripts/gen_api_refs_pages.py b/scripts/gen_api_refs_pages.py index f8873bb..9e1c210 100644 --- a/scripts/gen_api_refs_pages.py +++ b/scripts/gen_api_refs_pages.py @@ -17,6 +17,10 @@ if parts[-1] == "__init__": parts = parts[:-1] + ## https://mkdocstrings.github.io/recipes/#bind-pages-to-sections-themselves + doc_path = doc_path.with_name("index.md") + full_doc_path = full_doc_path.with_name("index.md") + ## elif parts[-1] == "__main__": continue From a4c442377dc640e1af47e8f787669afce86d1ab4 Mon Sep 17 00:00:00 2001 From: konstantinos Date: Wed, 15 Nov 2023 18:24:00 +0200 Subject: [PATCH 19/39] docs(polish-pages): render mermaid graphs! and redesign index page --- docs/index.md | 52 +++++++++++++++++++++++++++++++++++++++++---------- mkdocs.yml | 23 ++++++----------------- 2 files changed, 48 insertions(+), 27 deletions(-) diff --git a/docs/index.md b/docs/index.md index cafffe0..a72c7a9 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,16 +1,48 @@ # Artificial Artwork +## Quick-start -```mermaid -graph LR - hello --> world - world --> again - again --> hello +Run a demo NST, on sample `Content` and `Style` Images: + +```shell +mkdir art +export NST_HOST_MOUNT="$PWD/art" + +# Run containerized NST, and exit container upon finish +docker-compose up +``` + +Check out your **Generated Image**! +Artificial Artwork: **art/canoe_water_w300-h225.jpg+blue-red_w300-h225.jpg-100.png** + +```shell +xdg-open art/canoe_water_w300-h225.jpg+blue-red_w300-h225.jpg-100.png +``` + +## Usage + +Run the `nst` CLI with the `--help` option to see the available options. + +```shell +docker run boromir674/neural-style-transfer:1.0.2 --help ``` -## Project layout +## Development + + +### Installation from `pypi` + +```shell +pip install artificial-artwork +``` + +Only python3.8 wheel is included atm. + +### Installation from `source`: + +```shell +git clone https://github.com/boromir674/neural-style-transfer.git +pip install ./neural-style-transfer +``` - mkdocs.yml # The configuration file. - docs/ - index.md # The documentation homepage. - ... # Other markdown pages, images and other files. +The Neural Style Transfer - CLI heavely depends on Tensorflow (tf) and therefore it is crucial that tf is installed correctly in your Python environment. diff --git a/mkdocs.yml b/mkdocs.yml index 00eaa40..91b978e 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -4,11 +4,6 @@ plugins: - search - mermaid2 - mkdocstrings - # - mkdocstrings: - # default_handler: python - # handlers: - # python: - # paths: [src] - gen-files: scripts: - scripts/gen_api_refs_pages.py @@ -19,17 +14,11 @@ plugins: markdown_extensions: - mkdocs-click - pymdownx.highlight - - pymdownx.superfences - + nav: - - "Home": index.md - - "CLI": cli.md - - "Docker": build-process_DAG.md + - Home: + - "Quick Start": index.md + - "CLI": cli.md + - Developer: + - "Docker": build-process_DAG.md - Code Reference: reference/ - # - Code Reference: - # - artificial_artwork: - # - nst_math: reference/artificial_artwork/nst_math.md -# rest of the navigation... - - -# LEGACY \ No newline at end of file From aa3a825cbedac3fe66d7916bb60e47770adf4cac Mon Sep 17 00:00:00 2001 From: konstantinos Date: Wed, 15 Nov 2023 20:49:21 +0200 Subject: [PATCH 20/39] docs update --- .github/workflows/test.yaml | 46 ++++++++++++++----------------------- README.rst | 2 +- 2 files changed, 18 insertions(+), 30 deletions(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 2b9aeec..47b6316 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -30,48 +30,36 @@ env: TEST_STRATEGY: "{\"platform\":[\"ubuntu-latest\", \"macos-latest\", \"windows-latest\"], \"python-version\":[\"3.9\"]}" - ##### Pipeline Settings #### - - ### JOB ON/OFF SWITCHES ### - # On/Off switches for the various CI/CD steps - # If false the step prevented from running - # If true the step is allowed to run (it still may be skipped on other runtime conditions) - RUN_UNIT_TESTS: "true" - RUN_LINT_CHECKS: "true" - PUBLISH_ON_PYPI: "true" - DRAW_DEPENDENCIES: "true" - PREVENT_CODECOV_TEST_COVERAGE: "false" # Codecov Job runs only on 'false' - - # Hard switch to turn on/off the Docker build and publish to Dockerhub - DOCKER_JOB_ON: "true" + ####### Pipeline Settings ####### - ### END JOB ON/OFF SWITCHES ### - #### Behaviour - Docker build and Publish #### + ##### JOB ON/OFF SWITCHES ##### + RUN_UNIT_TESTS: "false" + RUN_LINT_CHECKS: "false" + PUBLISH_ON_PYPI: "true" + DRAW_DEPENDENCIES: "false" + PREVENT_CODECOV_TEST_COVERAGE: "false" + DOCKER_JOB_ON: "false" + ############################### - # Override policy-dependent decision-making and + #### DOCKER Job Policy ##### + # Override Docker Policy-dependent decision-making and # Accept any ALL (branch/build) to Publish to Dockerhub + # if true, will push image and ingnore below policy ALWAYS_BUILD_N_PUBLSIH_DOCKER: "false" - # Docker Policy - - ## Continous Integration / Continuous Deployment - ## CDeployment : Builds and Publishes only if Tests ran and passed + # CDeployment : Builds and Publishes only if Tests ran and passed + # CDelivery : Builds and Publishes if Tests Passed or if Tests were Skipped DOCKER_JOB_POLICY: "CDeployment" - - ## Continous Integration / Continuous Delivery - ## CDelivery : Builds and Publishes if Tests Passed or if Tests were Skipped # DOCKER_JOB_POLICY: "CDelivery" + ############################ - ##### END Pipeline Settings ###### - - - ## Static Code Analysis Parameters ## - + #### STATIC CHECK Job #### # Python Runtime version to set the Job runner with STATIC_ANALYSIS_PY: "3.8" # since our pyproject is tested to support 3.8 builds # Pylint Score Threshold, if the score is below this value the Job will fail # If pylint rated our code below that score, the Job fails PYLINT_SCORE_THRESHOLD: "8.2" + ########################## jobs: # we use the below to read the workflow env vars and be able to use in "- if:" Job conditionals diff --git a/README.rst b/README.rst index e0d7c78..a356467 100755 --- a/README.rst +++ b/README.rst @@ -34,7 +34,7 @@ This Python package runs a Neural Style Tranfer algorithm on input `content` and * - code quality - |codacy| |code_climate| |maintainability| |scrutinizer| - +| **Docs**: https://boromir674.github.io/neural-style-transfer/ Overview ======== From 734fbfe1da9e096e6f6b97d710f33ecfe966ff95 Mon Sep 17 00:00:00 2001 From: konstantinos Date: Wed, 15 Nov 2023 21:05:11 +0200 Subject: [PATCH 21/39] docs(cicd): document cicd pipeline, by cisualizing the Github Actoins Workflow as a graph --- .readthedocs.yaml | 41 +++++++++++++++++++++++++++++++++++++++++ docs/cicd.md | 21 +++++++++++++++++++++ docs/cli.md | 7 +++++++ mkdocs.yml | 1 + 4 files changed, 70 insertions(+) create mode 100644 .readthedocs.yaml create mode 100644 docs/cicd.md create mode 100644 docs/cli.md diff --git a/.readthedocs.yaml b/.readthedocs.yaml new file mode 100644 index 0000000..5fa59ec --- /dev/null +++ b/.readthedocs.yaml @@ -0,0 +1,41 @@ +# .readthedocs.yaml +# Read the Docs configuration file +# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details + +# Required +version: 2 + +# Set the OS, Python version and other tools you might need +build: + os: ubuntu-22.04 + tools: + python: "3.12" + # You can also specify other tool versions: + # nodejs: "19" + # rust: "1.64" + # golang: "1.19" + + # ALL JOBS implied: https://docs.readthedocs.io/en/stable/builds.html + jobs: + post_system_dependencies: + - pip install poetry + pre_install: + - poetry export -o req-docs.txt -E docs + + +# Build documentation in the "docs/" directory with mkdocs +mkdocs: + configuration: mkdocs.yml + +# Extra format only support by Shpinx +# formats: +# - epub +# - pdf + + +# Optional but recommended, declare the Python requirements required +# to build your documentation +# See https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html +python: + install: + - requirements: req-docs.txt \ No newline at end of file diff --git a/docs/cicd.md b/docs/cicd.md new file mode 100644 index 0000000..4f69887 --- /dev/null +++ b/docs/cicd.md @@ -0,0 +1,21 @@ +## CICD Pipeline, as single Github Action Workflow + +Flow Chart, of how the Jobs are connected in the Pipelinebuild). + +**config: ./.github/workflows/test.yaml** + +graph TB; +```mermaid +graph LR; + set_github_outputs --> test_suite + test_suite --> codecov_coverage_host + set_github_outputs --> codecov_coverage_host + set_github_outputs --> check_which_git_branch_we_are_on + test_suite --> pypi_publ + check_which_git_branch_we_are_on --> pypi_publ + read_docker_settings --> docker_build + test_suite --> docker_build + set_github_outputs --> lint + set_github_outputs --> check_trigger_draw_dependency_graphs + check_trigger_draw_dependency_graphs --> draw-dependencies +``` diff --git a/docs/cli.md b/docs/cli.md new file mode 100644 index 0000000..d3e8e5a --- /dev/null +++ b/docs/cli.md @@ -0,0 +1,7 @@ +# CLI Reference + +This page provides documentation for our command line tools. + +::: mkdocs-click + :module: artificial_artwork.cli + :command: entry_point diff --git a/mkdocs.yml b/mkdocs.yml index 91b978e..0132e85 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -21,4 +21,5 @@ nav: - "CLI": cli.md - Developer: - "Docker": build-process_DAG.md + - "CICD": cicd.md - Code Reference: reference/ From bc29aee27331937f502fefb069f61834757b876d Mon Sep 17 00:00:00 2001 From: konstantinos Date: Wed, 15 Nov 2023 21:08:25 +0200 Subject: [PATCH 22/39] docs(rtd-ci): call pip as module in rtd Runner CI --- .readthedocs.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.readthedocs.yaml b/.readthedocs.yaml index 5fa59ec..75f63ac 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -18,9 +18,9 @@ build: # ALL JOBS implied: https://docs.readthedocs.io/en/stable/builds.html jobs: post_system_dependencies: - - pip install poetry + - python -m pip install --user poetry pre_install: - - poetry export -o req-docs.txt -E docs + - python -m poetry export -o req-docs.txt -E docs # Build documentation in the "docs/" directory with mkdocs From 02bc6f8968a39853e345a43af398027600eba021 Mon Sep 17 00:00:00 2001 From: konstantinos Date: Wed, 15 Nov 2023 21:11:10 +0200 Subject: [PATCH 23/39] docs(rtd-build-ci): use explicitly python3.12 as entrypoint, rather than python --- .readthedocs.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.readthedocs.yaml b/.readthedocs.yaml index 75f63ac..10aac64 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -18,9 +18,9 @@ build: # ALL JOBS implied: https://docs.readthedocs.io/en/stable/builds.html jobs: post_system_dependencies: - - python -m pip install --user poetry + - python3.12 -m pip install --user poetry pre_install: - - python -m poetry export -o req-docs.txt -E docs + - python3.12 -m poetry export -o req-docs.txt -E docs # Build documentation in the "docs/" directory with mkdocs From 59e5d5dfe38ee720d26b3fef6bf29526b7a37af4 Mon Sep 17 00:00:00 2001 From: konstantinos Date: Wed, 15 Nov 2023 21:14:14 +0200 Subject: [PATCH 24/39] docs(rtd-build-ci): use python3 as entrypoint, rather than python3.12 --- .readthedocs.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.readthedocs.yaml b/.readthedocs.yaml index 10aac64..905068d 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -18,9 +18,9 @@ build: # ALL JOBS implied: https://docs.readthedocs.io/en/stable/builds.html jobs: post_system_dependencies: - - python3.12 -m pip install --user poetry + - python3 -m pip install --user poetry pre_install: - - python3.12 -m poetry export -o req-docs.txt -E docs + - python3 -m poetry export -o req-docs.txt -E docs # Build documentation in the "docs/" directory with mkdocs From b31ae6a1bd17389211efbc07a889b5e928ed1bce Mon Sep 17 00:00:00 2001 From: konstantinos Date: Wed, 15 Nov 2023 21:18:27 +0200 Subject: [PATCH 25/39] docs(rtd-build-ci): try to install poetry in pre_install Job --- .readthedocs.yaml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.readthedocs.yaml b/.readthedocs.yaml index 905068d..b933995 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -17,9 +17,10 @@ build: # ALL JOBS implied: https://docs.readthedocs.io/en/stable/builds.html jobs: - post_system_dependencies: - - python3 -m pip install --user poetry + # post_system_dependencies: + # - python3 -m pip install --user poetry pre_install: + - python3 -m pip install --user poetry - python3 -m poetry export -o req-docs.txt -E docs From b95f6c395f6f5b3a6bac8a0c80e288ceeac150fb Mon Sep 17 00:00:00 2001 From: konstantinos Date: Wed, 15 Nov 2023 21:20:16 +0200 Subject: [PATCH 26/39] docs(rtd-build-ci): do not do a --user pip install --- .readthedocs.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.readthedocs.yaml b/.readthedocs.yaml index b933995..4a61d86 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -20,7 +20,7 @@ build: # post_system_dependencies: # - python3 -m pip install --user poetry pre_install: - - python3 -m pip install --user poetry + - python3 -m pip install poetry - python3 -m poetry export -o req-docs.txt -E docs From 52684f34b193b77011cd1e5588db7d835c641376 Mon Sep 17 00:00:00 2001 From: konstantinos Date: Wed, 15 Nov 2023 21:23:53 +0200 Subject: [PATCH 27/39] docs(rtd-build-ci): setup Runner with python3.8 (required by pyproject.toml) --- .readthedocs.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.readthedocs.yaml b/.readthedocs.yaml index 4a61d86..84a978c 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -9,7 +9,7 @@ version: 2 build: os: ubuntu-22.04 tools: - python: "3.12" + python: "3.8" # You can also specify other tool versions: # nodejs: "19" # rust: "1.64" From 6755b5747a671506606c0daf7d77296b0a876367 Mon Sep 17 00:00:00 2001 From: konstantinos Date: Wed, 15 Nov 2023 21:34:29 +0200 Subject: [PATCH 28/39] docs(rtd-build): manually install artificial_artwork package (in edit mode) --- .readthedocs.yaml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/.readthedocs.yaml b/.readthedocs.yaml index 84a978c..b38edd7 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -20,8 +20,12 @@ build: # post_system_dependencies: # - python3 -m pip install --user poetry pre_install: - - python3 -m pip install poetry - - python3 -m poetry export -o req-docs.txt -E docs + - python --version + # generate compatible and pinned dependencies in pip format, for python3.8 + - python -m pip install poetry + - python -m poetry export -o req-docs.txt -E docs + post_install: + - python -m pip install -e . # Build documentation in the "docs/" directory with mkdocs From 8d85882efe8edf0e3332805c1a9f278e9d786209 Mon Sep 17 00:00:00 2001 From: konstantinos Date: Wed, 15 Nov 2023 21:48:00 +0200 Subject: [PATCH 29/39] style(scripts): lint code --- scripts/gen_api_refs_pages.py | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/scripts/gen_api_refs_pages.py b/scripts/gen_api_refs_pages.py index 9e1c210..6e91ff9 100644 --- a/scripts/gen_api_refs_pages.py +++ b/scripts/gen_api_refs_pages.py @@ -6,16 +6,16 @@ nav = mkdocs_gen_files.Nav() -src = Path(__file__).parent.parent / "src" +src = Path(__file__).parent.parent / "src" -for path in sorted(src.rglob("*.py")): - module_path = path.relative_to(src).with_suffix("") - doc_path = path.relative_to(src).with_suffix(".md") - full_doc_path = Path("reference", doc_path) +for path in sorted(src.rglob("*.py")): + module_path = path.relative_to(src).with_suffix("") + doc_path = path.relative_to(src).with_suffix(".md") + full_doc_path = Path("reference", doc_path) parts = list(module_path.parts) - if parts[-1] == "__init__": + if parts[-1] == "__init__": parts = parts[:-1] ## https://mkdocstrings.github.io/recipes/#bind-pages-to-sections-themselves doc_path = doc_path.with_name("index.md") @@ -23,14 +23,13 @@ ## elif parts[-1] == "__main__": continue - + # Progressively build the navigation object nav[parts] = doc_path.as_posix() - with mkdocs_gen_files.open(full_doc_path, "w") as fd: - identifier = ".".join(parts) - print("::: " + identifier, file=fd) - + with mkdocs_gen_files.open(full_doc_path, "w") as fd: + identifier = ".".join(parts) + print("::: " + identifier, file=fd) # ROOT # -> docs @@ -41,7 +40,6 @@ # /blob/master/src/artificial_artwork/nst_math.py instead of # /blob/master/docs/src/artificial_artwork/nst_math.py - # mkdocs_gen_files.set_edit_path(full_doc_path, path) From 37938e8cd333860375aac138c9624e6a27f510be Mon Sep 17 00:00:00 2001 From: konstantinos Date: Wed, 15 Nov 2023 23:26:23 +0200 Subject: [PATCH 30/39] docs: update content and set material theme --- docs/cicd.md | 5 ++++ mkdocs.yml | 70 +++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 74 insertions(+), 1 deletion(-) diff --git a/docs/cicd.md b/docs/cicd.md index 4f69887..734e94d 100644 --- a/docs/cicd.md +++ b/docs/cicd.md @@ -1,3 +1,8 @@ +--- +tags: + - CICD +--- + ## CICD Pipeline, as single Github Action Workflow Flow Chart, of how the Jobs are connected in the Pipelinebuild). diff --git a/mkdocs.yml b/mkdocs.yml index 0132e85..1bd9139 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -1,9 +1,72 @@ site_name: Artificial Artwork -repo_name: neural-style-transfer +site_url: https://neural-style-transfer.readthedocs.io/ +site_description: Neural Style Transfer Project Documentation. +site_author: Konstantinos Lampridis + +repo_url: https://github.com/boromir674/neural-style-transfer/ +repo_name: boromir674/neural-style-transfer +edit_uri: blob/master/docs/ + +theme: + # 1 + name: material + icon: + logo: material/palette + previous: fontawesome/solid/angle-left + next: fontawesome/solid/angle-right + default: material/tag + + # favicon: images/favicon.png + features: + - navigation.path + - navigation.top + - navigation.footer + # - navigation.indexes + # navigation.instant break mermaid + # features: + # - navigation.tracking + + # - navigation.instant + + # 2 + # name: mkdocs + # # nav_style: dark + # locale: en + # highlightjs: true + # hljs_languages: + # - python + # - bash + # - yaml + # - json + # shortcuts: + # help: 191 # ? + # next: 78 # n + # previous: 80 # p + # search: 83 # s + + # 3 +# name: readthedocs + plugins: + # Authors need installation + # - git-authors + - tags: + tags_file: tags.md + # BASIC SEARCH PLUGIN - search + # MERMAID Render Support - mermaid2 + # Directives Provider for docstrings parsing - mkdocstrings + # - mkdocstrings: + # handlers: + # python: + # options: + # docstring_section_style: list + # # members_order: source + # show_root_heading: false + # show_source: true + # show_signature_annotations: true - gen-files: scripts: - scripts/gen_api_refs_pages.py @@ -23,3 +86,8 @@ nav: - "Docker": build-process_DAG.md - "CICD": cicd.md - Code Reference: reference/ + - tags: tags.md + + +extra: + generator: false From 755d9cd9bf0106e7b5525261675a9e4797ccad54 Mon Sep 17 00:00:00 2001 From: konstantinos Date: Wed, 15 Nov 2023 23:29:36 +0200 Subject: [PATCH 31/39] fix docs ci --- README.rst | 9 +++++---- docs/tags.md | 5 +++++ 2 files changed, 10 insertions(+), 4 deletions(-) create mode 100644 docs/tags.md diff --git a/README.rst b/README.rst index a356467..d0672c0 100755 --- a/README.rst +++ b/README.rst @@ -22,8 +22,8 @@ This Python package runs a Neural Style Tranfer algorithm on input `content` and .. list-table:: :stub-columns: 1 - * - tests - - | |ci_pipeline| |codecov| + * - build + - | |ci_pipeline| |docs| |codecov| * - package - | |pypi| |wheel| |py_versions| |commits_since| @@ -169,8 +169,9 @@ Sample commands to install the NST CLI from source, using a terminal: - - +.. |docs| image:: https://readthedocs.org/projects/neural-style-transfer/badge/?version=latest + :alt: Documentation Status + :target: https://neural-style-transfer.readthedocs.io/en/latest/?badge=latest .. |docker| image:: https://img.shields.io/docker/v/boromir674/neural-style-transfer/latest?logo=docker&logoColor=%23849ED9 diff --git a/docs/tags.md b/docs/tags.md new file mode 100644 index 0000000..422b139 --- /dev/null +++ b/docs/tags.md @@ -0,0 +1,5 @@ +# Tags + +Following is a list of relevant tags: + +[TAGS] \ No newline at end of file From 9c12edea30270c8cbd3ad7143182a6838a2f8a7a Mon Sep 17 00:00:00 2001 From: konstantinos Date: Wed, 15 Nov 2023 23:33:49 +0200 Subject: [PATCH 32/39] release(semantic_version): bump version to 1.1.0 --- README.rst | 2 +- pyproject.toml | 2 +- src/artificial_artwork/__version__.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.rst b/README.rst index d0672c0..220d242 100755 --- a/README.rst +++ b/README.rst @@ -80,7 +80,7 @@ Run the `nst` CLI with the `--help` option to see the available options. :: - docker run boromir674/neural-style-transfer:1.0.2 --help + docker run boromir674/neural-style-transfer:1.1.0 --help Development diff --git a/pyproject.toml b/pyproject.toml index 02ddc99..7178dff 100755 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "artificial-artwork" -version = "1.0.2" +version = "1.1.0" description = "Create artificial artwork by transfering the appearance of one image (eg a famous painting) to another user-supplied image (eg your favourite photograph)." authors = ["Konstantinos Lampridis "] maintainers = ["Konstantinos Lampridis "] diff --git a/src/artificial_artwork/__version__.py b/src/artificial_artwork/__version__.py index 7863915..6849410 100755 --- a/src/artificial_artwork/__version__.py +++ b/src/artificial_artwork/__version__.py @@ -1 +1 @@ -__version__ = "1.0.2" +__version__ = "1.1.0" From b3b81f6068ec9120a2cfe5ed6f9c1ac751e8c5fe Mon Sep 17 00:00:00 2001 From: konstantinos Date: Wed, 15 Nov 2023 23:37:48 +0200 Subject: [PATCH 33/39] docs: update changelog with the release's changes --- CHANGELOG.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 501f5f9..a8aac41 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,27 @@ # Changelog +## 1.1.0 (2023-11-15) + +### Changes + +##### feature +- include wheel into the python distribution for PyPI + +##### documentation +- add Doc Pages content and use material theme +- document cicd pipeline, by visualizing the Github Actoins Workflow as a graph +- automatically create nav tree of API refs, from discovered docstrings in *.py +- update README + +##### build +- default docker build stage includes vgg and demo cmd + +##### ci +- call reusable workflow to handle PyPI Publish Job +- run Docker Job from reusable workflow + + ## 1.0.1 (2023-11-05) **CI Docker Behaviour** From be26c370d6c4c0e12b727b38036849b9b94e37df Mon Sep 17 00:00:00 2001 From: konstantinos Date: Wed, 15 Nov 2023 23:39:02 +0200 Subject: [PATCH 34/39] fix readme --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index 220d242..d0672c0 100755 --- a/README.rst +++ b/README.rst @@ -80,7 +80,7 @@ Run the `nst` CLI with the `--help` option to see the available options. :: - docker run boromir674/neural-style-transfer:1.1.0 --help + docker run boromir674/neural-style-transfer:1.0.2 --help Development From 6cfa34434be5f2d8950e1d320d1b35d9e39df695 Mon Sep 17 00:00:00 2001 From: konstantinos Date: Thu, 16 Nov 2023 00:06:10 +0200 Subject: [PATCH 35/39] docs(ci): visualize ci and dockerfile, and dynamically inject in Doc Pages on CI --- .readthedocs.yaml | 3 + docs/build-process_DAG.md | 14 +-- docs/cicd.md | 18 +--- mkdocs.yml | 2 + poetry.lock | 112 ++++++++++++++---------- pyproject.toml | 2 + scripts/visualize-dockerfile.py | 1 + scripts/visualize-ga-workflow.py | 143 +++++++++++++++++++++++++++++++ 8 files changed, 221 insertions(+), 74 deletions(-) create mode 120000 scripts/visualize-dockerfile.py create mode 100644 scripts/visualize-ga-workflow.py diff --git a/.readthedocs.yaml b/.readthedocs.yaml index b38edd7..234b579 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -26,6 +26,9 @@ build: - python -m poetry export -o req-docs.txt -E docs post_install: - python -m pip install -e . + pre_build: + - python ./scripts/visualize-ga-workflow.py > ./docs/cicd_mermaid.md + - python ./scripts/visualize-dockerfile.py > ./docs/dockerfile_mermaid.md # Build documentation in the "docs/" directory with mkdocs diff --git a/docs/build-process_DAG.md b/docs/build-process_DAG.md index 239c7a9..d032f41 100644 --- a/docs/build-process_DAG.md +++ b/docs/build-process_DAG.md @@ -8,16 +8,4 @@ If you run `docker build .` the `target` used by default is the `default_with_de **Dockerfile: ./Dockerfile** - -```mermaid -graph TB; - python:3.8.12-slim-bullseye --> base - base --> source - source --> prod - base --> prod_install - prod -. "COPY" .-> prod_install - prod_install --> prod_ready - prod_ready --> prod_demo - prod_ready --> default - prod_demo --> default_with_demo -``` +{% include 'dockerfile_mermaid.md' %} diff --git a/docs/cicd.md b/docs/cicd.md index 734e94d..5568dc8 100644 --- a/docs/cicd.md +++ b/docs/cicd.md @@ -5,22 +5,8 @@ tags: ## CICD Pipeline, as single Github Action Workflow -Flow Chart, of how the Jobs are connected in the Pipelinebuild). +Flow Chart, of Jobs Dependencies in the Pipeline. **config: ./.github/workflows/test.yaml** -graph TB; -```mermaid -graph LR; - set_github_outputs --> test_suite - test_suite --> codecov_coverage_host - set_github_outputs --> codecov_coverage_host - set_github_outputs --> check_which_git_branch_we_are_on - test_suite --> pypi_publ - check_which_git_branch_we_are_on --> pypi_publ - read_docker_settings --> docker_build - test_suite --> docker_build - set_github_outputs --> lint - set_github_outputs --> check_trigger_draw_dependency_graphs - check_trigger_draw_dependency_graphs --> draw-dependencies -``` +{% include 'cicd_mermaid.md' %} diff --git a/mkdocs.yml b/mkdocs.yml index 1bd9139..b9b0d77 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -48,6 +48,8 @@ theme: # name: readthedocs plugins: + # Enable jinja inside your markdown files + - macros # Authors need installation # - git-authors - tags: diff --git a/poetry.lock b/poetry.lock index 6e3a817..4b4aa15 100644 --- a/poetry.lock +++ b/poetry.lock @@ -503,54 +503,54 @@ testing = ["hatch", "pre-commit", "pytest", "tox"] [[package]] name = "fonttools" -version = "4.44.0" +version = "4.44.3" description = "Tools to manipulate font files" category = "main" optional = true python-versions = ">=3.8" files = [ - {file = "fonttools-4.44.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e1cd1c6bb097e774d68402499ff66185190baaa2629ae2f18515a2c50b93db0c"}, - {file = "fonttools-4.44.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b9eab7f9837fdaa2a10a524fbcc2ec24bf60637c044b6e4a59c3f835b90f0fae"}, - {file = "fonttools-4.44.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f412954275e594f7a51c16f3b3edd850acb0d842fefc33856b63a17e18499a5"}, - {file = "fonttools-4.44.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50d25893885e80a5955186791eed5579f1e75921751539cc1dc3ffd1160b48cf"}, - {file = "fonttools-4.44.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:22ea8aa7b3712450b42b044702bd3a64fd118006bad09a6f94bd1b227088492e"}, - {file = "fonttools-4.44.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:df40daa6c03b98652ffe8110ae014fe695437f6e1cb5a07e16ea37f40e73ac86"}, - {file = "fonttools-4.44.0-cp310-cp310-win32.whl", hash = "sha256:bca49da868e8bde569ef36f0cc1b6de21d56bf9c3be185c503b629c19a185287"}, - {file = "fonttools-4.44.0-cp310-cp310-win_amd64.whl", hash = "sha256:dbac86d83d96099890e731cc2af97976ff2c98f4ba432fccde657c5653a32f1c"}, - {file = "fonttools-4.44.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e8ff7d19a6804bfd561cfcec9b4200dd1788e28f7de4be70189801530c47c1b3"}, - {file = "fonttools-4.44.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a8a1fa9a718de0bc026979c93e1e9b55c5efde60d76f91561fd713387573817d"}, - {file = "fonttools-4.44.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c05064f95aacdfc06f21e55096c964b2228d942b8675fa26995a2551f6329d2d"}, - {file = "fonttools-4.44.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31b38528f25bc662401e6ffae14b3eb7f1e820892fd80369a37155e3b636a2f4"}, - {file = "fonttools-4.44.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:05d7c4d2c95b9490e669f3cb83918799bf1c838619ac6d3bad9ea017cfc63f2e"}, - {file = "fonttools-4.44.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6999e80a125b0cd8e068d0210b63323f17338038c2ecd2e11b9209ec430fe7f2"}, - {file = "fonttools-4.44.0-cp311-cp311-win32.whl", hash = "sha256:a7aec7f5d14dfcd71fb3ebc299b3f000c21fdc4043079101777ed2042ba5b7c5"}, - {file = "fonttools-4.44.0-cp311-cp311-win_amd64.whl", hash = "sha256:518a945dbfe337744bfff31423c1430303b8813c5275dffb0f2577f0734a1189"}, - {file = "fonttools-4.44.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:59b6ad83cce067d10f4790c037a5904424f45bebb5e7be2eb2db90402f288267"}, - {file = "fonttools-4.44.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c2de1fb18198acd400c45ffe2aef5420c8d55fde903e91cba705596099550f3b"}, - {file = "fonttools-4.44.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:84f308b7a8d28208d54315d11d35f9888d6d607673dd4d42d60b463682ee0400"}, - {file = "fonttools-4.44.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66bc6efd829382f7a7e6cf33c2fb32b13edc8a239eb15f32acbf197dce7a0165"}, - {file = "fonttools-4.44.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a8b99713d3a0d0e876b6aecfaada5e7dc9fe979fcd90ef9fa0ba1d9b9aed03f2"}, - {file = "fonttools-4.44.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b63da598d9cbc52e2381f922da0e94d60c0429f92207bd3fb04d112fc82ea7cb"}, - {file = "fonttools-4.44.0-cp312-cp312-win32.whl", hash = "sha256:f611c97678604e302b725f71626edea113a5745a7fb557c958b39edb6add87d5"}, - {file = "fonttools-4.44.0-cp312-cp312-win_amd64.whl", hash = "sha256:58af428746fa73a2edcbf26aff33ac4ef3c11c8d75bb200eaea2f7e888d2de4e"}, - {file = "fonttools-4.44.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:9ee8692e23028564c13d924004495f284df8ac016a19f17a87251210e1f1f928"}, - {file = "fonttools-4.44.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:dab3d00d27b1a79ae4d4a240e8ceea8af0ff049fd45f05adb4f860d93744110d"}, - {file = "fonttools-4.44.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f53526668beccdb3409c6055a4ffe50987a7f05af6436fa55d61f5e7bd450219"}, - {file = "fonttools-4.44.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3da036b016c975c2d8c69005bdc4d5d16266f948a7fab950244e0f58301996a"}, - {file = "fonttools-4.44.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b99fe8ef4093f672d00841569d2d05691e50334d79f4d9c15c1265d76d5580d2"}, - {file = "fonttools-4.44.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6d16d9634ff1e5cea2cf4a8cbda9026f766e4b5f30b48f8180f0e99133d3abfc"}, - {file = "fonttools-4.44.0-cp38-cp38-win32.whl", hash = "sha256:3d29509f6e05e8d725db59c2d8c076223d793e4e35773040be6632a0349f2f97"}, - {file = "fonttools-4.44.0-cp38-cp38-win_amd64.whl", hash = "sha256:d4fa4f4bc8fd86579b8cdbe5e948f35d82c0eda0091c399d009b2a5a6b61c040"}, - {file = "fonttools-4.44.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c794de4086f06ae609b71ac944ec7deb09f34ecf73316fddc041087dd24bba39"}, - {file = "fonttools-4.44.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2db63941fee3122e31a21dd0f5b2138ce9906b661a85b63622421d3654a74ae2"}, - {file = "fonttools-4.44.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb01c49c8aa035d5346f46630209923d4927ed15c2493db38d31da9f811eb70d"}, - {file = "fonttools-4.44.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46c79af80a835410874683b5779b6c1ec1d5a285e11c45b5193e79dd691eb111"}, - {file = "fonttools-4.44.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b6e6aa2d066f8dafd06d8d0799b4944b5d5a1f015dd52ac01bdf2895ebe169a0"}, - {file = "fonttools-4.44.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:63a3112f753baef8c6ac2f5f574bb9ac8001b86c8c0c0380039db47a7f512d20"}, - {file = "fonttools-4.44.0-cp39-cp39-win32.whl", hash = "sha256:54efed22b2799a85475e6840e907c402ba49892c614565dc770aa97a53621b2b"}, - {file = "fonttools-4.44.0-cp39-cp39-win_amd64.whl", hash = "sha256:2e91e19b583961979e2e5a701269d3cfc07418963bee717f8160b0a24332826b"}, - {file = "fonttools-4.44.0-py3-none-any.whl", hash = "sha256:b9beb0fa6ff3ea808ad4a6962d68ac0f140ddab080957b20d9e268e4d67fb335"}, - {file = "fonttools-4.44.0.tar.gz", hash = "sha256:4e90dd81b6e0d97ebfe52c0d12a17a9ef7f305d6bfbb93081265057d6092f252"}, + {file = "fonttools-4.44.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:192ebdb3bb1882b7ed3ad4b949a106ddd8b428d046ddce64df2d459f7a2db31b"}, + {file = "fonttools-4.44.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:20898476cf9c61795107b91409f4b1cf86de6e92b41095bbe900c05b5b117c96"}, + {file = "fonttools-4.44.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:437204780611f9f80f74cd4402fa451e920d1c4b6cb474a0818a734b4affc477"}, + {file = "fonttools-4.44.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50152205ed3e16c5878a006ee53ecc402acac9af68357343be1e5c36f66ccb24"}, + {file = "fonttools-4.44.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ba9c407d8bd63b21910b98399aeec87e24ca9c3e62ea60c246e505c4a4df6c27"}, + {file = "fonttools-4.44.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:79a6babb87d7f70f8aed88f157bbdc5d2f01ad8b01e9535ff07e43e96ad25548"}, + {file = "fonttools-4.44.3-cp310-cp310-win32.whl", hash = "sha256:32e8a5cebfe8f797461b02084104053b2690ebf0cc38eda5beb9ba24ce43c349"}, + {file = "fonttools-4.44.3-cp310-cp310-win_amd64.whl", hash = "sha256:c26649a6ce6f1ce4dd6748f64b18f70e39c618c6188286ab9534a949da28164c"}, + {file = "fonttools-4.44.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5cd114cb20b491f6812aa397040b06a469563c1a01ec94c8c5d96b76d84916db"}, + {file = "fonttools-4.44.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e84084cc325f888c3495df7ec25f6133be0f606efb80a9c9e072ea6064ede9ac"}, + {file = "fonttools-4.44.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:877e36afce69cfdbd0453a4f44b16e865ac29f06df29f10f0b822a68ab858e86"}, + {file = "fonttools-4.44.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1c2cb1e2a7cfeaeb40b8823f238d7e02929b3a0b53e133e757dec5e99c327c9"}, + {file = "fonttools-4.44.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:dd752b778b37863cf5146d0112aafcd5693235831f09303809ab9c1e564c236b"}, + {file = "fonttools-4.44.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8f4e22c5128cb604d3b0b869eb8d3092a1c10cbe6def402ff46bb920f7169374"}, + {file = "fonttools-4.44.3-cp311-cp311-win32.whl", hash = "sha256:4831d948bc3cea9cd8bf0c92a087f4392068bcac3b584a61a4c837c48a012337"}, + {file = "fonttools-4.44.3-cp311-cp311-win_amd64.whl", hash = "sha256:948b35e54b0c1b6acf9d63c70515051b7d400d69b61c91377cf0e8742d71c44d"}, + {file = "fonttools-4.44.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:fad1c74aa10b77764d3cdf3481bd181d4949e0b46f2da6f9e57543d4adbda177"}, + {file = "fonttools-4.44.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b6a77e3b994649f72fb46b0b8cfe64481b5640e5aecc2d77961300a34fe1dc4f"}, + {file = "fonttools-4.44.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2bff4f9d5edc10b29d2a2daeefd78a47289ba2f751c9bf247925b9d43c6efd79"}, + {file = "fonttools-4.44.3-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3302998e02a854a41c930f9f1366eb8092dbc5fe7ff636d86aeb28d232f4610a"}, + {file = "fonttools-4.44.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:8c7985017e7fb2c2613fa5c440457cd45a6ea808f8d08ed70c27e02e6862cbbe"}, + {file = "fonttools-4.44.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:35d88af2b63060ed2b50aa00d38f60edf4c0b9275a77ae1a98e8d2c03540c617"}, + {file = "fonttools-4.44.3-cp312-cp312-win32.whl", hash = "sha256:5478a77a15d01a21c569fc4ab6f2faba852a21d0932eef02ac4c4a4b50af8070"}, + {file = "fonttools-4.44.3-cp312-cp312-win_amd64.whl", hash = "sha256:979fc845703e0d9b35bc65379fcf34d050e04c3e0b3381a0f66b0be33183da1c"}, + {file = "fonttools-4.44.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:7a8b9f22d3c147ecdc7be46f9f1e1df0523541df0535fac5bdd653726218d068"}, + {file = "fonttools-4.44.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bcb0fde94374ba00c118d632b0b5f1f4447401313166bcb14d737322928e358f"}, + {file = "fonttools-4.44.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3eb365cd8ae4765973fa036aed0077ac26f37b2f8240a72c4a29cd9d8a31027f"}, + {file = "fonttools-4.44.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c329e21502c894fe4c800e32bc3ce37c6b5ca95778d32dff17d7ebf5cac94efa"}, + {file = "fonttools-4.44.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:345a30db8adfbb868221234fb434dd2fc5bfe27baafbaf418528f6c5a5a95584"}, + {file = "fonttools-4.44.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2fe4eed749de2e6bf3aa05d18df04231a712a16c08974af5e67bb9f75a25d10f"}, + {file = "fonttools-4.44.3-cp38-cp38-win32.whl", hash = "sha256:3b179a284b73802edd6d910e6384f28098cb03bd263fd87db6abb31679f68863"}, + {file = "fonttools-4.44.3-cp38-cp38-win_amd64.whl", hash = "sha256:4c805a0b0545fd9becf6dfe8d57e45a7c1af7fdbfd0a7d776c5e999e4edec9f5"}, + {file = "fonttools-4.44.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f647d270ee90f70acbf5b31a53d486ba0897624236f9056d624c4e436386a14e"}, + {file = "fonttools-4.44.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ba82ee938bd7ea16762124a650bf2529f67dfe9999f64e0ebe1ef0a04baceafd"}, + {file = "fonttools-4.44.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e3bbca4f873d96c20757c24c70a903251a8998e1931bd888b49956f21d94b441"}, + {file = "fonttools-4.44.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50b43fd55089ae850a050f0c382f13fc9586279a540b646b28b9e93fbc05b8a3"}, + {file = "fonttools-4.44.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:cde83f83919ae7569a0316e093e04022dbb8ae5217f41cf591f125dd35d4dc0d"}, + {file = "fonttools-4.44.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:72ec91b85391dd4b06991c0919215ecf910554df2842df32e928155ea5b74aef"}, + {file = "fonttools-4.44.3-cp39-cp39-win32.whl", hash = "sha256:367aa3e81a096e9a95dfc0d5afcbd0a299d857bac6d0fe5f1614c6f3e53f447f"}, + {file = "fonttools-4.44.3-cp39-cp39-win_amd64.whl", hash = "sha256:718599de63b337518bfa5ce67e4ae462da3dd582a74fbe805f56b3704eb334a1"}, + {file = "fonttools-4.44.3-py3-none-any.whl", hash = "sha256:42eefbb1babf81de40ab4a6ace6018c8c5a0d79ece0f986f73a9904b26ee511b"}, + {file = "fonttools-4.44.3.tar.gz", hash = "sha256:f77b6c0add23a3f1ec8eda40015bcb8e92796f7d06a074de102a31c7d007c05b"}, ] [package.extras] @@ -1306,6 +1306,28 @@ files = [ [package.dependencies] mkdocs = ">=1.0.3" +[[package]] +name = "mkdocs-macros-plugin" +version = "1.0.5" +description = "Unleash the power of MkDocs with macros and variables" +category = "main" +optional = true +python-versions = ">=3.8" +files = [ + {file = "mkdocs-macros-plugin-1.0.5.tar.gz", hash = "sha256:fe348d75f01c911f362b6d998c57b3d85b505876dde69db924f2c512c395c328"}, + {file = "mkdocs_macros_plugin-1.0.5-py3-none-any.whl", hash = "sha256:f60e26f711f5a830ddf1e7980865bf5c0f1180db56109803cdd280073c1a050a"}, +] + +[package.dependencies] +jinja2 = "*" +mkdocs = ">=0.17" +python-dateutil = "*" +pyyaml = "*" +termcolor = "*" + +[package.extras] +test = ["mkdocs-include-markdown-plugin", "mkdocs-macros-test", "mkdocs-material (>=6.2)"] + [[package]] name = "mkdocs-material" version = "9.4.8" @@ -2529,11 +2551,11 @@ docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.link testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy (>=0.9.1)", "pytest-ruff"] [extras] -docs = ["mkdocs", "mkdocs-click", "mkdocs-gen-files", "mkdocs-literate-nav", "mkdocs-material", "mkdocs-mermaid2-plugin", "mkdocs-section-index", "mkdocstrings", "mkdocstrings-python", "pymdown-extensions"] +docs = ["mkdocs", "mkdocs-click", "mkdocs-gen-files", "mkdocs-literate-nav", "mkdocs-macros-plugin", "mkdocs-material", "mkdocs-mermaid2-plugin", "mkdocs-section-index", "mkdocstrings", "mkdocstrings-python", "pymdown-extensions"] gui = ["matplotlib"] test = ["pytest", "pytest-click", "pytest-cov", "pytest-explicit", "pytest-xdist"] [metadata] lock-version = "2.0" python-versions = "~3.8" -content-hash = "6a3ff83d970a7444a5a0b6b5aa5e58c396cdbbf9c4d85838abf83c72780e51a1" +content-hash = "06cf6f90b0254ede0efa8b5b8e522d93dec6baaec9d97296aabb2806514bfe43" diff --git a/pyproject.toml b/pyproject.toml index 7178dff..1bc2987 100755 --- a/pyproject.toml +++ b/pyproject.toml @@ -111,6 +111,7 @@ mkdocstrings = {version = "^0.24.0", optional = true} mkdocstrings-python = {version = "^1.7.4", optional = true} mkdocs-literate-nav = {version = "^0.6.1", optional = true} mkdocs-section-index = {version = "^0.3.8", optional = true} +mkdocs-macros-plugin = {version = "^1.0.5", optional = true} [tool.poetry.extras] @@ -135,6 +136,7 @@ docs = [ "mkdocstrings-python", "mkdocs-literate-nav", "mkdocs-section-index", + "mkdocs-macros-plugin", ] # CLI / ENTRYPOINTS diff --git a/scripts/visualize-dockerfile.py b/scripts/visualize-dockerfile.py new file mode 120000 index 0000000..b0dcf6e --- /dev/null +++ b/scripts/visualize-dockerfile.py @@ -0,0 +1 @@ +/data/repos/static-site-generator/scripts/visualize-dockerfile.py \ No newline at end of file diff --git a/scripts/visualize-ga-workflow.py b/scripts/visualize-ga-workflow.py new file mode 100644 index 0000000..d00fa4e --- /dev/null +++ b/scripts/visualize-ga-workflow.py @@ -0,0 +1,143 @@ +#!/usr/bin/env python3 + +import argparse +import sys +import typing as t +from pathlib import Path + +import yaml + +# TYPES of Data as Read from Yaml Config + +## job names are yaml keys +JobName = t.NewType('JobName', str) + +## each job 'needs' key can be: +# - missing -> python None +# - a string value expected to be a job name -> python JobName +# - a list value, with jobs names as items -> python List[JobName] + +# OPT 2 +# Define a new type for JobNeeds +# JobNeedsType = t.Union[JobName, t.List[JobName], None] +# JobNeeds = t.NewType('JobNeeds', JobNeedsType) +# # OPT 1 +JobNeeds = t.Union[JobName, t.List[JobName], None] + + +ParsedYaml = t.Dict[str, t.Any] + +# TYPES of Data Model +JobsNeedsValue = t.List[JobName] + + +# Parse the GitHub Actions YAML file +def parse_actions_config(filename: t.Union[str, Path]) -> t.Union[ParsedYaml, None]: + with open(filename, 'r') as stream: + try: + return yaml.safe_load(stream) + except yaml.YAMLError as exc: + print(exc) + return None + + +# Extract job names and their 'needs' sections +def extract_job_dependencies(config: ParsedYaml) -> t.Dict[str, JobsNeedsValue]: + """Understand DAG of all Jobs""" + # DAG representation + + # mapping of job names to their dependencies (previous steps in the dependency DAG) + job_dependencies: t.Dict[str, JobsNeedsValue] = {} + + if not 'jobs' in config: + print(f"[WARNGING] No 'jobs' section found in config file") + + else: + for job_name, job_config in config['jobs'].items(): + needs: JobNeeds = job_config.get('needs') + + current_job_needs_value: JobsNeedsValue = [] + if isinstance(needs, str): # single dependency + current_job_needs_value = [needs] + elif isinstance(needs, list): # multiple dependencies + current_job_needs_value = needs + elif needs is not None: + print(f"[WARNING] Unexpected 'needs' value: {needs}") + + job_dependencies[job_name] = current_job_needs_value + + return job_dependencies + + +# Generate Mermaid markdown from job dependencies +def generate_mermaid_markdown(job_dependencies: t.Dict[str, t.List[str]]) -> str: + mermaid_code = 'graph LR;\n' + for job_name, needs in job_dependencies.items(): + for need in needs: + mermaid_code += f' {need} --> {job_name}\n' + return mermaid_code + + +def markdown_mermaid_from_yaml(filename: t.Union[str, Path]) -> str: + config: ParsedYaml = parse_actions_config(filename) + if config is None: + print(f"[ERROR] Could not parse YAML file: {filename}") + sys.exit(1) + job_dependencies: t.Dict[str, JobsNeedsValue] = extract_job_dependencies(config) + mermaid_code: str = generate_mermaid_markdown(job_dependencies) + + markdown: str = ( + # "## CI/CD Pipeline\n\n" + # f"**CI Config File: {filename}**\n\n" + f"```mermaid\n{mermaid_code}```\n" + ) + + return markdown + + +#### MAIN #### +def main(): + args = arg_parse() + + if args.input == "default-path": + ci_config = Path.cwd() / ".github/workflows/test.yaml" + # ci_config_file = Path(__file__).parent / "ci-config.yml" + # input_data = sys.stdin.read() + else: + ci_config = Path(args.input) + + md: str = markdown_mermaid_from_yaml( + ci_config, + ) + + if args.output: + # Handle the case of writing to an output file + output_file = Path(args.output) + output_file.write_text(md) + else: + # Handle the case of streaming output to stdout + sys.stdout.write(md) + # print + + +# CLI + + +def arg_parse(): + parser = argparse.ArgumentParser( + description="Command-line tool to handle input and output options." + ) + parser.add_argument( + "input", + nargs="?", + default="default-path", + help="Input file path (default: 'default-path')", + ) + parser.add_argument("-o", "--output", help="Output file path") + + args = parser.parse_args() + return args + + +if __name__ == '__main__': + main() From a95fb05a5d93c8913d120117ded55e872756ca4f Mon Sep 17 00:00:00 2001 From: konstantinos Date: Thu, 16 Nov 2023 00:13:18 +0200 Subject: [PATCH 36/39] fix docs ci --- scripts/visualize-dockerfile.py | 130 +++++++++++++++++++++++++++++++- 1 file changed, 129 insertions(+), 1 deletion(-) mode change 120000 => 100644 scripts/visualize-dockerfile.py diff --git a/scripts/visualize-dockerfile.py b/scripts/visualize-dockerfile.py deleted file mode 120000 index b0dcf6e..0000000 --- a/scripts/visualize-dockerfile.py +++ /dev/null @@ -1 +0,0 @@ -/data/repos/static-site-generator/scripts/visualize-dockerfile.py \ No newline at end of file diff --git a/scripts/visualize-dockerfile.py b/scripts/visualize-dockerfile.py new file mode 100644 index 0000000..5390d11 --- /dev/null +++ b/scripts/visualize-dockerfile.py @@ -0,0 +1,129 @@ +#!/usr/bin/env python +import argparse +import re +import typing as t +from pathlib import Path + + +def parse_dockerfile(dockerfile_path): + # Stages built from 'FROM AS statements + stages = {} + # copies built from 'COPY --from= ' statements + copies = {} + # Line match at current line + current_stage = None + stage_name_reg = r'[\w:\.\-]+' + stage_reg = re.compile( + rf'^FROM\s+(?P{stage_name_reg})\s+[Aa][Ss]\s+(?P{stage_name_reg})' + ) + + copy_from_reg = re.compile( + r'^COPY\s+\-\-from=(?P[\w\.\-:]+)\s+(?P[\w\.\-:/]+)' + ) + + with open(dockerfile_path, 'r') as f: + lines = f.readlines() + + for line in lines: + line = line.strip() + + # Check if it's a new stage + # each stage has a unique alias in the Dockerfile + stage_match = stage_reg.match(line) + if stage_match: # FROM AS + current_stage = stage_match.group('alias') + + # we create an empty list for pointing to "prev" stages + stages[current_stage] = [] + copies[current_stage] = [] + try: + previous_stage = stage_match.group('stage') + except AttributeError as error: + print(f'[DEBUG] Line: {line}') + print(f"Error: {error}") + raise error + # Add instructions to current stage + if current_stage: + stages[current_stage].append(previous_stage) + else: + match = copy_from_reg.match(line) + if match: # COPY --from= + previous_stage: str = match.group('prev_stage') + path_copied: str = match.group('path') + copies[current_stage].append((previous_stage, path_copied)) + + return stages, copies + + +def generate_mermaid_flow_chart(dockerfile_dag): + stages: t.Dict[str, t.List[str]] = dockerfile_dag[0] + thick_line_with_arrow = '-->' + copies: t.Dick[str, t.List[t.Tuple[str, str]]] = dockerfile_dag[1] + dotted_arrow_with_text = '-. "{text}" .->' + + chart = "graph TB;\n" + + for stage, prev_stages in stages.items(): + # chart += f" {stage}({stage})\n" + + # Connect 'FROM AS ' Stages + for prev_stage in prev_stages: + chart += f" {prev_stage} {thick_line_with_arrow} {stage}\n" + + # Connect 'COPY --from ' statements + prev_copies = copies.get(stage, []) + for prev_copy in prev_copies: + prev_stage: str = prev_copy[0] + # write copied path in arrow text + # path_copied: str = prev_copy[1] + # chart += f" {prev_stage} " + dotted_arrow_with_text.format(text=path_copied) + f" {stage}\n" + # write COPY (literal) in arrow text + chart += ( + f" {prev_stage} " + dotted_arrow_with_text.format(text='COPY') + f" {stage}\n" + ) + + return chart + + +def generate_markdown(dockerfile_path, output_path): + dockerfile_dag = parse_dockerfile(dockerfile_path) + + flow_chart = generate_mermaid_flow_chart(dockerfile_dag) + + markdown = ( + "## Dockerfile Flow Chart\n\n" + f"**Dockerfile: {dockerfile_path}**\n\n" + f"```mermaid\n{flow_chart}```\n" + ) + if output_path is None: + print(markdown) + return + with open(output_path, 'w') as f: + f.write(markdown) + + print(f"Markdown generated and saved to {output_path}") + + +def parse_cli_args() -> t.Tuple[Path, t.Optional[str]]: + parser = argparse.ArgumentParser(description='Process Dockerfile paths.') + + parser.add_argument( + 'dockerfile_path', nargs='?', default='Dockerfile', help='Path to the Dockerfile' + ) + parser.add_argument( + '-o', '--output', help='Output path. If not specified, print to stdout.' + ) + + args = parser.parse_args() + + dockerfile: Path = Path(args.dockerfile_path) + if not dockerfile.exists(): + # explicitly use cwd to try again to find it + dockerfile = Path.cwd() / args.dockerfile_path + + return dockerfile, args.output + + +if __name__ == '__main__': + dockerfile_path, output_path = parse_cli_args() + generate_markdown(dockerfile_path, output_path) From 8031da1cce2c1a4ddebbd79b99006842707bc82b Mon Sep 17 00:00:00 2001 From: konstantinos Date: Thu, 16 Nov 2023 00:15:59 +0200 Subject: [PATCH 37/39] add comments --- mkdocs.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/mkdocs.yml b/mkdocs.yml index b9b0d77..e90331b 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -49,6 +49,7 @@ theme: plugins: # Enable jinja inside your markdown files + # https://github.com/fralau/mkdocs_macros_plugin - macros # Authors need installation # - git-authors From f961eda738b22b686ef4a4d0d27899823a1fee86 Mon Sep 17 00:00:00 2001 From: konstantinos Date: Thu, 16 Nov 2023 00:16:30 +0200 Subject: [PATCH 38/39] enable production CI Pipeline settings --- .github/workflows/test.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 47b6316..525d1c3 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -33,12 +33,12 @@ env: ####### Pipeline Settings ####### ##### JOB ON/OFF SWITCHES ##### - RUN_UNIT_TESTS: "false" - RUN_LINT_CHECKS: "false" + RUN_UNIT_TESTS: "true" + RUN_LINT_CHECKS: "true" PUBLISH_ON_PYPI: "true" - DRAW_DEPENDENCIES: "false" + DRAW_DEPENDENCIES: "true" PREVENT_CODECOV_TEST_COVERAGE: "false" - DOCKER_JOB_ON: "false" + DOCKER_JOB_ON: "true" ############################### #### DOCKER Job Policy ##### From f1d9e22b882c1a1a76e00031374f9445ce44ab6b Mon Sep 17 00:00:00 2001 From: konstantinos Date: Thu, 16 Nov 2023 00:20:17 +0200 Subject: [PATCH 39/39] enable All Unit Tests --- tox.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tox.ini b/tox.ini index ac20b78..173559b 100644 --- a/tox.ini +++ b/tox.ini @@ -51,7 +51,7 @@ commands = pytest -ra --cov --cov-report=term-missing \ --cov-report=html:{envdir}/htmlcov --cov-context=test \ --cov-report=xml:{toxworkdir}/coverage.{envname}.xml \ - {posargs:-n auto} tests -k test_cli + {posargs:-n auto} tests ## CI oriented Envs integrating with GH Actions Tox Plugin ##