From e87d3b5e437390911fc59100d19049d3bcf2278b Mon Sep 17 00:00:00 2001 From: per1234 Date: Fri, 12 Sep 2025 12:10:41 -0700 Subject: [PATCH 1/9] Correct syntax of shell code in "Check Certificates" workflow Previously, the command was erroneously split at the first parenthesis. This resulted in the introduction of spaces between the two parentheses, which caused the syntax to be interpreted as a command substitution operator instead of the intended arithmetic expansion operator. This caused the command to fail: ``` /home/runner/work/_temp/2470dde2-826c-4a00-8268-b8d111566dc2.sh: line 46: syntax error near unexpected token `/' ``` --- .github/workflows/check-certificates.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/check-certificates.yml b/.github/workflows/check-certificates.yml index c1c9125f..2d8bb8bd 100644 --- a/.github/workflows/check-certificates.yml +++ b/.github/workflows/check-certificates.yml @@ -172,9 +172,9 @@ jobs: )" fi - DAYS_BEFORE_EXPIRATION="$( - (($(date --utc --date="$EXPIRATION_DATE" +%s) - $(date --utc +%s)) / 60 / 60 / 24) - )" + DAYS_BEFORE_EXPIRATION="$(( + ($(date --utc --date="$EXPIRATION_DATE" +%s) - $(date --utc +%s)) / 60 / 60 / 24 + ))" # Display the expiration information in the log. echo "Certificate expiration date: $EXPIRATION_DATE" From 2506adced31e16a17eb5d877b2563e5f3c18da55 Mon Sep 17 00:00:00 2001 From: per1234 Date: Sun, 7 Sep 2025 20:12:01 -0700 Subject: [PATCH 2/9] Check/fix problems with npm configuration The "Check npm" template provides actions and a GitHub Actions workflow used to check for problems with a project's npm configuration files. In addition to the `package.json` file previously used, we are now using an `.npmrc` configuration file. It will be useful to have some validation for this file. npm provides a `config fix` command which automatically fixes any problems that are detected with the npm configuration. In addition to using it for that purpose, it can also serve as a check by running the command via the GitHub Actions workflow, then checking for any diff. Beyond the automated fixes, it is hoped that the parsing of the configuration that npm must perform to check for any needed fixes provides a basic validation of the configuration. Unfortunately npm's parser is extremely lenient, so the validation is not at all comprehensive. However, it is probably better than nothing, simple to implement, and no alternatives were found. --- .github/workflows/check-npm-task.yml | 41 ++++++++++++++++++++++++++++ .npmrc | 2 +- Taskfile.yml | 14 ++++++++++ 3 files changed, 56 insertions(+), 1 deletion(-) diff --git a/.github/workflows/check-npm-task.yml b/.github/workflows/check-npm-task.yml index 2376dcbd..80e81abd 100644 --- a/.github/workflows/check-npm-task.yml +++ b/.github/workflows/check-npm-task.yml @@ -126,3 +126,44 @@ jobs: --color \ --exit-code \ "${{ matrix.project.path }}/package-lock.json" + + check-config: + name: check-config (${{ matrix.project.path }}) + needs: run-determination + if: needs.run-determination.outputs.result == 'true' + runs-on: ubuntu-latest + permissions: + contents: read + + strategy: + fail-fast: false + matrix: + project: + - path: . + + steps: + - name: Checkout repository + uses: actions/checkout@v5 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version-file: "${{ matrix.project.path }}/package.json" + + - name: Install Task + uses: arduino/setup-task@v2 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + version: 3.x + + - name: Fix problems in npm configuration file + run: | + task npm:fix-config \ + PROJECT_PATH="${{ matrix.project.path }}" + + - name: Check if fixes are needed in npm configuration file + run: | + git diff \ + --color \ + --exit-code \ + "${{ matrix.project.path }}/.npmrc" diff --git a/.npmrc b/.npmrc index 2fc27b7e..1c934969 100644 --- a/.npmrc +++ b/.npmrc @@ -1,3 +1,3 @@ # See: https://docs.npmjs.com/cli/configuring-npm/npmrc -engine-strict = true +engine-strict=true diff --git a/Taskfile.yml b/Taskfile.yml index 811c4f2f..261ded52 100644 --- a/Taskfile.yml +++ b/Taskfile.yml @@ -142,6 +142,7 @@ tasks: vars: GO_MODULE_PATH: ./ruledocsgen - task: markdown:fix + - task: npm:fix-config - task: python:format - task: shell:format vars: @@ -477,6 +478,19 @@ tasks: markdownlint-cli \ "**/*.md" + # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/check-npm-task/Taskfile.yml + npm:fix-config: + desc: | + Fix problems with the npm configuration file. + Environment variable parameters: + - PROJECT_PATH: Path of the npm-managed project (default: {{.DEFAULT_NPM_PROJECT_PATH}}). + dir: "{{default .DEFAULT_NPM_PROJECT_PATH .PROJECT_PATH}}" + cmds: + - | + npm config \ + --location project \ + fix + # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/npm-task/Taskfile.yml npm:install-deps: desc: | From d65221ed5d36f4f8bcf53ca0842f4cc44bdbf8b0 Mon Sep 17 00:00:00 2001 From: per1234 Date: Sun, 7 Sep 2025 20:12:40 -0700 Subject: [PATCH 3/9] Add reference link comment for Prettier filename matching patterns Prettier uses filename pattern matching to identify the programming language of files (and from this determines which files to format, and how to format those files). This is based on data from the "Linguist" project. That data was used as a reference for configuring the paths filter of the "Check Prettier Formatting" workflow, which ensures that the workflow will run whenever relevant files are modified. Documenting that reference via a comment in the workflow will facilitate the maintenance of the paths filter. --- .github/workflows/check-prettier-formatting-task.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/check-prettier-formatting-task.yml b/.github/workflows/check-prettier-formatting-task.yml index 8e799df5..663c7be4 100644 --- a/.github/workflows/check-prettier-formatting-task.yml +++ b/.github/workflows/check-prettier-formatting-task.yml @@ -11,6 +11,9 @@ on: - "Taskfile.ya?ml" - "**/.prettierignore" - "**/.prettierrc*" + # Prettier-covered file patterns are defined by: + # https://github.com/github-linguist/linguist/blob/main/lib/linguist/languages.yml + # # CSS - "**.css" - "**.wxss" From 6b71e2baa4e28d0085ebf30e5db57f408e3cd009 Mon Sep 17 00:00:00 2001 From: per1234 Date: Mon, 8 Sep 2025 06:16:07 -0700 Subject: [PATCH 4/9] Simplify workflow code Previously, a "block scalar" was used in the workflow. This is useful in the case of a multi-line string. However, this string is only a single line. Although it would be useful to break the command up into multiple lines via the use of the line continuation operators, this is not possible due to a quirk of the action. So the use of the "block scalar" is not really beneficial in this case. Furthermore, the use of the "block scalar" might encourage the maintainer to try to split the command into multiple lines as is common practice for complex shell commands in the infrastructure, leading to wasted time. --- .github/workflows/check-shell-task.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/check-shell-task.yml b/.github/workflows/check-shell-task.yml index 2a060c68..2ca88366 100644 --- a/.github/workflows/check-shell-task.yml +++ b/.github/workflows/check-shell-task.yml @@ -127,8 +127,7 @@ jobs: linters: gcc # Due to a quirk of the "liskin/gh-problem-matcher-wrap" action, the entire command must be on a single line # (instead of being broken into multiple lines for readability). - run: | - task --silent shell:check SCRIPT_PATH="${{ matrix.script }}" SHELLCHECK_FORMAT=${{ matrix.configuration.format }} + run: task --silent shell:check SCRIPT_PATH="${{ matrix.script }}" SHELLCHECK_FORMAT=${{ matrix.configuration.format }} formatting: name: formatting (${{ matrix.script }}) From 9c2a2c18334958e68e04f9b016c225bf18336c42 Mon Sep 17 00:00:00 2001 From: per1234 Date: Mon, 8 Sep 2025 06:23:35 -0700 Subject: [PATCH 5/9] Use explicit filename source in config file artifact upload step of "Sync Labels" workflows Starting from version 3.2.0 of the "actions/upload-artifact" action, "hidden" files are not uploaded by default. The action considers a file "hidden" if any component of the path starts with `.`. The "download" job of the "Sync Labels" workflow downloads each of the shared label configuration files from and uploads them to GitHub Actions workflow artifacts for use by the subsequent job. Since the names of the configuration files don't start with `.` and they aren't located in a subfolder that starts with `.`, we would not expect that this job could be impacted by the new hidden file handling behavior. However, it was impacted after all, under certain conditions. Previously, wildcard patterns were used in the `path` input of the job's "actions/upload-artifact" action step. It turns out that in the case of wildcards, the entire absolute path to the file is considered in the determination of whether it is "hidden". The "workspace" in which the workflow's steps are performed is under a path that includes the repository name. So if the repository name starts with a `.` (e.g., `.github`), then the "actions/upload-artifact" action step failed spuriously: ``` Run actions/upload-artifact@v3 Error: No files were found with the provided path: *.yaml *.yml. No artifacts will be uploaded. ``` Although this could be fixed by setting the "actions/upload-artifact" action's `include-hidden-files` input to `true`, it actually doesn't make sense to use a wildcard in the `path` input when the name of the single file is already available (the wildcard approach is a vestigial remnant of a previous version of the workflow that downloaded all configuration files in a single job, before it was changed to using a job matrix). By changing the `path` input value to the file's explicit relative path, it is ensured that the file will never be treated as "hidden", regardless of the repository name. --- .github/workflows/sync-labels-npm.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/workflows/sync-labels-npm.yml b/.github/workflows/sync-labels-npm.yml index 6b1b4469..cae13d1e 100644 --- a/.github/workflows/sync-labels-npm.yml +++ b/.github/workflows/sync-labels-npm.yml @@ -86,9 +86,7 @@ jobs: - name: Pass configuration files to next job via workflow artifact uses: actions/upload-artifact@v4 with: - path: | - *.yaml - *.yml + path: ${{ matrix.filename }} if-no-files-found: error name: ${{ env.CONFIGURATIONS_ARTIFACT_PREFIX }}${{ matrix.filename }} From 133bc949f1c764ebb5531cdbd4138fd05a95c9f3 Mon Sep 17 00:00:00 2001 From: per1234 Date: Mon, 8 Sep 2025 06:33:27 -0700 Subject: [PATCH 6/9] Disable Poetry "package mode" The project's Python package dependencies are managed using the Poetry tool. By default, Poetry is configured in "package mode", which is intended for use with projects that are a Python package. When Poetry is used in a project like this that is a standalone script, this configuration is inappropriate and has the following effects: * `poetry install` command installs the project as a Python package in addition to the dependencies. * `name`, `version`, `description`, and `authors` fields of the pyproject.toml file are required. Installing the project as a package is completely inappropriate if the project is not a package, and may cause the command to fail with a cryptic error. This can be avoided by passing the `--no-root` flag to the `install` command, but that increases the usage complexity and chance for user error. Although metadata fields under the `tool.poetry` section of the pyproject.toml configuration file are important for a package, in a non-package project there are better ways to provide that information. Since Git tags are used for versioning, the presence of a `version` field is especially harmful since it means duplication of information and extra work for the project maintainer (and likelihood the metadata will not be kept updated). This "package mode" can be disabled via the pyproject.toml configuration file, which causes Poetry to operate purely in the sole capacity in which it is used by this project: to manage dependencies. --- Taskfile.yml | 2 +- pyproject.toml | 5 +---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/Taskfile.yml b/Taskfile.yml index 261ded52..26cbc250 100644 --- a/Taskfile.yml +++ b/Taskfile.yml @@ -639,7 +639,7 @@ tasks: deps: - task: poetry:install cmds: - - poetry install --no-root + - poetry install # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/poetry-task/Taskfile.yml poetry:update-deps: diff --git a/pyproject.toml b/pyproject.toml index 5b4b7baa..6a018a7e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,10 +1,7 @@ # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/poetry/pyproject.toml [tool.poetry] -name = "arduino-lint" -version = "0.0.0" -description = "arduino-lint" -authors = ["Arduino "] +package-mode = false # The dependencies in this group are installed using pipx; NOT Poetry. The use of the `tool.poetry.group` super-table # is a hack required in order to be able to manage updates of these dependencies via Dependabot. From 375146bbce1d11a2057f84f2166e9e74cd9ec126 Mon Sep 17 00:00:00 2001 From: per1234 Date: Mon, 8 Sep 2025 06:42:59 -0700 Subject: [PATCH 7/9] Use project version of ajv-cli in npm:validate task The "ajv-cli" command line tool is used for validating data files against their JSON schema. The tool is used to validate the project's npm package.json configuration file. In general, it is preferable (and for some schemas even mandatory) to use the latest version of ajv-cli. However, support for the "Draft-04" schema specification was dropped in ajv-cli version 4.0.0. So when working with JSON schemas that specify that draft, it is necessary to use ajv-cli 3.3.0, the last compatible version. Previously, the package.json schema specified the "Draft-04" specification. For this reason, the `npm:validate` task was configured to use ajv-cli@3.3.0. The package.json schema has now been updated to use the "Draft-07" schema specification. So the code for using ajv-cli@3.3.0 is removed from the task, and it will now instead use the standard project level version of ajv-cli. --- Taskfile.yml | 50 +++++++++++++++++++------------------------------- 1 file changed, 19 insertions(+), 31 deletions(-) diff --git a/Taskfile.yml b/Taskfile.yml index 26cbc250..59af24ad 100644 --- a/Taskfile.yml +++ b/Taskfile.yml @@ -28,8 +28,6 @@ vars: || \ echo '"ERROR: Unable to discover Go packages"' \ ) - # Last version of ajv-cli with support for the JSON schema "Draft 4" specification - SCHEMA_DRAFT_4_AJV_CLI_VERSION: 3.3.0 # build vars COMMIT: sh: | @@ -508,6 +506,8 @@ tasks: Validate npm configuration files against their JSON schema. Environment variable parameters: - PROJECT_PATH: Path of the npm-managed project (default: {{.DEFAULT_NPM_PROJECT_PATH}}). + deps: + - task: npm:install-deps vars: # Source: https://github.com/SchemaStore/schemastore/blob/master/src/schemas/json/package.json SCHEMA_URL: https://json.schemastore.org/package.json @@ -551,10 +551,6 @@ tasks: sh: task utility:mktemp-file TEMPLATE="stylelintrc-schema-XXXXXXXXXX.json" INSTANCE_PATH: >- {{default .DEFAULT_NPM_PROJECT_PATH .PROJECT_PATH}}/package.json - PROJECT_FOLDER: - sh: pwd - WORKING_FOLDER: - sh: task utility:mktemp-folder TEMPLATE="dependabot-validate-XXXXXXXXXX" cmds: - wget --quiet --output-document="{{.SCHEMA_PATH}}" {{.SCHEMA_URL}} - wget --quiet --output-document="{{.AVA_SCHEMA_PATH}}" {{.AVA_SCHEMA_URL}} @@ -567,20 +563,23 @@ tasks: - wget --quiet --output-document="{{.SEMANTIC_RELEASE_SCHEMA_PATH}}" {{.SEMANTIC_RELEASE_SCHEMA_URL}} - wget --quiet --output-document="{{.STYLELINTRC_SCHEMA_PATH}}" {{.STYLELINTRC_SCHEMA_URL}} - | - cd "{{.WORKING_FOLDER}}" # Workaround for https://github.com/npm/cli/issues/3210 - npx ajv-cli@{{.SCHEMA_DRAFT_4_AJV_CLI_VERSION}} validate \ - --all-errors \ - -s "{{.SCHEMA_PATH}}" \ - -r "{{.AVA_SCHEMA_PATH}}" \ - -r "{{.BASE_SCHEMA_PATH}}" \ - -r "{{.ESLINTRC_SCHEMA_PATH}}" \ - -r "{{.JSCPD_SCHEMA_PATH}}" \ - -r "{{.NPM_BADGES_SCHEMA_PATH}}" \ - -r "{{.PARTIAL_ESLINT_PLUGINS_PATH}}" \ - -r "{{.PRETTIERRC_SCHEMA_PATH}}" \ - -r "{{.SEMANTIC_RELEASE_SCHEMA_PATH}}" \ - -r "{{.STYLELINTRC_SCHEMA_PATH}}" \ - -d "{{.PROJECT_FOLDER}}/{{.INSTANCE_PATH}}" + npx \ + --package=ajv-cli \ + --package=ajv-formats \ + ajv validate \ + --all-errors \ + --strict=false \ + -s "{{.SCHEMA_PATH}}" \ + -r "{{.AVA_SCHEMA_PATH}}" \ + -r "{{.BASE_SCHEMA_PATH}}" \ + -r "{{.ESLINTRC_SCHEMA_PATH}}" \ + -r "{{.JSCPD_SCHEMA_PATH}}" \ + -r "{{.NPM_BADGES_SCHEMA_PATH}}" \ + -r "{{.PARTIAL_ESLINT_PLUGINS_PATH}}" \ + -r "{{.PRETTIERRC_SCHEMA_PATH}}" \ + -r "{{.SEMANTIC_RELEASE_SCHEMA_PATH}}" \ + -r "{{.STYLELINTRC_SCHEMA_PATH}}" \ + -d "{{.INSTANCE_PATH}}" # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/poetry-task/Taskfile.yml poetry:install: @@ -744,17 +743,6 @@ tasks: vars: RAW_PATH: "{{.RAW_PATH}}" - # Make a temporary folder named according to the passed TEMPLATE variable and print the path passed to stdout - # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/windows-task/Taskfile.yml - utility:mktemp-folder: - vars: - RAW_PATH: - sh: mktemp --directory --tmpdir "{{.TEMPLATE}}" - cmds: - - task: utility:normalize-path - vars: - RAW_PATH: "{{.RAW_PATH}}" - # Print a normalized version of the path to stdout. # Environment variable parameters: # - RAW_PATH: the path to be normalized. From b6513b2e552552c72b20602fbbdf9ba8b2676e6a Mon Sep 17 00:00:00 2001 From: per1234 Date: Mon, 8 Sep 2025 06:44:19 -0700 Subject: [PATCH 8/9] Configure task dependencies to avoid redundant execution The "Task" task runner tool is used to perform common development operations for the project. Tasks may call other tasks. Under certain conditions (most commonly when running a convenience "umbrella" which calls all tasks of a general type), this can result in the same task being called redundantly, which is inefficient. Worse, since task calls specified via the `deps` mapping of a task definition are executed concurrently, the multiple executions can conflict with each other and cause problems such as a spurious failure. This can be avoided by configuring tasks which may be called multiple times, and for which it never makes sense to execute multiple times with the same conditions, so that all but the first call will be ignored. --- Taskfile.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Taskfile.yml b/Taskfile.yml index 59af24ad..67e1a259 100644 --- a/Taskfile.yml +++ b/Taskfile.yml @@ -179,6 +179,7 @@ tasks: # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/deploy-cobra-mkdocs-versioned-poetry/Taskfile.yml docs:generate: desc: Create all generated documentation content + run: when_changed deps: - task: go:cli-docs - task: go:rule-docs @@ -495,6 +496,7 @@ tasks: Install dependencies managed by npm. Environment variable parameters: - PROJECT_PATH: Path of the npm-managed project (default: {{.DEFAULT_NPM_PROJECT_PATH}}). + run: when_changed dir: | "{{default .DEFAULT_NPM_PROJECT_PATH .PROJECT_PATH}}" cmds: From a7ac7675c4945e5fda3e47d660f363ba7cb25cb1 Mon Sep 17 00:00:00 2001 From: per1234 Date: Mon, 8 Sep 2025 06:45:11 -0700 Subject: [PATCH 9/9] Only install Python package dependencies from relevant group The "Poetry" tool is used to manage the project's Python package dependencies. Dependencies might be classified into distinct categories. The most basic classification would be: - Application dependencies: used by the project's applications - Development dependencies: tools used in the development and maintenance of the project, but not by the application By default, Poetry installs all non-optional dependencies. This can be inefficient in a case where a specific operation is being performed, since a given operation might only require the dependencies from one category and so the installation of dependencies from the other is pointless for that operation. For this reason, Poetry allows the user to organize dependencies into arbitrary "groups", and to specify which groups should be installed. The Python package installation task is hereby updated to allow dependency groups to be specified, and the calls to that task updated to specify the groups they require. --- .../deploy-cobra-mkdocs-versioned-poetry.yml | 4 +- Taskfile.yml | 24 ++++- poetry.lock | 98 +++++++++---------- pyproject.toml | 20 ++-- 4 files changed, 82 insertions(+), 64 deletions(-) diff --git a/.github/workflows/deploy-cobra-mkdocs-versioned-poetry.yml b/.github/workflows/deploy-cobra-mkdocs-versioned-poetry.yml index b46972a9..f9370b8b 100644 --- a/.github/workflows/deploy-cobra-mkdocs-versioned-poetry.yml +++ b/.github/workflows/deploy-cobra-mkdocs-versioned-poetry.yml @@ -82,7 +82,9 @@ jobs: run: task docs:generate - name: Install Dependencies - run: task poetry:install-deps + run: | + task poetry:install-deps \ + POETRY_GROUPS=dev - name: Determine versioning parameters id: determine-versioning diff --git a/Taskfile.yml b/Taskfile.yml index 67e1a259..c965b633 100644 --- a/Taskfile.yml +++ b/Taskfile.yml @@ -234,6 +234,8 @@ tasks: desc: Check for commonly misspelled words deps: - task: poetry:install-deps + vars: + POETRY_GROUPS: dev cmds: - poetry run codespell @@ -242,6 +244,8 @@ tasks: desc: Correct commonly misspelled words where possible deps: - task: poetry:install-deps + vars: + POETRY_GROUPS: dev cmds: - | poetry run \ @@ -378,6 +382,8 @@ tasks: - task: go:build - task: go:rule-docs:build - task: poetry:install-deps + vars: + POETRY_GROUPS: dev cmds: - | poetry run \ @@ -636,11 +642,17 @@ tasks: # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/poetry-task/Taskfile.yml poetry:install-deps: - desc: Install dependencies managed by Poetry + desc: | + Install dependencies managed by Poetry. + Environment variable parameters: + - POETRY_GROUPS: Poetry dependency groups to install (default: install all dependencies). + run: when_changed deps: - task: poetry:install cmds: - - poetry install + - | + poetry install \ + {{if .POETRY_GROUPS}} --only {{.POETRY_GROUPS}} {{end}} # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/poetry-task/Taskfile.yml poetry:update-deps: @@ -655,6 +667,8 @@ tasks: desc: Format Python files deps: - task: poetry:install-deps + vars: + POETRY_GROUPS: dev cmds: - | poetry run \ @@ -666,6 +680,8 @@ tasks: desc: Lint Python code deps: - task: poetry:install-deps + vars: + POETRY_GROUPS: dev cmds: - | poetry run \ @@ -773,6 +789,8 @@ tasks: deps: - task: docs:generate - task: poetry:install-deps + vars: + POETRY_GROUPS: dev cmds: - | poetry run \ @@ -785,6 +803,8 @@ tasks: deps: - task: docs:generate - task: poetry:install-deps + vars: + POETRY_GROUPS: dev cmds: - | poetry run \ diff --git a/poetry.lock b/poetry.lock index 4b6dc00e..d712e319 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 2.1.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 2.1.3 and should not be changed by hand. [[package]] name = "anyio" @@ -27,7 +27,7 @@ version = "2.12.1" description = "Internationalization utilities" optional = false python-versions = ">=3.7" -groups = ["main"] +groups = ["dev"] files = [ {file = "Babel-2.12.1-py3-none-any.whl", hash = "sha256:b4246fb7677d3b98f501a39d43396d3cafdc8eadb045f4a31be01863f655c610"}, {file = "Babel-2.12.1.tar.gz", hash = "sha256:cc2d99999cd01d44420ae725a21c9e3711b3aadc7976d6147f622d8581963455"}, @@ -147,7 +147,7 @@ version = "2024.7.4" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" -groups = ["main", "pipx"] +groups = ["dev", "pipx"] files = [ {file = "certifi-2024.7.4-py3-none-any.whl", hash = "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90"}, {file = "certifi-2024.7.4.tar.gz", hash = "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b"}, @@ -240,7 +240,7 @@ version = "2.1.1" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.6.0" -groups = ["main", "pipx"] +groups = ["dev", "pipx"] files = [ {file = "charset-normalizer-2.1.1.tar.gz", hash = "sha256:5a3d016c7c547f69d6f81fb0db9449ce888b418b5b9952cc5e6e66843e9dd845"}, {file = "charset_normalizer-2.1.1-py3-none-any.whl", hash = "sha256:83e9a75d1911279afd89352c68b45348559d1fc0506b054b346651b5e7fee29f"}, @@ -271,7 +271,7 @@ version = "8.0.1" description = "Composable command line interface toolkit" optional = false python-versions = ">=3.6" -groups = ["main", "dev"] +groups = ["dev"] files = [ {file = "click-8.0.1-py3-none-any.whl", hash = "sha256:fba402a4a47334742d782209a7c79bc448911afe1149d07bdabdf480b3e2f4b6"}, {file = "click-8.0.1.tar.gz", hash = "sha256:8c04c11192119b1ef78ea049e0a6f0463e4c48ef00a30160c704337586f3ad7a"}, @@ -304,12 +304,12 @@ version = "0.4.4" description = "Cross-platform colored terminal text." optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -groups = ["main", "dev", "pipx"] +groups = ["dev", "pipx"] files = [ {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, ] -markers = {dev = "platform_system == \"Windows\"", pipx = "os_name == \"nt\""} +markers = {pipx = "os_name == \"nt\""} [[package]] name = "crashtest" @@ -459,7 +459,7 @@ version = "1.3.0" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" -groups = ["main", "pipx"] +groups = ["dev", "pipx"] files = [ {file = "exceptiongroup-1.3.0-py3-none-any.whl", hash = "sha256:4d111e6e0c13d0644cad6ddaa7ed0261a0b36971f6d23e7ec9b4b9097da78a10"}, {file = "exceptiongroup-1.3.0.tar.gz", hash = "sha256:b241f5885f560bc56a59ee63ca4c6a8bfa46ae4ad651af316d4e81817bb9fd88"}, @@ -536,7 +536,7 @@ version = "2.0.1" description = "Copy your docs directly to the gh-pages branch." optional = false python-versions = "*" -groups = ["main"] +groups = ["dev"] files = [ {file = "ghp-import-2.0.1.tar.gz", hash = "sha256:753de2eace6e0f7d4edfb3cce5e3c3b98cd52aadb80163303d1d036bda7b4483"}, {file = "ghp_import-2.0.1-py3-none-any.whl", hash = "sha256:8241a8e9f8dd3c1fafe9696e6e081b57a208ef907e9939c44e7415e407ab40ea"}, @@ -554,7 +554,7 @@ version = "4.0.5" description = "Git Object Database" optional = false python-versions = ">=3.4" -groups = ["main"] +groups = ["dev"] files = [ {file = "gitdb-4.0.5-py3-none-any.whl", hash = "sha256:91f36bfb1ab7949b3b40e23736db18231bf7593edada2ba5c3a174a7b23657ac"}, {file = "gitdb-4.0.5.tar.gz", hash = "sha256:c9e1f2d0db7ddb9a704c2a0217be31214e91a4fe1dea1efad19ae42ba0c285c9"}, @@ -569,7 +569,7 @@ version = "3.1.45" description = "GitPython is a Python library used to interact with Git repositories" optional = false python-versions = ">=3.7" -groups = ["main"] +groups = ["dev"] files = [ {file = "gitpython-3.1.45-py3-none-any.whl", hash = "sha256:8908cb2e02fb3b93b7eb0f2827125cb699869470432cc885f019b8fd0fccff77"}, {file = "gitpython-3.1.45.tar.gz", hash = "sha256:85b0ee964ceddf211c41b9f27a49086010a190fd8132a24e21f362a4b36a791c"}, @@ -648,7 +648,7 @@ version = "3.7" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.5" -groups = ["main", "pipx"] +groups = ["dev", "pipx"] files = [ {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, @@ -660,7 +660,7 @@ version = "8.4.0" description = "Read metadata from Python packages" optional = false python-versions = ">=3.8" -groups = ["main", "pipx"] +groups = ["dev", "pipx"] files = [ {file = "importlib_metadata-8.4.0-py3-none-any.whl", hash = "sha256:66f342cc6ac9818fc6ff340576acd24d65ba0b3efabb2b4ac08b598965a4a2f1"}, {file = "importlib_metadata-8.4.0.tar.gz", hash = "sha256:9a547d3bc3608b025f93d403fdd1aae741c24fbb8314df4b155675742ce303c5"}, @@ -680,7 +680,7 @@ version = "6.1.0" description = "Read resources from Python packages" optional = false python-versions = ">=3.8" -groups = ["main"] +groups = ["dev"] files = [ {file = "importlib_resources-6.1.0-py3-none-any.whl", hash = "sha256:aa50258bbfa56d4e33fbd8aa3ef48ded10d1735f11532b8df95388cc6bdb7e83"}, {file = "importlib_resources-6.1.0.tar.gz", hash = "sha256:9d48dcccc213325e810fd723e7fbb45ccb39f6cf5c31f00cf2b965f5f10f3cb9"}, @@ -699,7 +699,7 @@ version = "1.1.1" description = "iniconfig: brain-dead simple config-ini parsing" optional = false python-versions = "*" -groups = ["main"] +groups = ["dev"] files = [ {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, @@ -723,7 +723,7 @@ version = "2.2.0" description = "Pythonic task execution" optional = false python-versions = ">=3.6" -groups = ["main"] +groups = ["dev"] files = [ {file = "invoke-2.2.0-py3-none-any.whl", hash = "sha256:6ea924cc53d4f78e3d98bc436b08069a03077e6f85ad1ddaa8a116d7dad15820"}, {file = "invoke-2.2.0.tar.gz", hash = "sha256:ee6cbb101af1a859c7fe84f2a264c059020b0cb7fe3535f9424300ab568f6bd5"}, @@ -813,7 +813,7 @@ version = "3.1.6" description = "A very fast and expressive template engine." optional = false python-versions = ">=3.7" -groups = ["main"] +groups = ["dev"] files = [ {file = "jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67"}, {file = "jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d"}, @@ -861,7 +861,7 @@ version = "3.4.4" description = "Python implementation of John Gruber's Markdown." optional = false python-versions = ">=3.7" -groups = ["main"] +groups = ["dev"] files = [ {file = "Markdown-3.4.4-py3-none-any.whl", hash = "sha256:a4c1b65c0957b4bd9e7d86ddc7b3c9868fb9670660f6f99f6d1bca8954d5a941"}, {file = "Markdown-3.4.4.tar.gz", hash = "sha256:225c6123522495d4119a90b3a3ba31a1e87a70369e03f14799ea9c0d7183a3d6"}, @@ -880,7 +880,7 @@ version = "2.1.1" description = "Safely add untrusted strings to HTML/XML markup." optional = false python-versions = ">=3.7" -groups = ["main"] +groups = ["dev"] files = [ {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812"}, {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a"}, @@ -942,7 +942,7 @@ version = "1.3" description = "Extension for Python-Markdown that makes lists truly sane. Custom indents for nested lists and fix for messy linebreaks." optional = false python-versions = "*" -groups = ["main"] +groups = ["dev"] files = [ {file = "mdx_truly_sane_lists-1.3-py3-none-any.whl", hash = "sha256:b9546a4c40ff8f1ab692f77cee4b6bfe8ddf9cccf23f0a24e71f3716fe290a37"}, {file = "mdx_truly_sane_lists-1.3.tar.gz", hash = "sha256:b661022df7520a1e113af7c355c62216b384c867e4f59fb8ee7ad511e6e77f45"}, @@ -957,7 +957,7 @@ version = "1.3.4" description = "A deep merge function for 🐍." optional = false python-versions = ">=3.6" -groups = ["main"] +groups = ["dev"] files = [ {file = "mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307"}, {file = "mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8"}, @@ -969,7 +969,7 @@ version = "2.1.3" description = "Manage multiple versions of your MkDocs-powered documentation" optional = false python-versions = "*" -groups = ["main"] +groups = ["dev"] files = [ {file = "mike-2.1.3-py3-none-any.whl", hash = "sha256:d90c64077e84f06272437b464735130d380703a76a5738b152932884c60c062a"}, {file = "mike-2.1.3.tar.gz", hash = "sha256:abd79b8ea483fb0275b7972825d3082e5ae67a41820f8d8a0dc7a3f49944e810"}, @@ -995,7 +995,7 @@ version = "1.5.3" description = "Project documentation with Markdown." optional = false python-versions = ">=3.7" -groups = ["main"] +groups = ["dev"] files = [ {file = "mkdocs-1.5.3-py3-none-any.whl", hash = "sha256:3b3a78e736b31158d64dbb2f8ba29bd46a379d0c6e324c2246c3bc3d2189cfc1"}, {file = "mkdocs-1.5.3.tar.gz", hash = "sha256:eb7c99214dcb945313ba30426c2451b735992c73c2e10838f76d09e39ff4d0e2"}, @@ -1027,7 +1027,7 @@ version = "9.5.18" description = "Documentation that simply works" optional = false python-versions = ">=3.8" -groups = ["main"] +groups = ["dev"] files = [ {file = "mkdocs_material-9.5.18-py3-none-any.whl", hash = "sha256:1e0e27fc9fe239f9064318acf548771a4629d5fd5dfd45444fd80a953fe21eb4"}, {file = "mkdocs_material-9.5.18.tar.gz", hash = "sha256:a43f470947053fa2405c33995f282d24992c752a50114f23f30da9d8d0c57e62"}, @@ -1057,7 +1057,7 @@ version = "1.3" description = "Extension pack for Python Markdown and MkDocs Material." optional = false python-versions = ">=3.8" -groups = ["main"] +groups = ["dev"] files = [ {file = "mkdocs_material_extensions-1.3-py3-none-any.whl", hash = "sha256:0297cc48ba68a9fdd1ef3780a3b41b534b0d0df1d1181a44676fda5f464eeadc"}, {file = "mkdocs_material_extensions-1.3.tar.gz", hash = "sha256:f0446091503acb110a7cab9349cbc90eeac51b58d1caa92a704a81ca1e24ddbd"}, @@ -1162,7 +1162,7 @@ version = "25.0" description = "Core utilities for Python packages" optional = false python-versions = ">=3.8" -groups = ["main", "dev", "pipx"] +groups = ["dev", "pipx"] files = [ {file = "packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484"}, {file = "packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f"}, @@ -1174,7 +1174,7 @@ version = "0.5.6" description = "Divides large result sets into pages for easier browsing" optional = false python-versions = "*" -groups = ["main"] +groups = ["dev"] files = [ {file = "paginate-0.5.6.tar.gz", hash = "sha256:5e6007b6a9398177a7e1648d04fdd9f8c9766a1a945bceac82f1929e8c78af2d"}, ] @@ -1185,7 +1185,7 @@ version = "0.11.1" description = "Utility library for gitignore style pattern matching of file paths." optional = false python-versions = ">=3.7" -groups = ["main", "dev"] +groups = ["dev"] files = [ {file = "pathspec-0.11.1-py3-none-any.whl", hash = "sha256:d8af70af76652554bd134c22b3e8a1cc46ed7d91edcdd721ef1a0c51a84a5293"}, {file = "pathspec-0.11.1.tar.gz", hash = "sha256:2798de800fa92780e33acca925945e9a19a133b715067cf165b8866c15a31687"}, @@ -1248,7 +1248,7 @@ version = "4.4.0" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false python-versions = ">=3.9" -groups = ["main", "dev", "pipx"] +groups = ["dev", "pipx"] files = [ {file = "platformdirs-4.4.0-py3-none-any.whl", hash = "sha256:abd01743f24e5287cd7a5db3752faf1a2d65353f38ec26d98e25a6db65958c85"}, {file = "platformdirs-4.4.0.tar.gz", hash = "sha256:ca753cf4d81dc309bc67b0ea38fd15dc97bc30ce419a7f58d13eb3bf14c4febf"}, @@ -1265,7 +1265,7 @@ version = "1.5.0" description = "plugin and hook calling mechanisms for python" optional = false python-versions = ">=3.8" -groups = ["main"] +groups = ["dev"] files = [ {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, @@ -1367,7 +1367,7 @@ version = "2.16.1" description = "Pygments is a syntax highlighting package written in Python." optional = false python-versions = ">=3.7" -groups = ["main"] +groups = ["dev"] files = [ {file = "Pygments-2.16.1-py3-none-any.whl", hash = "sha256:13fc09fa63bc8d8671a6d247e1eb303c4b343eaee81d861f3404db2935653692"}, {file = "Pygments-2.16.1.tar.gz", hash = "sha256:1daff0494820c69bc8941e407aa20f577374ee88364ee10a98fdbe0aece96e29"}, @@ -1382,7 +1382,7 @@ version = "10.3" description = "Extension pack for Python Markdown." optional = false python-versions = ">=3.8" -groups = ["main"] +groups = ["dev"] files = [ {file = "pymdown_extensions-10.3-py3-none-any.whl", hash = "sha256:77a82c621c58a83efc49a389159181d570e370fff9f810d3a4766a75fc678b66"}, {file = "pymdown_extensions-10.3.tar.gz", hash = "sha256:94a0d8a03246712b64698af223848fd80aaf1ae4c4be29c8c61939b0467b5722"}, @@ -1401,7 +1401,7 @@ version = "3.1.1" description = "pyparsing module - Classes and methods to define and execute parsing grammars" optional = false python-versions = ">=3.6.8" -groups = ["main"] +groups = ["dev"] files = [ {file = "pyparsing-3.1.1-py3-none-any.whl", hash = "sha256:32c7c0b711493c72ff18a981d24f28aaf9c1fb7ed5e9667c9e84e3db623bdbfb"}, {file = "pyparsing-3.1.1.tar.gz", hash = "sha256:ede28a1a32462f5a9705e07aea48001a08f7cf81a021585011deba701581a0db"}, @@ -1428,7 +1428,7 @@ version = "8.4.2" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.9" -groups = ["main"] +groups = ["dev"] files = [ {file = "pytest-8.4.2-py3-none-any.whl", hash = "sha256:872f880de3fc3a5bdc88a11b39c9710c3497a547cfa9320bc3c5e62fbf272e79"}, {file = "pytest-8.4.2.tar.gz", hash = "sha256:86c0d0b93306b961d58d62a4db4879f27fe25513d4b969df351abdddb3c30e01"}, @@ -1452,7 +1452,7 @@ version = "2.9.0.post0" description = "Extensions to the standard Python datetime module" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" -groups = ["main"] +groups = ["dev"] files = [ {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, @@ -1480,7 +1480,7 @@ version = "6.0.1" description = "YAML parser and emitter for Python" optional = false python-versions = ">=3.6" -groups = ["main"] +groups = ["dev"] files = [ {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, @@ -1541,7 +1541,7 @@ version = "0.1" description = "A custom YAML tag for referencing environment variables in YAML files. " optional = false python-versions = ">=3.6" -groups = ["main"] +groups = ["dev"] files = [ {file = "pyyaml_env_tag-0.1-py3-none-any.whl", hash = "sha256:af31106dec8a4d68c60207c1886031cbf839b68aa7abccdb19868200532c2069"}, {file = "pyyaml_env_tag-0.1.tar.gz", hash = "sha256:70092675bda14fdec33b31ba77e7543de9ddc88f2e5b99160396572d11525bdb"}, @@ -1663,7 +1663,7 @@ version = "2022.10.31" description = "Alternative regular expression module, to replace re." optional = false python-versions = ">=3.6" -groups = ["main"] +groups = ["dev"] files = [ {file = "regex-2022.10.31-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a8ff454ef0bb061e37df03557afda9d785c905dab15584860f982e88be73015f"}, {file = "regex-2022.10.31-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1eba476b1b242620c266edf6325b443a2e22b633217a9835a52d8da2b5c051f9"}, @@ -1761,7 +1761,7 @@ version = "2.32.4" description = "Python HTTP for Humans." optional = false python-versions = ">=3.8" -groups = ["main", "pipx"] +groups = ["dev", "pipx"] files = [ {file = "requests-2.32.4-py3-none-any.whl", hash = "sha256:27babd3cda2a6d50b30443204ee89830707d396671944c998b5975b031ac2b2c"}, {file = "requests-2.32.4.tar.gz", hash = "sha256:27d0316682c8a29834d3264820024b62a36942083d52caf2f14c0591336d3422"}, @@ -1815,7 +1815,7 @@ version = "3.0.4" description = "Python helper for Semantic Versioning (https://semver.org)" optional = false python-versions = ">=3.7" -groups = ["main"] +groups = ["dev"] files = [ {file = "semver-3.0.4-py3-none-any.whl", hash = "sha256:9c824d87ba7f7ab4a1890799cec8596f15c1241cb473404ea1cb0c55e4b04746"}, {file = "semver-3.0.4.tar.gz", hash = "sha256:afc7d8c584a5ed0a11033af086e8af226a9c0b206f313e0301f8dd7b6b589602"}, @@ -1839,7 +1839,7 @@ version = "1.15.0" description = "Python 2 and 3 compatibility utilities" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" -groups = ["main"] +groups = ["dev"] files = [ {file = "six-1.15.0-py2.py3-none-any.whl", hash = "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced"}, {file = "six-1.15.0.tar.gz", hash = "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259"}, @@ -1851,7 +1851,7 @@ version = "3.0.4" description = "A pure Python implementation of a sliding window memory map manager" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -groups = ["main"] +groups = ["dev"] files = [ {file = "smmap-3.0.4-py2.py3-none-any.whl", hash = "sha256:54c44c197c819d5ef1991799a7e30b662d1e520f2ac75c9efbeb54a742214cf4"}, {file = "smmap-3.0.4.tar.gz", hash = "sha256:9c98bbd1f9786d22f14b3d4126894d56befb835ec90cef151af566c7e19b5d24"}, @@ -1875,7 +1875,7 @@ version = "2.2.1" description = "A lil' TOML parser" optional = false python-versions = ">=3.8" -groups = ["main", "dev", "pipx"] +groups = ["dev", "pipx"] files = [ {file = "tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249"}, {file = "tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6"}, @@ -1941,7 +1941,7 @@ version = "4.7.1" description = "Backported and Experimental Type Hints for Python 3.7+" optional = false python-versions = ">=3.7" -groups = ["main", "dev", "pipx"] +groups = ["dev", "pipx"] files = [ {file = "typing_extensions-4.7.1-py3-none-any.whl", hash = "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36"}, {file = "typing_extensions-4.7.1.tar.gz", hash = "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2"}, @@ -1953,7 +1953,7 @@ version = "2.5.0" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.9" -groups = ["main", "pipx"] +groups = ["dev", "pipx"] files = [ {file = "urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc"}, {file = "urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760"}, @@ -1971,7 +1971,7 @@ version = "0.1.0" description = "Flexible version handling" optional = false python-versions = "*" -groups = ["main"] +groups = ["dev"] files = [ {file = "verspec-0.1.0-py3-none-any.whl", hash = "sha256:741877d5633cc9464c45a469ae2a31e801e6dbbaa85b9675d481cda100f11c31"}, {file = "verspec-0.1.0.tar.gz", hash = "sha256:c4504ca697b2056cdb4bfa7121461f5a0e81809255b41c03dda4ba823637c01e"}, @@ -2007,7 +2007,7 @@ version = "2.1.3" description = "Filesystem events monitoring" optional = false python-versions = ">=3.6" -groups = ["main"] +groups = ["dev"] files = [ {file = "watchdog-2.1.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:9628f3f85375a17614a2ab5eac7665f7f7be8b6b0a2a228e6f6a2e91dd4bfe26"}, {file = "watchdog-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:acc4e2d5be6f140f02ee8590e51c002829e2c33ee199036fcd61311d558d89f4"}, @@ -2128,7 +2128,7 @@ version = "3.19.1" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.8" -groups = ["main", "pipx"] +groups = ["dev", "pipx"] files = [ {file = "zipp-3.19.1-py3-none-any.whl", hash = "sha256:2828e64edb5386ea6a52e7ba7cdb17bb30a73a858f5eb6eb93d8d36f5ea26091"}, {file = "zipp-3.19.1.tar.gz", hash = "sha256:35427f6d5594f4acf82d25541438348c26736fa9b3afa2754bcd63cdb99d8e8f"}, @@ -2253,4 +2253,4 @@ cffi = ["cffi (>=1.17) ; python_version >= \"3.13\" and platform_python_implemen [metadata] lock-version = "2.1" python-versions = "~3.9" -content-hash = "0ac838ba7313a5daf579834840c3d84ebf678fe91a4e02acd2bb0039a0f21b1b" +content-hash = "127a59a7f71ef529856f463fbed9d4b060ac7c3ec23a1968471542076aa01e22" diff --git a/pyproject.toml b/pyproject.toml index 6a018a7e..15d253de 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -14,24 +14,20 @@ poetry = "2.1.4" [tool.poetry.dependencies] python = "~3.9" -# Integration tests dependencies. -invoke = "^2.2.0" -pytest = "^8.4.2" -python-dateutil = "^2.9.0" -semver = "^3.0.4" - -# Documentation generation dependencies. +[tool.poetry.dev-dependencies] +black = "^25.1" +codespell = "^2.4.1" +flake8 = "^7.3.0" gitpython = "^3.1.45" +invoke = "^2.2.0" mdx_truly_sane_lists = "^1.3" mike = "^2.1.3" mkdocs = "^1.5.3" mkdocs-material = "^9.5.18" - -[tool.poetry.dev-dependencies] -black = "^25.1" -codespell = "^2.4.1" -flake8 = "^7.3.0" pep8-naming = "^0.15.1" +pytest = "^8.4.2" +python-dateutil = "^2.9.0" +semver = "^3.0.4" [tool.black] line-length = 120