diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index d04573843..08806fa8d 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -6,7 +6,7 @@ body: # information - type: markdown attributes: - value: | + value: | Thanks for taking the time to fill out this bug report! *Note:* Please search to see if an issue already exists for the bug you encountered. # bug description @@ -27,10 +27,10 @@ body: placeholder: Tell us what steps you did to encounter the bug! render: bash value: | - 1. - 2. - 3. - 4. + 1. + 2. + 3. + 4. validations: required: true # expected behavior @@ -47,7 +47,7 @@ body: id: additional-context attributes: label: Additional context - description: | + description: | Add any other context about the problem here. If applicable, you can add screenshots to help explain your problem. placeholder: Anything that might help us understanding your problem... @@ -62,7 +62,7 @@ body: attributes: label: Version (kapitan) description: | - Which version of kapitan are you running? + Which version of kapitan are you running? If you are using an older version of kapitan, please try it against the master branch or the latest stable version. options: - v0.31.0 (stable) @@ -76,11 +76,11 @@ body: attributes: label: Version (kapitan) description: | - Which version of python are you using? Kapitan officially supports only version 3.10 and 3.11 + Which version of python are you using? Kapitan officially supports only version 3.10 and 3.11 If you are using an older version of python, please check if the bug still exists with a newer (supported) version. options: - "3.11" - - "3.10" + - "3.10" - I use kapitan directly (pip, docker) multiple: true validations: @@ -107,7 +107,7 @@ body: id: logs attributes: label: Relevant log output - description: | + description: | Please copy and paste any relevant log output. This will be automatically formatted into code, so no need for backticks. Use the `--verbose` flag to see all the logs. render: bash diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 62ebdacd4..3a444d1e0 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -7,4 +7,4 @@ contact_links: - name: '💬 Join us on Slack' url: https://kubernetes.slack.com/archives/C981W2HD3 about: | - Join our Slack channel to connect with our community, ask questions, and stay updated on project developments. \ No newline at end of file + Join our Slack channel to connect with our community, ask questions, and stay updated on project developments. diff --git a/.github/ISSUE_TEMPLATE/documentation.yml b/.github/ISSUE_TEMPLATE/documentation.yml index 314c60733..bcc6d6f06 100644 --- a/.github/ISSUE_TEMPLATE/documentation.yml +++ b/.github/ISSUE_TEMPLATE/documentation.yml @@ -6,7 +6,7 @@ body: # information - type: markdown attributes: - value: | + value: | Thanks for taking the time to give us feedback! # feature description - type: textarea @@ -14,7 +14,7 @@ body: attributes: label: Description of the documentation issue description: | - A clear and concise description of what the issue with documentation is. + A clear and concise description of what the issue with documentation is. Please make proposals, how it could be done better. placeholder: Tell us what you want to see in the project! validations: @@ -24,6 +24,6 @@ body: id: additional-context attributes: label: Additional context - description: | + description: | Add any other context about the feature here. placeholder: Anything that might help us understanding your documentation issue... diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml index d0c1a95cb..aba8fb77f 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.yml +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -6,7 +6,7 @@ body: # information - type: markdown attributes: - value: | + value: | Thanks for taking the time to fill out this feature request! # feature description - type: textarea @@ -14,7 +14,7 @@ body: attributes: label: Description of the feature description: | - A clear and concise description of what the feature request is. + A clear and concise description of what the feature request is. Please make proposals, how you would use this feature (syntax). placeholder: Tell us what you want to see in the project! validations: @@ -24,6 +24,6 @@ body: id: additional-context attributes: label: Additional context - description: | + description: | Add any other context about the feature here. placeholder: Anything that might help us understanding your feature request... diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 6d73a0f38..772b13134 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -24,4 +24,4 @@ updates: schedule: interval: "daily" labels: - - "github-actions" \ No newline at end of file + - "github-actions" diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 0f335093b..f3c65cb98 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -7,4 +7,4 @@ Fixes # ## Docs and Tests * [ ] Tests added -* [ ] Updated documentation \ No newline at end of file +* [ ] Updated documentation diff --git a/.github/workflows/documentation.yml b/.github/workflows/documentation.yml index d7d794d88..7b0df4398 100644 --- a/.github/workflows/documentation.yml +++ b/.github/workflows/documentation.yml @@ -12,7 +12,7 @@ on: - 'docs/**' - '.github/workflows/documentation.yml' - 'mkdocs.yml' - - 'CNAME' + - 'CNAME' push: branches: - master diff --git a/.github/workflows/housekeeping.yml b/.github/workflows/housekeeping.yml index 8c384f25c..933f3c78a 100644 --- a/.github/workflows/housekeeping.yml +++ b/.github/workflows/housekeeping.yml @@ -11,9 +11,9 @@ jobs: with: stale-issue-message: | This issue is stale because it has been open for 1 year with no activity. - Remove the stale label or comment if this issue is still relevant for you. + Remove the stale label or comment if this issue is still relevant for you. If not, please close it yourself. days-before-issue-stale: 365 - day-before-pr-stale: -1 + days-before-pr-stale: -1 days-before-close: -1 - days-before-pr-close: -1 \ No newline at end of file + days-before-pr-close: -1 diff --git a/.github/workflows/pex-build-upload.yml b/.github/workflows/pex-build-upload.yml index af992258e..cb1f57104 100644 --- a/.github/workflows/pex-build-upload.yml +++ b/.github/workflows/pex-build-upload.yml @@ -15,7 +15,7 @@ jobs: steps: - uses: actions/checkout@v4 - name: Install poetry - run: |- + run: |- pipx install poetry pipx inject poetry poetry-plugin-export --force - name: Set up Python @@ -40,14 +40,14 @@ jobs: - name: Build Pex run: |- mkdir -p dist - pex .[gojsonnet] -r requirements.txt \ + pex '.[gojsonnet,omegaconf,reclass-rs]' -r requirements.txt \ --python-shebang='#!/usr/bin/env python3' \ --python=python3.11 \ --python=python3.10 \ --python=python3.12 \ -m kapitan \ -o dist/kapitan.linux-x86_64.pex - dist/kapitan.linux-x86_64.pex --help + dist/kapitan.linux-x86_64.pex --help - name: Add linux-x86_64 pex to assets uses: softprops/action-gh-release@v2 diff --git a/.github/workflows/python-pip-publish.yml b/.github/workflows/python-pip-publish.yml index f987d4a14..927eb5221 100644 --- a/.github/workflows/python-pip-publish.yml +++ b/.github/workflows/python-pip-publish.yml @@ -4,7 +4,7 @@ name: Upload Python Package concurrency: group: '${{ github.workflow }} @ ${{ github.event.pull_request.head.label || github.head_ref || github.ref }}' cancel-in-progress: true - + on: workflow_dispatch: release: diff --git a/.github/workflows/test-build-publish.yml b/.github/workflows/test-build-publish.yml index 0eddf0f23..b65a3ec52 100644 --- a/.github/workflows/test-build-publish.yml +++ b/.github/workflows/test-build-publish.yml @@ -6,7 +6,7 @@ concurrency: group: '${{ github.workflow }} @ ${{ github.event.pull_request.head.label || github.head_ref || github.ref }}' cancel-in-progress: true -on: +on: push: branches: - master @@ -29,15 +29,15 @@ on: - 'CNAME' jobs: - lint: - name: linter + precommit: + name: precommit checks runs-on: ubuntu-latest if: success() || failure() # Continue running if other jobs fail steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 - - uses: psf/black@main - + - uses: pre-commit/action@v3.0.1 + test: name: python ${{ matrix.python-version }} tests runs-on: ubuntu-latest @@ -60,7 +60,7 @@ jobs: python-version: ${{ matrix.python-version }} - name: Install libraries dependencies run: | - poetry install --no-root + poetry install --with test --no-root --extras=gojsonnet --extras=omegaconf --extras=reclass-rs - name: Install testing dependencies (Helm) run: | sudo apt-get -qq update @@ -92,7 +92,7 @@ jobs: uses: actions/checkout@v4 with: submodules: recursive - + # Setup QEMU and Buildx to build multi-platform image # This was inspired by this example : https://docs.docker.com/build/ci/github-actions/examples/#multi-platform-images - name: Set up QEMU @@ -104,7 +104,7 @@ jobs: - name: build Kapitan Image uses: docker/build-push-action@v6 with: - push: False + push: False platforms: ${{ matrix.platform }} load: True file: Dockerfile @@ -120,7 +120,7 @@ jobs: publish: name: publish platform images # Only starts if everything else is successful - needs: [lint, test, build] + needs: [precommit, test, build] if: github.event_name != 'pull_request' runs-on: ubuntu-latest strategy: @@ -134,7 +134,7 @@ jobs: uses: actions/checkout@v4 with: submodules: recursive - + # Setup QEMU and Buildx to build multi-platform image # This was inspired by this example : https://docs.docker.com/build/ci/github-actions/examples/#multi-platform-images - name: Set up QEMU @@ -180,7 +180,7 @@ jobs: platforms: ${{ matrix.platform }} push: true tags: ${{ steps.meta.outputs.tags }} - labels: ${{steps.meta.output.labels}} + labels: ${{steps.meta.outputs.labels}} cache-from: type=gha,scope=$GITHUB_REF_NAME-${{ matrix.platform }} cache-to: type=gha,mode=max,scope=$GITHUB_REF_NAME-${{ matrix.platform }} @@ -223,7 +223,7 @@ jobs: type=semver,pattern={{version}} type=semver,pattern={{major}}.{{minor}} type=semver,pattern={{major}} - + - uses: int128/docker-manifest-create-action@v1 env: DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME}} @@ -233,4 +233,4 @@ jobs: builder: buildx suffixes: | -linux-amd64 - -linux-arm64 \ No newline at end of file + -linux-arm64 diff --git a/.markdownlintignore b/.markdownlintignore index ed3852425..b6fa3acf7 100644 --- a/.markdownlintignore +++ b/.markdownlintignore @@ -1,4 +1,4 @@ examples/ tests/ kapitan/ -PULL_REQUEST_TEMPLATE.md \ No newline at end of file +PULL_REQUEST_TEMPLATE.md diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index c7b4a8c27..bd96c9dcd 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,9 +1,30 @@ +exclude: ^(examples/|tests/test_terraform_compiled/|tests/test_kubernetes_compiled/|tests/test_docker_compiled/|tests/test_resources/|tests/test_jsonnet/) repos: - repo: https://github.com/psf/black - rev: 22.10.0 + rev: 24.8.0 hooks: - id: black - - repo: https://github.com/igorshubovych/markdownlint-cli - rev: v0.32.2 + - repo: https://github.com/PyCQA/isort + rev: 5.13.2 hooks: - - id: markdownlint-fix + - id: isort + args: [--profile, black] + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.6.0 + hooks: + - id: trailing-whitespace + - id: check-docstring-first + - id: debug-statements + - id: end-of-file-fixer + - id: check-merge-conflict + - repo: https://github.com/python-poetry/poetry + rev: '1.8.0' + hooks: + - id: poetry-check + - id: poetry-lock + entry: env PYTHON_KEYRING_BACKEND=keyring.backends.null.Keyring poetry lock + - id: poetry-install + - repo: https://github.com/rhysd/actionlint + rev: 'v1.7.1' + hooks: + - id: actionlint-docker diff --git a/CNAME b/CNAME index a6b29dc21..4dbe9c735 100644 --- a/CNAME +++ b/CNAME @@ -1 +1 @@ -kapitan.dev \ No newline at end of file +kapitan.dev diff --git a/Dockerfile b/Dockerfile index 53cad7f8e..6d41bf504 100644 --- a/Dockerfile +++ b/Dockerfile @@ -37,12 +37,12 @@ COPY ./poetry.lock ./poetry.lock COPY ./README.md ./README.md # Installs and caches dependencies -RUN poetry install --no-root --extras=gojsonnet --extras=reclass-rs +ENV POETRY_VIRTUALENVS_CREATE=false +RUN poetry install --no-root --extras=gojsonnet --extras=reclass-rs --extras=omegaconf COPY ./kapitan ./kapitan -RUN pip install --editable .[test] \ - && pip install .[gojsonnet] +RUN pip install .[gojsonnet,omegaconf,reclass-rs] # Final image with virtualenv built in previous step diff --git a/Makefile b/Makefile index 082de31bf..a0bd1912d 100644 --- a/Makefile +++ b/Makefile @@ -1,9 +1,26 @@ all: clean package +.PHONY: pre-requisites +pre-requisites: + @echo ----- Installing pre-requisites ----- + poetry install --with dev --with docs --with test + +.PHONY: lint +lint: + @echo ----- Running lint ----- + poetry run flake8 kapitan + poetry run mypy kapitan + poetry run pylint kapitan + +.PHONY: install poetry with pipx +install_poetry: + @echo ----- Installing poetry with pipx ----- + which poetry || pipx install poetry + .PHONY: test -test: +test: pre-requisites lint test_python test_docker test_coverage test_formatting @echo ----- Running python tests ----- - python3 -m unittest discover + poetry run pytest .PHONY: test_docker test_docker: @@ -16,13 +33,13 @@ test_docker: .PHONY: test_coverage test_coverage: @echo ----- Testing code coverage ----- - coverage run --source=kapitan -m unittest discover - coverage report --fail-under=65 -m + poetry run coverage run --source=kapitan -m pytest + poetry run coverage report --fail-under=65 -m .PHONY: test_formatting test_formatting: @echo ----- Testing code formatting ----- - black --check . + poetry run black --check . @echo .PHONY: release @@ -43,9 +60,7 @@ clean: .PHONY: format_codestyle format_codestyle: - which black || echo "Install black with pip3 install --user black" - # ignores line length and reclass - black . + poetry run black . @echo .PHONY: local_serve_documentation diff --git a/_config.yml b/_config.yml index 911bafd8d..10e6731ad 100644 --- a/_config.yml +++ b/_config.yml @@ -1 +1 @@ -markdown: kramdown \ No newline at end of file +markdown: kramdown diff --git a/compiled/minikube-es/script.sh b/compiled/minikube-es/script.sh index 27ab1d028..872cc515d 100755 --- a/compiled/minikube-es/script.sh +++ b/compiled/minikube-es/script.sh @@ -4,4 +4,4 @@ set -ex compile_dir=$1 -echo "This is going into a file" > "${compile_dir}/${FILE_NAME}" \ No newline at end of file +echo "This is going into a file" > "${compile_dir}/${FILE_NAME}" diff --git a/docs/ADOPTERS.md b/docs/ADOPTERS.md index f49c8f9e3..e162a461d 100644 --- a/docs/ADOPTERS.md +++ b/docs/ADOPTERS.md @@ -17,4 +17,4 @@ If you're using **Kapitan** in your organization, please let us know by adding t - [![Ubisoft](adopters_logos/ubisoft.png){: style="height:100px"}](https://www.ubisoft.com/) - [![VSHN AG](adopters_logos/vhsn.png){: style="height:100px"}](https://www.vshn.ch) - [![Flower Labs](adopters_logos/flower.png){: style="height:100px"}](https://www.flower.ai) - \ No newline at end of file + diff --git a/docs/CNAME b/docs/CNAME index a6b29dc21..4dbe9c735 100644 --- a/docs/CNAME +++ b/docs/CNAME @@ -1 +1 @@ -kapitan.dev \ No newline at end of file +kapitan.dev diff --git a/docs/README.md b/docs/README.md index 442b31243..6ac03b9ef 100644 --- a/docs/README.md +++ b/docs/README.md @@ -3,7 +3,7 @@ ![GitHub Sponsors](https://img.shields.io/github/sponsors/kapicorp?style=for-the-badge) ![GitHub Stars](https://img.shields.io/github/stars/kapicorp/kapitan?style=for-the-badge) -**Kapitan** aims to be your *one-stop configuration management solution* to help you manage the ever growing complexity of your configurations by enabling **Platform Engineering** and **GitOps** workflows. +**Kapitan** aims to be your *one-stop configuration management solution* to help you manage the ever growing complexity of your configurations by enabling **Platform Engineering** and **GitOps** workflows. It streamlines complex deployments across heterogeneous environments while providing a secure and adaptable framework for managing infrastructure configurations. **Kapitan**'s inventory-driven model, powerful templating capabilities, and native secret management tools offer granular control, fostering consistency, reducing errors, and safeguarding sensitive data. @@ -12,7 +12,7 @@ Empower your team to make changes to your infrastructure whilst maintaining full * :fontawesome-brands-slack: Join the community [`#kapitan`](https://kubernetes.slack.com/archives/C981W2HD3) * :fontawesome-brands-github: Help us grow: [give us a star](https://github.com/kapicorp/kapitan/stargazers) or even better [sponsor our project](pages/contribute/sponsor/) -## [Why do I need **Kapitan**?](pages/blog/posts/2022-12-04.md#why-do-i-need-kapitan) +## [Why do I need **Kapitan**?](pages/blog/posts/2022-12-04.md#why-do-i-need-kapitan) ## [Video Tutorials to get started](https://www.youtube.com/@kapitandev) @@ -28,4 +28,4 @@ Empower your team to make changes to your infrastructure whilst maintaining full === "Rawkode: Introduction to Kapitan" - \ No newline at end of file + diff --git a/docs/getting_started.md b/docs/getting_started.md index a4cd0cb6f..ec1576d26 100644 --- a/docs/getting_started.md +++ b/docs/getting_started.md @@ -1,6 +1,6 @@ # :kapitan-logo: **Kapitan Overview** -## Setup your installation +## Setup your installation Using our reference repositories you can easily get started with **Kapitan** @@ -94,7 +94,7 @@ Compiled echo-server (0.14s) kapitan -h ``` -### Pip +### Pip #### Install Python diff --git a/docs/images/logo.min.svg b/docs/images/logo.min.svg index 1502f7cae..b0a9580b6 100644 --- a/docs/images/logo.min.svg +++ b/docs/images/logo.min.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/docs/kap_proposals/kap_11_hashicorp_vault_transit.md b/docs/kap_proposals/kap_11_hashicorp_vault_transit.md index 1f11c9fc1..47d00de59 100644 --- a/docs/kap_proposals/kap_11_hashicorp_vault_transit.md +++ b/docs/kap_proposals/kap_11_hashicorp_vault_transit.md @@ -66,7 +66,7 @@ parameters: VAULT_SKIP_VERIFY: "True" auth: token mount: transit - crypto_key: new_key + crypto_key: new_key always_latest: False ``` @@ -76,7 +76,7 @@ Extra parameters that can be defined in inventory are: * `auth`: specify which authentication method to use like `token`,`userpass`,`ldap`,`github` & `approle` * `mount`: specify the mount point of key's path. e.g if path=`alpha-secret/foo/bar` then `mount: alpha-secret` (default `secret`) * `crypto_key`: Name of the `encryption key` defined in vault -* `always_latest`: Always rewrap ciphertext to latest rotated `crypto_key` version +* `always_latest`: Always rewrap ciphertext to latest rotated `crypto_key` version Environment variables __should NOT__ be defined in inventory are `VAULT_TOKEN`,`VAULT_USERNAME`,`VAULT_PASSWORD`,`VAULT_ROLE_ID`,`VAULT_SECRET_ID`. This makes the secret_inside_kapitan file accessible throughout the inventory, where we can use the secret whenever necessary like `?{vaulttransit:${target_name}/secret_inside_kapitan}` diff --git a/docs/kap_proposals/kap_1_external_dependencies.md b/docs/kap_proposals/kap_1_external_dependencies.md index e23784939..ef974f664 100644 --- a/docs/kap_proposals/kap_1_external_dependencies.md +++ b/docs/kap_proposals/kap_1_external_dependencies.md @@ -14,10 +14,10 @@ parameters: dependencies: - type: git | http[s] output_path: - source: + source: ``` -The output path is the path to save the dependency into. For example, it could be `/components/external/manifest.jsonnet`. Then, the user can specify the fetched file as a `kapitan.compile` item along with the locally-created files. +The output path is the path to save the dependency into. For example, it could be `/components/external/manifest.jsonnet`. Then, the user can specify the fetched file as a `kapitan.compile` item along with the locally-created files. Git type may also include `ref` and `subdir` parameters as illustrated below: diff --git a/docs/kap_proposals/kap_2_helm_charts_input_type.md b/docs/kap_proposals/kap_2_helm_charts_input_type.md index 53322c3f0..aa3b854c1 100644 --- a/docs/kap_proposals/kap_2_helm_charts_input_type.md +++ b/docs/kap_proposals/kap_2_helm_charts_input_type.md @@ -6,7 +6,7 @@ Author: @yoshi-1224 ## Specification -This feature basically follows the `helm template` command available. +This feature basically follows the `helm template` command available. This will run after the fetching of the external dependencies takes place, such that users can simultaneously specify the fetch as well as the import of a helm chart dependency. ### Semantics @@ -15,14 +15,14 @@ This will run after the fetching of the external dependencies takes place, such kapitan: compile: - input_type: helm - input_path: + input_path: output_path: set-file: - - ... values_file: namespace: - + ``` This mostly maps to the options available to `helm template` command (refer to [here](https://helm.sh/docs/helm/#helm-template)). diff --git a/docs/kap_proposals/kap_3_schema_validation.md b/docs/kap_proposals/kap_3_schema_validation.md index 81526b614..bfbbfa508 100644 --- a/docs/kap_proposals/kap_3_schema_validation.md +++ b/docs/kap_proposals/kap_3_schema_validation.md @@ -13,7 +13,7 @@ The following inventory will validate the structure of Kubernetes Service manife parameters: kapitan: validate: - - output_type: kubernetes.service + - output_type: kubernetes.service version: 1.6.6 output_path: relative/path/in/target ``` diff --git a/docs/pages/blog/index.md b/docs/pages/blog/index.md index c58f16c50..05761ac57 100644 --- a/docs/pages/blog/index.md +++ b/docs/pages/blog/index.md @@ -1,2 +1 @@ # Blog - diff --git a/docs/pages/blog/posts/2022-12-04.md b/docs/pages/blog/posts/2022-12-04.md index d78b21edf..58caa190d 100644 --- a/docs/pages/blog/posts/2022-12-04.md +++ b/docs/pages/blog/posts/2022-12-04.md @@ -7,13 +7,13 @@ date: 2022-12-04 # :kapitan-logo: **5 Years** of **Kapitan** -Last October we quietly celebrated [5 years of **Kapitan**](https://github.com/kapicorp/kapitan/releases/tag/v0.9.14). +Last October we quietly celebrated [5 years of **Kapitan**](https://github.com/kapicorp/kapitan/releases/tag/v0.9.14). In 5 years, we've been able to witness a steady and relentless of Kapitan, which has however never caught the full attention of the majority of the community. The main issue has always been around an embarassing lack of **documentation**, and we've worked hard to improve on that, with more updates due soon. -Let this first blog post from a revamped website be a promise to our community of a better effort in explaining what sets **Kapitan** apart, and makes it the only tool of its kind. +Let this first blog post from a revamped website be a promise to our community of a better effort in explaining what sets **Kapitan** apart, and makes it the only tool of its kind. And let's start with a simple question: Why do you even need **Kapitan**? @@ -36,7 +36,7 @@ All I can say it is very rewarding once you get to use it, so stick with me whil It would be reductive to list the problems that **Kapitan** solves, because sometimes we ourselves are stunned by what **Kapitan** is being used for, so I will start with some common relatable ones, and perhaps that will give you the right framing to understand how to use it with your setup. -In its most basic explanation, **Kapitan** solves the problem of avoiding duplication of *configuration data*: by consolidating it in one place (the [**Inventory**](/inventory.md)), and making it accessible by all the tools and languages it integrates with (see [**Input Types**](/kapitan_overview.md#input-types)). +In its most basic explanation, **Kapitan** solves the problem of avoiding duplication of *configuration data*: by consolidating it in one place (the [**Inventory**](/inventory.md)), and making it accessible by all the tools and languages it integrates with (see [**Input Types**](/kapitan_overview.md#input-types)). This *configuration data* is then used by **Kapitan** (templates) to configure and operate a number of completely distinct and unaware tools which would normally not be able to share their configurations. @@ -77,7 +77,7 @@ graph LR SCRIPT --> BUCKET_SCRIPT HELM --> BUCKET_HELM - + DATA[("All your data")] BUCKET("bucket_name") KAPITAN(("")):::blue @@ -105,29 +105,29 @@ graph LR end ``` -Thanks to its flexiblility, you can use **Kapitan** to generate all sorts of configurations: Kubernetes and Terraform resources, ArgoCD pipelines, Docker Compose files, random configs, scripts, documentations and anything else you find relevant. +Thanks to its flexiblility, you can use **Kapitan** to generate all sorts of configurations: Kubernetes and Terraform resources, ArgoCD pipelines, Docker Compose files, random configs, scripts, documentations and anything else you find relevant. The trick is obviously on how to drive these changes, but it is not as complicated as it sounds. We'll get there soon enough! Let's see now another example of things that are so established in the way to do things that become elusivly impossible to see. As a way to highlight the potential issues with this way of doing things, let's ask some questions on your current setup. We pick on **Kubernetes** this time. -## Kubernetes +## Kubernetes -I’ll start with **Kubernetes**, such a popular and brilliant solution to problems most people should not be concerned with (jokes apart, I adore Kubernetes). +I’ll start with **Kubernetes**, such a popular and brilliant solution to problems most people should not be concerned with (jokes apart, I adore Kubernetes). To most, **Kubernetes** is that type of solution that quickly turns into a problem of its own right. > So.. how do you deploy to Kubernetes right now? -**Helm** comes to mind first, right? +**Helm** comes to mind first, right? !!! note ":kapitan-logo: **Kapitan** + **Helm**: BFF :heart:" - In spite of **Kapitan** being initially considered (even by ourselves) as an alternative to **Helm**, we’ve actually enjoyed the benefits of integrating with this amazing tool and the ecosystem it gives us access to. So yes, good news: you can use **Helm** right from within **Kapitan**!. + In spite of **Kapitan** being initially considered (even by ourselves) as an alternative to **Helm**, we’ve actually enjoyed the benefits of integrating with this amazing tool and the ecosystem it gives us access to. So yes, good news: you can use **Helm** right from within **Kapitan**!. Well, let’s put that to a test. How do you manage your **Helm** charts? I’ll attempt to break these questions down into categories. === "Code Organization" !!! note "" - * Where do you keep your **Helm** charts? + * Where do you keep your **Helm** charts? * In a single repository? * How many repositories? * Alongside the code you develop? @@ -138,16 +138,16 @@ Well, let’s put that to a test. How do you manage your **Helm** charts? I’ll * How many `values.yaml` files do you have? * How much consistency is there between them? any ***snowflakes***? * If you change something, like with the `bucket_name` example above: - * how many places do you need to go and update? + * how many places do you need to go and update? * And how many times do you get it wrong? - * Don't you feel all your charts look the same? - * Yet how many times do you need to deviate from the one you thought captured everything? + * Don't you feel all your charts look the same? + * Yet how many times do you need to deviate from the one you thought captured everything? * What if you need to make a change to all your charts at once: how do you deal with it? * What about configuration files, how do you deal with templating those? === "Maintenance" !!! note "" - * How do you deal with “official” charts, do they always cover what you want to do? + * How do you deal with “official” charts, do they always cover what you want to do? * How do you deal with modifications that you need to apply to your own version of a an official chart? * What if you need to make a change that affects ALL your charts? * Or if the change is for all the charts for a set of microservices? @@ -159,35 +159,35 @@ Well, let’s put that to a test. How do you manage your **Helm** charts? I’ll * How many of your colleagues have the same clean context setup as you have? * How many things are there that you wish you were tracking? * How do I connect to the production database? Which user is it again? - * How easy is it for you to create a new environment from scratch? - * Are you sure? + * How easy is it for you to create a new environment from scratch? + * Are you sure? * When was the last time you tried? === "Documentation" !!! note "" * How easy is it to keep your configuration up to date? * Does your documentation need to be “understood” or can be just executed on? - * How many conditionals like this do you have in your documentation? + * How many conditionals like this do you have in your documentation? > NOTE: Cluster X in project Y has an older version of Q and requires you to do Z instead N because of A, B and C! * Would you be able to follow those instructions at 3am on a Sunday morning? === "Secrets management" !!! note "" - * How do you handle secrets in your repository? - * Do you know how to create your secrets from scratch? + * How do you handle secrets in your repository? + * Do you know how to create your secrets from scratch? * Do you remember that token you created 4 months ago? How did you do that? - * How long would it take you? - * Is the process of creating them “secure”? + * How long would it take you? + * Is the process of creating them “secure”? * Or does it leave you with random certificates and tokens unencrypted on your “Downloads” folder? === "Everything else" !!! note "" - * The above concerns: do they also apply to other things you manage? - * Terraform? - * Pipelines? + * The above concerns: do they also apply to other things you manage? + * Terraform? + * Pipelines? * Random other systems you interact with? -I’ll stop here because I do not want to lose you, and neither do I want to discourage you. +I’ll stop here because I do not want to lose you, and neither do I want to discourage you. But if you look around it’s true, you do have a very complicated setup. And **Kapitan** can help you streamline it for you. In fact, **Kapitan** can leave you with a consistent and uniform way to manage all these concerns at once. diff --git a/docs/pages/blog/posts/2023-08-27.md b/docs/pages/blog/posts/2023-08-27.md index 6743e8010..31bfa9905 100644 --- a/docs/pages/blog/posts/2023-08-27.md +++ b/docs/pages/blog/posts/2023-08-27.md @@ -29,7 +29,7 @@ The content of this tutorial is already available on the [`kapitan-reference`](h ### Define parameters -```yaml +```yaml ## inventory/classes/components/keda.yml parameters: keda: @@ -51,7 +51,7 @@ parameters: ```yaml helm_values: operator: - replicaCount: 2 + replicaCount: 2 ``` ### Download the chart @@ -167,7 +167,7 @@ Let's add this configuration: # Configures a helm generator to compile files for the given chart keda: chart_dir: ${keda:params:chart_dir} - ... + ... mutations: bundle: - conditions: diff --git a/docs/pages/commands/kapitan_dotfile.md b/docs/pages/commands/kapitan_dotfile.md index c2b5408db..07967efac 100644 --- a/docs/pages/commands/kapitan_dotfile.md +++ b/docs/pages/commands/kapitan_dotfile.md @@ -6,7 +6,7 @@ Kapitan allows you to coveniently override defaults by specifying a local `.kapi This comes handy to make sure **Kapitan** runs consistently for your specific setup. -!!! info +!!! info Any **Kapitan** command can be overridden in the `.kapitan` dotfile, but here are some of the most common examples. ### `version` diff --git a/docs/pages/commands/kapitan_inventory.md b/docs/pages/commands/kapitan_inventory.md index d2b7048d5..17bc8e0fa 100644 --- a/docs/pages/commands/kapitan_inventory.md +++ b/docs/pages/commands/kapitan_inventory.md @@ -12,7 +12,7 @@ For example, rendering the inventory for the `mysql` target: kapitan inventory -t mysql ``` - ??? example "click to expand output" + ??? example "click to expand output" ```yaml __reclass__: environment: base diff --git a/docs/pages/commands/kapitan_lint.md b/docs/pages/commands/kapitan_lint.md index 6779aac4b..13c83be62 100644 --- a/docs/pages/commands/kapitan_lint.md +++ b/docs/pages/commands/kapitan_lint.md @@ -1,6 +1,6 @@ # :kapitan-logo: **CLI Reference** | `kapitan lint` -## `kapitan lint` +## `kapitan lint` Perform a checkup on your inventory or refs. @@ -10,7 +10,7 @@ Perform a checkup on your inventory or refs. ./kapitan lint ``` - ??? example "click to expand output" + ??? example "click to expand output" ```shell Running yamllint on all inventory files... diff --git a/docs/pages/commands/kapitan_searchvar.md b/docs/pages/commands/kapitan_searchvar.md index 6b306ba60..b8eca5561 100644 --- a/docs/pages/commands/kapitan_searchvar.md +++ b/docs/pages/commands/kapitan_searchvar.md @@ -10,7 +10,7 @@ Shows all inventory files where a variable is declared: ./kapitan searchvar parameters.components.*.image ``` - ??? example "click to expand output" + ??? example "click to expand output" ```shell ./inventory/classes/components/vault.yml ${vault:image} ./inventory/classes/components/logstash.yml eu.gcr.io/antha-images/logstash:7.5.1 diff --git a/docs/pages/commands/kapitan_validate.md b/docs/pages/commands/kapitan_validate.md index 84f4ffa17..e5d883d39 100644 --- a/docs/pages/commands/kapitan_validate.md +++ b/docs/pages/commands/kapitan_validate.md @@ -13,8 +13,8 @@ Validates the schema of compiled output. Validate options are specified in the i kapitan validate ``` - ??? example "click to expand output" - ```shell + ??? example "click to expand output" + ```shell created schema-cache-path at ./schemas Validation: manifest validation successful for ./compiled/minikube-mysql/manifests/mysql_secret.yml Validation: manifest validation successful for ./compiled/minikube-mysql/manifests/mysql_service_jsonnet.yml @@ -26,7 +26,7 @@ Validates the schema of compiled output. Validate options are specified in the i kapitan compile --validate ``` - ??? example "click to expand output" + ??? example "click to expand output" ```shell Rendered inventory (0.27s) Compiled labels (0.23s) @@ -47,7 +47,7 @@ Validates the schema of compiled output. Validate options are specified in the i You can leverage the `.kapitan` dotfile to make sure validate runs every time you run compile. - + !!! example "" !!! quote "example `.kapitan`" ```yaml @@ -56,13 +56,13 @@ Validates the schema of compiled output. Validate options are specified in the i compile: validate: true ``` - + The `validate` command will now be implied for every compile run ```shell kapitan compile ``` - ??? example "click to expand output" + ??? example "click to expand output" ```shell Rendered inventory (0.27s) Compiled labels (0.23s) @@ -90,10 +90,10 @@ Validates the schema of compiled output. Validate options are specified in the i !!! info - **Kapitan** will automatically download the schemas for Kubernetes Manifests directly from - + **Kapitan** will automatically download the schemas for Kubernetes Manifests directly from + By default, the schemas are cached into `./schemas/`, which can be modified with the `--schemas-path` option. - + !!! tip "override permanently `schema-path`" Remember to use the `.kapitan` dotfile configuration to override permanently the `schema-path` location. diff --git a/docs/pages/contribute/documentation.md b/docs/pages/contribute/documentation.md index 2feef6d3e..e7523695c 100644 --- a/docs/pages/contribute/documentation.md +++ b/docs/pages/contribute/documentation.md @@ -31,4 +31,4 @@ Submit a PR for our master branch that updates the `.md` file(s). Test how the c ### Submit a PR -Once the above PR has been merged, our CI will deploy your docs automatically. \ No newline at end of file +Once the above PR has been merged, our CI will deploy your docs automatically. diff --git a/docs/pages/contribute/sponsor.md b/docs/pages/contribute/sponsor.md index de695df85..98f6a8786 100644 --- a/docs/pages/contribute/sponsor.md +++ b/docs/pages/contribute/sponsor.md @@ -3,7 +3,7 @@ comments: true tags: - community --- -# :kapitan-logo: **Sponsor Kapitan** +# :kapitan-logo: **Sponsor Kapitan** Do you want to help the project? Great! There are many ways to do it diff --git a/docs/pages/external_dependencies.md b/docs/pages/external_dependencies.md index 5a11eefac..9263c4e46 100644 --- a/docs/pages/external_dependencies.md +++ b/docs/pages/external_dependencies.md @@ -1,6 +1,6 @@ # :kapitan-logo: External dependencies -**Kapitan** has the functionality to fetch external dependencies from remote locations. +**Kapitan** has the functionality to fetch external dependencies from remote locations. Supported dependencies types are: @@ -23,23 +23,23 @@ You can use the `fetch` option to explicitly fetch the dependencies: kapitan compile --fetch ``` -=== "dotfile" +=== "dotfile" !!! code "`.kapitan`" to make it default, then simply use `kapitan compile` - ```yaml + ```yaml ... compile: - fetch: true + fetch: true ``` - + This will download the dependencies and store them at their respective `output_path`. ### Overwrite local changes -When fetching a dependency, **Kapitan** will refuse to overwrite existing files to preserve your local modifications. +When fetching a dependency, **Kapitan** will refuse to overwrite existing files to preserve your local modifications. Use the `force-fetch` option to force overwrite your local files in the `output_path`. @@ -50,15 +50,15 @@ Use the `force-fetch` option to force overwrite your local files in the `output_ kapitan compile --force-fetch ``` -=== "dotfile" +=== "dotfile" !!! code "`.kapitan`" to make it default, then simply use `kapitan compile` - ```yaml + ```yaml ... compile: - force-fetch: true + force-fetch: true ``` ### Caching @@ -87,7 +87,7 @@ Kapitan also supports caching Use the `--cache` flag to cache the fetched items submodules: true/false (optional) # mkdocs (4)! ``` - 1. Git types can fetch external `git` repositories through either HTTP/HTTPS or SSH URLs. + 1. Git types can fetch external `git` repositories through either HTTP/HTTPS or SSH URLs. 2. Optional supports for cloning just a sub-directory 3. Optional support for accessing them in specific commits and branches (refs). 4. Optional support to disable fetching the submodules of a repo. @@ -130,7 +130,7 @@ Kapitan also supports caching Use the `--cache` flag to cache the fetched items - type: http | https # mkdocs (2)! output_path: path/to/file # mkdocs (1)! source: http[s]:// # mkdocs (2)! - unpack: True | False # mkdocs (3)! + unpack: True | False # mkdocs (3)! ``` 1. `output_path` must fully specify the file name. For example: @@ -214,4 +214,3 @@ Kapitan also supports caching Use the `--cache` flag to cache the fetched items namespace: monitoring name: prometheus ``` - diff --git a/docs/pages/input_types/copy.md b/docs/pages/input_types/copy.md index f14140563..d8ab72a52 100644 --- a/docs/pages/input_types/copy.md +++ b/docs/pages/input_types/copy.md @@ -16,4 +16,3 @@ Example - resources/state/${target_name}/.terraform.lock.hcl output_path: terraform/ ``` - diff --git a/docs/pages/input_types/introduction.md b/docs/pages/input_types/introduction.md index f42cd2e50..aabce4cf4 100644 --- a/docs/pages/input_types/introduction.md +++ b/docs/pages/input_types/introduction.md @@ -22,7 +22,7 @@ graph LR subgraph "fetch" F{"fetch?"} FETCH["fetch dependencies"] - end + end subgraph "validate" V{"validate?"} @@ -47,7 +47,7 @@ graph LR V ==> |no| FINISH VALIDATE --> FINISH - + ``` | Step | Flag | Description | Configuration | @@ -70,8 +70,8 @@ Input types can be specified in the inventory under `kapitan.compile` in the fol kapitan: compile: - output_path: - input_type: jinja2 - input_params: # (1)! + input_type: jinja2 + input_params: # (1)! input_paths: - directory/ - file @@ -88,8 +88,8 @@ Input types can be specified in the inventory under `kapitan.compile` in the fol kapitan: compile: - output_path: - input_type: jsonnet - prune: false # (1)! + input_type: jsonnet + prune: false # (1)! input_paths: - directory/ - file @@ -105,8 +105,8 @@ Input types can be specified in the inventory under `kapitan.compile` in the fol kapitan: compile: - output_path: - input_type: kadet - prune: false # (1)! + input_type: kadet + prune: false # (1)! input_paths: - directory/ - file @@ -124,8 +124,8 @@ Input types can be specified in the inventory under `kapitan.compile` in the fol kapitan: compile: - output_path: - input_type: helm - prune: false # (1)! + input_type: helm + prune: false # (1)! input_paths: - directory/ - file @@ -141,8 +141,8 @@ Input types can be specified in the inventory under `kapitan.compile` in the fol kapitan: compile: - output_path: - input_type: copy - prune: false # (1)! + input_type: copy + prune: false # (1)! input_paths: - directory/ - file diff --git a/docs/pages/input_types/jinja.md b/docs/pages/input_types/jinja.md index e801d05aa..eb8fb0bf3 100644 --- a/docs/pages/input_types/jinja.md +++ b/docs/pages/input_types/jinja.md @@ -62,7 +62,7 @@ We usually store script templates under the `templates/scripts` directory. --8<-- "kubernetes/compiled/minikube-nginx-jsonnet/nginx-deploy.sh" ``` - 1. The script is now a "canned script" and ready to be used for this specif target. + 1. The script is now a "canned script" and ready to be used for this specif target. 2. You can see that the namespace has been replaced with the target's one. @@ -115,64 +115,62 @@ Templates will be provided at runtime with 3 variables: We support the following custom filters for use in Jinja2 templates: === "Encoding" - === "`sha256`" - !!! example "SHA256 hashing of text" + === "`sha256`" + !!! example "SHA256 hashing of text" `{{ text | sha256 }}` - === "`yaml`" - !!! example "Dump text as YAML" + === "`yaml`" + !!! example "Dump text as YAML" `{{ text | yaml }}` - === "`toml`" - !!! example "Dump text as TOML" + === "`toml`" + !!! example "Dump text as TOML" `{{ text | toml }}` - === "`b64encode`" - !!! example "base64 encode text" + === "`b64encode`" + !!! example "base64 encode text" `{{ text | b64encode }}` - === "`b64decode`" - !!! example "base64 decode text" + === "`b64decode`" + !!! example "base64 decode text" `{{ text | b64decode }}` === "Time" - === "`to_datetime`" + === "`to_datetime`" !!! example "return datetime object for string" `{{ "2019-03-07 13:37:00" | to_datetime }}` - === "`strftime`" + === "`strftime`" !!! example "return current date string for format" `{{ "%a, %d %b %Y %H:%M" | strftime }}` === "Regexp" - === "`regex_replace`" + === "`regex_replace`" !!! example "perform a `re.sub` returning a string" `{{ hello world | regex_replace(pattern="world", replacement="kapitan")}}` - === "`regex_escape`" + === "`regex_escape`" !!! example "escape all regular expressions special characters from string" `{{ "+s[a-z].*" | regex_escape}}` - === "`regex_search`" + === "`regex_search`" !!! example "perform `re.search` and return the list of matches or a backref" `{{ hello world | regex_search("world.*")}}` - === "`regex_findall`" + === "`regex_findall`" !!! example "perform `re.findall` and return the list of matches as array" - `{{ hello world | regex_findall("world.*")}}` -=== "`fileglob`" - !!! example "return list of matched regular files for glob" + `{{ hello world | regex_findall("world.*")}}` +=== "`fileglob`" + !!! example "return list of matched regular files for glob" `{{ ./path/file* | fileglob }}` -=== "`bool`" - !!! example "return the bool for value" +=== "`bool`" + !!! example "return the bool for value" `{{ yes | bool }}` -=== "`ternary`" - !!! example "`value ? true_val : false_val`" +=== "`ternary`" + !!! example "`value ? true_val : false_val`" `{{ condition | ternary("yes", "no")}}` -=== "`shuffle`" - !!! example "randomly shuffle elements of a list" +=== "`shuffle`" + !!! example "randomly shuffle elements of a list" `{{ [1, 2, 3, 4, 5] | shuffle }}` -=== "`reveal_maybe`" - !!! example "reveal `ref/secret` tag only if `compile --reveal` flag is set" +=== "`reveal_maybe`" + !!! example "reveal `ref/secret` tag only if `compile --reveal` flag is set" `{{ "?{base64:my_ref}" | reveal_maybe}}` !!! tip You can also provide path to your custom filter modules in CLI. By default, you can put your filters in `lib/jinja2_filters.py` and they will automatically get loaded. - - diff --git a/docs/pages/input_types/jsonnet.md b/docs/pages/input_types/jsonnet.md index 1b86023e7..342d49cc3 100644 --- a/docs/pages/input_types/jsonnet.md +++ b/docs/pages/input_types/jsonnet.md @@ -133,4 +133,3 @@ If `validation.valid` is not true, it will then fail compilation and display `va Compile error: failed to compile target: minikube-mysql ``` - diff --git a/docs/pages/input_types/kadet.md b/docs/pages/input_types/kadet.md index a84f09717..970981433 100644 --- a/docs/pages/input_types/kadet.md +++ b/docs/pages/input_types/kadet.md @@ -1,6 +1,6 @@ # :kapitan-logo: **Input Type | Kadet** -Kadet is an extensible **input type** for **Kapitan** that enables you to generate templates using **Python**. +Kadet is an extensible **input type** for **Kapitan** that enables you to generate templates using **Python**. The key benefit being the ability to utilize familiar programing principles while having access to **Kapitan**'s powerful inventory system. @@ -36,9 +36,9 @@ class Deployment(BaseObj): # (1)! self.root.spec.template.spec.containers = self.kwargs.containers ``` -1. The deployment is an `BaseObj()` which has two main functions. +1. The deployment is an `BaseObj()` which has two main functions. 2. `new(self)` is used to perform parameter validation & template compilation -3. `body(self)` is utilized to set those parameters to be rendered. +3. `body(self)` is utilized to set those parameters to be rendered. 4. `self.root.metadata.name` is a direct reference to a key in the corresponding yaml. diff --git a/docs/pages/input_types/remove.md b/docs/pages/input_types/remove.md index 660112765..d68eba737 100644 --- a/docs/pages/input_types/remove.md +++ b/docs/pages/input_types/remove.md @@ -45,4 +45,3 @@ parameters: The first input block would throw an error because the copy input command hasn't run yet to produce the file being removed by the remove input block. *Supported output types*: N/A (no need to specify `output_type`) - diff --git a/docs/pages/inventory/advanced.md b/docs/pages/inventory/advanced.md index ef70fdbab..0057f80da 100644 --- a/docs/pages/inventory/advanced.md +++ b/docs/pages/inventory/advanced.md @@ -40,5 +40,3 @@ For instance you could define the following: Compiled acme (0.06s) Compiled acme-documentation (0.09s) ``` - - diff --git a/docs/pages/inventory/classes.md b/docs/pages/inventory/classes.md index 72a8c404b..d11812737 100644 --- a/docs/pages/inventory/classes.md +++ b/docs/pages/inventory/classes.md @@ -6,7 +6,7 @@ The next thing you want to learn about the inventory are [**classes**](#classes) [**Classes**](#classes) are *fragments* of yaml: feature sets, commonalities between targets. [**Classes**](#classes) let you compose your [**Inventory**](/inventory/) from smaller bits, eliminating duplication and exposing all important parameters from a single, logically organised place. As the [**Inventory**](#inventory) lets you reference other parameters in the hierarchy, [**classes**](#classes) become places where you can define something that will then get referenced from another section of the inventory, allowing for composition. -[**Classes**](#classes) are organised under the [`inventory/classes`](#classes) directory substructure. +[**Classes**](#classes) are organised under the [`inventory/classes`](#classes) directory substructure. They are organised hierarchically in subfolders, and the way they can be imported into a [**target**](#targets) or other [**classes**](#classes) depends on their location relative to the [`inventory/classes`](#classes) directory. @@ -52,4 +52,3 @@ If we open the file, we find another familiar yaml fragment. Notice that this class includes an import definition for another class, `kapitan.common`. We've already learned this means that kapitan will import a file on disk called `inventory/classes/kapitan/common.yml` You can also see that in the `parameters` section we now encounter a new syntax which unlocks another powerful inventory feature: *parameters interpolation*! - diff --git a/docs/pages/inventory/introduction.md b/docs/pages/inventory/introduction.md index 3858c9d7d..5e0cc318f 100644 --- a/docs/pages/inventory/introduction.md +++ b/docs/pages/inventory/introduction.md @@ -6,9 +6,9 @@ The **Inventory** is a core component of Kapitan: this section aims to explain h The **Inventory** is a hierarchical `YAML` based structure which you use to capture anything that you want to make available to **Kapitan**, so that it can be passed on to its templating engines. -The first concept to learn about the **Inventory** is the [**target**](#targets). A target is a file, found under the [`inventory/targets`](#targets) substructure, that tells Kapitan what you want to compile. It will usually map to something you want to do with **Kapitan**. +The first concept to learn about the **Inventory** is the [**target**](#targets). A target is a file, found under the [`inventory/targets`](#targets) substructure, that tells Kapitan what you want to compile. It will usually map to something you want to do with **Kapitan**. -For instance, you might want to define a [**target**](#targets) for each environment that you want to deploy using **Kapitan**. +For instance, you might want to define a [**target**](#targets) for each environment that you want to deploy using **Kapitan**. The **Inventory** lets you also define and reuse common configurations through YAML files that are referred to as [**classes**](#classes): by listing classes into [**target**](#targets), their content gets merged together and allows you to compose complex configurations without repetitions. diff --git a/docs/pages/inventory/parameters_interpolation.md b/docs/pages/inventory/parameters_interpolation.md index 04bc273b5..cda59c1b6 100644 --- a/docs/pages/inventory/parameters_interpolation.md +++ b/docs/pages/inventory/parameters_interpolation.md @@ -9,20 +9,20 @@ components: nginx: image: nginx:latest - ``` + ``` + + Usually when we want to talk about the `image` subkey, we normally use either of the following: - Usually when we want to talk about the `image` subkey, we normally use either of the following: - * `parameters.components.nginx.image` * `components.nginx.image` However, when used in parameter expansion, remember to: - - * replace the `.` with `:` + + * replace the `.` with `:` * omit the `parameters` initial key which is implied * wrap it into the `${}` variable interpolation syntax - The correct way to reference `parameters.nginx.image` then becomes `${components:nginx:image}`. + The correct way to reference `parameters.nginx.image` then becomes `${components:nginx:image}`. The [**Inventory**](#inventory) allows you to refer to other values defined elsewhere in the structure, using parameter interpolation. @@ -33,7 +33,7 @@ Given the example: parameters: cluster: location: europe - + application: location: ${cluster:location} @@ -64,4 +64,3 @@ classes: Here in this case `application.location` refers to a value `location` which has been defined elsewhere, perhaps (but not necessarily) in the `project.production` class. Also notice that the class name (`project.production`) is not in any ways influencing the name or the structed of the yaml it imports into the file - diff --git a/docs/pages/inventory/targets.md b/docs/pages/inventory/targets.md index 48da8a0f5..439bcb000 100644 --- a/docs/pages/inventory/targets.md +++ b/docs/pages/inventory/targets.md @@ -92,7 +92,7 @@ A typical [**target**](#targets) might look like this: Note that it is made of 2 sections: * `classes` is a list of class files you will want to import. -* `parameters` allows for local override of what is unique to this target. +* `parameters` allows for local override of what is unique to this target. !!! info diff --git a/docs/pages/kapitan_overview.md b/docs/pages/kapitan_overview.md index d75a5a933..0313444d9 100644 --- a/docs/pages/kapitan_overview.md +++ b/docs/pages/kapitan_overview.md @@ -2,7 +2,7 @@ ## **Kapitan** at a glance -**Kapitan** is a powerful configuration management tool designed to help engineers manage complex systems through code. It centralizes and simplifies the management of configurations with a structured approach that revolves around a few core concepts. +**Kapitan** is a powerful configuration management tool designed to help engineers manage complex systems through code. It centralizes and simplifies the management of configurations with a structured approach that revolves around a few core concepts. ??? note "**Kapitan** diagram" ```mermaid @@ -31,12 +31,12 @@ OTHER --> REFERENCES PLAIN --> REFERENCES OUTPUT --> TARGETN_OUTPUT - OUTPUT --> TARGET1_OUTPUT - OUTPUT --> TARGET2_OUTPUT + OUTPUT --> TARGET1_OUTPUT + OUTPUT --> TARGET2_OUTPUT REFERENCES --> KAPITAN - TARGET1_OUTPUT --> DOCUMENTATION + TARGET1_OUTPUT --> DOCUMENTATION TARGET1_OUTPUT --> KUBERNETES - TARGET1_OUTPUT --> SCRIPTS + TARGET1_OUTPUT --> SCRIPTS TARGET1_OUTPUT --> TERRAFORM CLASSES --> TARGET1 CLASSES --> TARGET2 @@ -62,7 +62,7 @@ KAPITAN(("")):::blue click EXTERNAL "/compile#external" - subgraph "Input Types" + subgraph "Input Types" EXTERNAL["external"] GENERATORS["generators"] HELM["helm"] @@ -82,7 +82,7 @@ SCRIPTS["scripts"] TERRAFORM["terraform"] end - + TARGET2_OUTPUT(["target 2"]) TARGETN_OUTPUT(["target N"]) @@ -92,7 +92,7 @@ Let's explore these concepts in a way that's accessible to new users: ## [**Inventory**](/pages/inventory/introduction/) -At the core of **Kapitan** lies the **Inventory**, a structured database of variables meticulously organized in YAML files. +At the core of **Kapitan** lies the **Inventory**, a structured database of variables meticulously organized in YAML files. This hierarchical setup serves as the single source of truth (SSOT) for your system's configurations, making it easier to manage and reference the essential components of your infrastructure. Whether you're dealing with Kubernetes configurations, Terraform resources, or even business logic, the Inventory allows you to define and store these elements efficiently. This central repository then feeds into **Kapitan**'s templating engines, enabling seamless reuse across various applications and services. diff --git a/docs/pages/remote_repositories.md b/docs/pages/remote_repositories.md index b9001b167..2ef9b8ce9 100644 --- a/docs/pages/remote_repositories.md +++ b/docs/pages/remote_repositories.md @@ -30,13 +30,13 @@ parameters: ### Example Lets say we want to fetch a class from our kapitan repository, specifically -`kapicorp/kapitan/tree/master/examples/docker/inventory/classes/dockerfiles.yml`. +`kapicorp/kapitan/tree/master/examples/docker/inventory/classes/dockerfiles.yml`. Lets create a simple target file `docker.yml` !!! example "" - !!! note + !!! note [external dependencies](external_dependencies.md) are used to fetch dependency items in this example. @@ -77,7 +77,7 @@ Lets create a simple target file `docker.yml` kapitan compile --fetch ``` - ??? example "click to expand output" + ??? example "click to expand output" ```shell [WARNING] Reclass class not found: 'dockerfiles'. Skipped! [WARNING] Reclass class not found: 'dockerfiles'. Skipped! @@ -136,13 +136,13 @@ parameters: kapitan compile --fetch ``` - ??? example "click to expand output" + ??? example "click to expand output" ```shell ./kapitan compile -t mysql-generator-fetch --fetch Inventory https://raw.githubusercontent.com/kapicorp/kapitan-reference/master/inventory/classes/kapitan/generators/kubernetes.yml: fetching now Inventory https://raw.githubusercontent.com/kapicorp/kapitan-reference/master/inventory/classes/kapitan/generators/kubernetes.yml: successfully fetched Inventory https://raw.githubusercontent.com/kapicorp/kapitan-reference/master/inventory/classes/kapitan/generators/kubernetes.yml: saved to inventory/classes/kapitan/generators/kubernetes.yml - + ... cut ... diff --git a/docs/references.md b/docs/references.md index 59ca998cf..93783d67f 100644 --- a/docs/references.md +++ b/docs/references.md @@ -25,7 +25,7 @@ Some reference backends require configuration, both in the Inventory and to conf !!! tip "**Get started**" If you want to get started with references but don't want to deal with the initial setup, you can use the `plain` and `base64` reference types. These are great for demos, but we will see they are extremely helpful even in Production environments. - + !!! danger Both `plain` and `base64` references do not support encryption: they are intended for development or demo purposes only. *DO NOT* use `plain` or `base64` for storing sensitive information! @@ -126,8 +126,8 @@ Some reference backends require configuration, both in the Inventory and to conf ``` ??? tip "ADVANCED: Mix-and-Match backends" - Remember that you can use multiple backends at the same time, and also use variable interpolation for an even greater flexibility. - + Remember that you can use multiple backends at the same time, and also use variable interpolation for an even greater flexibility. + In a multi-cloud setup, for instance, you could configure both **GKMS** !!! quote "GCP configuration" @@ -165,7 +165,7 @@ Some reference backends require configuration, both in the Inventory and to conf - security.backends.awskms ... ``` - + Now because they both set the `parameters.backend` variable, you can define a reference whose backend changes based on what class is assigned to the target !!! example "`inventory/targets/cloud/gcp/acme.yml`" @@ -188,9 +188,9 @@ Some reference backends require configuration, both in the Inventory and to conf References can be defined in the inventory following the syntax ***spaces added for clarity***: `?{` **``** `:` **``** `}` - + ??? tip "expand for advanced features" - The syntax also supports for **process functions** and **create_functions** which we will discuss later, which brings the full syntax to + The syntax also supports for **process functions** and **create_functions** which we will discuss later, which brings the full syntax to !!! example "" `?{` **``** `:` **``** `}` |**``** ||**``** @@ -208,7 +208,7 @@ Some reference backends require configuration, both in the Inventory and to conf !!! danger "not encrypted" This reference type does not support encryption: it is intended for non sensitive data only. *DO NOT* use `plain` for storing sensitive information! - === "base64" + === "base64" ```yaml parameters: ... @@ -359,8 +359,8 @@ You can assign values to your reference using the command line. Both reading fro !!! note "Setting default value only" The `env` backend works in a slightly different ways, as it allows you to reference environment variables at runtime. - For example, for a reference called **`{?env:targets/envs_defaults/mysql_port_${target_name}}`**, **Kapitan** would look for an environment variable called **`KAPITAN_ENV_mysql_port_${TARGET_NAME}`**. - + For example, for a reference called **`{?env:targets/envs_defaults/mysql_port_${target_name}}`**, **Kapitan** would look for an environment variable called **`KAPITAN_ENV_mysql_port_${TARGET_NAME}`**. + If that variable cannot be found in the **Kapitan** environment, the default will be taken from the **`refs/targets/envs_defaults/mysql_port_${TARGET_NAME}`** file instead. ```shell @@ -385,7 +385,7 @@ You can assign values to your reference using the command line. Both reading fro ``` === "vaulttransit" - This backend expects the value to be stored as a `key:value` pair. + This backend expects the value to be stored as a `key:value` pair. ```shell echo "a_key:a_value" | kapitan refs --write vaulttransit:refs/targets/${TARGET_NAME}/mysql/root_password -t ${TARGET_NAME} -f - @@ -412,8 +412,8 @@ For instance, to automatically initialise a reference with a ***random string*** ``` !!! note "Initialise non existent references" - The first operator here `||` is more similar to a ***logical OR***. - + The first operator here `||` is more similar to a ***logical OR***. + * If the reference file does not exist, **Kapitan** will use the function to initialise it * If the reference file exists, no functions will run. @@ -468,7 +468,7 @@ For instance, to automatically initialise a reference with a ***random string*** === "private keys" === "rsa" !!! quote "" - Generates an RSA 4096 private key (PKCS#8). You can optionally pass the key size + Generates an RSA 4096 private key (PKCS#8). You can optionally pass the key size ```yaml ?{${backend}:targets/${target_name}/private_key||rsa} ``` @@ -619,7 +619,7 @@ I can not reference the link to the cluster in the inventory using: ```yaml parameters: cluster: - name: ?{plain:clusters/${target_name}/cluster@name} + name: ?{plain:clusters/${target_name}/cluster@name} release_channel: ?{plain:clusters/${target_name}/cluster@releaseChannel.channel} link: ?{plain:clusters/${target_name}/cluster@selfLink} ``` @@ -655,7 +655,7 @@ To write a secret in the vault with kapitan use a ref tag with following structu ... ``` -Leave `mount` empty to use the specified mount from vault params from the inventory (see below). Same applies to the `path/in/vault` where the ref path in kapitan gets taken as default value. +Leave `mount` empty to use the specified mount from vault params from the inventory (see below). Same applies to the `path/in/vault` where the ref path in kapitan gets taken as default value. Parameters in the secret file are collected from the inventory of the target we gave from CLI `-t `. If target isn't provided then kapitan will identify the variables from the environment when revealing secret. diff --git a/kapitan/__init__.py b/kapitan/__init__.py index cdc55f2c1..f91ad742c 100755 --- a/kapitan/__init__.py +++ b/kapitan/__init__.py @@ -5,9 +5,9 @@ # # SPDX-License-Identifier: Apache-2.0 +import logging import os import sys -import logging def setup_logging(name=None, level=logging.INFO, force=False): diff --git a/kapitan/cached.py b/kapitan/cached.py index 9a44c38ca..d4dd1aebf 100644 --- a/kapitan/cached.py +++ b/kapitan/cached.py @@ -19,7 +19,7 @@ dot_kapitan = {} ref_controller_obj = None revealer_obj = None -args = Namespace() # args won't need resetting +args = Namespace() # args won't need resetting inv_sources = set() diff --git a/kapitan/cli.py b/kapitan/cli.py index 062a78c54..db6bc477a 100644 --- a/kapitan/cli.py +++ b/kapitan/cli.py @@ -94,14 +94,20 @@ def trigger_compile(args): jinja2_filters=args.jinja2_filters, verbose=args.verbose, use_go_jsonnet=args.use_go_jsonnet, - compose_target_name=args.compose_target_name + compose_target_name=args.compose_target_name, ) def build_parser(): parser = argparse.ArgumentParser(prog=PROJECT_NAME, description=DESCRIPTION) parser.add_argument("--version", action="version", version=VERSION) - parser.add_argument("--mp-method", action="store", default=from_dot_kapitan("global", "mp-method", "spawn"), help="set multiprocessing start method", choices=["spawn", "fork", "forkserver"]) + parser.add_argument( + "--mp-method", + action="store", + default=from_dot_kapitan("global", "mp-method", "spawn"), + help="set multiprocessing start method", + choices=["spawn", "fork", "forkserver"], + ) subparser = parser.add_subparsers(help="commands", dest="subparser_name") inventory_backend_parser = argparse.ArgumentParser(add_help=False) @@ -120,10 +126,13 @@ def build_parser(): ) inventory_backend_parser.add_argument( - "--compose-target-name", "--compose-target-name", + "--compose-target-name", + "--compose-target-name", help="Create same subfolder structure from inventory/targets inside compiled folder", action="store_true", - default=from_dot_kapitan("global", "compose-target-name", from_dot_kapitan("compile", "compose-node-name", False)), + default=from_dot_kapitan( + "global", "compose-target-name", from_dot_kapitan("compile", "compose-node-name", False) + ), ) eval_parser = subparser.add_parser("eval", aliases=["e"], help="evaluate jsonnet file") @@ -612,7 +621,7 @@ def main(): # and will raise RuntimeError except RuntimeError: pass - + if getattr(args, "func", None) == generate_inventory and args.pattern and args.target_name == "": parser.error("--pattern requires --target_name") @@ -622,8 +631,8 @@ def main(): parser.print_help() sys.exit(1) - cached.args = args - + cached.args = args + if hasattr(args, "verbose") and args.verbose: logging_level = logging.DEBUG elif hasattr(args, "quiet") and args.quiet: diff --git a/kapitan/dependency_manager/base.py b/kapitan/dependency_manager/base.py index 7b218d4ff..3aae6b3a7 100644 --- a/kapitan/dependency_manager/base.py +++ b/kapitan/dependency_manager/base.py @@ -11,17 +11,17 @@ from mimetypes import MimeTypes from shutil import copyfile, rmtree -from git import GitCommandError -from git import Repo -from kapitan.errors import GitSubdirNotFoundError, GitFetchingError, HelmFetchingError +from git import GitCommandError, Repo + +from kapitan.errors import GitFetchingError, GitSubdirNotFoundError, HelmFetchingError from kapitan.helm_cli import helm_cli from kapitan.utils import ( copy_tree, make_request, - unpack_downloaded_file, - safe_copy_tree, - safe_copy_file, normalise_join_path, + safe_copy_file, + safe_copy_tree, + unpack_downloaded_file, ) logger = logging.getLogger(__name__) @@ -235,10 +235,12 @@ def fetch_helm_chart(dep_mapping, save_dir, force): for dep in deps: output_path = dep["output_path"] - + if not os.path.exists(output_path) or force: if not exists_in_cache(cached_repo_path): - fetch_helm_archive(source.helm_path, source.repo, source.chart_name, source.version, cached_repo_path) + fetch_helm_archive( + source.helm_path, source.repo, source.chart_name, source.version, cached_repo_path + ) else: logger.debug("Using cached helm chart at %s", cached_repo_path) diff --git a/kapitan/initialiser.py b/kapitan/initialiser.py index 46d699150..f77ae8256 100644 --- a/kapitan/initialiser.py +++ b/kapitan/initialiser.py @@ -9,6 +9,7 @@ import logging import os + from kapitan.utils import copy_tree logger = logging.getLogger(__name__) diff --git a/kapitan/inputs/base.py b/kapitan/inputs/base.py index 63de2d26d..a38a72783 100644 --- a/kapitan/inputs/base.py +++ b/kapitan/inputs/base.py @@ -12,13 +12,13 @@ import os from collections.abc import Mapping -import yaml import toml +import yaml +from kapitan import cached from kapitan.errors import CompileError, KapitanError from kapitan.refs.base import Revealer from kapitan.utils import PrettyDumper -from kapitan import cached logger = logging.getLogger(__name__) @@ -129,14 +129,14 @@ def write_yaml(self, obj): # TODO(ademaria): make it configurable per input type style_selection = cached.inv[target_name]["parameters"].get("multiline_string_style", None) - if not style_selection: + if not style_selection: if hasattr(cached.args, "multiline_string_style"): style_selection = cached.args.multiline_string_style elif hasattr(cached.args, "yaml_multiline_string_style"): style_selection = cached.args.yaml_multiline_string_style dumper = PrettyDumper.get_dumper_for_style(style_selection) - + if reveal: obj = self.revealer.reveal_obj(obj) else: diff --git a/kapitan/inputs/copy.py b/kapitan/inputs/copy.py index 4706950bd..4dd7eba82 100644 --- a/kapitan/inputs/copy.py +++ b/kapitan/inputs/copy.py @@ -8,9 +8,9 @@ import logging import os import shutil -from kapitan.utils import copy_tree from kapitan.inputs.base import InputType +from kapitan.utils import copy_tree logger = logging.getLogger(__name__) diff --git a/kapitan/inputs/external.py b/kapitan/inputs/external.py index 6faaaa02b..ec0a55260 100644 --- a/kapitan/inputs/external.py +++ b/kapitan/inputs/external.py @@ -5,14 +5,14 @@ # # SPDX-License-Identifier: Apache-2.0 -import subprocess -import re import logging import os +import re import shutil -from kapitan.utils import copy_tree +import subprocess from kapitan.inputs.base import InputType +from kapitan.utils import copy_tree logger = logging.getLogger(__name__) diff --git a/kapitan/inputs/jinja2.py b/kapitan/inputs/jinja2.py index 0f741ba70..ba083e483 100644 --- a/kapitan/inputs/jinja2.py +++ b/kapitan/inputs/jinja2.py @@ -8,10 +8,11 @@ import logging import os +from kapitan import cached from kapitan.inputs.base import CompiledFile, InputType from kapitan.resources import inventory from kapitan.utils import render_jinja2 -from kapitan import cached + logger = logging.getLogger(__name__) diff --git a/kapitan/inputs/jinja2_filters.py b/kapitan/inputs/jinja2_filters.py index c810ac541..b55fe793c 100644 --- a/kapitan/inputs/jinja2_filters.py +++ b/kapitan/inputs/jinja2_filters.py @@ -18,9 +18,10 @@ import toml import yaml +from six import string_types + from kapitan import cached, defaults, utils from kapitan.errors import CompileError -from six import string_types logger = logging.getLogger(__name__) diff --git a/kapitan/inputs/kadet.py b/kapitan/inputs/kadet.py index 2363f8b09..30c95f927 100644 --- a/kapitan/inputs/kadet.py +++ b/kapitan/inputs/kadet.py @@ -10,16 +10,17 @@ import logging import os import sys -from importlib.util import module_from_spec, spec_from_file_location import time +from functools import lru_cache +from importlib.util import module_from_spec, spec_from_file_location + import kadet from kadet import BaseModel, BaseObj, Dict +from kapitan import cached from kapitan.errors import CompileError -from functools import lru_cache from kapitan.inputs.base import CompiledFile, InputType from kapitan.utils import prune_empty -from kapitan import cached # Set external kadet exception to kapitan.error.CompileError kadet.ABORT_EXCEPTION_TYPE = CompileError @@ -65,6 +66,7 @@ def module_from_path(path, check_name=None): return mod, spec + def load_from_search_paths(module_name): """ loads and executes python module with module_name from search paths diff --git a/kapitan/inputs/remove.py b/kapitan/inputs/remove.py index 3213d8e73..20015fca1 100644 --- a/kapitan/inputs/remove.py +++ b/kapitan/inputs/remove.py @@ -8,9 +8,9 @@ import logging import os import shutil -from kapitan.utils import copy_tree from kapitan.inputs.base import InputType +from kapitan.utils import copy_tree logger = logging.getLogger(__name__) diff --git a/kapitan/inputs/templates/inventory/classes/my_component.yml b/kapitan/inputs/templates/inventory/classes/my_component.yml index ed6cf270a..d70ffd84c 100644 --- a/kapitan/inputs/templates/inventory/classes/my_component.yml +++ b/kapitan/inputs/templates/inventory/classes/my_component.yml @@ -26,4 +26,4 @@ parameters: input_type: kadet output_type: yaml input_paths: - - components/other_component/ \ No newline at end of file + - components/other_component/ diff --git a/kapitan/inputs/templates/templates/scripts/my_script.sh b/kapitan/inputs/templates/templates/scripts/my_script.sh index 3a0690074..ba8c80105 100644 --- a/kapitan/inputs/templates/templates/scripts/my_script.sh +++ b/kapitan/inputs/templates/templates/scripts/my_script.sh @@ -5,4 +5,3 @@ DIR=$(dirname ${BASH_SOURCE[0]}) echo "Running for target {{ i.target_name }}" echo ${DIR} - diff --git a/kapitan/inventory/__init__.py b/kapitan/inventory/__init__.py index be670c104..b61057664 100644 --- a/kapitan/inventory/__init__.py +++ b/kapitan/inventory/__init__.py @@ -12,6 +12,7 @@ class InventoryBackends(StrEnum): """ Enumeration of available inventory backends. """ + RECLASS = "reclass" RECLASS_RS = "reclass-rs" OMEGACONF = "omegaconf" @@ -23,6 +24,7 @@ def load_reclass_backend(): Enable the reclass inventory backend. """ from .inv_reclass import ReclassInventory + return ReclassInventory @@ -31,6 +33,7 @@ def load_reclass_rs_backend(): Enable the reclass-rs inventory backend. """ from .inv_reclass_rs import ReclassRsInventory + return ReclassRsInventory @@ -39,6 +42,7 @@ def load_omegaconf_backend(): Enable the omegaconf inventory backend. """ from .inv_omegaconf.inv_omegaconf import OmegaConfInventory + return OmegaConfInventory @@ -55,4 +59,4 @@ def get_inventory_backend(backend_name: str) -> Type[Inventory]: """ Get the `Inventory` subclass associated with the given `backend_name`. """ - return AVAILABLE_BACKENDS.get(backend_name, AVAILABLE_BACKENDS[InventoryBackends.DEFAULT])() \ No newline at end of file + return AVAILABLE_BACKENDS.get(backend_name, AVAILABLE_BACKENDS[InventoryBackends.DEFAULT])() diff --git a/kapitan/inventory/inv_omegaconf/inv_omegaconf.py b/kapitan/inventory/inv_omegaconf/inv_omegaconf.py index a2449083d..f7c4a1bb7 100644 --- a/kapitan/inventory/inv_omegaconf/inv_omegaconf.py +++ b/kapitan/inventory/inv_omegaconf/inv_omegaconf.py @@ -10,17 +10,20 @@ import os import time from functools import singledispatch -from cachetools import cached, LRUCache -from omegaconf import OmegaConf, ListMergeMode, DictConfig -from pydantic import ConfigDict -from ..inventory import InventoryError, Inventory, InventoryTarget -from .resolvers import register_resolvers, register_user_resolvers + +import yaml +from cachetools import LRUCache, cached from kadet import Dict +from omegaconf import DictConfig, ListMergeMode, OmegaConf +from pydantic import ConfigDict + +from ..inventory import Inventory, InventoryError, InventoryTarget from .migrate import migrate -import yaml +from .resolvers import register_resolvers, register_user_resolvers logger = logging.getLogger(__name__) + @singledispatch def keys_to_strings(ob): return ob @@ -35,14 +38,14 @@ def _handle_dict(ob: dict): def _handle_list(ob: list): return [keys_to_strings(v) for v in ob] - + class OmegaConfTarget(InventoryTarget): resolved: bool = False def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.__add_metadata() - + def __add_metadata(self): metadata = { "name": { @@ -60,17 +63,21 @@ class OmegaConfInventory(Inventory): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs, target_class=OmegaConfTarget) - def render_targets(self, targets: list[OmegaConfTarget] = None, ignore_class_not_found: bool = False) -> None: + def render_targets( + self, targets: list[OmegaConfTarget] = None, ignore_class_not_found: bool = False + ) -> None: if not self.initialised: manager = mp.Manager() shared_targets = manager.dict() with mp.Pool(min(len(targets), os.cpu_count())) as pool: - r = pool.map_async(self.inventory_worker, [(self, target, shared_targets) for target in targets.values()]) + r = pool.map_async( + self.inventory_worker, [(self, target, shared_targets) for target in targets.values()] + ) r.wait() - + for target in shared_targets.values(): self.targets[target.name] = target - + @staticmethod def inventory_worker(zipped_args): self, target, shared_targets = zipped_args @@ -78,46 +85,45 @@ def inventory_worker(zipped_args): register_resolvers() self.load_target(target) shared_targets[target.name] = target - + except Exception as e: logger.error(f"{target.name}: could not render due to error {e}") raise - + @cached(cache=LRUCache(maxsize=1024)) - def resolve_class_file_path(self, class_name: str, class_parent_dir: str = None, class_parent_name: str = None): + def resolve_class_file_path( + self, class_name: str, class_parent_dir: str = None, class_parent_name: str = None + ): class_file = None - - # Finds relative paths based on the parent directory + + # Finds relative paths based on the parent directory if class_name.startswith(".") and class_parent_dir: class_path_base = os.path.join(self.classes_path, class_parent_dir) else: class_path_base = self.classes_path - + # Now try to find the class file extension = ".yml" - + cases = [ # case components.kapicorp is absolute and a directory, look for components/kapicorp/init.yml # case .components.kapicorp is relative and a directory, look for /components/kapicorp/init.yml os.path.join(class_path_base, *class_name.split("."), "init" + extension), - # case components.kapicorp is absolute and a file, look for components/kapicorp.yml # case components.kapicorp is relative and a file, look for /components/kapicorp.yml os.path.join(class_path_base, *class_name.split(".")) + extension, - # Reclass compatibility mode # case .components.kapicorp points to /kapicorp.yml os.path.join(class_path_base, *class_name.split(".")[2:]) + extension, - # case components.kapicorp points to components/kapicorp/init.yml os.path.join(class_path_base, *class_name.split(".")[2:], "init" + extension), ] - + for case in cases: if os.path.isfile(case): class_file = case return class_file - + logger.error(f"class file not found for class {class_name}, tried {cases}") return None @@ -125,49 +131,55 @@ def resolve_class_file_path(self, class_name: str, class_parent_dir: str = None, def load_file(self, filename): with open(filename, "r") as f: return yaml.safe_load(f) - + def load_parameters_from_file(self, filename, parameters={}) -> Dict: parameters = OmegaConf.create(parameters) applications = [] classes = [] exports = Dict() - + content = self.load_file(filename) - + _classes = content.get("classes", []) _parameters = keys_to_strings(content.get("parameters", {})) _applications = content.get("applications", []) _exports = content.get("exports", {}) - # first processes all classes + # first processes all classes for class_name in _classes: class_parent_dir = os.path.dirname(filename.removeprefix(self.classes_path).removeprefix("/")) class_parent_name = os.path.basename(filename) - class_file = self.resolve_class_file_path(class_name, class_parent_dir=class_parent_dir, class_parent_name=class_parent_name) + class_file = self.resolve_class_file_path( + class_name, class_parent_dir=class_parent_dir, class_parent_name=class_parent_name + ) if not class_file: if self.ignore_class_not_found: continue raise InventoryError(f"Class {class_name} not found") p, c, a, e = self.load_parameters_from_file(class_file) if p: - parameters = OmegaConf.unsafe_merge(parameters, p, list_merge_mode=ListMergeMode.EXTEND_UNIQUE) + parameters = OmegaConf.unsafe_merge( + parameters, p, list_merge_mode=ListMergeMode.EXTEND_UNIQUE + ) classes.extend(c) classes.append(class_name) applications.extend(a) exports.merge_update(e, box_merge_lists="unique") - + # finally merges the parameters from the current file if _parameters: - parameters = OmegaConf.unsafe_merge(parameters, _parameters, list_merge_mode=ListMergeMode.EXTEND_UNIQUE) - + parameters = OmegaConf.unsafe_merge( + parameters, _parameters, list_merge_mode=ListMergeMode.EXTEND_UNIQUE + ) + exports.merge_update(_exports, box_merge_lists="unique") applications.extend(_applications) return parameters, classes, applications, exports - + def load_target(self, target: OmegaConfTarget): full_target_path = os.path.join(self.targets_path, target.path) - + start = time.perf_counter() parameters = OmegaConf.create(keys_to_strings(target.parameters)) p, c, a, e = self.load_parameters_from_file(full_target_path, parameters=parameters) @@ -178,12 +190,14 @@ def load_target(self, target: OmegaConfTarget): target.applications = a target.exports = e finish_loading = time.perf_counter() - start - logger.debug(f"{target.name}: Config loaded in {load_parameters:.2f}s, resolved in {to_container:.2f}s. Total {finish_loading:.2f}s") - + logger.debug( + f"{target.name}: Config loaded in {load_parameters:.2f}s, resolved in {to_container:.2f}s. Total {finish_loading:.2f}s" + ) + def migrate(self): migrate(self.inventory_path) - + def resolve_targets(self, targets: list[OmegaConfTarget] = None) -> None: if not targets: targets = self.targets.values() - map(lambda target: target.resolve(), targets) \ No newline at end of file + map(lambda target: target.resolve(), targets) diff --git a/kapitan/inventory/inv_omegaconf/migrate.py b/kapitan/inventory/inv_omegaconf/migrate.py index fe5afff53..b452a40f6 100644 --- a/kapitan/inventory/inv_omegaconf/migrate.py +++ b/kapitan/inventory/inv_omegaconf/migrate.py @@ -54,7 +54,14 @@ def migrate_str(content: str): # migrate meta data name updated_content = regex.sub( r"(?") sys.exit(1) - + print(f"Migrating all .yml/.yaml files in {sys.argv[1]}") migrate(sys.argv[1]) diff --git a/kapitan/inventory/inv_omegaconf/resolvers.py b/kapitan/inventory/inv_omegaconf/resolvers.py index 43fd8db99..462099bc5 100644 --- a/kapitan/inventory/inv_omegaconf/resolvers.py +++ b/kapitan/inventory/inv_omegaconf/resolvers.py @@ -8,11 +8,12 @@ import copy import logging import os -import yaml import sys from typing import Any -from omegaconf import Container, Node, OmegaConf, ListMergeMode +import yaml +from omegaconf import Container, ListMergeMode, Node, OmegaConf + logger = logging.getLogger(__name__) @@ -241,7 +242,6 @@ def register_resolvers() -> None: OmegaConf.register_new_resolver("not", condition_not, replace=replace) OmegaConf.register_new_resolver("equal", condition_equal, replace=replace) - # user defined resolvers user_resolver_file = os.path.join(os.getcwd(), "system/omegaconf/resolvers/resolvers.py") @@ -282,4 +282,4 @@ def register_user_resolvers(user_resolver_file: str) -> None: try: OmegaConf.register_new_resolver(name, func, replace=True) except: - logger.warning(f"Could not load resolver {name}") \ No newline at end of file + logger.warning(f"Could not load resolver {name}") diff --git a/kapitan/inventory/inv_reclass.py b/kapitan/inventory/inv_reclass.py index ecb22f331..5db4650f9 100644 --- a/kapitan/inventory/inv_reclass.py +++ b/kapitan/inventory/inv_reclass.py @@ -1,6 +1,5 @@ import logging import os - from datetime import datetime import reclass @@ -16,8 +15,10 @@ class ReclassInventory(Inventory): - - def render_targets(self, targets: list[InventoryTarget] = None, ignore_class_not_found: bool = False) -> None: + + def render_targets( + self, targets: list[InventoryTarget] = None, ignore_class_not_found: bool = False + ) -> None: """ Runs a reclass inventory in inventory_path (same output as running ./reclass.py -b inv_base_uri/ --inventory) diff --git a/kapitan/inventory/inv_reclass_rs.py b/kapitan/inventory/inv_reclass_rs.py index 75f6c76e4..ac3c99336 100644 --- a/kapitan/inventory/inv_reclass_rs.py +++ b/kapitan/inventory/inv_reclass_rs.py @@ -1,13 +1,13 @@ import logging import os -import reclass_rs - from datetime import datetime +import reclass_rs + from kapitan.errors import InventoryError -from .inventory import Inventory, InventoryTarget from .inv_reclass import get_reclass_config +from .inventory import Inventory, InventoryTarget logger = logging.getLogger(__name__) diff --git a/kapitan/inventory/inventory.py b/kapitan/inventory/inventory.py index 364791e9c..be81bce1b 100644 --- a/kapitan/inventory/inventory.py +++ b/kapitan/inventory/inventory.py @@ -5,13 +5,16 @@ # # SPDX-License-Identifier: Apache-2.0 +import functools import logging import os from abc import ABC, abstractmethod -import functools +from typing import Dict + from pydantic import BaseModel, Field + from kapitan.errors import KapitanError -from typing import Dict + logger = logging.getLogger(__name__) @@ -25,19 +28,26 @@ class InventoryTarget(BaseModel): class Inventory(ABC): - def __init__(self, inventory_path: str = "inventory", compose_target_name: bool = False, ignore_class_not_found=False, initialise=True, target_class=InventoryTarget): + def __init__( + self, + inventory_path: str = "inventory", + compose_target_name: bool = False, + ignore_class_not_found=False, + initialise=True, + target_class=InventoryTarget, + ): self.inventory_path = inventory_path self.compose_target_name = compose_target_name - self.targets_path = os.path.join(self.inventory_path, 'targets') - self.classes_path = os.path.join(self.inventory_path, 'classes') + self.targets_path = os.path.join(self.inventory_path, "targets") + self.classes_path = os.path.join(self.inventory_path, "classes") self.initialised: bool = False self.targets: dict[str, target_class] = {} self.ignore_class_not_found = ignore_class_not_found self.target_class = target_class - + if initialise: self.__initialise(ignore_class_not_found=ignore_class_not_found) - + @functools.cached_property def inventory(self) -> dict: """ @@ -62,7 +72,7 @@ def __initialise(self, ignore_class_not_found) -> bool: name = name.replace(os.sep, ".") else: name, ext = os.path.splitext(file) - + if ext not in (".yml", ".yaml"): logger.debug(f"ignoring {file}: targets have to be .yml or .yaml files.") continue @@ -74,9 +84,9 @@ def __initialise(self, ignore_class_not_found) -> bool: f"Conflicting targets {target.name}: {target.path} and {self.targets[target.name].path}. " f"Consider using '--compose-target-name'." ) - + self.targets[target.name] = target - + self.render_targets(self.targets, ignore_class_not_found=ignore_class_not_found) self.initialised = True return self.initialised @@ -91,12 +101,16 @@ def get_targets(self, target_names: list[str] = [], ignore_class_not_found: bool """ helper function to get rendered InventoryTarget objects for multiple targets """ - + if target_names: - return {target_name: self.targets[target_name] for target_name in target_names if target_name in self.targets} + return { + target_name: self.targets[target_name] + for target_name in target_names + if target_name in self.targets + } else: return self.targets - + def get_parameters(self, target_names: str | list[str], ignore_class_not_found: bool = False) -> dict: """ helper function to get rendered parameters for single target or multiple targets @@ -105,10 +119,14 @@ def get_parameters(self, target_names: str | list[str], ignore_class_not_found: target = self.get_target(target_names, ignore_class_not_found) return target.parameters - return {name: {"parameters": Dict(target.parameters)} for name, target in self.get_targets(target_names)} + return { + name: {"parameters": Dict(target.parameters)} for name, target in self.get_targets(target_names) + } @abstractmethod - def render_targets(self, targets: list[InventoryTarget] = None, ignore_class_not_found: bool = False) -> None: + def render_targets( + self, targets: list[InventoryTarget] = None, ignore_class_not_found: bool = False + ) -> None: """ create the inventory depending on which backend gets used """ diff --git a/kapitan/lint.py b/kapitan/lint.py index 54dd7fe3d..9b2a9c1c4 100644 --- a/kapitan/lint.py +++ b/kapitan/lint.py @@ -12,11 +12,12 @@ import sys from pprint import pformat -from kapitan.errors import KapitanError -from kapitan.utils import list_all_paths from yamllint import linter from yamllint.config import YamlLintConfig +from kapitan.errors import KapitanError +from kapitan.utils import list_all_paths + logger = logging.getLogger(__name__) yamllint_config = """ diff --git a/kapitan/refs/base.py b/kapitan/refs/base.py index 6ef5d1ff6..81dc36dd0 100644 --- a/kapitan/refs/base.py +++ b/kapitan/refs/base.py @@ -18,7 +18,12 @@ import yaml -from kapitan.errors import RefBackendError, RefError, RefFromFuncError, RefHashMismatchError +from kapitan.errors import ( + RefBackendError, + RefError, + RefFromFuncError, + RefHashMismatchError, +) from kapitan.refs.functions import eval_func, get_func_lookup from kapitan.utils import PrettyDumper, list_all_paths diff --git a/kapitan/refs/base64.py b/kapitan/refs/base64.py index fea2cacdd..20795c2ce 100644 --- a/kapitan/refs/base64.py +++ b/kapitan/refs/base64.py @@ -11,6 +11,7 @@ import logging import yaml + from kapitan.refs.base import PlainRef, PlainRefBackend try: diff --git a/kapitan/refs/functions.py b/kapitan/refs/functions.py index 76ced7dd9..124f1e42b 100644 --- a/kapitan/refs/functions.py +++ b/kapitan/refs/functions.py @@ -14,6 +14,7 @@ from cryptography.hazmat.backends import default_backend from cryptography.hazmat.primitives import serialization from cryptography.hazmat.primitives.asymmetric import ed25519, rsa + from kapitan.errors import RefError logger = logging.getLogger(__name__) diff --git a/kapitan/refs/vault_resources.py b/kapitan/refs/vault_resources.py index 5a581c616..5f56ac008 100644 --- a/kapitan/refs/vault_resources.py +++ b/kapitan/refs/vault_resources.py @@ -5,8 +5,9 @@ "hashicorp vault resource functions" -import os import logging +import os + import hvac from kapitan.errors import KapitanError diff --git a/kapitan/resources.py b/kapitan/resources.py index dc02f04eb..aa410207f 100644 --- a/kapitan/resources.py +++ b/kapitan/resources.py @@ -22,10 +22,16 @@ import kapitan.cached as cached from kapitan import __file__ as kapitan_install_path -from kapitan.inputs.kadet import Dict from kapitan.errors import CompileError, InventoryError, KapitanError +from kapitan.inputs.kadet import Dict from kapitan.inventory import Inventory, get_inventory_backend -from kapitan.utils import PrettyDumper, deep_get, flatten_dict, render_jinja2_file, sha256_string +from kapitan.utils import ( + PrettyDumper, + deep_get, + flatten_dict, + render_jinja2_file, + sha256_string, +) logger = logging.getLogger(__name__) @@ -328,14 +334,18 @@ def get_inventory(inventory_path, ignore_class_not_found: bool = False) -> Inven backend_id = hasattr(cached.args, "inventory_backend") and cached.args.inventory_backend compose_target_name = hasattr(cached.args, "compose_target_name") and cached.args.compose_target_name backend = get_inventory_backend(backend_id) - + logger.debug(f"Using {backend.__name__} as inventory backend") - inventory_backend = backend(inventory_path=inventory_path, compose_target_name=compose_target_name, ignore_class_not_found=ignore_class_not_found) + inventory_backend = backend( + inventory_path=inventory_path, + compose_target_name=compose_target_name, + ignore_class_not_found=ignore_class_not_found, + ) cached.inv = inventory_backend cached.global_inv = cached.inv.inventory - # if we use forked processes, we need to load the inventory for kadet once + # if we use forked processes, we need to load the inventory for kadet once # and pass it to the children, to avoid re-reading the inventory for each child # TODO(adenaria): Improve to only do it for kadet if hasattr(cached.args, "mp_method") and cached.args.mp_method != "spawn": diff --git a/kapitan/targets.py b/kapitan/targets.py index 5611a828e..8449942c8 100644 --- a/kapitan/targets.py +++ b/kapitan/targets.py @@ -51,7 +51,10 @@ def compile_targets( inventory = get_inventory(inventory_path) discovered_targets = inventory.targets.keys() - logger.info(f"Rendered inventory (%.2fs): discovered {len(discovered_targets)} targets.", time.time() - rendering_start) + logger.info( + f"Rendered inventory (%.2fs): discovered {len(discovered_targets)} targets.", + time.time() - rendering_start, + ) if discovered_targets == 0: raise CompileError("No inventory targets discovered at path: {inventory_path}") @@ -60,19 +63,22 @@ def compile_targets( try: targets = search_targets(inventory, targets, labels) - + except CompileError as e: raise CompileError(f"Error searching targets: {e}") if len(targets) == 0: raise CompileError(f"No matching targets found in inventory: {labels if labels else desired_targets}") - if parallelism is None: parallelism = min(len(targets), os.cpu_count()) - logger.debug(f"Parallel not set, defaulting to {parallelism} processes {os.cpu_count()} {len(targets)}") - - logger.info(f"Compiling {len(targets)}/{len(discovered_targets)} targets using {parallelism} concurrent processes: ({os.cpu_count()} CPU detected)") + logger.debug( + f"Parallel not set, defaulting to {parallelism} processes {os.cpu_count()} {len(targets)}" + ) + + logger.info( + f"Compiling {len(targets)}/{len(discovered_targets)} targets using {parallelism} concurrent processes: ({os.cpu_count()} CPU detected)" + ) with multiprocessing.Pool(parallelism) as pool: try: @@ -124,7 +130,7 @@ def compile_targets( if fetch_objs: fetch_dependencies(output_path, fetch_objs, dep_cache_dir, True, pool) logger.info("Fetched dependencies (%.2fs)", time.time() - fetching_start) - + compile_start = time.time() worker = partial( compile_target, @@ -202,7 +208,7 @@ def load_target_inventory(inventory, requested_targets, ignore_class_not_found=F continue else: raise InventoryError(f"InventoryError: {target_name}: parameters is empty") - + kapitan_target_configs = target.parameters["kapitan"] for comp_obj in kapitan_target_configs["compile"]: comp_obj.setdefault("input_params", {}) @@ -242,7 +248,9 @@ def search_targets(inventory, targets, labels): matched_all_labels = True continue except KeyError: - logger.debug(f"search_targets: label {label}={value} didn't match target {target.name} {target_labels}") + logger.debug( + f"search_targets: label {label}={value} didn't match target {target.name} {target_labels}" + ) matched_all_labels = False break @@ -266,7 +274,7 @@ def compile_target(target_obj, search_paths, compile_path, ref_controller, globa # Only populates the cache if the subprocess doesn't have it if globals_cached and not cached.inv: cached.from_dict(globals_cached) - + use_go_jsonnet = kwargs.get("use_go_jsonnet", False) if use_go_jsonnet: logger.debug("Using go-jsonnet over jsonnet") @@ -309,7 +317,8 @@ def compile_target(target_obj, search_paths, compile_path, ref_controller, globa continue else: import traceback + traceback.print_exception(type(e), e, e.__traceback__) raise CompileError(f"Error compiling {target_name}: {e}") - logger.info("Compiled %s (%.2fs)", target_obj["target_full_path"], time.time() - start) \ No newline at end of file + logger.info("Compiled %s (%.2fs)", target_obj["target_full_path"], time.time() - start) diff --git a/kapitan/utils.py b/kapitan/utils.py index 1924a5145..442671669 100644 --- a/kapitan/utils.py +++ b/kapitan/utils.py @@ -7,16 +7,15 @@ from __future__ import print_function import collections -import json import functools +import glob +import json import logging -import magic import math import os import re -import stat import shutil -import glob +import stat import sys import tarfile import traceback @@ -26,12 +25,16 @@ from zipfile import ZipFile import jinja2 +import magic import requests import yaml from kapitan import cached, defaults from kapitan.errors import CompileError -from kapitan.inputs.jinja2_filters import load_jinja2_filters, load_jinja2_filters_from_file +from kapitan.inputs.jinja2_filters import ( + load_jinja2_filters, + load_jinja2_filters_from_file, +) from kapitan.version import VERSION logger = logging.getLogger(__name__) @@ -217,6 +220,7 @@ def get_dumper_for_style(cls, style_selection="double-quotes"): cls.add_representer(str, functools.partial(multiline_str_presenter, style_selection=style_selection)) return cls + def multiline_str_presenter(dumper, data, style_selection="double-quotes"): """ Configures yaml for dumping multiline strings with given style. @@ -224,11 +228,7 @@ def multiline_str_presenter(dumper, data, style_selection="double-quotes"): Ref: https://github.com/yaml/pyyaml/issues/240#issuecomment-1018712495 """ - supported_styles = { - "literal": "|", - "folded": ">", - "double-quotes": '"' - } + supported_styles = {"literal": "|", "folded": ">", "double-quotes": '"'} style = supported_styles.get(style_selection) @@ -635,7 +635,7 @@ def copy_tree(src: str, dst: str) -> list: """ if not os.path.isdir(src): raise SafeCopyError(f"Cannot copy tree {src}: not a directory") - + if not os.path.isdir(dst): raise SafeCopyError(f"Cannot copy tree {dst}: not a directory") diff --git a/overrides/.icons/kapitan/logo.svg b/overrides/.icons/kapitan/logo.svg index 426380625..2569d2409 100644 --- a/overrides/.icons/kapitan/logo.svg +++ b/overrides/.icons/kapitan/logo.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/overrides/main.html b/overrides/main.html index a8d15cdc6..64c418219 100644 --- a/overrides/main.html +++ b/overrides/main.html @@ -24,4 +24,4 @@ {% endif %} {{ page.content }} -{% endblock %} \ No newline at end of file +{% endblock %} diff --git a/overrides/partials/comments.html b/overrides/partials/comments.html index e8a40ecfd..3b8748feb 100644 --- a/overrides/partials/comments.html +++ b/overrides/partials/comments.html @@ -25,7 +25,7 @@

{{ lang.t("meta.comments") }}

var palette = __md_get("__palette") if (palette && typeof palette.color === "object") { var theme = palette.color.scheme === "slate" ? "dark" : "light" - giscus.setAttribute("data-theme", theme) + giscus.setAttribute("data-theme", theme) } /* Register event handlers after documented loaded */ @@ -47,4 +47,3 @@

{{ lang.t("meta.comments") }}

}) {% endif %} - diff --git a/overrides/partials/integrations/analytics/custom.html b/overrides/partials/integrations/analytics/custom.html index 363ccf208..3bdfe304f 100644 --- a/overrides/partials/integrations/analytics/custom.html +++ b/overrides/partials/integrations/analytics/custom.html @@ -4,4 +4,4 @@ j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); })(window,document,'script','dataLayer','GTM-WPN4JBMH'); - \ No newline at end of file + diff --git a/poetry.lock b/poetry.lock index 84c8114bc..39fdd267a 100644 --- a/poetry.lock +++ b/poetry.lock @@ -109,6 +109,52 @@ files = [ [package.extras] dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"] +[[package]] +name = "black" +version = "24.8.0" +description = "The uncompromising code formatter." +optional = false +python-versions = ">=3.8" +files = [ + {file = "black-24.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:09cdeb74d494ec023ded657f7092ba518e8cf78fa8386155e4a03fdcc44679e6"}, + {file = "black-24.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:81c6742da39f33b08e791da38410f32e27d632260e599df7245cccee2064afeb"}, + {file = "black-24.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:707a1ca89221bc8a1a64fb5e15ef39cd755633daa672a9db7498d1c19de66a42"}, + {file = "black-24.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:d6417535d99c37cee4091a2f24eb2b6d5ec42b144d50f1f2e436d9fe1916fe1a"}, + {file = "black-24.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:fb6e2c0b86bbd43dee042e48059c9ad7830abd5c94b0bc518c0eeec57c3eddc1"}, + {file = "black-24.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:837fd281f1908d0076844bc2b801ad2d369c78c45cf800cad7b61686051041af"}, + {file = "black-24.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:62e8730977f0b77998029da7971fa896ceefa2c4c4933fcd593fa599ecbf97a4"}, + {file = "black-24.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:72901b4913cbac8972ad911dc4098d5753704d1f3c56e44ae8dce99eecb0e3af"}, + {file = "black-24.8.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:7c046c1d1eeb7aea9335da62472481d3bbf3fd986e093cffd35f4385c94ae368"}, + {file = "black-24.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:649f6d84ccbae73ab767e206772cc2d7a393a001070a4c814a546afd0d423aed"}, + {file = "black-24.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2b59b250fdba5f9a9cd9d0ece6e6d993d91ce877d121d161e4698af3eb9c1018"}, + {file = "black-24.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:6e55d30d44bed36593c3163b9bc63bf58b3b30e4611e4d88a0c3c239930ed5b2"}, + {file = "black-24.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:505289f17ceda596658ae81b61ebbe2d9b25aa78067035184ed0a9d855d18afd"}, + {file = "black-24.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b19c9ad992c7883ad84c9b22aaa73562a16b819c1d8db7a1a1a49fb7ec13c7d2"}, + {file = "black-24.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1f13f7f386f86f8121d76599114bb8c17b69d962137fc70efe56137727c7047e"}, + {file = "black-24.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:f490dbd59680d809ca31efdae20e634f3fae27fba3ce0ba3208333b713bc3920"}, + {file = "black-24.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:eab4dd44ce80dea27dc69db40dab62d4ca96112f87996bca68cd75639aeb2e4c"}, + {file = "black-24.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3c4285573d4897a7610054af5a890bde7c65cb466040c5f0c8b732812d7f0e5e"}, + {file = "black-24.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e84e33b37be070ba135176c123ae52a51f82306def9f7d063ee302ecab2cf47"}, + {file = "black-24.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:73bbf84ed136e45d451a260c6b73ed674652f90a2b3211d6a35e78054563a9bb"}, + {file = "black-24.8.0-py3-none-any.whl", hash = "sha256:972085c618ee94f402da1af548a4f218c754ea7e5dc70acb168bfaca4c2542ed"}, + {file = "black-24.8.0.tar.gz", hash = "sha256:2500945420b6784c38b9ee885af039f5e7471ef284ab03fa35ecdde4688cd83f"}, +] + +[package.dependencies] +click = ">=8.0.0" +mypy-extensions = ">=0.4.3" +packaging = ">=22.0" +pathspec = ">=0.9.0" +platformdirs = ">=2" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} +typing-extensions = {version = ">=4.0.1", markers = "python_version < \"3.11\""} + +[package.extras] +colorama = ["colorama (>=0.4.3)"] +d = ["aiohttp (>=3.7.4)", "aiohttp (>=3.7.4,!=3.9.0)"] +jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] +uvloop = ["uvloop (>=0.15.2)"] + [[package]] name = "boto3" version = "1.35.10" @@ -147,52 +193,6 @@ urllib3 = {version = ">=1.25.4,<2.2.0 || >2.2.0,<3", markers = "python_version > [package.extras] crt = ["awscrt (==0.21.2)"] -[[package]] -name = "build" -version = "1.2.1" -description = "A simple, correct Python build frontend" -optional = false -python-versions = ">=3.8" -files = [ - {file = "build-1.2.1-py3-none-any.whl", hash = "sha256:75e10f767a433d9a86e50d83f418e83efc18ede923ee5ff7df93b6cb0306c5d4"}, - {file = "build-1.2.1.tar.gz", hash = "sha256:526263f4870c26f26c433545579475377b2b7588b6f1eac76a001e873ae3e19d"}, -] - -[package.dependencies] -colorama = {version = "*", markers = "os_name == \"nt\""} -importlib-metadata = {version = ">=4.6", markers = "python_full_version < \"3.10.2\""} -packaging = ">=19.1" -pyproject_hooks = "*" -tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} - -[package.extras] -docs = ["furo (>=2023.08.17)", "sphinx (>=7.0,<8.0)", "sphinx-argparse-cli (>=1.5)", "sphinx-autodoc-typehints (>=1.10)", "sphinx-issues (>=3.0.0)"] -test = ["build[uv,virtualenv]", "filelock (>=3)", "pytest (>=6.2.4)", "pytest-cov (>=2.12)", "pytest-mock (>=2)", "pytest-rerunfailures (>=9.1)", "pytest-xdist (>=1.34)", "setuptools (>=42.0.0)", "setuptools (>=56.0.0)", "setuptools (>=56.0.0)", "setuptools (>=67.8.0)", "wheel (>=0.36.0)"] -typing = ["build[uv]", "importlib-metadata (>=5.1)", "mypy (>=1.9.0,<1.10.0)", "tomli", "typing-extensions (>=3.7.4.3)"] -uv = ["uv (>=0.1.18)"] -virtualenv = ["virtualenv (>=20.0.35)"] - -[[package]] -name = "cachecontrol" -version = "0.14.0" -description = "httplib2 caching for requests" -optional = false -python-versions = ">=3.7" -files = [ - {file = "cachecontrol-0.14.0-py3-none-any.whl", hash = "sha256:f5bf3f0620c38db2e5122c0726bdebb0d16869de966ea6a2befe92470b740ea0"}, - {file = "cachecontrol-0.14.0.tar.gz", hash = "sha256:7db1195b41c81f8274a7bbd97c956f44e8348265a1bc7641c37dfebc39f0c938"}, -] - -[package.dependencies] -filelock = {version = ">=3.8.0", optional = true, markers = "extra == \"filecache\""} -msgpack = ">=0.5.2,<2.0.0" -requests = ">=2.16.0" - -[package.extras] -dev = ["CacheControl[filecache,redis]", "black", "build", "cherrypy", "furo", "mypy", "pytest", "pytest-cov", "sphinx", "sphinx-copybutton", "tox", "types-redis", "types-requests"] -filecache = ["filelock (>=3.8.0)"] -redis = ["redis (>=2.10.5)"] - [[package]] name = "cachetools" version = "5.5.0" @@ -294,6 +294,17 @@ files = [ [package.dependencies] pycparser = "*" +[[package]] +name = "cfgv" +version = "3.4.0" +description = "Validate configuration and produce human readable error messages." +optional = false +python-versions = ">=3.8" +files = [ + {file = "cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9"}, + {file = "cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560"}, +] + [[package]] name = "charset-normalizer" version = "3.3.2" @@ -393,21 +404,6 @@ files = [ {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, ] -[[package]] -name = "cleo" -version = "2.1.0" -description = "Cleo allows you to create beautiful and testable command-line interfaces." -optional = false -python-versions = ">=3.7,<4.0" -files = [ - {file = "cleo-2.1.0-py3-none-any.whl", hash = "sha256:4a31bd4dd45695a64ee3c4758f583f134267c2bc518d8ae9a29cf237d009b07e"}, - {file = "cleo-2.1.0.tar.gz", hash = "sha256:0b2c880b5d13660a7ea651001fb4acb527696c01f15c9ee650f377aa543fd523"}, -] - -[package.dependencies] -crashtest = ">=0.4.1,<0.5.0" -rapidfuzz = ">=3.0.0,<4.0.0" - [[package]] name = "click" version = "8.1.7" @@ -514,20 +510,12 @@ files = [ {file = "coverage-7.6.1.tar.gz", hash = "sha256:953510dfb7b12ab69d20135a0662397f077c59b1e6379a768e97c59d852ee51d"}, ] +[package.dependencies] +tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.11.0a6\" and extra == \"toml\""} + [package.extras] toml = ["tomli"] -[[package]] -name = "crashtest" -version = "0.4.1" -description = "Manage Python errors with ease" -optional = false -python-versions = ">=3.7,<4.0" -files = [ - {file = "crashtest-0.4.1-py3-none-any.whl", hash = "sha256:8d23eac5fa660409f57472e3851dab7ac18aba459a8d19cbbba86d3d5aecd2a5"}, - {file = "crashtest-0.4.1.tar.gz", hash = "sha256:80d7b1f316ebfbd429f648076d6275c877ba30ba48979de4191714a75266f0ce"}, -] - [[package]] name = "cryptography" version = "42.0.8" @@ -626,93 +614,6 @@ docs = ["myst-parser (==0.18.0)", "sphinx (==5.1.1)"] ssh = ["paramiko (>=2.4.3)"] websockets = ["websocket-client (>=1.3.0)"] -[[package]] -name = "dulwich" -version = "0.21.7" -description = "Python Git Library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "dulwich-0.21.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d4c0110798099bb7d36a110090f2688050703065448895c4f53ade808d889dd3"}, - {file = "dulwich-0.21.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2bc12697f0918bee324c18836053644035362bb3983dc1b210318f2fed1d7132"}, - {file = "dulwich-0.21.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:471305af74790827fcbafe330fc2e8bdcee4fb56ca1177c8c481b1c8f806c4a4"}, - {file = "dulwich-0.21.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d54c9d0e845be26f65f954dff13a1cd3f2b9739820c19064257b8fd7435ab263"}, - {file = "dulwich-0.21.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:12d61334a575474e707614f2e93d6ed4cdae9eb47214f9277076d9e5615171d3"}, - {file = "dulwich-0.21.7-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e274cebaf345f0b1e3b70197f2651de92b652386b68020cfd3bf61bc30f6eaaa"}, - {file = "dulwich-0.21.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:817822f970e196e757ae01281ecbf21369383285b9f4a83496312204cf889b8c"}, - {file = "dulwich-0.21.7-cp310-cp310-win32.whl", hash = "sha256:7836da3f4110ce684dcd53489015fb7fa94ed33c5276e3318b8b1cbcb5b71e08"}, - {file = "dulwich-0.21.7-cp310-cp310-win_amd64.whl", hash = "sha256:4a043b90958cec866b4edc6aef5fe3c2c96a664d0b357e1682a46f6c477273c4"}, - {file = "dulwich-0.21.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ce8db196e79c1f381469410d26fb1d8b89c6b87a4e7f00ff418c22a35121405c"}, - {file = "dulwich-0.21.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:62bfb26bdce869cd40be443dfd93143caea7089b165d2dcc33de40f6ac9d812a"}, - {file = "dulwich-0.21.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c01a735b9a171dcb634a97a3cec1b174cfbfa8e840156870384b633da0460f18"}, - {file = "dulwich-0.21.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fa4d14767cf7a49c9231c2e52cb2a3e90d0c83f843eb6a2ca2b5d81d254cf6b9"}, - {file = "dulwich-0.21.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7bca4b86e96d6ef18c5bc39828ea349efb5be2f9b1f6ac9863f90589bac1084d"}, - {file = "dulwich-0.21.7-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a7b5624b02ef808cdc62dabd47eb10cd4ac15e8ac6df9e2e88b6ac6b40133673"}, - {file = "dulwich-0.21.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c3a539b4696a42fbdb7412cb7b66a4d4d332761299d3613d90a642923c7560e1"}, - {file = "dulwich-0.21.7-cp311-cp311-win32.whl", hash = "sha256:675a612ce913081beb0f37b286891e795d905691dfccfb9bf73721dca6757cde"}, - {file = "dulwich-0.21.7-cp311-cp311-win_amd64.whl", hash = "sha256:460ba74bdb19f8d498786ae7776745875059b1178066208c0fd509792d7f7bfc"}, - {file = "dulwich-0.21.7-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:4c51058ec4c0b45dc5189225b9e0c671b96ca9713c1daf71d622c13b0ab07681"}, - {file = "dulwich-0.21.7-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:4bc4c5366eaf26dda3fdffe160a3b515666ed27c2419f1d483da285ac1411de0"}, - {file = "dulwich-0.21.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a0650ec77d89cb947e3e4bbd4841c96f74e52b4650830112c3057a8ca891dc2f"}, - {file = "dulwich-0.21.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f18f0a311fb7734b033a3101292b932158cade54b74d1c44db519e42825e5a2"}, - {file = "dulwich-0.21.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c589468e5c0cd84e97eb7ec209ab005a2cb69399e8c5861c3edfe38989ac3a8"}, - {file = "dulwich-0.21.7-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d62446797163317a397a10080c6397ffaaca51a7804c0120b334f8165736c56a"}, - {file = "dulwich-0.21.7-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e84cc606b1f581733df4350ca4070e6a8b30be3662bbb81a590b177d0c996c91"}, - {file = "dulwich-0.21.7-cp312-cp312-win32.whl", hash = "sha256:c3d1685f320907a52c40fd5890627945c51f3a5fa4bcfe10edb24fec79caadec"}, - {file = "dulwich-0.21.7-cp312-cp312-win_amd64.whl", hash = "sha256:6bd69921fdd813b7469a3c77bc75c1783cc1d8d72ab15a406598e5a3ba1a1503"}, - {file = "dulwich-0.21.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7d8ab29c660125db52106775caa1f8f7f77a69ed1fe8bc4b42bdf115731a25bf"}, - {file = "dulwich-0.21.7-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b0d2e4485b98695bf95350ce9d38b1bb0aaac2c34ad00a0df789aa33c934469b"}, - {file = "dulwich-0.21.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e138d516baa6b5bafbe8f030eccc544d0d486d6819b82387fc0e285e62ef5261"}, - {file = "dulwich-0.21.7-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:f34bf9b9fa9308376263fd9ac43143c7c09da9bc75037bb75c6c2423a151b92c"}, - {file = "dulwich-0.21.7-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2e2c66888207b71cd1daa2acb06d3984a6bc13787b837397a64117aa9fc5936a"}, - {file = "dulwich-0.21.7-cp37-cp37m-win32.whl", hash = "sha256:10893105c6566fc95bc2a67b61df7cc1e8f9126d02a1df6a8b2b82eb59db8ab9"}, - {file = "dulwich-0.21.7-cp37-cp37m-win_amd64.whl", hash = "sha256:460b3849d5c3d3818a80743b4f7a0094c893c559f678e56a02fff570b49a644a"}, - {file = "dulwich-0.21.7-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:74700e4c7d532877355743336c36f51b414d01e92ba7d304c4f8d9a5946dbc81"}, - {file = "dulwich-0.21.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c92e72c43c9e9e936b01a57167e0ea77d3fd2d82416edf9489faa87278a1cdf7"}, - {file = "dulwich-0.21.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d097e963eb6b9fa53266146471531ad9c6765bf390849230311514546ed64db2"}, - {file = "dulwich-0.21.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:808e8b9cc0aa9ac74870b49db4f9f39a52fb61694573f84b9c0613c928d4caf8"}, - {file = "dulwich-0.21.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1957b65f96e36c301e419d7adaadcff47647c30eb072468901bb683b1000bc5"}, - {file = "dulwich-0.21.7-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:4b09bc3a64fb70132ec14326ecbe6e0555381108caff3496898962c4136a48c6"}, - {file = "dulwich-0.21.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d5882e70b74ac3c736a42d3fdd4f5f2e6570637f59ad5d3e684760290b58f041"}, - {file = "dulwich-0.21.7-cp38-cp38-win32.whl", hash = "sha256:29bb5c1d70eba155ded41ed8a62be2f72edbb3c77b08f65b89c03976292f6d1b"}, - {file = "dulwich-0.21.7-cp38-cp38-win_amd64.whl", hash = "sha256:25c3ab8fb2e201ad2031ddd32e4c68b7c03cb34b24a5ff477b7a7dcef86372f5"}, - {file = "dulwich-0.21.7-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8929c37986c83deb4eb500c766ee28b6670285b512402647ee02a857320e377c"}, - {file = "dulwich-0.21.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cc1e11be527ac06316539b57a7688bcb1b6a3e53933bc2f844397bc50734e9ae"}, - {file = "dulwich-0.21.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0fc3078a1ba04c588fabb0969d3530efd5cd1ce2cf248eefb6baf7cbc15fc285"}, - {file = "dulwich-0.21.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40dcbd29ba30ba2c5bfbab07a61a5f20095541d5ac66d813056c122244df4ac0"}, - {file = "dulwich-0.21.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8869fc8ec3dda743e03d06d698ad489b3705775fe62825e00fa95aa158097fc0"}, - {file = "dulwich-0.21.7-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d96ca5e0dde49376fbcb44f10eddb6c30284a87bd03bb577c59bb0a1f63903fa"}, - {file = "dulwich-0.21.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e0064363bd5e814359657ae32517fa8001e8573d9d040bd997908d488ab886ed"}, - {file = "dulwich-0.21.7-cp39-cp39-win32.whl", hash = "sha256:869eb7be48243e695673b07905d18b73d1054a85e1f6e298fe63ba2843bb2ca1"}, - {file = "dulwich-0.21.7-cp39-cp39-win_amd64.whl", hash = "sha256:404b8edeb3c3a86c47c0a498699fc064c93fa1f8bab2ffe919e8ab03eafaaad3"}, - {file = "dulwich-0.21.7-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e598d743c6c0548ebcd2baf94aa9c8bfacb787ea671eeeb5828cfbd7d56b552f"}, - {file = "dulwich-0.21.7-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4a2d76c96426e791556836ef43542b639def81be4f1d6d4322cd886c115eae1"}, - {file = "dulwich-0.21.7-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6c88acb60a1f4d31bd6d13bfba465853b3df940ee4a0f2a3d6c7a0778c705b7"}, - {file = "dulwich-0.21.7-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ecd315847dea406a4decfa39d388a2521e4e31acde3bd9c2609c989e817c6d62"}, - {file = "dulwich-0.21.7-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d05d3c781bc74e2c2a2a8f4e4e2ed693540fbe88e6ac36df81deac574a6dad99"}, - {file = "dulwich-0.21.7-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6de6f8de4a453fdbae8062a6faa652255d22a3d8bce0cd6d2d6701305c75f2b3"}, - {file = "dulwich-0.21.7-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e25953c7acbbe4e19650d0225af1c0c0e6882f8bddd2056f75c1cc2b109b88ad"}, - {file = "dulwich-0.21.7-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:4637cbd8ed1012f67e1068aaed19fcc8b649bcf3e9e26649826a303298c89b9d"}, - {file = "dulwich-0.21.7-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:858842b30ad6486aacaa607d60bab9c9a29e7c59dc2d9cb77ae5a94053878c08"}, - {file = "dulwich-0.21.7-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:739b191f61e1c4ce18ac7d520e7a7cbda00e182c3489552408237200ce8411ad"}, - {file = "dulwich-0.21.7-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:274c18ec3599a92a9b67abaf110e4f181a4f779ee1aaab9e23a72e89d71b2bd9"}, - {file = "dulwich-0.21.7-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:2590e9b431efa94fc356ae33b38f5e64f1834ec3a94a6ac3a64283b206d07aa3"}, - {file = "dulwich-0.21.7-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ed60d1f610ef6437586f7768254c2a93820ccbd4cfdac7d182cf2d6e615969bb"}, - {file = "dulwich-0.21.7-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8278835e168dd097089f9e53088c7a69c6ca0841aef580d9603eafe9aea8c358"}, - {file = "dulwich-0.21.7-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffc27fb063f740712e02b4d2f826aee8bbed737ed799962fef625e2ce56e2d29"}, - {file = "dulwich-0.21.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:61e3451bd3d3844f2dca53f131982553be4d1b1e1ebd9db701843dd76c4dba31"}, - {file = "dulwich-0.21.7.tar.gz", hash = "sha256:a9e9c66833cea580c3ac12927e4b9711985d76afca98da971405d414de60e968"}, -] - -[package.dependencies] -urllib3 = ">=1.25" - -[package.extras] -fastimport = ["fastimport"] -https = ["urllib3 (>=1.24.1)"] -paramiko = ["paramiko"] -pgp = ["gpg"] - [[package]] name = "enum34" version = "1.1.10" @@ -739,20 +640,6 @@ files = [ [package.extras] test = ["pytest (>=6)"] -[[package]] -name = "fastjsonschema" -version = "2.20.0" -description = "Fastest Python implementation of JSON schema" -optional = false -python-versions = "*" -files = [ - {file = "fastjsonschema-2.20.0-py3-none-any.whl", hash = "sha256:5875f0b0fa7a0043a91e93a9b8f793bcbbba9691e7fd83dca95c28ba26d21f0a"}, - {file = "fastjsonschema-2.20.0.tar.gz", hash = "sha256:3d48fc5300ee96f5d116f10fe6f28d938e6008f59a6a025c2649475b87f76a23"}, -] - -[package.extras] -devel = ["colorama", "json-spec", "jsonschema", "pylint", "pytest", "pytest-benchmark", "pytest-cache", "validictory"] - [[package]] name = "filelock" version = "3.15.4" @@ -769,6 +656,57 @@ docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1 testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8.0.1)", "pytest (>=7.4.3)", "pytest-asyncio (>=0.21)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)", "virtualenv (>=20.26.2)"] typing = ["typing-extensions (>=4.8)"] +[[package]] +name = "flake8" +version = "7.1.1" +description = "the modular source code checker: pep8 pyflakes and co" +optional = false +python-versions = ">=3.8.1" +files = [ + {file = "flake8-7.1.1-py2.py3-none-any.whl", hash = "sha256:597477df7860daa5aa0fdd84bf5208a043ab96b8e96ab708770ae0364dd03213"}, + {file = "flake8-7.1.1.tar.gz", hash = "sha256:049d058491e228e03e67b390f311bbf88fce2dbaa8fa673e7aea87b7198b8d38"}, +] + +[package.dependencies] +mccabe = ">=0.7.0,<0.8.0" +pycodestyle = ">=2.12.0,<2.13.0" +pyflakes = ">=3.2.0,<3.3.0" + +[[package]] +name = "flake8-bugbear" +version = "24.8.19" +description = "A plugin for flake8 finding likely bugs and design problems in your program. Contains warnings that don't belong in pyflakes and pycodestyle." +optional = false +python-versions = ">=3.8.1" +files = [ + {file = "flake8_bugbear-24.8.19-py3-none-any.whl", hash = "sha256:25bc3867f7338ee3b3e0916bf8b8a0b743f53a9a5175782ddc4325ed4f386b89"}, + {file = "flake8_bugbear-24.8.19.tar.gz", hash = "sha256:9b77627eceda28c51c27af94560a72b5b2c97c016651bdce45d8f56c180d2d32"}, +] + +[package.dependencies] +attrs = ">=19.2.0" +flake8 = ">=6.0.0" + +[package.extras] +dev = ["coverage", "hypothesis", "hypothesmith (>=0.2)", "pre-commit", "pytest", "tox"] + +[[package]] +name = "flake8-pyproject" +version = "1.2.3" +description = "Flake8 plug-in loading the configuration from pyproject.toml" +optional = false +python-versions = ">= 3.6" +files = [ + {file = "flake8_pyproject-1.2.3-py3-none-any.whl", hash = "sha256:6249fe53545205af5e76837644dc80b4c10037e73a0e5db87ff562d75fb5bd4a"}, +] + +[package.dependencies] +Flake8 = ">=5" +TOMLi = {version = "*", markers = "python_version < \"3.11\""} + +[package.extras] +dev = ["pyTest", "pyTest-cov"] + [[package]] name = "ghp-import" version = "2.1.0" @@ -955,6 +893,20 @@ requests = ">=2.27.1,<3.0.0" [package.extras] parser = ["pyhcl (>=0.4.4,<0.5.0)"] +[[package]] +name = "identify" +version = "2.6.0" +description = "File identification library for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "identify-2.6.0-py2.py3-none-any.whl", hash = "sha256:e79ae4406387a9d300332b5fd366d8994f1525e8414984e1a59e058b2eda2dd0"}, + {file = "identify-2.6.0.tar.gz", hash = "sha256:cb171c685bdc31bcc4c1734698736a7d5b6c8bf2e0c15117f4d469c8640ae5cf"}, +] + +[package.extras] +license = ["ukkonen"] + [[package]] name = "idna" version = "3.8" @@ -1015,17 +967,6 @@ files = [ {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, ] -[[package]] -name = "installer" -version = "0.7.0" -description = "A library for installing Python wheels." -optional = false -python-versions = ">=3.7" -files = [ - {file = "installer-0.7.0-py3-none-any.whl", hash = "sha256:05d1933f0a5ba7d8d6296bb6d5018e7c94fa473ceb10cf198a92ccea19c27b53"}, - {file = "installer-0.7.0.tar.gz", hash = "sha256:a26d3e3116289bb08216e0d0f7d925fcef0b0194eedfa0c944bcaaa106c4b631"}, -] - [[package]] name = "isodate" version = "0.6.1" @@ -1041,37 +982,18 @@ files = [ six = "*" [[package]] -name = "jaraco-classes" -version = "3.4.0" -description = "Utility functions for Python class constructs" -optional = false -python-versions = ">=3.8" -files = [ - {file = "jaraco.classes-3.4.0-py3-none-any.whl", hash = "sha256:f662826b6bed8cace05e7ff873ce0f9283b5c924470fe664fff1c2f00f581790"}, - {file = "jaraco.classes-3.4.0.tar.gz", hash = "sha256:47a024b51d0239c0dd8c8540c6c7f484be3b8fcf0b2d85c13825780d3b3f3acd"}, -] - -[package.dependencies] -more-itertools = "*" - -[package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1)"] - -[[package]] -name = "jeepney" -version = "0.8.0" -description = "Low-level, pure Python DBus protocol wrapper." +name = "isort" +version = "5.13.2" +description = "A Python utility / library to sort Python imports." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8.0" files = [ - {file = "jeepney-0.8.0-py3-none-any.whl", hash = "sha256:c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755"}, - {file = "jeepney-0.8.0.tar.gz", hash = "sha256:5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806"}, + {file = "isort-5.13.2-py3-none-any.whl", hash = "sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6"}, + {file = "isort-5.13.2.tar.gz", hash = "sha256:48fdfcb9face5d58a4f6dde2e72a1fb8dcaf8ab26f95ab49fab84c2ddefb0109"}, ] [package.extras] -test = ["async-timeout", "pytest", "pytest-asyncio (>=0.17)", "pytest-trio", "testpath", "trio"] -trio = ["async_generator", "trio"] +colors = ["colorama (>=0.4.6)"] [[package]] name = "jinja2" @@ -1181,29 +1103,6 @@ pyparsing = "*" pyyaml = "*" six = "*" -[[package]] -name = "keyring" -version = "24.3.1" -description = "Store and access your passwords safely." -optional = false -python-versions = ">=3.8" -files = [ - {file = "keyring-24.3.1-py3-none-any.whl", hash = "sha256:df38a4d7419a6a60fea5cef1e45a948a3e8430dd12ad88b0f423c5c143906218"}, - {file = "keyring-24.3.1.tar.gz", hash = "sha256:c3327b6ffafc0e8befbdb597cacdb4928ffe5c1212f7645f186e6d9957a898db"}, -] - -[package.dependencies] -importlib-metadata = {version = ">=4.11.4", markers = "python_version < \"3.12\""} -"jaraco.classes" = "*" -jeepney = {version = ">=0.4.2", markers = "sys_platform == \"linux\""} -pywin32-ctypes = {version = ">=0.2.0", markers = "sys_platform == \"win32\""} -SecretStorage = {version = ">=3.2", markers = "sys_platform == \"linux\""} - -[package.extras] -completion = ["shtab (>=1.1.0)"] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1)"] - [[package]] name = "markdown" version = "3.7" @@ -1305,6 +1204,17 @@ files = [ {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, ] +[[package]] +name = "mccabe" +version = "0.7.0" +description = "McCabe checker, plugin for flake8" +optional = false +python-versions = ">=3.6" +files = [ + {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, + {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, +] + [[package]] name = "mergedeep" version = "1.3.4" @@ -1427,17 +1337,6 @@ files = [ {file = "mkdocs_material_extensions-1.3.1.tar.gz", hash = "sha256:10c9511cea88f568257f960358a467d12b970e1f7b2c0e5fb2bb48cab1928443"}, ] -[[package]] -name = "more-itertools" -version = "10.4.0" -description = "More routines for operating on iterables, beyond itertools" -optional = false -python-versions = ">=3.8" -files = [ - {file = "more-itertools-10.4.0.tar.gz", hash = "sha256:fe0e63c4ab068eac62410ab05cccca2dc71ec44ba8ef29916a0090df061cf923"}, - {file = "more_itertools-10.4.0-py3-none-any.whl", hash = "sha256:0f7d9f83a0a8dcfa8a2694a770590d98a67ea943e3d9f5298309a484758c4e27"}, -] - [[package]] name = "msal" version = "1.30.0" @@ -1473,75 +1372,32 @@ msal = ">=1.29,<2" portalocker = ">=1.4,<3" [[package]] -name = "msgpack" -version = "1.0.8" -description = "MessagePack serializer" +name = "mypy-extensions" +version = "1.0.0" +description = "Type system extensions for programs checked with the mypy type checker." optional = false -python-versions = ">=3.8" +python-versions = ">=3.5" +files = [ + {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, + {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, +] + +[[package]] +name = "nodeenv" +version = "1.9.1" +description = "Node.js virtual environment builder" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" files = [ - {file = "msgpack-1.0.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:505fe3d03856ac7d215dbe005414bc28505d26f0c128906037e66d98c4e95868"}, - {file = "msgpack-1.0.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e6b7842518a63a9f17107eb176320960ec095a8ee3b4420b5f688e24bf50c53c"}, - {file = "msgpack-1.0.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:376081f471a2ef24828b83a641a02c575d6103a3ad7fd7dade5486cad10ea659"}, - {file = "msgpack-1.0.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e390971d082dba073c05dbd56322427d3280b7cc8b53484c9377adfbae67dc2"}, - {file = "msgpack-1.0.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00e073efcba9ea99db5acef3959efa45b52bc67b61b00823d2a1a6944bf45982"}, - {file = "msgpack-1.0.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82d92c773fbc6942a7a8b520d22c11cfc8fd83bba86116bfcf962c2f5c2ecdaa"}, - {file = "msgpack-1.0.8-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9ee32dcb8e531adae1f1ca568822e9b3a738369b3b686d1477cbc643c4a9c128"}, - {file = "msgpack-1.0.8-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e3aa7e51d738e0ec0afbed661261513b38b3014754c9459508399baf14ae0c9d"}, - {file = "msgpack-1.0.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:69284049d07fce531c17404fcba2bb1df472bc2dcdac642ae71a2d079d950653"}, - {file = "msgpack-1.0.8-cp310-cp310-win32.whl", hash = "sha256:13577ec9e247f8741c84d06b9ece5f654920d8365a4b636ce0e44f15e07ec693"}, - {file = "msgpack-1.0.8-cp310-cp310-win_amd64.whl", hash = "sha256:e532dbd6ddfe13946de050d7474e3f5fb6ec774fbb1a188aaf469b08cf04189a"}, - {file = "msgpack-1.0.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9517004e21664f2b5a5fd6333b0731b9cf0817403a941b393d89a2f1dc2bd836"}, - {file = "msgpack-1.0.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d16a786905034e7e34098634b184a7d81f91d4c3d246edc6bd7aefb2fd8ea6ad"}, - {file = "msgpack-1.0.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e2872993e209f7ed04d963e4b4fbae72d034844ec66bc4ca403329db2074377b"}, - {file = "msgpack-1.0.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c330eace3dd100bdb54b5653b966de7f51c26ec4a7d4e87132d9b4f738220ba"}, - {file = "msgpack-1.0.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:83b5c044f3eff2a6534768ccfd50425939e7a8b5cf9a7261c385de1e20dcfc85"}, - {file = "msgpack-1.0.8-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1876b0b653a808fcd50123b953af170c535027bf1d053b59790eebb0aeb38950"}, - {file = "msgpack-1.0.8-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:dfe1f0f0ed5785c187144c46a292b8c34c1295c01da12e10ccddfc16def4448a"}, - {file = "msgpack-1.0.8-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3528807cbbb7f315bb81959d5961855e7ba52aa60a3097151cb21956fbc7502b"}, - {file = "msgpack-1.0.8-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e2f879ab92ce502a1e65fce390eab619774dda6a6ff719718069ac94084098ce"}, - {file = "msgpack-1.0.8-cp311-cp311-win32.whl", hash = "sha256:26ee97a8261e6e35885c2ecd2fd4a6d38252246f94a2aec23665a4e66d066305"}, - {file = "msgpack-1.0.8-cp311-cp311-win_amd64.whl", hash = "sha256:eadb9f826c138e6cf3c49d6f8de88225a3c0ab181a9b4ba792e006e5292d150e"}, - {file = "msgpack-1.0.8-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:114be227f5213ef8b215c22dde19532f5da9652e56e8ce969bf0a26d7c419fee"}, - {file = "msgpack-1.0.8-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d661dc4785affa9d0edfdd1e59ec056a58b3dbb9f196fa43587f3ddac654ac7b"}, - {file = "msgpack-1.0.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d56fd9f1f1cdc8227d7b7918f55091349741904d9520c65f0139a9755952c9e8"}, - {file = "msgpack-1.0.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0726c282d188e204281ebd8de31724b7d749adebc086873a59efb8cf7ae27df3"}, - {file = "msgpack-1.0.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8db8e423192303ed77cff4dce3a4b88dbfaf43979d280181558af5e2c3c71afc"}, - {file = "msgpack-1.0.8-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99881222f4a8c2f641f25703963a5cefb076adffd959e0558dc9f803a52d6a58"}, - {file = "msgpack-1.0.8-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b5505774ea2a73a86ea176e8a9a4a7c8bf5d521050f0f6f8426afe798689243f"}, - {file = "msgpack-1.0.8-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:ef254a06bcea461e65ff0373d8a0dd1ed3aa004af48839f002a0c994a6f72d04"}, - {file = "msgpack-1.0.8-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e1dd7839443592d00e96db831eddb4111a2a81a46b028f0facd60a09ebbdd543"}, - {file = "msgpack-1.0.8-cp312-cp312-win32.whl", hash = "sha256:64d0fcd436c5683fdd7c907eeae5e2cbb5eb872fafbc03a43609d7941840995c"}, - {file = "msgpack-1.0.8-cp312-cp312-win_amd64.whl", hash = "sha256:74398a4cf19de42e1498368c36eed45d9528f5fd0155241e82c4082b7e16cffd"}, - {file = "msgpack-1.0.8-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:0ceea77719d45c839fd73abcb190b8390412a890df2f83fb8cf49b2a4b5c2f40"}, - {file = "msgpack-1.0.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1ab0bbcd4d1f7b6991ee7c753655b481c50084294218de69365f8f1970d4c151"}, - {file = "msgpack-1.0.8-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:1cce488457370ffd1f953846f82323cb6b2ad2190987cd4d70b2713e17268d24"}, - {file = "msgpack-1.0.8-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3923a1778f7e5ef31865893fdca12a8d7dc03a44b33e2a5f3295416314c09f5d"}, - {file = "msgpack-1.0.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a22e47578b30a3e199ab067a4d43d790249b3c0587d9a771921f86250c8435db"}, - {file = "msgpack-1.0.8-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bd739c9251d01e0279ce729e37b39d49a08c0420d3fee7f2a4968c0576678f77"}, - {file = "msgpack-1.0.8-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:d3420522057ebab1728b21ad473aa950026d07cb09da41103f8e597dfbfaeb13"}, - {file = "msgpack-1.0.8-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5845fdf5e5d5b78a49b826fcdc0eb2e2aa7191980e3d2cfd2a30303a74f212e2"}, - {file = "msgpack-1.0.8-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6a0e76621f6e1f908ae52860bdcb58e1ca85231a9b0545e64509c931dd34275a"}, - {file = "msgpack-1.0.8-cp38-cp38-win32.whl", hash = "sha256:374a8e88ddab84b9ada695d255679fb99c53513c0a51778796fcf0944d6c789c"}, - {file = "msgpack-1.0.8-cp38-cp38-win_amd64.whl", hash = "sha256:f3709997b228685fe53e8c433e2df9f0cdb5f4542bd5114ed17ac3c0129b0480"}, - {file = "msgpack-1.0.8-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f51bab98d52739c50c56658cc303f190785f9a2cd97b823357e7aeae54c8f68a"}, - {file = "msgpack-1.0.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:73ee792784d48aa338bba28063e19a27e8d989344f34aad14ea6e1b9bd83f596"}, - {file = "msgpack-1.0.8-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f9904e24646570539a8950400602d66d2b2c492b9010ea7e965025cb71d0c86d"}, - {file = "msgpack-1.0.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e75753aeda0ddc4c28dce4c32ba2f6ec30b1b02f6c0b14e547841ba5b24f753f"}, - {file = "msgpack-1.0.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5dbf059fb4b7c240c873c1245ee112505be27497e90f7c6591261c7d3c3a8228"}, - {file = "msgpack-1.0.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4916727e31c28be8beaf11cf117d6f6f188dcc36daae4e851fee88646f5b6b18"}, - {file = "msgpack-1.0.8-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7938111ed1358f536daf311be244f34df7bf3cdedb3ed883787aca97778b28d8"}, - {file = "msgpack-1.0.8-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:493c5c5e44b06d6c9268ce21b302c9ca055c1fd3484c25ba41d34476c76ee746"}, - {file = "msgpack-1.0.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5fbb160554e319f7b22ecf530a80a3ff496d38e8e07ae763b9e82fadfe96f273"}, - {file = "msgpack-1.0.8-cp39-cp39-win32.whl", hash = "sha256:f9af38a89b6a5c04b7d18c492c8ccf2aee7048aff1ce8437c4683bb5a1df893d"}, - {file = "msgpack-1.0.8-cp39-cp39-win_amd64.whl", hash = "sha256:ed59dd52075f8fc91da6053b12e8c89e37aa043f8986efd89e61fae69dc1b011"}, - {file = "msgpack-1.0.8.tar.gz", hash = "sha256:95c02b0e27e706e48d0e5426d1710ca78e0f0628d6e89d5b5a5b91a5f12274f3"}, + {file = "nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9"}, + {file = "nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f"}, ] [[package]] name = "omegaconf" version = "2.4.0.dev3" description = "A flexible configuration library" -optional = false +optional = true python-versions = ">=3.8" files = [ {file = "omegaconf-2.4.0.dev3-py3-none-any.whl", hash = "sha256:acffa42eab0d9cb09ccead6e80d1dfd20a625e21602353f267f3bc2cd131f7b2"}, @@ -1588,34 +1444,6 @@ files = [ {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, ] -[[package]] -name = "pexpect" -version = "4.9.0" -description = "Pexpect allows easy control of interactive console applications." -optional = false -python-versions = "*" -files = [ - {file = "pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523"}, - {file = "pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f"}, -] - -[package.dependencies] -ptyprocess = ">=0.5" - -[[package]] -name = "pkginfo" -version = "1.11.1" -description = "Query metadata from sdists / bdists / installed packages." -optional = false -python-versions = ">=3.8" -files = [ - {file = "pkginfo-1.11.1-py3-none-any.whl", hash = "sha256:bfa76a714fdfc18a045fcd684dbfc3816b603d9d075febef17cb6582bea29573"}, - {file = "pkginfo-1.11.1.tar.gz", hash = "sha256:2e0dca1cf4c8e39644eed32408ea9966ee15e0d324c62ba899a393b3c6b467aa"}, -] - -[package.extras] -testing = ["pytest", "pytest-cov", "wheel"] - [[package]] name = "platformdirs" version = "4.2.2" @@ -1647,68 +1475,6 @@ files = [ dev = ["pre-commit", "tox"] testing = ["pytest", "pytest-benchmark"] -[[package]] -name = "poetry" -version = "1.8.3" -description = "Python dependency management and packaging made easy." -optional = false -python-versions = "<4.0,>=3.8" -files = [ - {file = "poetry-1.8.3-py3-none-any.whl", hash = "sha256:88191c69b08d06f9db671b793d68f40048e8904c0718404b63dcc2b5aec62d13"}, - {file = "poetry-1.8.3.tar.gz", hash = "sha256:67f4eb68288eab41e841cc71a00d26cf6bdda9533022d0189a145a34d0a35f48"}, -] - -[package.dependencies] -build = ">=1.0.3,<2.0.0" -cachecontrol = {version = ">=0.14.0,<0.15.0", extras = ["filecache"]} -cleo = ">=2.1.0,<3.0.0" -crashtest = ">=0.4.1,<0.5.0" -dulwich = ">=0.21.2,<0.22.0" -fastjsonschema = ">=2.18.0,<3.0.0" -installer = ">=0.7.0,<0.8.0" -keyring = ">=24.0.0,<25.0.0" -packaging = ">=23.1" -pexpect = ">=4.7.0,<5.0.0" -pkginfo = ">=1.10,<2.0" -platformdirs = ">=3.0.0,<5" -poetry-core = "1.9.0" -poetry-plugin-export = ">=1.6.0,<2.0.0" -pyproject-hooks = ">=1.0.0,<2.0.0" -requests = ">=2.26,<3.0" -requests-toolbelt = ">=1.0.0,<2.0.0" -shellingham = ">=1.5,<2.0" -tomli = {version = ">=2.0.1,<3.0.0", markers = "python_version < \"3.11\""} -tomlkit = ">=0.11.4,<1.0.0" -trove-classifiers = ">=2022.5.19" -virtualenv = ">=20.23.0,<21.0.0" -xattr = {version = ">=1.0.0,<2.0.0", markers = "sys_platform == \"darwin\""} - -[[package]] -name = "poetry-core" -version = "1.9.0" -description = "Poetry PEP 517 Build Backend" -optional = false -python-versions = ">=3.8,<4.0" -files = [ - {file = "poetry_core-1.9.0-py3-none-any.whl", hash = "sha256:4e0c9c6ad8cf89956f03b308736d84ea6ddb44089d16f2adc94050108ec1f5a1"}, - {file = "poetry_core-1.9.0.tar.gz", hash = "sha256:fa7a4001eae8aa572ee84f35feb510b321bd652e5cf9293249d62853e1f935a2"}, -] - -[[package]] -name = "poetry-plugin-export" -version = "1.8.0" -description = "Poetry plugin to export the dependencies to various formats" -optional = false -python-versions = "<4.0,>=3.8" -files = [ - {file = "poetry_plugin_export-1.8.0-py3-none-any.whl", hash = "sha256:adbe232cfa0cc04991ea3680c865cf748bff27593b9abcb1f35fb50ed7ba2c22"}, - {file = "poetry_plugin_export-1.8.0.tar.gz", hash = "sha256:1fa6168a85d59395d835ca564bc19862a7c76061e60c3e7dfaec70d50937fc61"}, -] - -[package.dependencies] -poetry = ">=1.8.0,<3.0.0" -poetry-core = ">=1.7.0,<3.0.0" - [[package]] name = "portalocker" version = "2.10.1" @@ -1728,6 +1494,24 @@ docs = ["sphinx (>=1.7.1)"] redis = ["redis"] tests = ["pytest (>=5.4.1)", "pytest-cov (>=2.8.1)", "pytest-mypy (>=0.8.0)", "pytest-timeout (>=2.1.0)", "redis", "sphinx (>=6.0.0)", "types-redis"] +[[package]] +name = "pre-commit" +version = "3.8.0" +description = "A framework for managing and maintaining multi-language pre-commit hooks." +optional = false +python-versions = ">=3.9" +files = [ + {file = "pre_commit-3.8.0-py2.py3-none-any.whl", hash = "sha256:9a90a53bf82fdd8778d58085faf8d83df56e40dfe18f45b19446e26bf1b3a63f"}, + {file = "pre_commit-3.8.0.tar.gz", hash = "sha256:8bb6494d4a20423842e198980c9ecf9f96607a07ea29549e180eef9ae80fe7af"}, +] + +[package.dependencies] +cfgv = ">=2.0.0" +identify = ">=1.0.0" +nodeenv = ">=0.11.1" +pyyaml = ">=5.1" +virtualenv = ">=20.10.0" + [[package]] name = "proto-plus" version = "1.24.0" @@ -1765,17 +1549,6 @@ files = [ {file = "protobuf-5.28.0.tar.gz", hash = "sha256:dde74af0fa774fa98892209992295adbfb91da3fa98c8f67a88afe8f5a349add"}, ] -[[package]] -name = "ptyprocess" -version = "0.7.0" -description = "Run a subprocess in a pseudo terminal" -optional = false -python-versions = "*" -files = [ - {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, - {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, -] - [[package]] name = "pyasn1" version = "0.6.0" @@ -1801,6 +1574,17 @@ files = [ [package.dependencies] pyasn1 = ">=0.4.6,<0.7.0" +[[package]] +name = "pycodestyle" +version = "2.12.1" +description = "Python style guide checker" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pycodestyle-2.12.1-py2.py3-none-any.whl", hash = "sha256:46f0fb92069a7c28ab7bb558f05bfc0110dac69a0cd23c61ea0040283a9d78b3"}, + {file = "pycodestyle-2.12.1.tar.gz", hash = "sha256:6838eae08bbce4f6accd5d5572075c63626a15ee3e6f842df996bf62f6d73521"}, +] + [[package]] name = "pycparser" version = "2.22" @@ -1932,6 +1716,17 @@ files = [ [package.dependencies] typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" +[[package]] +name = "pyflakes" +version = "3.2.0" +description = "passive checker of Python programs" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pyflakes-3.2.0-py2.py3-none-any.whl", hash = "sha256:84b5be138a2dfbb40689ca07e2152deb896a65c3a3e24c251c5c62489568074a"}, + {file = "pyflakes-3.2.0.tar.gz", hash = "sha256:1c61603ff154621fb2a9172037d84dca3500def8c8b630657d1701f026f8af3f"}, +] + [[package]] name = "pygments" version = "2.18.0" @@ -1998,17 +1793,6 @@ files = [ [package.extras] diagrams = ["jinja2", "railroad-diagrams"] -[[package]] -name = "pyproject-hooks" -version = "1.1.0" -description = "Wrappers to call pyproject.toml-based build backend hooks." -optional = false -python-versions = ">=3.7" -files = [ - {file = "pyproject_hooks-1.1.0-py3-none-any.whl", hash = "sha256:7ceeefe9aec63a1064c18d939bdc3adf2d8aa1988a510afec15151578b232aa2"}, - {file = "pyproject_hooks-1.1.0.tar.gz", hash = "sha256:4b37730834edbd6bd37f26ece6b44802fb1c1ee2ece0e54ddff8bfc06db86965"}, -] - [[package]] name = "pytest" version = "8.3.2" @@ -2031,6 +1815,24 @@ tomli = {version = ">=1", markers = "python_version < \"3.11\""} [package.extras] dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] +[[package]] +name = "pytest-cov" +version = "3.0.0" +description = "Pytest plugin for measuring coverage." +optional = false +python-versions = ">=3.6" +files = [ + {file = "pytest-cov-3.0.0.tar.gz", hash = "sha256:e7f0f5b1617d2210a2cabc266dfe2f4c75a8d32fb89eafb7ad9d06f6d076d470"}, + {file = "pytest_cov-3.0.0-py3-none-any.whl", hash = "sha256:578d5d15ac4a25e5f961c938b85a05b09fdaae9deef3bb6de9a6e766622ca7a6"}, +] + +[package.dependencies] +coverage = {version = ">=5.2.1", extras = ["toml"]} +pytest = ">=4.6" + +[package.extras] +testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtualenv"] + [[package]] name = "pytest-emoji" version = "0.2.0" @@ -2153,17 +1955,6 @@ files = [ {file = "pywin32-306-cp39-cp39-win_amd64.whl", hash = "sha256:39b61c15272833b5c329a2989999dcae836b1eed650252ab1b7bfbe1d59f30f4"}, ] -[[package]] -name = "pywin32-ctypes" -version = "0.2.3" -description = "A (partial) reimplementation of pywin32 using ctypes/cffi" -optional = false -python-versions = ">=3.6" -files = [ - {file = "pywin32-ctypes-0.2.3.tar.gz", hash = "sha256:d162dc04946d704503b2edc4d55f3dba5c1d539ead017afa00142c38b9885755"}, - {file = "pywin32_ctypes-0.2.3-py3-none-any.whl", hash = "sha256:8a1513379d709975552d202d942d9837758905c8d01eb82b8bcc30918929e7b8"}, -] - [[package]] name = "pyyaml" version = "6.0.2" @@ -2240,131 +2031,11 @@ files = [ [package.dependencies] pyyaml = "*" -[[package]] -name = "rapidfuzz" -version = "3.9.6" -description = "rapid fuzzy string matching" -optional = false -python-versions = ">=3.8" -files = [ - {file = "rapidfuzz-3.9.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a7ed0d0b9c85720f0ae33ac5efc8dc3f60c1489dad5c29d735fbdf2f66f0431f"}, - {file = "rapidfuzz-3.9.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f3deff6ab7017ed21b9aec5874a07ad13e6b2a688af055837f88b743c7bfd947"}, - {file = "rapidfuzz-3.9.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c3f9fc060160507b2704f7d1491bd58453d69689b580cbc85289335b14fe8ca"}, - {file = "rapidfuzz-3.9.6-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c4e86c2b3827fa6169ad6e7d4b790ce02a20acefb8b78d92fa4249589bbc7a2c"}, - {file = "rapidfuzz-3.9.6-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f982e1aafb4bd8207a5e073b1efef9e68a984e91330e1bbf364f9ed157ed83f0"}, - {file = "rapidfuzz-3.9.6-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9196a51d0ec5eaaaf5bca54a85b7b1e666fc944c332f68e6427503af9fb8c49e"}, - {file = "rapidfuzz-3.9.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb5a514064e02585b1cc09da2fe406a6dc1a7e5f3e92dd4f27c53e5f1465ec81"}, - {file = "rapidfuzz-3.9.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e3a4244f65dbc3580b1275480118c3763f9dc29fc3dd96610560cb5e140a4d4a"}, - {file = "rapidfuzz-3.9.6-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:f6ebb910a702e41641e1e1dada3843bc11ba9107a33c98daef6945a885a40a07"}, - {file = "rapidfuzz-3.9.6-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:624fbe96115fb39addafa288d583b5493bc76dab1d34d0ebba9987d6871afdf9"}, - {file = "rapidfuzz-3.9.6-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:1c59f1c1507b7a557cf3c410c76e91f097460da7d97e51c985343798e9df7a3c"}, - {file = "rapidfuzz-3.9.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f6f0256cb27b6a0fb2e1918477d1b56473cd04acfa245376a342e7c15806a396"}, - {file = "rapidfuzz-3.9.6-cp310-cp310-win32.whl", hash = "sha256:24d473d00d23a30a85802b502b417a7f5126019c3beec91a6739fe7b95388b24"}, - {file = "rapidfuzz-3.9.6-cp310-cp310-win_amd64.whl", hash = "sha256:248f6d2612e661e2b5f9a22bbd5862a1600e720da7bb6ad8a55bb1548cdfa423"}, - {file = "rapidfuzz-3.9.6-cp310-cp310-win_arm64.whl", hash = "sha256:e03fdf0e74f346ed7e798135df5f2a0fb8d6b96582b00ebef202dcf2171e1d1d"}, - {file = "rapidfuzz-3.9.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:52e4675f642fbc85632f691b67115a243cd4d2a47bdcc4a3d9a79e784518ff97"}, - {file = "rapidfuzz-3.9.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1f93a2f13038700bd245b927c46a2017db3dcd4d4ff94687d74b5123689b873b"}, - {file = "rapidfuzz-3.9.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42b70500bca460264b8141d8040caee22e9cf0418c5388104ff0c73fb69ee28f"}, - {file = "rapidfuzz-3.9.6-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a1e037fb89f714a220f68f902fc6300ab7a33349f3ce8ffae668c3b3a40b0b06"}, - {file = "rapidfuzz-3.9.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6792f66d59b86ccfad5e247f2912e255c85c575789acdbad8e7f561412ffed8a"}, - {file = "rapidfuzz-3.9.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:68d9cffe710b67f1969cf996983608cee4490521d96ea91d16bd7ea5dc80ea98"}, - {file = "rapidfuzz-3.9.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63daaeeea76da17fa0bbe7fb05cba8ed8064bb1a0edf8360636557f8b6511961"}, - {file = "rapidfuzz-3.9.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d214e063bffa13e3b771520b74f674b22d309b5720d4df9918ff3e0c0f037720"}, - {file = "rapidfuzz-3.9.6-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ed443a2062460f44c0346cb9d269b586496b808c2419bbd6057f54061c9b9c75"}, - {file = "rapidfuzz-3.9.6-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:5b0c9b227ee0076fb2d58301c505bb837a290ae99ee628beacdb719f0626d749"}, - {file = "rapidfuzz-3.9.6-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:82c9722b7dfaa71e8b61f8c89fed0482567fb69178e139fe4151fc71ed7df782"}, - {file = "rapidfuzz-3.9.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c18897c95c0a288347e29537b63608a8f63a5c3cb6da258ac46fcf89155e723e"}, - {file = "rapidfuzz-3.9.6-cp311-cp311-win32.whl", hash = "sha256:3e910cf08944da381159587709daaad9e59d8ff7bca1f788d15928f3c3d49c2a"}, - {file = "rapidfuzz-3.9.6-cp311-cp311-win_amd64.whl", hash = "sha256:59c4a61fab676d37329fc3a671618a461bfeef53a4d0b8b12e3bc24a14e166f8"}, - {file = "rapidfuzz-3.9.6-cp311-cp311-win_arm64.whl", hash = "sha256:8b4afea244102332973377fddbe54ce844d0916e1c67a5123432291717f32ffa"}, - {file = "rapidfuzz-3.9.6-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:70591b28b218fff351b88cdd7f2359a01a71f9f7f5a2e465ce3715ed4b3c422b"}, - {file = "rapidfuzz-3.9.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ee2d8355c7343c631a03e57540ea06e8717c19ecf5ff64ea07e0498f7f161457"}, - {file = "rapidfuzz-3.9.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:708fb675de0f47b9635d1cc6fbbf80d52cb710d0a1abbfae5c84c46e3abbddc3"}, - {file = "rapidfuzz-3.9.6-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d66c247c2d3bb7a9b60567c395a15a929d0ebcc5f4ceedb55bfa202c38c6e0c"}, - {file = "rapidfuzz-3.9.6-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:15146301b32e6e3d2b7e8146db1a26747919d8b13690c7f83a4cb5dc111b3a08"}, - {file = "rapidfuzz-3.9.6-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7a03da59b6c7c97e657dd5cd4bcaab5fe4a2affd8193958d6f4d938bee36679"}, - {file = "rapidfuzz-3.9.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d2c2fe19e392dbc22695b6c3b2510527e2b774647e79936bbde49db7742d6f1"}, - {file = "rapidfuzz-3.9.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:91aaee4c94cb45930684f583ffc4e7c01a52b46610971cede33586cf8a04a12e"}, - {file = "rapidfuzz-3.9.6-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3f5702828c10768f9281180a7ff8597da1e5002803e1304e9519dd0f06d79a85"}, - {file = "rapidfuzz-3.9.6-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:ccd1763b608fb4629a0b08f00b3c099d6395e67c14e619f6341b2c8429c2f310"}, - {file = "rapidfuzz-3.9.6-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:cc7a0d4b2cb166bc46d02c8c9f7551cde8e2f3c9789df3827309433ee9771163"}, - {file = "rapidfuzz-3.9.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7496f53d40560a58964207b52586783633f371683834a8f719d6d965d223a2eb"}, - {file = "rapidfuzz-3.9.6-cp312-cp312-win32.whl", hash = "sha256:5eb1a9272ca71bc72be5415c2fa8448a6302ea4578e181bb7da9db855b367df0"}, - {file = "rapidfuzz-3.9.6-cp312-cp312-win_amd64.whl", hash = "sha256:0d21fc3c0ca507a1180152a6dbd129ebaef48facde3f943db5c1055b6e6be56a"}, - {file = "rapidfuzz-3.9.6-cp312-cp312-win_arm64.whl", hash = "sha256:43bb27a57c29dc5fa754496ba6a1a508480d21ae99ac0d19597646c16407e9f3"}, - {file = "rapidfuzz-3.9.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:83a5ac6547a9d6eedaa212975cb8f2ce2aa07e6e30833b40e54a52b9f9999aa4"}, - {file = "rapidfuzz-3.9.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:10f06139142ecde67078ebc9a745965446132b998f9feebffd71acdf218acfcc"}, - {file = "rapidfuzz-3.9.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:74720c3f24597f76c7c3e2c4abdff55f1664f4766ff5b28aeaa689f8ffba5fab"}, - {file = "rapidfuzz-3.9.6-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ce2bce52b5c150878e558a0418c2b637fb3dbb6eb38e4eb27d24aa839920483e"}, - {file = "rapidfuzz-3.9.6-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1611199f178793ca9a060c99b284e11f6d7d124998191f1cace9a0245334d219"}, - {file = "rapidfuzz-3.9.6-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0308b2ad161daf502908a6e21a57c78ded0258eba9a8f5e2545e2dafca312507"}, - {file = "rapidfuzz-3.9.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3eda91832201b86e3b70835f91522587725bec329ec68f2f7faf5124091e5ca7"}, - {file = "rapidfuzz-3.9.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ece873c093aedd87fc07c2a7e333d52e458dc177016afa1edaf157e82b6914d8"}, - {file = "rapidfuzz-3.9.6-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d97d3c9d209d5c30172baea5966f2129e8a198fec4a1aeb2f92abb6e82a2edb1"}, - {file = "rapidfuzz-3.9.6-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:6c4550d0db4931f5ebe9f0678916d1b06f06f5a99ba0b8a48b9457fd8959a7d4"}, - {file = "rapidfuzz-3.9.6-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:b6b8dd4af6324fc325d9483bec75ecf9be33e590928c9202d408e4eafff6a0a6"}, - {file = "rapidfuzz-3.9.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:16122ae448bc89e2bea9d81ce6cb0f751e4e07da39bd1e70b95cae2493857853"}, - {file = "rapidfuzz-3.9.6-cp313-cp313-win32.whl", hash = "sha256:71cc168c305a4445109cd0d4925406f6e66bcb48fde99a1835387c58af4ecfe9"}, - {file = "rapidfuzz-3.9.6-cp313-cp313-win_amd64.whl", hash = "sha256:59ee78f2ecd53fef8454909cda7400fe2cfcd820f62b8a5d4dfe930102268054"}, - {file = "rapidfuzz-3.9.6-cp313-cp313-win_arm64.whl", hash = "sha256:58b4ce83f223605c358ae37e7a2d19a41b96aa65b1fede99cc664c9053af89ac"}, - {file = "rapidfuzz-3.9.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9f469dbc9c4aeaac7dd005992af74b7dff94aa56a3ea063ce64e4b3e6736dd2f"}, - {file = "rapidfuzz-3.9.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a9ed7ad9adb68d0fe63a156fe752bbf5f1403ed66961551e749641af2874da92"}, - {file = "rapidfuzz-3.9.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39ffe48ffbeedf78d120ddfb9d583f2ca906712159a4e9c3c743c9f33e7b1775"}, - {file = "rapidfuzz-3.9.6-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8502ccdea9084d54b6f737d96a3b60a84e3afed9d016686dc979b49cdac71613"}, - {file = "rapidfuzz-3.9.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6a4bec4956e06b170ca896ba055d08d4c457dac745548172443982956a80e118"}, - {file = "rapidfuzz-3.9.6-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2c0488b1c273be39e109ff885ccac0448b2fa74dea4c4dc676bcf756c15f16d6"}, - {file = "rapidfuzz-3.9.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0542c036cb6acf24edd2c9e0411a67d7ba71e29e4d3001a082466b86fc34ff30"}, - {file = "rapidfuzz-3.9.6-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:0a96b52c9f26857bf009e270dcd829381e7a634f7ddd585fa29b87d4c82146d9"}, - {file = "rapidfuzz-3.9.6-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:6edd3cd7c4aa8c68c716d349f531bd5011f2ca49ddade216bb4429460151559f"}, - {file = "rapidfuzz-3.9.6-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:50b2fb55d7ed58c66d49c9f954acd8fc4a3f0e9fd0ff708299bd8abb68238d0e"}, - {file = "rapidfuzz-3.9.6-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:32848dfe54391636b84cda1823fd23e5a6b1dbb8be0e9a1d80e4ee9903820994"}, - {file = "rapidfuzz-3.9.6-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:29146cb7a1bf69c87e928b31bffa54f066cb65639d073b36e1425f98cccdebc6"}, - {file = "rapidfuzz-3.9.6-cp38-cp38-win32.whl", hash = "sha256:aed13e5edacb0ecadcc304cc66e93e7e77ff24f059c9792ee602c0381808e10c"}, - {file = "rapidfuzz-3.9.6-cp38-cp38-win_amd64.whl", hash = "sha256:af440e36b828922256d0b4d79443bf2cbe5515fc4b0e9e96017ec789b36bb9fc"}, - {file = "rapidfuzz-3.9.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:efa674b407424553024522159296690d99d6e6b1192cafe99ca84592faff16b4"}, - {file = "rapidfuzz-3.9.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0b40ff76ee19b03ebf10a0a87938f86814996a822786c41c3312d251b7927849"}, - {file = "rapidfuzz-3.9.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:16a6c7997cb5927ced6f617122eb116ba514ec6b6f60f4803e7925ef55158891"}, - {file = "rapidfuzz-3.9.6-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3f42504bdc8d770987fc3d99964766d42b2a03e4d5b0f891decdd256236bae0"}, - {file = "rapidfuzz-3.9.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad9462aa2be9f60b540c19a083471fdf28e7cf6434f068b631525b5e6251b35e"}, - {file = "rapidfuzz-3.9.6-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1629698e68f47609a73bf9e73a6da3a4cac20bc710529215cbdf111ab603665b"}, - {file = "rapidfuzz-3.9.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68bc7621843d8e9a7fd1b1a32729465bf94b47b6fb307d906da168413331f8d6"}, - {file = "rapidfuzz-3.9.6-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:c6254c50f15bc2fcc33cb93a95a81b702d9e6590f432a7f7822b8c7aba9ae288"}, - {file = "rapidfuzz-3.9.6-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:7e535a114fa575bc143e175e4ca386a467ec8c42909eff500f5f0f13dc84e3e0"}, - {file = "rapidfuzz-3.9.6-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:d50acc0e9d67e4ba7a004a14c42d1b1e8b6ca1c515692746f4f8e7948c673167"}, - {file = "rapidfuzz-3.9.6-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:fa742ec60bec53c5a211632cf1d31b9eb5a3c80f1371a46a23ac25a1fa2ab209"}, - {file = "rapidfuzz-3.9.6-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c256fa95d29cbe5aa717db790b231a9a5b49e5983d50dc9df29d364a1db5e35b"}, - {file = "rapidfuzz-3.9.6-cp39-cp39-win32.whl", hash = "sha256:89acbf728b764421036c173a10ada436ecca22999851cdc01d0aa904c70d362d"}, - {file = "rapidfuzz-3.9.6-cp39-cp39-win_amd64.whl", hash = "sha256:c608fcba8b14d86c04cb56b203fed31a96e8a1ebb4ce99e7b70313c5bf8cf497"}, - {file = "rapidfuzz-3.9.6-cp39-cp39-win_arm64.whl", hash = "sha256:d41c00ded0e22e9dba88ff23ebe0dc9d2a5f21ba2f88e185ea7374461e61daa9"}, - {file = "rapidfuzz-3.9.6-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:a65c2f63218ea2dedd56fc56361035e189ca123bd9c9ce63a9bef6f99540d681"}, - {file = "rapidfuzz-3.9.6-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:680dc78a5f889d3b89f74824b89fe357f49f88ad10d2c121e9c3ad37bac1e4eb"}, - {file = "rapidfuzz-3.9.6-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8ca862927a0b05bd825e46ddf82d0724ea44b07d898ef639386530bf9b40f15"}, - {file = "rapidfuzz-3.9.6-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2116fa1fbff21fa52cd46f3cfcb1e193ba1d65d81f8b6e123193451cd3d6c15e"}, - {file = "rapidfuzz-3.9.6-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4dcb7d9afd740370a897c15da61d3d57a8d54738d7c764a99cedb5f746d6a003"}, - {file = "rapidfuzz-3.9.6-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:1a5bd6401bb489e14cbb5981c378d53ede850b7cc84b2464cad606149cc4e17d"}, - {file = "rapidfuzz-3.9.6-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:29fda70b9d03e29df6fc45cc27cbcc235534b1b0b2900e0a3ae0b43022aaeef5"}, - {file = "rapidfuzz-3.9.6-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:88144f5f52ae977df9352029488326afadd7a7f42c6779d486d1f82d43b2b1f2"}, - {file = "rapidfuzz-3.9.6-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:715aeaabafba2709b9dd91acb2a44bad59d60b4616ef90c08f4d4402a3bbca60"}, - {file = "rapidfuzz-3.9.6-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:af26ebd3714224fbf9bebbc27bdbac14f334c15f5d7043699cd694635050d6ca"}, - {file = "rapidfuzz-3.9.6-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:101bd2df438861a005ed47c032631b7857dfcdb17b82beeeb410307983aac61d"}, - {file = "rapidfuzz-3.9.6-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:2185e8e29809b97ad22a7f99281d1669a89bdf5fa1ef4ef1feca36924e675367"}, - {file = "rapidfuzz-3.9.6-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:9e53c72d08f0e9c6e4a369e52df5971f311305b4487690c62e8dd0846770260c"}, - {file = "rapidfuzz-3.9.6-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:a0cb157162f0cdd62e538c7bd298ff669847fc43a96422811d5ab933f4c16c3a"}, - {file = "rapidfuzz-3.9.6-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4bb5ff2bd48132ed5e7fbb8f619885facb2e023759f2519a448b2c18afe07e5d"}, - {file = "rapidfuzz-3.9.6-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6dc37f601865e8407e3a8037ffbc3afe0b0f837b2146f7632bd29d087385babe"}, - {file = "rapidfuzz-3.9.6-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a657eee4b94668faf1fa2703bdd803654303f7e468eb9ba10a664d867ed9e779"}, - {file = "rapidfuzz-3.9.6-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:51be6ab5b1d5bb32abd39718f2a5e3835502e026a8272d139ead295c224a6f5e"}, - {file = "rapidfuzz-3.9.6.tar.gz", hash = "sha256:5cf2a7d621e4515fee84722e93563bf77ff2cbe832a77a48b81f88f9e23b9e8d"}, -] - -[package.extras] -full = ["numpy"] - [[package]] name = "reclass-rs" version = "0.4.0" description = "Reclass defines a syntax and directory structure for recursively merging YAML data sources." -optional = false +optional = true python-versions = ">=3.8" files = [ {file = "reclass_rs-0.4.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:8f853eaf3b9af92c0eb9b3b25770ca35c3da7e411dfea6529651195b8d37c308"}, @@ -2562,20 +2233,6 @@ urllib3 = ">=1.21.1,<3" socks = ["PySocks (>=1.5.6,!=1.5.7)"] use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] -[[package]] -name = "requests-toolbelt" -version = "1.0.0" -description = "A utility belt for advanced users of python-requests" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6"}, - {file = "requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06"}, -] - -[package.dependencies] -requests = ">=2.0.1,<3.0.0" - [[package]] name = "rpds-py" version = "0.20.0" @@ -2719,32 +2376,6 @@ botocore = ">=1.33.2,<2.0a.0" [package.extras] crt = ["botocore[crt] (>=1.33.2,<2.0a.0)"] -[[package]] -name = "secretstorage" -version = "3.3.3" -description = "Python bindings to FreeDesktop.org Secret Service API" -optional = false -python-versions = ">=3.6" -files = [ - {file = "SecretStorage-3.3.3-py3-none-any.whl", hash = "sha256:f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99"}, - {file = "SecretStorage-3.3.3.tar.gz", hash = "sha256:2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77"}, -] - -[package.dependencies] -cryptography = ">=2.0" -jeepney = ">=0.6" - -[[package]] -name = "shellingham" -version = "1.5.4" -description = "Tool to Detect Surrounding Shell" -optional = false -python-versions = ">=3.7" -files = [ - {file = "shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686"}, - {file = "shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de"}, -] - [[package]] name = "six" version = "1.16.0" @@ -2805,28 +2436,6 @@ files = [ {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, ] -[[package]] -name = "tomlkit" -version = "0.13.2" -description = "Style preserving TOML library" -optional = false -python-versions = ">=3.8" -files = [ - {file = "tomlkit-0.13.2-py3-none-any.whl", hash = "sha256:7a974427f6e119197f670fbbbeae7bef749a6c14e793db934baefc1b5f03efde"}, - {file = "tomlkit-0.13.2.tar.gz", hash = "sha256:fff5fe59a87295b278abd31bec92c15d9bc4a06885ab12bcea52c71119392e79"}, -] - -[[package]] -name = "trove-classifiers" -version = "2024.7.2" -description = "Canonical source for classifiers on PyPI (pypi.org)." -optional = false -python-versions = "*" -files = [ - {file = "trove_classifiers-2024.7.2-py3-none-any.whl", hash = "sha256:ccc57a33717644df4daca018e7ec3ef57a835c48e96a1e71fc07eb7edac67af6"}, - {file = "trove_classifiers-2024.7.2.tar.gz", hash = "sha256:8328f2ac2ce3fd773cbb37c765a0ed7a83f89dc564c7d452f039b69249d0ac35"}, -] - [[package]] name = "typeguard" version = "4.3.0" @@ -2960,79 +2569,6 @@ files = [ [package.extras] watchmedo = ["PyYAML (>=3.10)"] -[[package]] -name = "xattr" -version = "1.1.0" -description = "Python wrapper for extended filesystem attributes" -optional = false -python-versions = ">=3.8" -files = [ - {file = "xattr-1.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ef2fa0f85458736178fd3dcfeb09c3cf423f0843313e25391db2cfd1acec8888"}, - {file = "xattr-1.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ccab735d0632fe71f7d72e72adf886f45c18b7787430467ce0070207882cfe25"}, - {file = "xattr-1.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9013f290387f1ac90bccbb1926555ca9aef75651271098d99217284d9e010f7c"}, - {file = "xattr-1.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dcd5dfbcee73c7be057676ecb900cabb46c691aff4397bf48c579ffb30bb963"}, - {file = "xattr-1.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6480589c1dac7785d1f851347a32c4a97305937bf7b488b857fe8b28a25de9e9"}, - {file = "xattr-1.1.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:08f61cbed52dc6f7c181455826a9ff1e375ad86f67dd9d5eb7663574abb32451"}, - {file = "xattr-1.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:918e1f83f2e8a072da2671eac710871ee5af337e9bf8554b5ce7f20cdb113186"}, - {file = "xattr-1.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:0f06e0c1e4d06b4e0e49aaa1184b6f0e81c3758c2e8365597918054890763b53"}, - {file = "xattr-1.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:46a641ac038a9f53d2f696716147ca4dbd6a01998dc9cd4bc628801bc0df7f4d"}, - {file = "xattr-1.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7e4ca0956fd11679bb2e0c0d6b9cdc0f25470cc00d8da173bb7656cc9a9cf104"}, - {file = "xattr-1.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6881b120f9a4b36ccd8a28d933bc0f6e1de67218b6ce6e66874e0280fc006844"}, - {file = "xattr-1.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dab29d9288aa28e68a6f355ddfc3f0a7342b40c9012798829f3e7bd765e85c2c"}, - {file = "xattr-1.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e0c80bbf55339c93770fc294b4b6586b5bf8e85ec00a4c2d585c33dbd84b5006"}, - {file = "xattr-1.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d1418705f253b6b6a7224b69773842cac83fcbcd12870354b6e11dd1cd54630f"}, - {file = "xattr-1.1.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:687e7d18611ef8d84a6ecd8f4d1ab6757500c1302f4c2046ce0aa3585e13da3f"}, - {file = "xattr-1.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b6ceb9efe0657a982ccb8b8a2efe96b690891779584c901d2f920784e5d20ae3"}, - {file = "xattr-1.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:b489b7916f239100956ea0b39c504f3c3a00258ba65677e4c8ba1bd0b5513446"}, - {file = "xattr-1.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0a9c431b0e66516a078125e9a273251d4b8e5ba84fe644b619f2725050d688a0"}, - {file = "xattr-1.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:1a5921ea3313cc1c57f2f53b63ea8ca9a91e48f4cc7ebec057d2447ec82c7efe"}, - {file = "xattr-1.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f6ad2a7bd5e6cf71d4a862413234a067cf158ca0ae94a40d4b87b98b62808498"}, - {file = "xattr-1.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0683dae7609f7280b0c89774d00b5957e6ffcb181c6019c46632b389706b77e6"}, - {file = "xattr-1.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54cb15cd94e5ef8a0ef02309f1bf973ba0e13c11e87686e983f371948cfee6af"}, - {file = "xattr-1.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff6223a854229055e803c2ad0c0ea9a6da50c6be30d92c198cf5f9f28819a921"}, - {file = "xattr-1.1.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d44e8f955218638c9ab222eed21e9bd9ab430d296caf2176fb37abe69a714e5c"}, - {file = "xattr-1.1.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:caab2c2986c30f92301f12e9c50415d324412e8e6a739a52a603c3e6a54b3610"}, - {file = "xattr-1.1.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:d6eb7d5f281014cd44e2d847a9107491af1bf3087f5afeded75ed3e37ec87239"}, - {file = "xattr-1.1.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:47a3bdfe034b4fdb70e5941d97037405e3904accc28e10dbef6d1c9061fb6fd7"}, - {file = "xattr-1.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:00d2b415cf9d6a24112d019e721aa2a85652f7bbc9f3b9574b2d1cd8668eb491"}, - {file = "xattr-1.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:78b377832dd0ee408f9f121a354082c6346960f7b6b1480483ed0618b1912120"}, - {file = "xattr-1.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6461a43b585e5f2e049b39bcbfcb6391bfef3c5118231f1b15d10bdb89ef17fe"}, - {file = "xattr-1.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:24d97f0d28f63695e3344ffdabca9fcc30c33e5c8ccc198c7524361a98d526f2"}, - {file = "xattr-1.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ad47d89968c9097900607457a0c89160b4771601d813e769f68263755516065"}, - {file = "xattr-1.1.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc53cab265f6e8449bd683d5ee3bc5a191e6dd940736f3de1a188e6da66b0653"}, - {file = "xattr-1.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:cd11e917f5b89f2a0ad639d9875943806c6c9309a3dd02da5a3e8ef92db7bed9"}, - {file = "xattr-1.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:9c5a78c7558989492c4cb7242e490ffb03482437bf782967dfff114e44242343"}, - {file = "xattr-1.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:cebcf8a303a44fbc439b68321408af7267507c0d8643229dbb107f6c132d389c"}, - {file = "xattr-1.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b0d73150f2f9655b4da01c2369eb33a294b7f9d56eccb089819eafdbeb99f896"}, - {file = "xattr-1.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:793c01deaadac50926c0e1481702133260c7cb5e62116762f6fe1543d07b826f"}, - {file = "xattr-1.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e189e440bcd04ccaad0474720abee6ee64890823ec0db361fb0a4fb5e843a1bf"}, - {file = "xattr-1.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afacebbc1fa519f41728f8746a92da891c7755e6745164bd0d5739face318e86"}, - {file = "xattr-1.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9b1664edf003153ac8d1911e83a0fc60db1b1b374ee8ac943f215f93754a1102"}, - {file = "xattr-1.1.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dda2684228798e937a7c29b0e1c7ef3d70e2b85390a69b42a1c61b2039ba81de"}, - {file = "xattr-1.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b735ac2625a4fc2c9343b19f806793db6494336338537d2911c8ee4c390dda46"}, - {file = "xattr-1.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:fa6a7af7a4ada43f15ccc58b6f9adcdbff4c36ba040013d2681e589e07ae280a"}, - {file = "xattr-1.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d1059b2f726e2702c8bbf9bbf369acfc042202a4cc576c2dec6791234ad5e948"}, - {file = "xattr-1.1.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e2255f36ebf2cb2dbf772a7437ad870836b7396e60517211834cf66ce678b595"}, - {file = "xattr-1.1.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dba4f80b9855cc98513ddf22b7ad8551bc448c70d3147799ea4f6c0b758fb466"}, - {file = "xattr-1.1.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4cb70c16e7c3ae6ba0ab6c6835c8448c61d8caf43ea63b813af1f4dbe83dd156"}, - {file = "xattr-1.1.0-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:83652910ef6a368b77b00825ad67815e5c92bfab551a848ca66e9981d14a7519"}, - {file = "xattr-1.1.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:7a92aff66c43fa3e44cbeab7cbeee66266c91178a0f595e044bf3ce51485743b"}, - {file = "xattr-1.1.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d4f71b673339aeaae1f6ea9ef8ea6c9643c8cd0df5003b9a0eaa75403e2e06c"}, - {file = "xattr-1.1.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a20de1c47b5cd7b47da61799a3b34e11e5815d716299351f82a88627a43f9a96"}, - {file = "xattr-1.1.0-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23705c7079b05761ff2fa778ad17396e7599c8759401abc05b312dfb3bc99f69"}, - {file = "xattr-1.1.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:27272afeba8422f2a9d27e1080a9a7b807394e88cce73db9ed8d2dde3afcfb87"}, - {file = "xattr-1.1.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd43978966de3baf4aea367c99ffa102b289d6c2ea5f3d9ce34a203dc2f2ab73"}, - {file = "xattr-1.1.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ded771eaf27bb4eb3c64c0d09866460ee8801d81dc21097269cf495b3cac8657"}, - {file = "xattr-1.1.0-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96ca300c0acca4f0cddd2332bb860ef58e1465d376364f0e72a1823fdd58e90d"}, - {file = "xattr-1.1.0.tar.gz", hash = "sha256:fecbf3b05043ed3487a28190dec3e4c4d879b2fcec0e30bafd8ec5d4b6043630"}, -] - -[package.dependencies] -cffi = ">=1.16.0" - -[package.extras] -test = ["pytest"] - [[package]] name = "yamllint" version = "1.35.1" @@ -3072,10 +2608,10 @@ type = ["pytest-mypy"] [extras] gojsonnet = ["gojsonnet"] +omegaconf = ["omegaconf"] reclass-rs = ["reclass-rs"] -test = ["docker", "reclass-rs"] [metadata] lock-version = "2.0" python-versions = "^3.10,<3.13" -content-hash = "b188171ffdf9a2218faafa82ed743825b45c945b180243522ef8babd9dcc8f0a" +content-hash = "fc3dd68ab1f9587587d0029d8f3a3a5c3e92a7b907b6819996250887e01662be" diff --git a/pyproject.toml b/pyproject.toml index eafe6f1db..e6629e318 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -33,14 +33,32 @@ packages = [ [tool.poetry.scripts] kapitan = 'kapitan.cli:main' -[tool.poetry.group.dev.dependencies] + +[tool.poetry.group.test] +optional = true + +[tool.poetry.group.test.dependencies] pytest = "^8.2.0" -coverage = "^7.5.0" -docker = "^7.0.0" +coverage = "^7.6.1" pytest-md = "^0.2.0" pytest-emoji = "^0.2.0" +pytest-cov = "^3.0.0" +docker = "^7.0.0" + +[tool.poetry.group.dev] +optional = true + +[tool.poetry.group.dev.dependencies] +black = "^24.8.0" +pre-commit = "^3.8.0" +isort = "^5.13.2" +flake8 = "^7.1.1" +flake8-pyproject = "^1.2.3" +flake8-bugbear = "^24.8.19" +[tool.poetry.group.docs] +optional = true [tool.poetry.group.docs.dependencies] markdown-include = "^0.8.1" @@ -78,27 +96,26 @@ certifi = "*" gitdb = "^4.0.10" packaging = ">=23,<25" typing-extensions = "^4.0.0" -gojsonnet = { version = "^0.20.0", optional = true } -docker = { version = ">=5,<8", optional = true } -kapicorp-reclass = ">=2.0.0" -reclass-rs = {version = "^0.4.0"} kadet = "^0.3.0" -poetry = "^1.8.3" regex = "^2024.5.10" -omegaconf = "^2.4.0.dev3" +omegaconf = {version = "^2.4.0.dev3", optional = true} +reclass-rs = {version = "^0.4.0", optional = true } +gojsonnet = { version = "^0.20.0", optional = true } +kapicorp-reclass = ">=2.0.0" [tool.poetry.extras] gojsonnet = ["gojsonnet"] -test = ["docker", "reclass-rs"] reclass-rs = ["reclass-rs"] +omegaconf = ["omegaconf"] + +[tool.isort] +profile = "black" + +[tool.flake8] +max-line-length = 110 +extend-select = "B950" +extend-ignore = "E203,E501,E701" [tool.black] line-length = 110 -target-version = ['py310'] -exclude = ''' -( - /( - | .*version.py - ) -) -''' +target-version = ['py311'] diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index e0531b809..000000000 --- a/requirements.txt +++ /dev/null @@ -1,107 +0,0 @@ -addict==2.4.0 ; python_version >= "3.10" and python_version < "3.13" -annotated-types==0.7.0 ; python_version >= "3.10" and python_version < "3.13" -attrs==24.2.0 ; python_version >= "3.10" and python_version < "3.13" -azure-core==1.30.2 ; python_version >= "3.10" and python_version < "3.13" -azure-identity==1.17.1 ; python_version >= "3.10" and python_version < "3.13" -azure-keyvault-keys==4.9.0 ; python_version >= "3.10" and python_version < "3.13" -boto3==1.35.10 ; python_version >= "3.10" and python_version < "3.13" -botocore==1.35.10 ; python_version >= "3.10" and python_version < "3.13" -build==1.2.1 ; python_version >= "3.10" and python_version < "3.13" -cachecontrol[filecache]==0.14.0 ; python_version >= "3.10" and python_version < "3.13" -cachetools==5.5.0 ; python_version >= "3.10" and python_version < "3.13" -certifi==2024.8.30 ; python_version >= "3.10" and python_version < "3.13" -cffi==1.17.0 ; python_version >= "3.10" and python_version < "3.13" and (platform_python_implementation != "PyPy" or sys_platform == "darwin") -charset-normalizer==3.3.2 ; python_version >= "3.10" and python_version < "3.13" -cleo==2.1.0 ; python_version >= "3.10" and python_version < "3.13" -colorama==0.4.6 ; python_version >= "3.10" and python_version < "3.13" and os_name == "nt" -crashtest==0.4.1 ; python_version >= "3.10" and python_version < "3.13" -cryptography==42.0.8 ; python_version >= "3.10" and python_version < "3.13" -ddt==1.7.2 ; python_version >= "3.10" and python_version < "3.13" -distlib==0.3.8 ; python_version >= "3.10" and python_version < "3.13" -docker==7.1.0 ; python_version >= "3.10" and python_version < "3.13" -dulwich==0.21.7 ; python_version >= "3.10" and python_version < "3.13" -enum34==1.1.10 ; python_version >= "3.10" and python_version < "3.13" -fastjsonschema==2.20.0 ; python_version >= "3.10" and python_version < "3.13" -filelock==3.15.4 ; python_version >= "3.10" and python_version < "3.13" -gitdb==4.0.11 ; python_version >= "3.10" and python_version < "3.13" -gitpython==3.1.43 ; python_version >= "3.10" and python_version < "3.13" -google-api-core==2.19.2 ; python_version >= "3.10" and python_version < "3.13" -google-api-python-client==2.143.0 ; python_version >= "3.10" and python_version < "3.13" -google-auth-httplib2==0.2.0 ; python_version >= "3.10" and python_version < "3.13" -google-auth==2.34.0 ; python_version >= "3.10" and python_version < "3.13" -googleapis-common-protos==1.65.0 ; python_version >= "3.10" and python_version < "3.13" -httplib2==0.22.0 ; python_version >= "3.10" and python_version < "3.13" -hvac==2.3.0 ; python_version >= "3.10" and python_version < "3.13" -idna==3.8 ; python_version >= "3.10" and python_version < "3.13" -importlib-metadata==8.4.0 ; python_version >= "3.10" and python_version < "3.12" -installer==0.7.0 ; python_version >= "3.10" and python_version < "3.13" -isodate==0.6.1 ; python_version >= "3.10" and python_version < "3.13" -jaraco-classes==3.4.0 ; python_version >= "3.10" and python_version < "3.13" -jeepney==0.8.0 ; python_version >= "3.10" and python_version < "3.13" and sys_platform == "linux" -jinja2==3.1.4 ; python_version >= "3.10" and python_version < "3.13" -jmespath==1.0.1 ; python_version >= "3.10" and python_version < "3.13" -jsonnet==0.20.0 ; python_version >= "3.10" and python_version < "3.13" -jsonschema-specifications==2023.12.1 ; python_version >= "3.10" and python_version < "3.13" -jsonschema==4.23.0 ; python_version >= "3.10" and python_version < "3.13" -kadet==0.3.2 ; python_version >= "3.10" and python_version < "3.13" -kapicorp-reclass==2.0.0 ; python_version >= "3.10" and python_version < "3.13" -keyring==24.3.1 ; python_version >= "3.10" and python_version < "3.13" -markupsafe==2.1.5 ; python_version >= "3.10" and python_version < "3.13" -more-itertools==10.4.0 ; python_version >= "3.10" and python_version < "3.13" -msal-extensions==1.2.0 ; python_version >= "3.10" and python_version < "3.13" -msal==1.30.0 ; python_version >= "3.10" and python_version < "3.13" -msgpack==1.0.8 ; python_version >= "3.10" and python_version < "3.13" -omegaconf==2.4.0.dev3 ; python_version >= "3.10" and python_version < "3.13" -packaging==24.1 ; python_version >= "3.10" and python_version < "3.13" -pathspec==0.12.1 ; python_version >= "3.10" and python_version < "3.13" -pexpect==4.9.0 ; python_version >= "3.10" and python_version < "3.13" -pkginfo==1.11.1 ; python_version >= "3.10" and python_version < "3.13" -platformdirs==4.2.2 ; python_version >= "3.10" and python_version < "3.13" -poetry-core==1.9.0 ; python_version >= "3.10" and python_version < "3.13" -poetry-plugin-export==1.8.0 ; python_version >= "3.10" and python_version < "3.13" -poetry==1.8.3 ; python_version >= "3.10" and python_version < "3.13" -portalocker==2.10.1 ; python_version >= "3.10" and python_version < "3.13" -proto-plus==1.24.0 ; python_version >= "3.10" and python_version < "3.13" -protobuf==5.28.0 ; python_version >= "3.10" and python_version < "3.13" -ptyprocess==0.7.0 ; python_version >= "3.10" and python_version < "3.13" -pyasn1-modules==0.4.0 ; python_version >= "3.10" and python_version < "3.13" -pyasn1==0.6.0 ; python_version >= "3.10" and python_version < "3.13" -pycparser==2.22 ; python_version >= "3.10" and python_version < "3.13" and (platform_python_implementation != "PyPy" or sys_platform == "darwin") -pydantic-core==2.20.1 ; python_version >= "3.10" and python_version < "3.13" -pydantic==2.8.2 ; python_version >= "3.10" and python_version < "3.13" -pyjwt[crypto]==2.9.0 ; python_version >= "3.10" and python_version < "3.13" -pyparsing==3.1.4 ; python_version >= "3.10" and python_version < "3.13" -pyproject-hooks==1.1.0 ; python_version >= "3.10" and python_version < "3.13" -python-box==7.2.0 ; python_version >= "3.10" and python_version < "3.13" -python-dateutil==2.9.0.post0 ; python_version >= "3.10" and python_version < "3.13" -python-gnupg==0.5.2 ; python_version >= "3.10" and python_version < "3.13" -python-magic==0.4.27 ; python_version >= "3.10" and python_version < "3.13" -pywin32-ctypes==0.2.3 ; python_version >= "3.10" and python_version < "3.13" and sys_platform == "win32" -pywin32==306 ; python_version >= "3.10" and python_version < "3.13" and (sys_platform == "win32" or platform_system == "Windows") -pyyaml==6.0.2 ; python_version >= "3.10" and python_version < "3.13" -rapidfuzz==3.9.6 ; python_version >= "3.10" and python_version < "3.13" -reclass-rs==0.4.0 ; python_version >= "3.10" and python_version < "3.13" -referencing==0.35.1 ; python_version >= "3.10" and python_version < "3.13" -regex==2024.7.24 ; python_version >= "3.10" and python_version < "3.13" -requests-toolbelt==1.0.0 ; python_version >= "3.10" and python_version < "3.13" -requests==2.32.3 ; python_version >= "3.10" and python_version < "3.13" -rpds-py==0.20.0 ; python_version >= "3.10" and python_version < "3.13" -rsa==4.9 ; python_version >= "3.10" and python_version < "3.13" -s3transfer==0.10.2 ; python_version >= "3.10" and python_version < "3.13" -secretstorage==3.3.3 ; python_version >= "3.10" and python_version < "3.13" and sys_platform == "linux" -shellingham==1.5.4 ; python_version >= "3.10" and python_version < "3.13" -six==1.16.0 ; python_version >= "3.10" and python_version < "3.13" -smmap==5.0.1 ; python_version >= "3.10" and python_version < "3.13" -strenum==0.4.15 ; python_version >= "3.10" and python_version < "3.13" -toml==0.10.2 ; python_version >= "3.10" and python_version < "3.13" -tomli==2.0.1 ; python_version >= "3.10" and python_version < "3.11" -tomlkit==0.13.2 ; python_version >= "3.10" and python_version < "3.13" -trove-classifiers==2024.7.2 ; python_version >= "3.10" and python_version < "3.13" -typeguard==4.3.0 ; python_version >= "3.10" and python_version < "3.13" -typing-extensions==4.12.2 ; python_version >= "3.10" and python_version < "3.13" -uritemplate==4.1.1 ; python_version >= "3.10" and python_version < "3.13" -urllib3==2.2.2 ; python_version >= "3.10" and python_version < "3.13" -virtualenv==20.26.3 ; python_version >= "3.10" and python_version < "3.13" -xattr==1.1.0 ; python_version >= "3.10" and python_version < "3.13" and sys_platform == "darwin" -yamllint==1.35.1 ; python_version >= "3.10" and python_version < "3.13" -zipp==3.20.1 ; python_version >= "3.10" and python_version < "3.12" diff --git a/scripts/after_deploy.sh b/scripts/after_deploy.sh index 820a93aa0..5373e7626 100755 --- a/scripts/after_deploy.sh +++ b/scripts/after_deploy.sh @@ -21,4 +21,4 @@ notify_hangouts() { export LATEST_TAG=$(git describe --abbrev=0 --tags) MSG="Succesfully deployed ${LATEST_TAG} on Kapitan. https://github.com/kapicorp/kapitan/releases/tag/${LATEST_TAG}" notify_slack "${MSG}" -notify_hangouts "${MSG}" \ No newline at end of file +notify_hangouts "${MSG}" diff --git a/tests/test_azure.py b/tests/test_azure.py index bac54ff9e..ccd57e82b 100644 --- a/tests/test_azure.py +++ b/tests/test_azure.py @@ -1,16 +1,16 @@ "Azure secrets test" +import contextlib +import io import os +import sys import tempfile import unittest -import io -import sys -import contextlib from kapitan import cached from kapitan.cli import main from kapitan.refs.base import RefController, RefParams, Revealer -from kapitan.refs.secrets.azkms import AzureKMSSecret, AzureKMSError +from kapitan.refs.secrets.azkms import AzureKMSError, AzureKMSSecret REFS_HOME = tempfile.mkdtemp() REF_CONTROLLER = RefController(REFS_HOME) diff --git a/tests/test_cli.py b/tests/test_cli.py index fa5d99fe4..1dd2936e1 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -16,7 +16,7 @@ import unittest from unittest.mock import patch -from kapitan.cli import main, build_parser +from kapitan.cli import build_parser, main from kapitan.refs.secrets.vaultkv import VaultSecret from tests.vault_server import VaultServer diff --git a/tests/test_compile.py b/tests/test_compile.py index c5f0ded85..c90c2b2fc 100644 --- a/tests/test_compile.py +++ b/tests/test_compile.py @@ -7,20 +7,22 @@ "compile tests" -import unittest -import os -import sys -import io import contextlib import glob +import io +import os import shutil -import yaml -import toml +import sys import tempfile -from kapitan.cli import main -from kapitan.utils import directory_hash +import unittest + +import toml +import yaml + from kapitan.cached import reset_cache +from kapitan.cli import main from kapitan.inventory import InventoryBackends +from kapitan.utils import directory_hash TEST_PWD = os.getcwd() TEST_RESOURCES_PATH = os.path.join(os.getcwd(), "tests/test_resources") @@ -80,6 +82,7 @@ def tearDown(self): os.chdir(TEST_PWD) reset_cache() + class FailCompileTestResourcesTestKadet(unittest.TestCase): def setUp(self): os.chdir(TEST_RESOURCES_PATH) @@ -91,7 +94,8 @@ def test_compile(self): def tearDown(self): os.chdir(TEST_PWD) reset_cache() - + + class CompileTestResourcesTestJinja2InputParams(unittest.TestCase): def setUp(self): os.chdir(TEST_RESOURCES_PATH) @@ -158,8 +162,8 @@ def setUp(self): def test_compile(self): sys.argv = ["kapitan", "compile", "-c"] + self.extraArgv main() - compile_dir = os.path.join(os.getcwd(), "compiled") - reference_dir = os.path.join(TEST_PWD, 'tests/test_kubernetes_compiled') + compile_dir = os.path.join(os.getcwd(), "compiled") + reference_dir = os.path.join(TEST_PWD, "tests/test_kubernetes_compiled") compiled_dir_hash = directory_hash(compile_dir) test_compiled_dir_hash = directory_hash(reference_dir) self.assertEqual(compiled_dir_hash, test_compiled_dir_hash) @@ -173,7 +177,7 @@ def test_compile_not_enough_args(self): self.assertEqual(cm.exception.code, 1) def test_compile_specific_target(self): - + sys.argv = ["kapitan", "compile", "-t", "minikube-mysql"] + self.extraArgv main() self.assertTrue( @@ -229,14 +233,15 @@ def test_compile_not_enough_args(self): class CompileKubernetesTestOmegaconf(CompileKubernetesTest): temp_dir = tempfile.mkdtemp() - + def setUp(self): - + shutil.copytree(self.inventory_path, self.temp_dir, dirs_exist_ok=True) self.inventory_path = self.temp_dir super().setUp() self.extraArgv = ["--inventory-backend=omegaconf"] from kapitan.inventory.inv_omegaconf import migrate + migrate.migrate(self.temp_dir) @unittest.skip("Already tested") diff --git a/tests/test_compose_node_name.py b/tests/test_compose_node_name.py index 5f471d0d7..1e45b76eb 100644 --- a/tests/test_compose_node_name.py +++ b/tests/test_compose_node_name.py @@ -5,7 +5,7 @@ import tempfile import unittest -from kapitan.inventory import get_inventory_backend, InventoryBackends +from kapitan.inventory import InventoryBackends, get_inventory_backend from kapitan.inventory.inventory import InventoryError @@ -15,16 +15,16 @@ def setUp(self): def test_compose_target_name(self): inventory_path = "examples/kubernetes/inventory" - targets_path = os.path.join(inventory_path, "targets") + targets_path = os.path.join(inventory_path, "targets") example_target_names = [] - + for root, dirs, files in os.walk(targets_path): for file in files: # split file extension and check if yml/yaml path = os.path.relpath(os.path.join(root, file), targets_path) name = os.path.splitext(path)[0].replace(os.sep, ".") example_target_names.append(name) - + temp_inventory_dir = tempfile.mkdtemp() shutil.copytree(inventory_path, temp_inventory_dir, dirs_exist_ok=True) diff --git a/tests/test_copy.py b/tests/test_copy.py index d92467576..bfbe3a66a 100644 --- a/tests/test_copy.py +++ b/tests/test_copy.py @@ -8,6 +8,7 @@ "copy tests" import filecmp import hashlib +import logging import os import shutil import sys @@ -16,7 +17,6 @@ from kapitan.cli import main from kapitan.inputs.copy import Copy from kapitan.utils import directory_hash -import logging logger = logging.getLogger(__name__) diff --git a/tests/test_dependency_manager.py b/tests/test_dependency_manager.py index 07d129605..4fe9c0fee 100644 --- a/tests/test_dependency_manager.py +++ b/tests/test_dependency_manager.py @@ -12,17 +12,17 @@ import unittest from shutil import rmtree -from kapitan.errors import HelmFetchingError from kapitan.cached import reset_cache from kapitan.cli import main from kapitan.dependency_manager.base import ( - fetch_git_source, - fetch_http_source, + HelmSource, + fetch_dependencies, fetch_git_dependency, + fetch_git_source, fetch_helm_chart, - fetch_dependencies, - HelmSource, + fetch_http_source, ) +from kapitan.errors import HelmFetchingError class DependencyManagerTest(unittest.TestCase): @@ -79,7 +79,6 @@ def test_clone_repo_subdir(self): rmtree(temp_dir) rmtree(output_dir) - def test_fetch_helm_chart(self): """ Tests fetching helm chart diff --git a/tests/test_external_input.py b/tests/test_external_input.py index fadd1ed73..0bae8b7eb 100644 --- a/tests/test_external_input.py +++ b/tests/test_external_input.py @@ -7,15 +7,16 @@ "external input tests" import os -import sys -import tempfile -import unittest -import string import random import stat +import string import subprocess +import sys +import tempfile +import unittest import yaml + from kapitan.cached import reset_cache from kapitan.cli import main from kapitan.inputs.external import External diff --git a/tests/test_from_dot_kapitan.py b/tests/test_from_dot_kapitan.py index 22843f988..c467cd2eb 100644 --- a/tests/test_from_dot_kapitan.py +++ b/tests/test_from_dot_kapitan.py @@ -2,11 +2,12 @@ import shutil import tempfile import unittest + import yaml -from kapitan.utils import from_dot_kapitan from kapitan.cached import reset_cache from kapitan.inventory import InventoryBackends +from kapitan.utils import from_dot_kapitan class FromDotKapitanTest(unittest.TestCase): @@ -26,13 +27,19 @@ def test_no_file(self): def test_no_option(self): self._setup_dot_kapitan( - {"global": {"inventory-backend": str(InventoryBackends.RECLASS)}, "compile": {"inventory-path": "./path/to/inv"}} + { + "global": {"inventory-backend": str(InventoryBackends.RECLASS)}, + "compile": {"inventory-path": "./path/to/inv"}, + } ) assert from_dot_kapitan("inventory", "inventory-path", "./some/fallback") == "./some/fallback" def test_cmd_option(self): self._setup_dot_kapitan( - {"global": {"inventory-backend": str(InventoryBackends.RECLASS)}, "compile": {"inventory-path": "./path/to/inv"}} + { + "global": {"inventory-backend": str(InventoryBackends.RECLASS)}, + "compile": {"inventory-path": "./path/to/inv"}, + } ) assert from_dot_kapitan("compile", "inventory-path", "./some/fallback") == "./path/to/inv" diff --git a/tests/test_gpg.py b/tests/test_gpg.py index 419726219..41b710262 100644 --- a/tests/test_gpg.py +++ b/tests/test_gpg.py @@ -11,11 +11,17 @@ import tempfile import unittest -import kapitan.cached as cached from cryptography.hazmat.backends import default_backend from cryptography.hazmat.primitives import serialization + +import kapitan.cached as cached from kapitan.refs.base import RefController, RefParams, Revealer -from kapitan.refs.secrets.gpg import GPG_KWARGS, GPG_TARGET_FINGERPRINTS, GPGSecret, gpg_obj +from kapitan.refs.secrets.gpg import ( + GPG_KWARGS, + GPG_TARGET_FINGERPRINTS, + GPGSecret, + gpg_obj, +) # set GNUPGHOME for test_cli GNUPGHOME = tempfile.mkdtemp() diff --git a/tests/test_inventory.py b/tests/test_inventory.py index 2b1558f50..6f21dddb6 100644 --- a/tests/test_inventory.py +++ b/tests/test_inventory.py @@ -6,15 +6,16 @@ # SPDX-License-Identifier: Apache-2.0 "inventory tests" -from kapitan.resources import inventory -from kapitan.inventory import InventoryBackends - import importlib -import unittest import logging -import tempfile import os import shutil +import tempfile +import unittest + +from kapitan.inventory import InventoryBackends +from kapitan.resources import inventory + logger = logging.getLogger(__name__) @@ -23,18 +24,17 @@ class InventoryTargetTestBase(unittest.TestCase): - - + def setUp(self) -> None: - from kapitan.cached import reset_cache, args - + from kapitan.cached import args, reset_cache + reset_cache() # Fix inconsistency between reclass-rs (option name) and reclass_rs (module name) - backend_module_name = self.backend_id.replace("-", "_") + backend_module_name = self.backend_id.replace("-", "_") if not importlib.util.find_spec(backend_module_name): self.skipTest(f"backend module {backend_module_name} not available") - args.inventory_backend = self.backend_id - + args.inventory_backend = self.backend_id + def test_inventory_target(self): inv = inventory(inventory_path=self.inventory_path, target_name="minikube-es") logger.error(inv) @@ -70,13 +70,14 @@ def setUp(self) -> None: self.backend_id = InventoryBackends.OMEGACONF self.expected_targets_count = 10 from kapitan.inventory.inv_omegaconf import migrate + self.inventory_path = os.path.join(self.temp_dir, "inventory") migrate.migrate(self.inventory_path) super().setUp() - + def tearDown(self) -> None: shutil.rmtree(self.temp_dir) return super().tearDown() -del (InventoryTargetTestBase) # remove InventoryTargetTestBase so that it doesn't run \ No newline at end of file +del InventoryTargetTestBase # remove InventoryTargetTestBase so that it doesn't run diff --git a/tests/test_jinja2.py b/tests/test_jinja2.py index af8f47c53..007686ded 100644 --- a/tests/test_jinja2.py +++ b/tests/test_jinja2.py @@ -8,15 +8,16 @@ "jinja2 tests" import argparse import base64 -import unittest import tempfile import time -from kapitan.utils import render_jinja2_file -from kapitan.resources import inventory +import unittest + +from kapitan import cached from kapitan.inputs.jinja2_filters import base64_encode from kapitan.refs.base import RefController, Revealer from kapitan.refs.base64 import Base64Ref -from kapitan import cached +from kapitan.resources import inventory +from kapitan.utils import render_jinja2_file class Jinja2FiltersTest(unittest.TestCase): diff --git a/tests/test_jsonnet.py b/tests/test_jsonnet.py index 8aaf32c6f..a2d5cb370 100644 --- a/tests/test_jsonnet.py +++ b/tests/test_jsonnet.py @@ -12,9 +12,9 @@ import unittest from kapitan.resources import ( - file_exists, dir_files_list, dir_files_read, + file_exists, gzip_b64, jsonschema_validate, yaml_dump, diff --git a/tests/test_linter.py b/tests/test_linter.py index 7deecf8ce..b9b8e9949 100644 --- a/tests/test_linter.py +++ b/tests/test_linter.py @@ -15,8 +15,6 @@ logging.basicConfig(level=logging.CRITICAL, format="%(message)s") logger = logging.getLogger(__name__) -"""Helper class for creating args""" - class Object(object): pass diff --git a/tests/test_omegaconf.py b/tests/test_omegaconf.py index 660972d6b..0848da24c 100644 --- a/tests/test_omegaconf.py +++ b/tests/test_omegaconf.py @@ -6,13 +6,13 @@ # SPDX-License-Identifier: Apache-2.0 "inventory tests" -from kapitan.inventory import get_inventory_backend - -import unittest import logging -import tempfile -import shutil import os +import shutil +import tempfile +import unittest + +from kapitan.inventory import get_inventory_backend logger = logging.getLogger(__name__) @@ -20,33 +20,44 @@ TEST_KUBERNETES_INVENTORY = os.path.join(TEST_PWD, "examples/kubernetes/") - class InventoryTestOmegaConf(unittest.TestCase): temp_dir = tempfile.mkdtemp() - + def setUp(self) -> None: shutil.copytree(TEST_KUBERNETES_INVENTORY, self.temp_dir, dirs_exist_ok=True) inventory_backend = get_inventory_backend("omegaconf") self.inventory_path = self.temp_dir self.extraArgv = ["--inventory-backend=omegaconf"] from kapitan.inventory.inv_omegaconf import migrate + inventory_path = os.path.join(self.temp_dir, "inventory") migrate.migrate(inventory_path) - self.inventory_backend = inventory_backend(inventory_path=inventory_path, initialise=False) + self.inventory_backend = inventory_backend(inventory_path=inventory_path, initialise=False) def test_load_and_resolve_single_target(self): target_name = "minikube" - target_kapitan_metadata = dict({'_kapitan_': {'name': {'short': 'minikube', 'full': 'minikube', 'path': 'minikube-es', 'parts': ['minikube']}}}) - + target_kapitan_metadata = dict( + { + "_kapitan_": { + "name": { + "short": "minikube", + "full": "minikube", + "path": "minikube-es", + "parts": ["minikube"], + } + } + } + ) + # Load inventory but does not initialises targets inventory = self.inventory_backend - + # Manually create a new Target target = inventory.target_class(name=target_name, path="minikube-es.yml") - + # Adds target to Inventory inventory.targets.update({target_name: target}) - + # Loads the target using the inventory inventory.load_target(target) @@ -54,7 +65,7 @@ def test_load_and_resolve_single_target(self): self.assertEqual(target.parameters["_kapitan_"]["name"]["short"], "minikube") self.assertEqual(target.parameters["target_name"], "minikube-es") self.assertEqual(target.parameters["kubectl"]["insecure_skip_tls_verify"], False) - + def tearDown(self) -> None: shutil.rmtree(self.temp_dir) - return super().tearDown() \ No newline at end of file + return super().tearDown() diff --git a/tests/test_refs.py b/tests/test_refs.py index 1703feff9..3a8387b8a 100644 --- a/tests/test_refs.py +++ b/tests/test_refs.py @@ -15,8 +15,8 @@ from kapitan.errors import RefError, RefFromFuncError, RefHashMismatchError from kapitan.refs.base import PlainRef, RefController, RefParams, Revealer -from kapitan.refs.env import EnvRef, DEFAULT_ENV_REF_VAR_PREFIX from kapitan.refs.base64 import Base64Ref +from kapitan.refs.env import DEFAULT_ENV_REF_VAR_PREFIX, EnvRef from kapitan.utils import get_entropy REFS_HOME = tempfile.mkdtemp() diff --git a/tests/test_utils.py b/tests/test_utils.py index 54e47e176..f4d6f8247 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -7,13 +7,13 @@ "utils tests" -import unittest -import os -import tempfile import glob +import os import shutil +import tempfile +import unittest -from kapitan.utils import copy_tree, directory_hash, SafeCopyError +from kapitan.utils import SafeCopyError, copy_tree, directory_hash TEST_PWD = os.getcwd() TEST_RESOURCES_PATH = os.path.join(os.getcwd(), "tests/test_resources") @@ -27,8 +27,7 @@ class CopyTreeTest(unittest.TestCase): def setUp(self): self.temp_dir = tempfile.mkdtemp() - - + def test_copy_dir(self): original = set(glob.iglob(f"{TEST_KUBERNETES_PATH}/*", recursive=True)) copied = copy_tree(TEST_KUBERNETES_PATH, self.temp_dir) @@ -38,11 +37,9 @@ def test_copy_dir(self): copied_hash = directory_hash(self.temp_dir) self.assertEqual(copied_hash, original_hash) - def test_validate_copy_dir(self): with self.assertRaises(SafeCopyError): copy_tree("non_existent_dir", self.temp_dir) - + def tearDown(self): shutil.rmtree(self.temp_dir) - \ No newline at end of file diff --git a/tests/test_vault.py b/tests/test_vault.py index a57f58db8..f2d46b6b1 100644 --- a/tests/test_vault.py +++ b/tests/test_vault.py @@ -8,12 +8,12 @@ "vault secrets tests" import os +import shutil import tempfile import unittest -import shutil -from kapitan.refs.base import RefController, Revealer, RefParams -from kapitan.refs.secrets.vaultkv import VaultSecret, VaultClient, VaultError +from kapitan.refs.base import RefController, RefParams, Revealer +from kapitan.refs.secrets.vaultkv import VaultClient, VaultError, VaultSecret from tests.vault_server import VaultServer # Create temporary folder diff --git a/tests/test_vault_transit.py b/tests/test_vault_transit.py index b0d009ea4..5cb233474 100644 --- a/tests/test_vault_transit.py +++ b/tests/test_vault_transit.py @@ -1,15 +1,14 @@ "vault transit tests" -import tempfile -import unittest import base64 import shutil +import tempfile +import unittest from kapitan.refs.base import RefController, Revealer from kapitan.refs.secrets.vaulttransit import VaultTransit -from tests.vault_server import VaultTransitServer from kapitan.refs.vault_resources import VaultClient - +from tests.vault_server import VaultTransitServer # Create temporary folder REFS_PATH = tempfile.mkdtemp() diff --git a/tests/vault_server.py b/tests/vault_server.py index 8b43d42fa..0c4b1292f 100644 --- a/tests/vault_server.py +++ b/tests/vault_server.py @@ -5,15 +5,15 @@ "hashicorp vault resource functions" -import docker -import os import logging - +import os from time import sleep -from kapitan.errors import KapitanError +import docker import hvac +from kapitan.errors import KapitanError + logger = logging.getLogger(__name__) @@ -48,8 +48,6 @@ def setup_container(self): auto_remove=True, command="server", ) - - # make sure the container is up & running before testing