diff --git a/.github/actions/release/action.yaml b/.github/actions/release/action.yaml index 649bb60..bde34d9 100644 --- a/.github/actions/release/action.yaml +++ b/.github/actions/release/action.yaml @@ -1,15 +1,9 @@ name: Release description: Create a GitHub release and upload the package to PyPI inputs: - pypi-api-token: - description: 'PyPI API token' - required: true tag-name: description: 'The name of the tag for the GitHub release' required: true - github-token: - description: 'GitHub token' - required: true runs: using: "composite" @@ -31,9 +25,6 @@ runs: files: dist/* tag_name: "${{ inputs.tag-name }}" body_path: release-notes.md - token: ${{ inputs.github-token }} - name: Upload package to PyPI uses: pypa/gh-action-pypi-publish@release/v1 - with: - password: ${{ inputs.pypi-api-token }} diff --git a/.github/actions/setup-python-and-git/action.yaml b/.github/actions/setup-python-and-git/action.yaml index 44b7247..bb288dd 100644 --- a/.github/actions/setup-python-and-git/action.yaml +++ b/.github/actions/setup-python-and-git/action.yaml @@ -4,16 +4,18 @@ inputs: python-version: description: 'Python version to use' required: false - default: '3.11' + default: '3.12' runs: using: 'composite' steps: - - uses: actions/setup-python@v4 + - uses: actions/setup-python@v5 name: Setup Python with: python-version: ${{ inputs.python-version }} - cache: 'pip' # caching pip dependencies - + - name: Install the latest version of uv + uses: astral-sh/setup-uv@v4 + with: + version: "latest" - name: Git check run: | git config --global user.email "action@github.actions" diff --git a/.github/workflows/docs-final.yml b/.github/workflows/docs-final.yml index 71200ad..7b496ab 100644 --- a/.github/workflows/docs-final.yml +++ b/.github/workflows/docs-final.yml @@ -14,18 +14,17 @@ jobs: uses: actions/checkout@v4 with: fetch-depth: 0 - token: ${{ secrets.PAT }} - - name: Set up Python 3.10 - uses: actions/setup-python@v5 + - name: Setup Python and Git + uses: ./.github/actions/setup-python-and-git with: - python-version: "3.10" + python-version: '3.12' - name: Install dependencies run: | git pull --all - python -m pip install ".[docs]" + uv sync -p 3.12 --group docs - name: Build and deploy documentation run: | - mkdocs gh-deploy --strict -v + uv run mkdocs gh-deploy --strict diff --git a/.github/workflows/docs-preview.yml b/.github/workflows/docs-preview.yml index db4fbd1..2589185 100644 --- a/.github/workflows/docs-preview.yml +++ b/.github/workflows/docs-preview.yml @@ -19,18 +19,17 @@ jobs: with: fetch-depth: 0 - - name: Set up Python 3.10 - uses: actions/setup-python@v5 + - name: Setup Python and Git + uses: ./.github/actions/setup-python-and-git with: - python-version: "3.10" + python-version: '3.12' - name: Install dependencies - run: | - python -m pip install ".[docs]" + run: uv sync -p 3.12 --group docs - name: Build documentation run: | - mkdocs build --strict -v + uv run mkdocs build --strict - name: Deploy preview uses: rossjrw/pr-preview-action@v1 diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index def335a..62f7c9c 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -16,16 +16,15 @@ jobs: name: Checkout the repository with: fetch-depth: 0 - token: ${{ secrets.PAT }} - name: Setup Python and Git uses: ./.github/actions/setup-python-and-git with: - python-version: '3.11' + python-version: '3.12' - name: Install requirements run: | - python -m pip install generate-changelog bump-my-version + uv sync -p 3.12 --group dev - name: Generate the changelog and get the release hint id: generate-changelog @@ -43,8 +42,6 @@ jobs: echo "pull_request_number=${PR_NUMBER}" >> $GITHUB_OUTPUT echo "::notice::PR_NUMBER is ${PR_NUMBER}" echo "PR_NUMBER=$PR_NUMBER" >> $GITHUB_ENV - env: - GITHUB_TOKEN: ${{ secrets.PAT }} - name: Bump version if: ${{ env.RELEASE_KIND != 'no-release' }} @@ -74,5 +71,3 @@ jobs: uses: ./.github/actions/release with: tag-name: ${{ env.TAG_NAME }} - github-token: ${{ secrets.PAT }} - pypi-api-token: ${{ secrets.PYPI_API_TOKEN }} diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index a8994e1..22fb202 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -22,56 +22,41 @@ jobs: - ubuntu-latest - windows-latest python-version: - - "3.8" - - "3.9" - - "3.10" - - "3.11" - "3.12" + - "3.13" runs-on: ${{ matrix.os }} steps: + - uses: actions/checkout@v4 + name: Checkout the repository + with: + fetch-depth: 0 - uses: ./.github/actions/setup-python-and-git with: python-version: ${{ matrix.python-version }} - - name: Check git is working - run: | - git config --global user.email "test-git@github.actions" - git config --global user.name "Testing Git" - git --version - git config --list - name: Install test dependencies - run: pip install '.[test]' + run: uv sync -p ${{ matrix.python-version }} --group test - name: Test - run: pytest --cov-report=xml - - name: Upload coverage to Codecov - uses: codecov/codecov-action@v5 - with: - token: ${{ secrets.CODECOV_TOKEN }} - files: test-reports/coverage.xml - flags: python-${{ matrix.python-version }} - verbose: true # optional (default = false) - env_vars: OS,PYTHON + run: uv run pytest # Upload to Test PyPI. release-test-pypi: name: Publish in-dev package to test.pypi.org runs-on: ubuntu-latest + permissions: + id-token: write steps: - uses: actions/checkout@v4 with: fetch-depth: 0 - token: ${{ secrets.PAT }} - ref: ${{ github.head_ref }} - - uses: actions/setup-python@v5 + - uses: ./.github/actions/setup-python-and-git with: - python-version: '3.11' - cache: 'pip' # caching pip dependencies + python-version: "3.12" - name: Install requirements shell: bash run: | - python -m pip install --disable-pip-version-check --no-python-version-warning build - python -m pip install --disable-pip-version-check --no-python-version-warning -e . + uv sync -p 3.12 --group dev - name: Set dev version shell: bash @@ -79,14 +64,12 @@ jobs: export PR_NUMBER=$(gh pr view --json number -q .number || echo "") echo "PR_NUMBER=$PR_NUMBER" >> $GITHUB_ENV echo "::notice::PR_NUMBER is: ${PR_NUMBER}" - bump-my-version bump dev bumpversion/__init__.py --no-commit --no-tag --no-configured-files -v - env: - GH_TOKEN: ${{ secrets.PAT }} + uv run bump-my-version bump dev --no-commit --no-tag -v - name: Package shell: bash run: | - python -m build + uv build - name: Upload package to Test PyPI uses: pypa/gh-action-pypi-publish@release/v1 diff --git a/.github/workflows/version-preview.yaml b/.github/workflows/version-preview.yaml index e65a9ab..087bf9f 100644 --- a/.github/workflows/version-preview.yaml +++ b/.github/workflows/version-preview.yaml @@ -13,21 +13,19 @@ jobs: with: fetch-depth: 0 ref: ${{ github.event.pull_request.head.sha }} - token: ${{ secrets.PAT }} - name: Setup Python and Git uses: ./.github/actions/setup-python-and-git with: - python-version: '3.11' + python-version: '3.12' - - name: Install requirements - run: | - python -m pip install generate-changelog bump-my-version + - name: Install test dependencies + run: uv sync -p 3.12 --group dev - name: Get the release hint id: generate-changelog run: | - RELEASE_KIND=$(generate-changelog --output release-hint --branch-override ${{ github.base_ref }} --skip-output-pipeline) + RELEASE_KIND=$(uv run generate-changelog --output release-hint --branch-override ${{ github.base_ref }} --skip-output-pipeline) echo "::notice::Suggested release type upon merge to ${{ github.base_ref }}: ${RELEASE_KIND}" echo "RELEASE_KIND=$RELEASE_KIND" >> $GITHUB_ENV echo "release-kind=$RELEASE_KIND" >> $GITHUB_OUTPUT @@ -39,26 +37,24 @@ jobs: echo "pull_request_number=${PR_NUMBER}" >> $GITHUB_OUTPUT echo "::notice::PR_NUMBER is ${PR_NUMBER}" echo "PR_NUMBER=$PR_NUMBER" >> $GITHUB_ENV - env: - GITHUB_TOKEN: ${{ secrets.PAT }} - name: Bump version dry run if: ${{ env.RELEASE_KIND != 'no-release' }} shell: bash run: | # This will display a full log of what would happen if we were to bump the version. - bump-my-version bump --dry-run --verbose "$RELEASE_KIND" + uv run bump-my-version bump --dry-run --verbose "$RELEASE_KIND" # This retrieves the current and new version numbers as a JSON-formatted string. - VERSION_INFO=$(bump-my-version show --format json --increment "$RELEASE_KIND" current_version new_version) + VERSION_INFO=$(uv run bump-my-version show --format json --increment "$RELEASE_KIND" current_version new_version) echo "CURRENT_VERSION=$(echo $VERSION_INFO | jq -r .current_version)" >> $GITHUB_ENV echo "NEW_VERSION=$(echo $VERSION_INFO | jq -r .new_version)" >> $GITHUB_ENV - name: Set no-release information if: ${{ env.RELEASE_KIND == 'no-release' }} run: | - echo "CURRENT_VERSION=$(bump-my-version show current_version)" >> $GITHUB_ENV - echo "NEW_VERSION=$(bump-my-version show current_version)" >> $GITHUB_ENV + echo "CURRENT_VERSION=$(uv run bump-my-version show current_version)" >> $GITHUB_ENV + echo "NEW_VERSION=$(uv run bump-my-version show current_version)" >> $GITHUB_ENV - name: Display the version hint uses: s-gehring/singleton-comment@v1 diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 758eace..bd20152 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -5,11 +5,18 @@ repos: - id: black - repo: https://github.com/astral-sh/ruff-pre-commit # Ruff version. - rev: 'v0.8.0' + rev: 'v0.8.2' hooks: - id: ruff - args: [--fix, --exit-non-zero-on-fix] + args: [ --fix, --exit-non-zero-on-fix ] exclude: test.* + - repo: https://github.com/codespell-project/codespell + rev: v2.3.0 + hooks: + - id: codespell + additional_dependencies: + - tomli + args: [--ignore-words-list, astroid ] - repo: https://github.com/pre-commit/pre-commit-hooks rev: v5.0.0 hooks: @@ -29,28 +36,27 @@ repos: test.*| mkdocs.yml )$ - args: [--allow-multiple-documents] + args: [ --allow-multiple-documents ] - id: debug-statements - id: end-of-file-fixer exclude: "^tests/resources/" - id: fix-byte-order-marker - id: fix-encoding-pragma - args: ["--remove"] - - id: requirements-txt-fixer + args: [ "--remove" ] - repo: https://github.com/Yelp/detect-secrets rev: v1.5.0 hooks: - - id: detect-secrets - additional_dependencies: ["gibberish-detector"] + - id: detect-secrets + additional_dependencies: [ "gibberish-detector" ] - repo: https://github.com/pre-commit/mirrors-mypy rev: v1.13.0 hooks: - id: mypy - args: [--no-strict-optional, --ignore-missing-imports] - additional_dependencies: ["pydantic>2.0", "toml", "types-PyYAML"] + args: [ --no-strict-optional, --ignore-missing-imports ] + additional_dependencies: [ "pydantic>2.0", "toml", "types-PyYAML" ] exclude: "^tests/" - repo: https://github.com/jsh9/pydoclint - rev: 0.5.9 + rev: 0.5.10 hooks: - id: pydoclint args: diff --git a/CHANGELOG.md b/CHANGELOG.md index 06a5976..a9596f3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,73 +1,74 @@ # Changelog ## 0.2.0 (2024-11-18) + [Compare the full difference.](https://github.com/callowayproject/project-forge/compare/0.1.0...0.2.0) ### New - Add test suite for CLI and enhance TODO tags. [0296f46](https://github.com/callowayproject/project-forge/commit/0296f461d77e9ada1cf1eab6a2e1fe2bbb8939ef) - + Introduced a comprehensive test suite for the CLI functionality using `pytest` and `unittest.mock.patch` to ensure robustness. Enhanced TODO tags with issue numbers for improved tracking and organization. - Added initial CLI interface. [a6fab99](https://github.com/callowayproject/project-forge/commit/a6fab99419439d7cb64102d9755c714e27df2bda) - + - Add tests and implement render functionality. [302b685](https://github.com/callowayproject/project-forge/commit/302b68590bfbe8dc3cf4faa36d71c3d0d9abfed1) - + Added two tests in `test_render.py` to verify the rendering of templates and directories. Implemented the `render_env` function in `render.py` to handle the template rendering logic. Also ensured `questions` field in the pattern configuration has a default factory list. - Add initial documentation and assets with new CSS and images. [052af67](https://github.com/callowayproject/project-forge/commit/052af67da9f0e1cee17b8073d537ca933d1e754d) - + Created new documentation pages for tutorials, how-tos, references, and explanations. Added custom CSS files for card layouts, extra content, field lists, and mkdocstrings styling. Included new logo and favicon images. - Add new JSON and YAML pattern files for fixture setups. [ca6df6d](https://github.com/callowayproject/project-forge/commit/ca6df6d74b1ffe4850f146aaaca7d18e64052554) - + Introduce JSON and YAML files for 'mkdocs', 'python-boilerplate', and 'python-package' fixtures. These files define template locations, questions, and extra context to streamline repository setups. - Add URL parsing and caching capabilities to Location class. [92cbb91](https://github.com/callowayproject/project-forge/commit/92cbb91b780f44ae7633dd88b6a5e6319da848b4) - + Enhanced Location class to parse URLs, handle local file URLs, and cache parsed URLs. Updated caching functions to handle remote repository cloning and local file paths, with added tests to verify this functionality. - Add settings configuration for project. [69ec6e9](https://github.com/callowayproject/project-forge/commit/69ec6e9e9d7a68f5c32ae0a014f4198943273f06) - + Created a new settings file (`settings.py`) to manage configurations for the project using `pydantic-settings` and `platformdirs`. Updated dependencies in `pyproject.toml` to include these new packages. - Add unit tests and git command utility functions. [1baa00e](https://github.com/callowayproject/project-forge/commit/1baa00ecd254023f2ac07c28991174fbfef2d005) - + Implemented unit tests for various git commands in `tests/test_git_commands.py` and defined git utility functions in `project_forge/git_commands.py`. These changes ensure comprehensive coverage for git operations including repository management, branching, and applying patches. - Add URL parsing functionality and unit tests. [d6ef3c9](https://github.com/callowayproject/project-forge/commit/d6ef3c9de350fece13ad3081ef7a4f04db319f0d) - + Introduce `project_forge.core.urls` module with functions to parse git URLs, internal paths, and path components. Additionally, provide comprehensive unit tests in `tests/test_core/test_urls.py` to validate the parsing logic. - Add path existence and removal utility functions with tests. [cec15da](https://github.com/callowayproject/project-forge/commit/cec15da3432c1659ccebdec49acd0982a2237a55) - + Introduced `make_sure_path_exists` and `remove_single_path` functions to handle directory and file operations safely. Additionally, added tests to ensure these functions create directories if missing and remove files and directories correctly. Logging and custom error handling are also included to enhance debugging and reliability. - Added initial composition models. [8aeda6e](https://github.com/callowayproject/project-forge/commit/8aeda6ea53589c2fea4f3d9a3e91f0bb7074232e) - + - Added configuration files. [45608a5](https://github.com/callowayproject/project-forge/commit/45608a52aac67acb04422da7ce2d598a4488b07f) - + ### Other - Enable default responses and fix context rendering logic. [4af116f](https://github.com/callowayproject/project-forge/commit/4af116f97bcf617751ed287378b0a3702d5df5fd) - + Simplified context rendering by directly returning non-string values and enabled forcing default responses for certain questions. This reduces unnecessary UI interactions and corrects the faulty rendering of expression values in contextual overlays. + ### Updates - Updated tooling and configuration. [a7665e6](https://github.com/callowayproject/project-forge/commit/a7665e61a89ed8b17134a66d267709ee862bbc39) - + - Refactor template handling. [228c06a](https://github.com/callowayproject/project-forge/commit/228c06a1584bde05645c4af85852fdf31925aa0d) - + Refactor `catalog_templates` to incorporate directory names for better path resolution. Updated `pyproject.toml` templates to align with the new requirements structure. Added logging for template loading in the Jinja2 environment. - Update composition tests and add context builder merge logic. [ba65296](https://github.com/callowayproject/project-forge/commit/ba6529616d11fe28ebfc57bf2ff0e4975a3294b1) - + Updated unit tests to reflect changes in overlay patterns and added merge keys in composition. Introduced new module `data_merge.py` and implemented merge strategies for combining configurations within the context builder. - Rename and refactor `rendering` module. [9137a77](https://github.com/callowayproject/project-forge/commit/9137a77bfd825cbc9851352dfc110780ef921d55) - + Renamed `rendering.py` to `expressions.py`, and refactored to load the environment dynamically rather than using a static instance. Adjusted project to require Python 3.12 and updated dependencies accordingly, including the addition of `asttokens` and `icecream`. - Refactor rendering module and improve template handling. [fc042a2](https://github.com/callowayproject/project-forge/commit/fc042a2e2d0b8c1e5a2378ec5290a6c824d1eb40) - + Delete `rendering.py` and establish new modular structure with `expressions.py`, `templates.py`, and `environment.py`. Update import paths accordingly and add new test cases to cover the added functionality. - Remove debug prints and update project references. [d949cee](https://github.com/callowayproject/project-forge/commit/d949ceeacfec411873cae810536112bf8348ebcb) - + Removed unnecessary debug print statements from multiple files to clean up the codebase. Also, updated references from "cookie_composer" to "project_forge" to align with the current project's naming conventions. - Refactor exception hierarchy in core/exceptions.py. [e2bd1d5](https://github.com/callowayproject/project-forge/commit/e2bd1d5426b30690cf3b5098d72c2c454d59b713) - + Introduce a base ProjectForgeError class and inherit all specific exceptions from it. This change enhances consistency and simplifies exception handling across Project Forge. - Updated Ruff configuration. [4eed053](https://github.com/callowayproject/project-forge/commit/4eed053365f1a8ff1fd88e5f12a2ac98b11a21a9) - ## 0.1.0 (2024-08-26) -* Initial creation +- Initial creation diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index 35b5167..2a2c990 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -5,7 +5,7 @@ We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender -identity and expression, level of experience, education, socio-economic status, +identity and expression, level of experience, education, socioeconomic status, nationality, personal appearance, race, caste, color, religion, or sexual identity and orientation. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 1ab9784..10eeb93 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -5,6 +5,7 @@ First off, thanks for taking the time to contribute! ❤️ All types of contributions are encouraged and valued. See the [Table of Contents](#table-of-contents) for different ways to help and details about how this project handles them. Please make sure to read the relevant section before making your contribution. It will make it much easier for us maintainers and smooth out the experience for all involved. The community looks forward to your contributions. 🎉 > If you like the project but don't have time to contribute, that's fine. There are other easy ways to support the project and show your appreciation, which we would also be very happy about: +> > - Star the project > - Tweet about it > - Refer to this project in your project's readme @@ -21,14 +22,12 @@ All types of contributions are encouraged and valued. See the [Table of Contents - [Styleguides](#styleguides) - [Join The Project Team](#join-the-project-team) - ## Code of Conduct This project and everyone participating in it are governed by the [Bump My Version Code of Conduct](https://github.com/callowayproject/bump-my-versionblob/master/CODE_OF_CONDUCT.md). By participating, you are expected to uphold this code. Please report unacceptable behavior to . - ## I Have a Question > If you want to ask a question, we assume that you have read the available [Documentation](https://callowayproject.github.io/bump-my-version/). @@ -60,7 +59,6 @@ A good bug report shouldn't leave others needing to chase you up for more inform - Possibly your input and the output - Can you reliably reproduce the issue? And can you also reproduce it with older versions? - ### How Do I Submit a Good Bug Report? > You must never report security-related issues, vulnerabilities, or bugs that include sensitive information to the issue tracker or elsewhere in public. Instead, sensitive bugs must be sent by email to . @@ -78,7 +76,6 @@ Once it's filed: - A team member will try to reproduce the issue with your provided steps. If there are no reproduction steps or no obvious way to reproduce the issue, the team will ask you for those steps and will not address them until they are included. - If the team is able to reproduce the issue, the issue will be left to be [implemented by someone](#your-first-code-contribution). - ## Suggesting Enhancements This section guides you through submitting an enhancement suggestion for Bump My Version, **including completely new features and minor improvements to existing functionality**. Following these guidelines will help maintainers and the community to understand your suggestion and find related suggestions. @@ -104,7 +101,6 @@ Enhancement suggestions are tracked as [GitHub issues](https://github.com/callow ## Your First Code Contribution - > ### Legal Notice > > When contributing to this project, you must agree that you have authored 100% of the content, that you have the necessary rights to the content and that the content you contribute may be provided under the project license. @@ -133,15 +129,15 @@ python -m pip install ".[dev,test,docs]" ### Run tests Once setup, you should be able to run tests: -``` -pytest + +```console +$ pytest ``` ## Install Pre-commit Hooks - Pre-commit hooks are scripts that run every time you make a commit. If any of the scripts fail, it stops the commit. You can see a listing of the checks in the ``.pre-commit-config.yaml`` file. -``` -pre-commit install +```console +$ pre-commit install ``` diff --git a/README.md b/README.md index 7c2c0cf..a6582e9 100644 --- a/README.md +++ b/README.md @@ -5,12 +5,14 @@ [![image](https://img.shields.io/pypi/pyversions/project-forge.svg)](https://pypi.org/project/project-forge/) [![GitHub Actions](https://github.com/callowayproject/project-forge/workflows/CI/badge.svg)](https://github.com/callowayproject/project-forge/actions) + a tool that combines one or more templates and the user's answers to questions to generate a code project -*Put a meaningful, short, plain-language description of:* +*Put a meaningful, short, plain-language description of:* - *what this project is trying to accomplish.* -- *why it matters.* +- *why it matters.* - *the problem(s) this project solves.* - *how this software can improve the lives of its audience.* - *what sets this apart from related-projects. Linking to another doc or page is OK if this can't be expressed in a sentence or two.* + diff --git a/composition.schema.json b/composition.schema.json index 1ae9a55..7a39dd8 100644 --- a/composition.schema.json +++ b/composition.schema.json @@ -138,4 +138,4 @@ "type": "object", "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://github.com/callowayproject/project-forge/composition.schema.json" -} \ No newline at end of file +} diff --git a/docs/explanation.md b/docs/explanation.md index 009914f..c2d7806 100644 --- a/docs/explanation.md +++ b/docs/explanation.md @@ -15,29 +15,31 @@ Explanation is **discussion** that clarifies and illuminates a particular topic. - Avoid writing instructions or technical descriptions here - [More Information](https://diataxis.fr/explanation/) - ## Overview Project Forge is a scaffolding tool. A scaffolding tool allows developers to generate a new project by answering a few questions. Developers can go from idea to coding very quickly. Additional needs: + - Combine several templates using composition. - Projects can update themselves with updates from their dependent templates. - Can use blocks within files to compose parts of files - Don't ask the same question twice Issues to be aware of: + - Context collisions - - The question variable names match in two or more patterns, but their values and use are different. + - The question variable names match in two or more patterns, but their values and use are different. - Patterns with similar questions but different names. - - `project_name` vs. `name_of_project` + - `project_name` vs. `name_of_project` - Storage location of pattern configuration and pattern template - - Local-Local - - Local-Remote - - Remote-Local - - Remote-Remote + - Local-Local + - Local-Remote + - Remote-Local + - Remote-Remote Similar metaphors: + - Stencil - Pattern - Template @@ -46,120 +48,6 @@ Similar metaphors: - Composition - Overlays -## Elements - -- **Location.** A location is a reference to a source. -- **Pattern.** A set of template files to render and a rendering configuration file. -- **Pattern source management.** Downloading and caching the pattern sources (git repos, local directories) -- **Overlay.** A reference to a pattern and the configuration for using it in a specific composition. -- **Composition.** A list of overlays and context to render a project. -- **Template Rendering Engine.** The system that defines the structure of the templates and renders them into the final product -- **Hooks.** Scripts that are stored in a specific place and executed before or after the generation process. -- **Context.** The set of values that the *template rendering engine* uses to render templates -- **Question management.** Manages the questions across multiple overlays in a composition. Handles actual validation (Passes UI a validation function for each question) -- **User input.** Manages the questioning, validation, and error handling of user input for the pattern questions. -- **Migrations.** Adding overlays and updating overlays on projects - - -```mermaid -flowchart LR - CLI(Entry Point) - UI(User\nInterface) - QMgr(Question\nManager) - Render(Rendering) - Hook(Hooks) - User(User) - Comp(Composition) - Pat(Pattern) - PatSource(Pattern\nSource\nManager) - User -->|Calls| CLI - CLI -->|Sets up| UI - CLI -->|Passes info to| QMgr - CLI -->|Validates| Comp - QMgr <-->|Gets questions from| Comp - Comp <-->|Gets questions from| Pat - QMgr -->|Requests answer from| UI - UI -->|Gives answer to| QMgr - QMgr --> Render - Render -->|Gets source from| PatSource - Render --> Hook -``` - -## Location - -The location is a hashable reference to a source. A location consists of a `url` and `path` combination. - -At least one of `path` or `url` must be specified. When `url` is specified, the `path` is resolved using the root of the repository. When `url` is unspecified, the path is resolved using the local filesystem and current working directory. - -### Examples - -- Supports normal URLs (scheme://netloc/path;parameters?query#fragment) and SSH urls (user@domain/path) - -- specify branches, tags, or commits - - - GitHub: - - `https://github.com/owner/repository/tree/[branch-or-tag]` - - `https://github.com/owner/repository/commit/[commit-SHA]` - - GitLab: - - `https://gitlab.com/owner/repository/-/tree/[branch-or-tag]` - - `https://gitlab.com/owner/repository/-/commit/[commit-SHA]` - - Using `@` or `#`: - - `https:///owner/repository@[branch/tag/commit]` - - `https:///owner/repository#[branch/tag/commit]` - -- relative or absolute path to the object within the URL or local filesystem - - -## Pattern - -A _pattern_ consists of a set of template files and a configuration file. The configuration file defines the context required to render the template and the rendering rules. - -*Patterns* are meant to be focused and reusable. *Patterns* are combined with other *patterns* using a *composition.* - -*Patterns* are renderable as-is. They do not need to be a part of a composition. - -### Pattern configuration - -The pattern configuration file have a flexible suffix: `.yaml`, `.json`, `.toml` - -Includes: - -- Pattern settings -- Question objects -- Choice objects - -### Pattern Templates - -- how context is presented -- can you have templates fill parts of other overlays? - - Like treating each overlay as a chain map -- need to figure out how to use inheritance and multiple sources of templates -- need to figure out all the files (including overwrites and ) - -## Pattern source manager - -- Contains the interface for accessing local copies of the pattern templates -- Caching logic - - Local checkouts for remote repositories -- Hashing sources to detect changes - -### Sources of patterns - -- Local directory - - For local Git repositories, we will need to deal with the potential of a dirty repo and how that affects the snapshot - - Treat it as a Non-Git repository - - Don't allow dirty repositories: raise an error - - Non-Git directories - - Hash the contents of the directory. - - Treat it as "always new". - -## Composition - -A composition defines a set of overlays and how they should interact. - -The composition file is a list of overlay objects. An overlay is a reference to a pattern configuration with the ability to adjust the pattern's configuration. - - ## Template engine ?? @@ -168,22 +56,6 @@ The composition file is a list of overlay objects. An overlay is a reference to ?? -## Context - -?? - -## Question manager - -- Treats everything as a composition. -- Resolves the dependency tree for questions across all overlays -- Uses the *User Interface* to ask questions and updates context and dependencies -- Output is a single context used to render all templates -- Handles validation - - Can pass validation function for each question to user interface -- Interface: - - `Pattern` or `Composition` - - `UI` (reference) - ## User interface - Provides interface for different types of questions, validation, error handling, etc @@ -191,13 +63,13 @@ The composition file is a list of overlay objects. An overlay is a reference to - Abstract enough that it is pluggable for both console or web or other - Interface - - `type` - - `prompt` - - `help` - - `choices` - - `multiselect` - - `default` (pre-rendered) - - `validator` (a function to call to validate the input) + - `type` + - `prompt` + - `help` + - `choices` + - `multiselect` + - `default` (pre-rendered) + - `validator` (a function to call to validate the input) - Returns the answer ## Migrations @@ -208,20 +80,20 @@ flowchart LR ``` - The anchor for changes is: - - The location of the - - the hashed value of the composition and its overlays - - This detects changes to overridden values and changes to pattern configuration locations (like a more up-to-date git reference) - - + - The location of the + - the hashed value of the composition and its overlays + - This detects changes to overridden values and changes to pattern configuration locations (like a more up-to-date git reference) + - - What to store - - Store the composition location - - Store the composition contents hash to detect if its overrides have changed - - This catches when the pattern configuration location changes (like a more up-to-date git reference) - - For each pattern - - Store the requested location from the overlay - - This will provide information if a specific version of the pattern was requested - - The location may be very generic (like a GitHub repo), or very specific (commit 123456 of the repo) - - Store the location used: - - For git URLs, this would be a URL to a specific reference - - Will need to be able to resolve the specificity of Git references - - branches -> current commit - - tags -> commit + - Store the composition location + - Store the composition contents hash to detect if its overrides have changed + - This catches when the pattern configuration location changes (like a more up-to-date git reference) + - For each pattern + - Store the requested location from the overlay + - This will provide information if a specific version of the pattern was requested + - The location may be very generic (like a GitHub repo), or very specific (commit 123456 of the repo) + - Store the location used: + - For git URLs, this would be a URL to a specific reference + - Will need to be able to resolve the specificity of Git references + - branches -> current commit + - tags -> commit diff --git a/docs/howtos/index.md b/docs/howtos/index.md index 51b49f4..c4be80d 100644 --- a/docs/howtos/index.md +++ b/docs/howtos/index.md @@ -4,7 +4,7 @@ summary: Recipes for common tasks using Project Forge. date: 2024-08-26 --- -The *How To's* are intended as recipes for common tasks using project-forge. See the API reference for detailed reference documentation and function, class etc definitions. +The *How To's* are intended as recipes for common tasks using project-forge. See the API reference for detailed reference documentation and function, class etc definitions. !!! warning diff --git a/docs/index.md b/docs/index.md index b1aea5f..d870124 100644 --- a/docs/index.md +++ b/docs/index.md @@ -7,10 +7,10 @@ comments: true # Project Forge -{% - include-markdown - "../README.md" - start="" +{% + include-markdown + "../README.md" + start="" end="" rewrite-relative-urls=false %} diff --git a/docs/installation.md b/docs/installation.md index f0662ca..e76cc34 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -8,7 +8,6 @@ date: 2024-08-26 Installation instructions not implemented yet! - ## Installing the Stable Release from PyPI To install project-forge, run this command in your terminal: diff --git a/docs/quickstart.md b/docs/quickstart.md index 93c106e..a6ad47a 100644 --- a/docs/quickstart.md +++ b/docs/quickstart.md @@ -17,13 +17,13 @@ Getting started quickly with Project Forge. From source...from pypi? ## The Basics + To use `project-forge` in a project: ```python import project_forge ``` - ## Basic Operations ## Tips and Tricks diff --git a/docs/reference/composition.md b/docs/reference/composition.md new file mode 100644 index 0000000..f3def2b --- /dev/null +++ b/docs/reference/composition.md @@ -0,0 +1,7 @@ +# Composition + +A [composition](api/project_forge/configurations/composition.md#project_forge.configurations.composition.Composition) +defines a set of overlays and methods of context manipulation. + +The composition file is a list of overlay objects. An overlay is a reference to a pattern configuration with the ability +to adjust the pattern's configuration. diff --git a/docs/reference/context.md b/docs/reference/context.md new file mode 100644 index 0000000..7b88f69 --- /dev/null +++ b/docs/reference/context.md @@ -0,0 +1,21 @@ +# Context + +The context holds the variables available when rendering a template. It is a nested key/value data structure. + +## Building the context + +Patterns provide the core context by asking the user a question and associating the answer with a key. + +Patterns, Overlays, and Compositions all have `extra_context` attributes that provide a method to add key/values to the context without prompting the user. + +Overlays provide an `answer_map` attribute to map one pattern key/value to another. + +Compositions use `merge_keys` to merge the values of common pattern keys. + +Contexts are built iteratively question by question and pattern by pattern. + +The default answer of a question to be the answer to a previous question. + +Patterns may have keys that whose answers should be the same, but their keys are different. For example, one pattern might use `project_name` and another might use `library_name`. The overlay's `answer_map` allows you to map the answer of `project_name` to answer of `library_name`. + +Patterns that define complex data structures, such as `list`s or `dict`s, may be merged between patterns using the composition's `merge_keys` attribute. For example, if several patterns define a `requirements` dict as in their `extra_context`, you can have the composition merge all the values of `requirements`. diff --git a/docs/reference/index.md b/docs/reference/index.md index b61d8f6..444bf4e 100644 --- a/docs/reference/index.md +++ b/docs/reference/index.md @@ -4,12 +4,16 @@ summary: Technical reference of Project Forge. date: 2024-08-26 --- -The *Reference* is intended as technical descriptions of the parts of project-forge. +# Reference -!!! warning - - Reference not implemented yet! - -Reference guides are technical descriptions of the machinery and how to operate it. Reference material is **information-oriented.** - -[More information](https://diataxis.fr/reference/) +- **Location.** A location is a reference to a source. +- **Pattern.** A set of template files to render and a rendering configuration file. +- **Pattern source management.** Downloading and caching the pattern sources (git repos, local directories) +- **Overlay.** A reference to a pattern and the configuration for using it in a specific composition. +- **Composition.** A list of overlays and context to render a project. +- **Template Rendering Engine.** The system that defines the structure of the templates and renders them into the final product +- **Hooks.** Scripts that are stored in a specific place and executed before or after the generation process. +- **Context.** The set of values that the *template rendering engine* uses to render templates +- **Question management.** Manages the questions across multiple overlays in a composition. Handles actual validation (Passes UI a validation function for each question) +- **User input.** Manages the questioning, validation, and error handling of user input for the pattern questions. +- **Migrations.** Adding overlays and updating overlays on projects diff --git a/docs/reference/location.md b/docs/reference/location.md new file mode 100644 index 0000000..9beb699 --- /dev/null +++ b/docs/reference/location.md @@ -0,0 +1,58 @@ +# Location + +The [location](api/project_forge/core/location.md/) is a hashable reference to a source. A location consists of a `url` and `path` combination. + +All fields that accept a [location](api/project_forge/core/location.md/) object will also accept a string representing a URL _or_ a path. So the following are equivalent: + +```toml title="Locations specified by strings" +overlays = [ + { pattern_location = "python-package/pattern.toml" }, + { pattern_location = "https://github.com/owner/repository/" } +] +``` + +```toml title="Locations specified by objects" +overlays = [ + { pattern_location = { path = "python-package/pattern.toml" } }, + { pattern_location = { url = "https://github.com/owner/repository/" } } +] +``` + +At least one of `path` or `url` must be specified. Here is how the `url` and `path` attributes work together: + +- **`url` specified, `path` specified:** The `path` is resolved using the root of the repository. Relative paths cannot resolve to locations outside the repository. +- **`url` specified, `path` unspecified:** The `path` is the root of the repository. + +- **`url` unspecified, `path` specified:** The `path` is resolved using the local filesystem and current working directory. + +## Supported URL formats + +- **Normal URLs:** `scheme://netloc/path;parameters?query#fragment` +- **SSH urls:** `user@domain/path` + +## Path formats + +- relative or absolute path to the object within the URL or local filesystem + +## Recipes + +### Specify branches, tags, or commits + +**GitHub** + +- `https://github.com/owner/repository/tree/[branch-or-tag]` +- `https://github.com/owner/repository/commit/[commit-SHA]` + +**GitLab** + +- `https://gitlab.com/owner/repository/-/tree/[branch-or-tag]` +- `https://gitlab.com/owner/repository/-/commit/[commit-SHA]` + +**Using `@` or `#`** + +- `https:///owner/repository@[branch/tag/commit]` +- `https:///owner/repository#[branch/tag/commit]` + +### Specify a directory within a URL + +Specify both the `url` and the `path` attributes. The `path` should be the path from the root of the repository to the location. diff --git a/docs/reference/pattern.md b/docs/reference/pattern.md new file mode 100644 index 0000000..0a297d7 --- /dev/null +++ b/docs/reference/pattern.md @@ -0,0 +1,197 @@ +# Pattern + +[Patterns](api/project_forge/configurations/pattern.md#project_forge.configurations.pattern.Pattern) are meant to be focused and reusable chunks of templated content. Although patterns are renderable as-is, you may combine patterns using a *composition.* + +A [pattern](api/project_forge/configurations/pattern.md#project_forge.configurations.pattern.Pattern) consists of a set of template files and a configuration file. + +## Pattern configuration + +The configuration file defines the context required to render the template and the rendering rules. + +You may use YAML, JSON, or TOML formatting to define the configuration. + +=== "TOML" + + ```toml + template_location = "{{ repo_name }}" + copy_only = [ + "overrides/**/*", "overrides/**/.*" + ] + + [[questions]] + name = "project_name" + prompt = "What is the human-friendly name of the project?" + type = "str" + default = "My Project" + + [[questions]] + name = "package_name" + prompt = "What is the name of the Python package?" + type = "str" + default = "{{ project_name|lower|replace(' ', '_') }}" + + [[questions]] + name = "repo_name" + prompt = "What is the name of the project repository?" + type = "str" + default = "{{ package_name|replace('_', '-') }}" + + [[questions]] + name = "project_description" + help = "A sentence or two about what this project does." + type = "str" + default = "" + + [extra_context.requirements] + docs = [ + "black", + "markdown-customblocks", + "mdx-truly-sane-lists", + "mkdocs", + "mkdocs-click", + "mkdocs-gen-files", + "mkdocs-git-authors-plugin", + "mkdocs-git-committers-plugin", + "mkdocs-git-revision-date-localized-plugin", + "mkdocs-include-markdown-plugin", + "mkdocs-literate-nav", + "mkdocs-material", + "mkdocs-section-index", + "mkdocstrings[python]", + "python-frontmatter" + ] + ``` + +=== "JSON" + + ```json + { + "template_location": "{{ repo_name }}", + "copy_only": [ + "overrides/**/*", + "overrides/**/.*" + ], + "questions": [ + { + "name": "project_name", + "prompt": "What is the human-friendly name of the project?", + "type": "str", + "default": "My Project" + }, + { + "name": "package_name", + "prompt": "What is the name of the Python package?", + "type": "str", + "default": "{{ project_name|lower|replace(' ', '_') }}" + }, + { + "name": "repo_name", + "prompt": "What is the name of the project repository?", + "type": "str", + "default": "{{ package_name|replace('_', '-') }}" + }, + { + "name": "project_description", + "help": "A sentence or two about what this project does.", + "type": "str", + "default": "" + } + ], + "extra_context": { + "requirements": { + "docs": [ + "black", + "markdown-customblocks", + "mdx-truly-sane-lists", + "mkdocs", + "mkdocs-click", + "mkdocs-gen-files", + "mkdocs-git-authors-plugin", + "mkdocs-git-committers-plugin", + "mkdocs-git-revision-date-localized-plugin", + "mkdocs-include-markdown-plugin", + "mkdocs-literate-nav", + "mkdocs-material", + "mkdocs-section-index", + "mkdocstrings[python]", + "python-frontmatter" + ] + } + } + } + ``` + +=== "YAML" + + ```yaml + template_location: '{{ repo_name }}' + copy_only: + - overrides/**/* + - overrides/**/.* + questions: + - default: My Project + name: project_name + prompt: What is the human-friendly name of the project? + type: str + - default: '{{ project_name|lower|replace('' '', ''_'') }}' + name: package_name + prompt: What is the name of the Python package? + type: str + - default: '{{ package_name|replace(''_'', ''-'') }}' + name: repo_name + prompt: What is the name of the project repository? + type: str + - default: '' + help: A sentence or two about what this project does. + name: project_description + type: str + extra_context: + requirements: + docs: + - black + - markdown-customblocks + - mdx-truly-sane-lists + - mkdocs + - mkdocs-click + - mkdocs-gen-files + - mkdocs-git-authors-plugin + - mkdocs-git-committers-plugin + - mkdocs-git-revision-date-localized-plugin + - mkdocs-include-markdown-plugin + - mkdocs-literate-nav + - mkdocs-material + - mkdocs-section-index + - mkdocstrings[python] + - python-frontmatter + ``` + +Includes: + +- Pattern settings +- Question objects +- Choice objects + +## Pattern Templates + +- how context is presented +- can you have templates fill parts of other overlays? + - Like treating each overlay as a chain map +- need to figure out how to use inheritance and multiple sources of templates +- need to figure out all the files (including overwrites and ) + +## Pattern source manager + +- Contains the interface for accessing local copies of the pattern templates +- Caching logic + - Local checkouts for remote repositories +- Hashing sources to detect changes + +### Sources of patterns + +- Local directory + - For local Git repositories, we will need to deal with the potential of a dirty repo and how that affects the snapshot + - Treat it as a Non-Git repository + - Don't allow dirty repositories: raise an error + - Non-Git directories + - Hash the contents of the directory. + - Treat it as "always new". diff --git a/docs/reference/question.md b/docs/reference/question.md new file mode 100644 index 0000000..24d5638 --- /dev/null +++ b/docs/reference/question.md @@ -0,0 +1,11 @@ +# Questions + +- Treats everything as a composition. +- Resolves the dependency tree for questions across all overlays +- Uses the *User Interface* to ask questions and updates context and dependencies +- Output is a single context used to render all templates +- Handles validation + - Can pass validation function for each question to user interface +- Interface: + - `Pattern` or `Composition` + - `UI` (reference) diff --git a/docs/tutorials/create_a_pattern.md b/docs/tutorials/create_a_pattern.md index 79e2cc7..30b5ba1 100644 --- a/docs/tutorials/create_a_pattern.md +++ b/docs/tutorials/create_a_pattern.md @@ -9,7 +9,7 @@ comments: true We are going to convert an existing project into a pattern. This process is going to require _lots_ of search and replace. -In another tutorial, we will break it into several patterns. +In another tutorial, we will break it into several patterns. ## Setup @@ -20,7 +20,7 @@ In another tutorial, we will break it into several patterns. !!! Note -​ If you are doing this with an actual project, remove the `.git` directory if it exists. + If you are doing this with an actual project, remove the `.git` directory if it exists. 4. Inside the `patterns/` directory, create a file named `core_pattern.toml` @@ -52,7 +52,7 @@ Now, let's deal with the outer folder name and the code folder. Python package n We'll call the name of the code folder the `package_name`. Add this question to `core_pattern.toml`: -```toml title="patterns/core_pattern.toml" +```toml title="patterns/core_pattern.toml" # ... previous question [[questions]] @@ -68,7 +68,7 @@ This sets the default answer to a modification of the previous question's answer We'll call the name of the outer folder the `repo_name`. Add this question to `core_pattern.toml`: -```toml title="patterns/core_pattern.toml" +```toml title="patterns/core_pattern.toml" # ... previous questions [[questions]] diff --git a/mkdocs.yml b/mkdocs.yml index 3e52362..97df370 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -49,7 +49,8 @@ markdown_extensions: - name: mermaid class: mermaid format: !!python/name:pymdownx.superfences.fence_code_format - - pymdownx.tabbed + - pymdownx.tabbed: + alternate_style: true - smarty - toc: permalink: true @@ -80,6 +81,9 @@ plugins: ignore_init_summary: true docstring_section_style: spacy enable_inventory: true + extensions: + - griffe_pydantic: + schema: true group_by_category: true members_order: alphabetical merge_init_into_class: true diff --git a/project_forge/cli.py b/project_forge/cli.py index 15ffdfb..6f6da6f 100644 --- a/project_forge/cli.py +++ b/project_forge/cli.py @@ -8,6 +8,7 @@ from project_forge import __version__ from project_forge.core.io import parse_file +from project_forge.tui import ask_question @click.group( @@ -79,4 +80,10 @@ def build( if data: initial_context |= dict(data) - build_project(composition, output_dir=output_dir, use_defaults=use_defaults, initial_context=initial_context) + build_project( + composition, + output_dir=output_dir, + ui_function=ask_question, + use_defaults=use_defaults, + initial_context=initial_context, + ) diff --git a/project_forge/commands/build.py b/project_forge/commands/build.py index c6b5e79..976a01f 100644 --- a/project_forge/commands/build.py +++ b/project_forge/commands/build.py @@ -6,17 +6,21 @@ from project_forge.configurations.composition import read_composition_file from project_forge.context_builder.context import build_context +from project_forge.core.models import BuildResult, UIFunction from project_forge.rendering.environment import load_environment from project_forge.rendering.render import render_env from project_forge.rendering.templates import catalog_inheritance -from project_forge.tui import ask_question logger = logging.getLogger(__name__) def build_project( - composition_file: Path, output_dir: Path, use_defaults: bool = False, initial_context: Optional[dict] = None -) -> None: + composition_file: Path, + output_dir: Path, + ui_function: UIFunction, + use_defaults: bool = False, + initial_context: Optional[dict] = None, +) -> BuildResult: """Render a project to a directory.""" initial_context = initial_context or {} composition = read_composition_file(composition_file) @@ -24,9 +28,10 @@ def build_project( if use_defaults: for overlay in composition.overlays: overlay.ask_questions = False - context = build_context(composition, ask_question, initial_context) + context = build_context(composition, ui_function, initial_context) template_paths = [overlay.pattern.template_location.resolve() for overlay in composition.overlays] # type: ignore[union-attr] inheritance = catalog_inheritance(template_paths) env = load_environment(inheritance) - render_env(env, inheritance, context, output_dir) + root_path = render_env(env, inheritance, context, output_dir) + return BuildResult(root_path, context) diff --git a/project_forge/configurations/pattern.py b/project_forge/configurations/pattern.py index 970b928..86d7783 100644 --- a/project_forge/configurations/pattern.py +++ b/project_forge/configurations/pattern.py @@ -6,7 +6,7 @@ *Patterns* are meant to be focused and reusable. *Patterns* are combined with other *patterns* using a *composition.* -*Patterns* are renderable as is. They do not need to be a part of a composition. +*Patterns* are renderable as-is. They do not need to be a part of a composition. """ from pathlib import Path @@ -33,8 +33,8 @@ class Choice(BaseModel): description=( "A template string that will render as `True` if the choice is not valid based on previous context " "values.\n\n" - "Take care to have at least one option without a `when` clause to avoid accidentally creating a situation " - "with no valid choices." + "Take care to have at least one option without a `skip_when` clause to avoid accidentally creating " + "a situation with no valid choices." ), ) @@ -57,8 +57,6 @@ def convert_scalar_to_choice(cls, value: Any) -> Any: return result_dict -"""Valid values for question types.""" - QUESTION_TYPE_VALIDATORS = { "int": is_int, "float": is_float, diff --git a/project_forge/core/models.py b/project_forge/core/models.py index 4c23644..85b5fcb 100644 --- a/project_forge/core/models.py +++ b/project_forge/core/models.py @@ -1,28 +1,8 @@ """Data models core to project forge.""" -from typing import Any, Callable, Literal, Optional, Protocol, TypeVar, Union - -T = TypeVar("T") - - -class UndefinedType: - """A singleton that indicates an undefined state.""" - - def __repr__(self) -> str: - return "Undefined" - - def __copy__(self: T) -> T: - return self - - def __reduce__(self) -> str: - return "Undefined" - - def __deepcopy__(self: T, _: Any) -> T: - return self - - -Undefined = UndefinedType() -Skipped = Undefined +from dataclasses import dataclass +from pathlib import Path +from typing import Any, Callable, Literal, Optional, Protocol, Union TemplateEngine = Literal["default"] """Supported template engines.""" @@ -45,7 +25,18 @@ def __deepcopy__(self: T, _: Any) -> T: VARIABLE_REGEX = r"[a-zA-Z_][\w_]*" """The regular expression to validate a variable name. -Must start with a letter and can contain alpha-numeric and underscores.""" +Must start with a letter and can contain alphanumeric and underscores.""" + + +@dataclass +class BuildResult: + """The result of a build operation.""" + + root_path: Path + """The path to the rendered project.""" + + context: dict[str, Any] + """The rendered context for the project.""" class UIFunction(Protocol): @@ -60,6 +51,7 @@ def __call__( default: Any = None, multiselect: bool = False, validator_func: Optional[Callable] = None, + **kwargs: Any, ) -> Any: """ A function that asks the user for input. @@ -72,6 +64,7 @@ def __call__( default: The default value. multiselect: Can the user select multiple answers? validator_func: A callable that takes an answer and returns True if it is valid. + **kwargs: Additional keyword arguments to pass to the UI function. Returns: The answer to the prompt. diff --git a/project_forge/core/validators.py b/project_forge/core/validators.py index df1bd0d..14a8810 100644 --- a/project_forge/core/validators.py +++ b/project_forge/core/validators.py @@ -33,7 +33,7 @@ def __call__(self, value: T) -> T: def is_int(value: Any) -> bool: - """Is the value an int or convertable to an int?""" + """Is the value an int or convertible to an int?""" if not isinstance(value, (int, float, str, bool)): return False @@ -45,7 +45,7 @@ def is_int(value: Any) -> bool: def is_float(value: Any) -> bool: - """Is the value a float or convertable to a float?""" + """Is the value a float or convertible to a float?""" if not isinstance(value, (int, float, str, bool)): return False @@ -57,7 +57,7 @@ def is_float(value: Any) -> bool: def is_bool(value: Any) -> bool: - """Is the value a boolean or convertable to a boolean?""" + """Is the value a boolean or convertible to a boolean?""" if not isinstance(value, (int, float, str, bool)): return False diff --git a/project_forge/git_commands.py b/project_forge/git_commands.py index 9c4801e..29e2f2a 100644 --- a/project_forge/git_commands.py +++ b/project_forge/git_commands.py @@ -10,7 +10,6 @@ from git import GitCommandError, InvalidGitRepositoryError, NoSuchPathError, Repo from project_forge.core.exceptions import GitError -from project_forge.core.io import remove_single_path from project_forge.core.urls import ParsedURL logger = logging.getLogger(__name__) @@ -241,6 +240,9 @@ def temp_git_worktree_dir( raise GitError(f"Could not create a worktree for {repo_path}") from e finally: # Clean up the temporary working directory. - remove_single_path(worktree_path) - remove_single_path(tmp_dir) + # Windows has an issue with this: + # The process cannot access the file because it is being used by another process + # Since these will get purged by the OS, I'm not going to worry about determining the problem. + # remove_single_path(worktree_path) + # remove_single_path(tmp_dir) repo.git.worktree("prune") diff --git a/project_forge/rendering/render.py b/project_forge/rendering/render.py index a6ce1bf..46b5510 100644 --- a/project_forge/rendering/render.py +++ b/project_forge/rendering/render.py @@ -1,8 +1,6 @@ """Functions to render a composition using answered questions.""" import logging -import pprint -from io import StringIO from pathlib import Path from jinja2 import Environment @@ -13,15 +11,15 @@ logger = logging.getLogger(__name__) -def render_env(env: Environment, path_list: InheritanceMap, context: dict, destination_path: Path): +def render_env(env: Environment, path_list: InheritanceMap, context: dict, destination_path: Path) -> Path: """Render the templates in path_list using context.""" - context_stream = StringIO() - pprint.pprint(context, context_stream) - logger.debug(f"Rendering templates using context:\n{context_stream.getvalue()}") + project_root = None for path, val in path_list.items(): dst_rel_path = render_expression(path, context) full_path = destination_path / dst_rel_path + if project_root is None: + project_root = full_path if not val.exists(): raise ValueError(f"Path {path} does not exist") @@ -36,3 +34,4 @@ def render_env(env: Environment, path_list: InheritanceMap, context: dict, desti full_path.mkdir(parents=True, exist_ok=True) else: raise ValueError(f"Path {val} does not exist") + return project_root diff --git a/project_forge/rendering/templates.py b/project_forge/rendering/templates.py index 4c6549d..e28a75b 100644 --- a/project_forge/rendering/templates.py +++ b/project_forge/rendering/templates.py @@ -41,10 +41,10 @@ def catalog_templates(template_dir: Path) -> Dict[str, Path]: for root, dirs, files in template_dir.walk(): for file in files: template_path = root / file - templates[str(template_path.relative_to(root_dir))] = template_path + templates[str(template_path.relative_to(root_dir).as_posix())] = template_path for dir_ in dirs: template_path = root / dir_ - templates[str(template_path.relative_to(root_dir))] = template_path + templates[str(template_path.relative_to(root_dir).as_posix())] = template_path return {key: templates[key] for key in sorted(templates)} diff --git a/project_forge/testing/__init__.py b/project_forge/testing/__init__.py new file mode 100644 index 0000000..b93d47f --- /dev/null +++ b/project_forge/testing/__init__.py @@ -0,0 +1,107 @@ +"""Utilities for testing Project Forge patterns and compositions.""" + +import os +import pathlib +import subprocess +from contextlib import contextmanager +from dataclasses import dataclass +from pathlib import Path +import shlex +from subprocess import CompletedProcess +from typing import Generator, Optional, Any, Callable + +from project_forge.commands.build import build_project +from project_forge.core.models import QuestionType + + +@contextmanager +def inside_dir(dir_path: Path) -> Generator[None, None, None]: + """ + Temporarily switch the current directory to the given path. + + Args: + dir_path: path of the directory the command is being run. + """ + old_path = os.getcwd() + try: + os.chdir(dir_path) + yield + finally: + os.chdir(old_path) + + +def run_inside_dir(command: str, dir_path: Path) -> CompletedProcess: + """ + Run a command from inside a given directory, returning the exit status + + Args: + command: Command string to execute within the directory + dir_path: String, path of the directory the command is being run. + + Returns: + The result code of the command. + """ + with inside_dir(dir_path): + return subprocess.run(shlex.split(command), capture_output=True, check=True) + + +def use_default_ui( + prompt: str, + type: QuestionType = "str", + help: Optional[str] = None, + choices: Optional[dict] = None, + default: Any = None, + multiselect: bool = False, + validator_func: Optional[Callable] = None, + **kwargs, +) -> Any: + """A testing UI that simply returns the default answer.""" + return default + + +@dataclass +class Result: + """Holds the captured result of the cookiecutter project generation.""" + + exception: Optional[BaseException] = None + exit_code: str | int = 0 + project_dir: Optional[pathlib.Path] = None + context: Optional[dict] = None + + +class Forger: + """Class to provide convenient access to the project_forge API.""" + + def __init__(self, output_dir: pathlib.Path): + self._output_dir = output_dir + + def forge( + self, config_path: Optional[pathlib.Path], use_defaults: bool = False, initial_context: Optional[dict] = None + ) -> Result: + """Build a project from the given config.""" + exception: Optional[BaseException] = None + exit_code: str | int = 0 + build_result = None + + try: + build_result = build_project( + composition_file=config_path, + output_dir=self._output_dir, + use_defaults=use_defaults, + ui_function=use_default_ui, + initial_context=initial_context, + ) + except SystemExit as e: # pragma: no-coverage + if e.code != 0: + exception = e + exit_code = e.code + except Exception as e: # pragma: no-coverage + exception = e + exit_code = -1 + + return Result( + exception=exception, + exit_code=exit_code, + project_dir=build_result.root_path if build_result else None, + context=build_result.context if build_result else None, + ) diff --git a/project_forge/testing/plugin.py b/project_forge/testing/plugin.py new file mode 100644 index 0000000..98cdc20 --- /dev/null +++ b/project_forge/testing/plugin.py @@ -0,0 +1,32 @@ +"""Utilities for testing the rendering of projects.""" + +import pathlib + +import pytest +from _pytest.fixtures import FixtureRequest + +from project_forge.testing import Forger + + +@pytest.fixture +def forger(request: FixtureRequest, tmp_path: pathlib.Path): + """ + Yield an instance of the Forger helper class that can be used to generate a project from a template. + """ + output_path = request.config.getoption("forge_output_dir") or tmp_path + if output_path.is_file(): + raise ValueError(f"The output path {output_path} is a file, not a directory.") + output_path.mkdir(parents=True, exist_ok=True) + yield Forger(output_path) + + +def pytest_addoption(parser): + group = parser.getgroup("forger") + group.addoption( + "--forge-output-dir", + action="store", + required=False, + dest="forge_output_dir", + help="store rendered projects here", + type=pathlib.Path, + ) diff --git a/pyproject.toml b/pyproject.toml index 69b6a41..aebdc33 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -10,6 +10,7 @@ classifiers = [ "Intended Audience :: Developers", "Natural Language :: English", "Programming Language :: Python :: 3.12", + "Framework :: Pytest", ] keywords = ["project_forge"] dynamic = ["version"] @@ -28,7 +29,7 @@ dependencies = [ "rich-click>=1.8.3", ] authors = [ - { name = "Calloway Project", email = "coreyoordt@gmail.com" }, + { name = "Calloway Project", email = "coreyoordt@gmail.com" }, ] [project.readme] @@ -41,7 +42,7 @@ Documentation = "https://callowayproject.github.io/project_forge" Repository = "https://github.com/callowayproject/project-forge" Changelog = "https://github.com/callowayproject/project-forge/CHANGELOG.md" -[project.optional-dependencies] +[dependency-groups] dev = [ "bump-my-version", "generate-changelog>=0.7.6", @@ -50,6 +51,7 @@ dev = [ ] test = [ "coverage>=6.1.2", + "gitpython", "pre-commit>=2.15.0", "pytest-cov>=3.0.0", "pytest>=6.0.0", @@ -57,6 +59,7 @@ test = [ ] docs = [ "black", + "griffe-pydantic", "markdown-customblocks", "mdx-truly-sane-lists", "mkdocs", @@ -76,6 +79,9 @@ docs = [ [project.scripts] project-forge = "project_forge.cli:cli" +[project.entry-points.pytest11] +forger = "project_forge.testing.plugin" + [tool.hatch.version] path = "project_forge/__init__.py" @@ -84,6 +90,7 @@ python_version = "3.12" [tool.coverage.run] branch = true +source = ["project_forge"] omit = ["**/test_*.py", "**/__main__.py"] [tool.coverage.report] @@ -98,16 +105,7 @@ exclude_lines = [ "pragma: no-coverage", ] -[tool.coverage.html] -directory = "test-reports/htmlcov" - [tool.pytest.ini_options] -addopts = [ - "--cov=project_forge", - "--cov-branch", - "--cov-report=term", - "--cov-report=html", -] norecursedirs = [ ".*", "build", @@ -118,7 +116,11 @@ norecursedirs = [ "requirements*", "lib", ] -python_files = "test*.py" +python_files = [ + "test_*.py", + "*_test.py", + "tests.py", +] [tool.interrogate] ignore-init-method = true @@ -196,8 +198,6 @@ select = [ ignore = [ "ANN002", # missing-type-args "ANN003", # missing-type-kwargs - "ANN101", # missing-type-self - "ANN102", # missing-type-cls "ANN204", # missing-return-type-special-method "ANN401", # any-type "S101", # assert @@ -226,7 +226,6 @@ typing-modules = ["typing", "types", "typing_extensions", "mypy", "mypy_extensio "tests/*" = ["S101", "PLR0913", "PLR0915", "PGH003", "ANN001", "ANN202", "ANN201", "PLR0912", "TRY301", "PLW0603", "PLR2004", "ANN101", "S106", "TRY201", "ANN003", "ANN002", "S105", "TRY003"] [tool.ruff.lint.mccabe] -# Unlike Flake8, default to a complexity level of 10. max-complexity = 10 [tool.ruff.lint.isort] @@ -247,9 +246,9 @@ exclude = '\.git|tests' require-return-section-when-returning-nothing = false arg-type-hints-in-docstring = false check-return-types = false +skip-checking-raises = true quiet = true - [tool.bumpversion] current_version = "0.2.0" commit = true diff --git a/tests/conftest.py b/tests/conftest.py index fcaa820..6bc9505 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,32 +1,14 @@ """Configuration and utilities for PyTest.""" import sys -from contextlib import contextmanager from pathlib import Path -from typing import Generator from git import Actor, Repo import pytest from project_forge.core.io import remove_single_path - -@contextmanager -def inside_dir(dirpath: Path) -> Generator: - """ - Temporarily switch to a specific directory. - - Args: - dirpath: Path of the directory to switch to - """ - import os - - old_path = os.getcwd() - try: - os.chdir(dirpath) - yield - finally: - os.chdir(old_path) +pytest_plugins = ["pytester", "forger"] @pytest.fixture(scope="session") @@ -72,7 +54,6 @@ def default_origin(tmp_path: Path) -> Repo: tmp_repo.remotes.origin.push("remote-branch") tmp_repo.remotes.origin.push("v1.0.0") - remove_single_path(tmp_repo_path) return origin diff --git a/tests/fixtures/mkdocs/{{ repo_name }}/pyproject.toml b/tests/fixtures/mkdocs/{{ repo_name }}/pyproject.toml new file mode 100644 index 0000000..53fe2e8 --- /dev/null +++ b/tests/fixtures/mkdocs/{{ repo_name }}/pyproject.toml @@ -0,0 +1 @@ +{% extends "{{ repo_name }}/pyproject.toml" %} diff --git a/tests/test_caching.py b/tests/test_caching.py index 71671b1..b2dcf58 100644 --- a/tests/test_caching.py +++ b/tests/test_caching.py @@ -53,7 +53,7 @@ class TestGetRemoteClone: @patch("project_forge.caching.clone") @patch("project_forge.caching.remove_single_path") def test_repo_is_cloned_once_if_not_detached(self, mock_remove_single_path, mock_clone, mock_get_cache_dir): - """When the head is not detatched, the repo is only cloned once.""" + """When the head is not detached, the repo is only cloned once.""" # Assemble ParsedURL = MagicMock() ParsedURL.repo_name = "my_test_repo" @@ -73,7 +73,7 @@ def test_repo_is_cloned_once_if_not_detached(self, mock_remove_single_path, mock @patch("project_forge.caching.clone") @patch("project_forge.caching.remove_single_path") def test_repo_is_cloned_twice_if_detached(self, mock_remove_single_path, mock_clone, mock_get_cache_dir): - """If the head is detatched, the repo is cloned, deleted, and cloned again.""" + """If the head is detached, the repo is cloned, deleted, and cloned again.""" # Assemble ParsedURL = MagicMock() ParsedURL.repo_name = "my_test_repo" diff --git a/tests/test_cli.py b/tests/test_cli.py index e3c629d..b83c00f 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -3,6 +3,7 @@ import pytest from project_forge.cli import build +from project_forge.tui import ask_question from click.testing import CliRunner @@ -38,7 +39,7 @@ def test_use_defaults_passed_to_build_project(self, mock_build_project, runner: assert result.exit_code == 0 mock_build_project.assert_called_once_with( - composition_path, output_dir=Path.cwd(), use_defaults=True, initial_context={} + composition_path, output_dir=Path.cwd(), ui_function=ask_question, use_defaults=True, initial_context={} ) @patch("project_forge.commands.build.build_project") @@ -56,7 +57,7 @@ def test_custom_output_dir_passed_to_build_project( assert result.exit_code == 0 mock_build_project.assert_called_once_with( - composition_path, output_dir=output_dir, use_defaults=False, initial_context={} + composition_path, output_dir=output_dir, ui_function=ask_question, use_defaults=False, initial_context={} ) @patch("project_forge.commands.build.build_project") @@ -78,7 +79,11 @@ def test_data_file_adds_to_initial_context( mock_parse_file.assert_called_once_with(data_file_path) mock_build_project.assert_called_once_with( - composition_path, output_dir=Path.cwd(), use_defaults=False, initial_context={"key": "value"} + composition_path, + output_dir=Path.cwd(), + ui_function=ask_question, + use_defaults=False, + initial_context={"key": "value"}, ) @patch("project_forge.commands.build.build_project") @@ -92,5 +97,9 @@ def test_data_options_adds_to_initial_context(self, mock_build_project, runner: assert result.exit_code == 0 mock_build_project.assert_called_once_with( - composition_path, output_dir=Path.cwd(), use_defaults=False, initial_context={"key": "value"} + composition_path, + output_dir=Path.cwd(), + ui_function=ask_question, + use_defaults=False, + initial_context={"key": "value"}, ) diff --git a/tests/test_core/test_io.py b/tests/test_core/test_io.py index 7c56906..558f252 100644 --- a/tests/test_core/test_io.py +++ b/tests/test_core/test_io.py @@ -97,9 +97,9 @@ def test_parse_json_file(self, tmp_path: Path): def test_unsupported_file_returns_content(self, tmp_path: Path): """Parsing an unknown file just returns the file's contents.""" test_file_path = tmp_path / "test.unsupported" - test_file_path.write_text("unsupport type file content") + test_file_path.write_text("unsupported type file content") result = io.parse_file(test_file_path) - assert result == "unsupport type file content" + assert result == "unsupported type file content" class TestMakeSurePathExists: diff --git a/tests/test_core/test_location.py b/tests/test_core/test_location.py index ba9e991..6eff3ee 100644 --- a/tests/test_core/test_location.py +++ b/tests/test_core/test_location.py @@ -45,7 +45,7 @@ def test_ensure_path_or_url(self): class TestResolve: """Tests for the `Location.resolve` method.""" - def test_url_calls_resolve_url_location(tmp_path: Path): + def test_url_calls_resolve_url_location(self, tmp_path: Path): """A location with a URL calls `resolve_url_location`.""" mocked_resolve_url_location = MagicMock("project_forge.core.location.resolve_url_location") location = Location(url="http://localhost/repo.git") @@ -140,3 +140,6 @@ def test_missing_file_raises_error(self, tmp_path: Path): with patch("project_forge.caching.clone_repo", mocked_clone_repo): with pytest.raises(PathNotFoundError): result_path = resolve_url_location(test_location) + + +# TODO[#12]: Test a location with a URL and a relative path with a `../` does not resolve outside the repository diff --git a/tests/test_rendering/test_templates.py b/tests/test_rendering/test_templates.py index b236a8f..2088b12 100644 --- a/tests/test_rendering/test_templates.py +++ b/tests/test_rendering/test_templates.py @@ -47,7 +47,7 @@ def test_result_keys_are_relative_filepaths(self, tmp_path: Path): result = catalog_templates(template1) # Assert - assert set(result.keys()) == expected_keys + assert {x.replace("\\", "/") for x in result.keys()} == expected_keys for key in expected_keys: assert (tmp_path / key).exists() diff --git a/tests/test_testing.py b/tests/test_testing.py new file mode 100644 index 0000000..7ec3ffc --- /dev/null +++ b/tests/test_testing.py @@ -0,0 +1,178 @@ +"""Tests for the `project_forge.testing` module.""" + +import contextlib +from pathlib import Path +from subprocess import CompletedProcess +from unittest.mock import patch + +import pytest +import os +from project_forge.testing import inside_dir, run_inside_dir, use_default_ui + + +class TestForgerFixture: + """Tests for the `forger` fixture.""" + + def test_forger_class(self, pytester): + """The `forger` fixture should return a `Forger` class.""" + # Assemble + pytester.makepyfile( + """ + def test_forger_fixture(forger): + assert forger.__class__.__name__ == "Forger" + assert hasattr(forger, "forge") + """ + ) + + # Act + result = pytester.runpytest() + + # Assert + if result.ret != 0: + print(result.stdout, result.stderr) + + assert result.ret == 0 + + def test_output_dir_setting_is_recognized(self, pytester, tmp_path: Path): + """The `forger-output-dir` setting should change where the project is built.""" + # Assemble + output_dir = tmp_path / "test_output" + output_dir.mkdir(parents=True, exist_ok=True) + pytester.makepyfile( + f""" + def test_forger_fixture(forger): + assert str(forger._output_dir.as_posix()) == "{output_dir.as_posix()}" + """ + ) + + # Act + result = pytester.runpytest(f"--forge-output-dir={output_dir}") + + # Assert + if result.ret != 0: + print(result.stdout, result.stderr) + + assert result.ret == 0 + + def test_raises_error_if_output_dir_setting_is_file(self, pytester, tmp_path: Path): + """If the `forger-output-dir` is a file, it raises a `ValueError`.""" + # Assemble + output_dir = tmp_path / "test_output" + output_dir.touch() + pytester.makepyfile( + f""" + def test_forger_fixture(forger): + assert str(forger._output_dir.as_posix()) == "{output_dir.as_posix()}" + """ + ) + + # Act + result = pytester.runpytest(f"--forge-output-dir={output_dir}") + + # Assert + assert "ValueError: The output path" in result.stdout.str() + + def test_forge_command_renders(self, pytester, tmp_path: Path, fixtures_dir: Path): + """The forge command properly builds a project.""" + # Assemble + composition_path = fixtures_dir.joinpath("composition1.toml").resolve() + composition_path_str = str(composition_path).replace("\\", "\\\\") + output_dir = tmp_path / "test_output" + output_dir.mkdir(parents=True, exist_ok=True) + pytester.makepyfile( + f""" + def test_forger_fixture(forger): + result = forger.forge(config_path="{composition_path_str}", use_defaults=True) + assert result.exception == None + assert result.exit_code == 0 + assert result.project_dir.exists() + assert len(result.context) > 1 + """ + ) + + # Act + result = pytester.runpytest(f"--forge-output-dir={output_dir}") + + # Assert + if result.ret != 0: + print(result.stdout, result.stderr) + + assert result.ret == 0 + assert output_dir.joinpath("my-project").exists() + + +@pytest.fixture +def temp_directory(tmp_path: Path) -> Path: + """Fixture to provide a temporary directory for testing.""" + temp_dir = tmp_path / "subdir" + temp_dir.mkdir() + return temp_dir + + +class TestInsideDir: + """Tests for the `inside_dir` context manager.""" + + def test_inside_dir_changes_directory(self, temp_directory): + """Test that inside_dir changes the current working directory.""" + initial_directory = Path(os.getcwd()) + with inside_dir(temp_directory): + assert Path(os.getcwd()) == temp_directory + assert Path(os.getcwd()) == initial_directory + + def test_inside_dir_restores_directory_on_exception(self, temp_directory): + """Test that inside_dir restores the directory in case of an exception.""" + initial_directory = Path(os.getcwd()) + with contextlib.suppress(ValueError): + with inside_dir(temp_directory): + raise ValueError("Intentional exception") + assert Path(os.getcwd()) == initial_directory + + +class TestRunInsideDir: + """Tests for the `run_inside_dir` decorator.""" + + @patch("project_forge.testing.subprocess") + @patch("project_forge.testing.inside_dir") + def test_run_inside_dir_success(self, mock_inside_dir, mock_subprocess): + """Test successful execution of a command inside a directory.""" + # Mock the result of subprocess.run + mock_subprocess.run.return_value = CompletedProcess(args=["ls"], returncode=0, stdout=b"list", stderr=b"") + + # Define the command and directory + command = "ls" + dir_path = Path("/some/path") + + # Call the function + result = run_inside_dir(command, dir_path) + + # Assertions + mock_inside_dir.assert_called_once_with(dir_path) + mock_subprocess.run.assert_called_once_with(["ls"], capture_output=True, check=True) + assert result.returncode == 0 + assert result.stdout == b"list" + + @patch("project_forge.testing.subprocess") + @patch("project_forge.testing.inside_dir") + def test_run_inside_dir_failure(self, mock_inside_dir, mock_subprocess): + """Test failed execution of a command inside a directory.""" + # Mock the result of subprocess.run + mock_subprocess.run.return_value = CompletedProcess(args=["ls"], returncode=1, stdout=b"", stderr=b"error") + + # Define the command and directory + command = "ls" + dir_path = Path("/some/path") + + # Call the function + result = run_inside_dir(command, dir_path) + + # Assertions + mock_inside_dir.assert_called_once_with(dir_path) + mock_subprocess.run.assert_called_once_with(["ls"], capture_output=True, check=True) + assert result.returncode == 1 + assert result.stderr == b"error" + + +def test_testing_ui_returns_default(): + """The `testing_ui` function only returns the default value.""" + result = use_default_ui("Question?", default="yes") + assert result == "yes" diff --git a/tools/export_schemas.py b/tools/export_schemas.py old mode 100644 new mode 100755 index f800906..2880b85 --- a/tools/export_schemas.py +++ b/tools/export_schemas.py @@ -1,13 +1,14 @@ #!/usr/bin/env python3 """Export the schemas for the compositions and patterns.""" import json +from pathlib import Path -from project_forge.configurations.pattern import Pattern from project_forge.configurations.composition import Composition -from pathlib import Path +from project_forge.configurations.pattern import Pattern def main(): + """Export the schemas.""" root_path = Path(__file__).parent.parent comp_schema_path = root_path / "composition.schema.json" pattern_schema_path = root_path / "pattern.schema.json" diff --git a/uv.lock b/uv.lock index fbfc0eb..da173a2 100644 --- a/uv.lock +++ b/uv.lock @@ -1,9 +1,5 @@ version = 1 requires-python = ">=3.12" -resolution-markers = [ - "python_full_version < '3.13'", - "python_full_version >= '3.13'", -] [[package]] name = "annotated-types" @@ -16,14 +12,11 @@ wheels = [ [[package]] name = "asttokens" -version = "2.4.1" +version = "3.0.0" source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "six" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/45/1d/f03bcb60c4a3212e15f99a56085d93093a497718adf828d050b9d675da81/asttokens-2.4.1.tar.gz", hash = "sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0", size = 62284 } +sdist = { url = "https://files.pythonhosted.org/packages/4a/e7/82da0a03e7ba5141f05cce0d302e6eed121ae055e0456ca228bf693984bc/asttokens-3.0.0.tar.gz", hash = "sha256:0dcd8baa8d62b0c1d118b399b2ddba3c4aff271d0d7a9e0d4c1681c79035bbc7", size = 61978 } wheels = [ - { url = "https://files.pythonhosted.org/packages/45/86/4736ac618d82a20d87d2f92ae19441ebc7ac9e7a581d7e58bbe79233b24a/asttokens-2.4.1-py2.py3-none-any.whl", hash = "sha256:051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24", size = 27764 }, + { url = "https://files.pythonhosted.org/packages/25/8a/c46dcc25341b5bce5472c718902eb3d38600a903b14fa6aeecef3f21a46f/asttokens-3.0.0-py3-none-any.whl", hash = "sha256:e3078351a059199dd5138cb1c706e6430c05eff2ff136af5eb4790f9d28932e2", size = 26918 }, ] [[package]] @@ -73,16 +66,16 @@ wheels = [ [[package]] name = "bracex" -version = "2.5" +version = "2.5.post1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ac/f1/ac657fd234f4ee61da9d90f2bae7d6078074de2f97cb911743faa8d10a91/bracex-2.5.tar.gz", hash = "sha256:0725da5045e8d37ea9592ab3614d8b561e22c3c5fde3964699be672e072ab611", size = 26622 } +sdist = { url = "https://files.pythonhosted.org/packages/d6/6c/57418c4404cd22fe6275b8301ca2b46a8cdaa8157938017a9ae0b3edf363/bracex-2.5.post1.tar.gz", hash = "sha256:12c50952415bfa773d2d9ccb8e79651b8cdb1f31a42f6091b804f6ba2b4a66b6", size = 26641 } wheels = [ - { url = "https://files.pythonhosted.org/packages/05/4f/54d324c35221c027ca77e9aae418f525003bd0cc2613eea162a1246b5a92/bracex-2.5-py3-none-any.whl", hash = "sha256:d2fcf4b606a82ac325471affe1706dd9bbaa3536c91ef86a31f6b766f3dad1d0", size = 11509 }, + { url = "https://files.pythonhosted.org/packages/4b/02/8db98cdc1a58e0abd6716d5e63244658e6e63513c65f469f34b6f1053fd0/bracex-2.5.post1-py3-none-any.whl", hash = "sha256:13e5732fec27828d6af308628285ad358047cec36801598368cb28bc631dbaf6", size = 11558 }, ] [[package]] name = "bump-my-version" -version = "0.26.0" +version = "0.28.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, @@ -94,9 +87,9 @@ dependencies = [ { name = "tomlkit" }, { name = "wcmatch" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f3/34/926646fa7d1c91b8ae215766b88370bea06cf95658fc5eba08b6853cd782/bump_my_version-0.26.0.tar.gz", hash = "sha256:9e2c01b7639960379440c4a371b3c8c0aa66cf6979985f1c9ba2e7c2fb4a185f", size = 109841 } +sdist = { url = "https://files.pythonhosted.org/packages/1d/44/8f4f5dc472a054634bffd86e4941b2624e0b050f15578d40ec15e670d8e5/bump_my_version-0.28.1.tar.gz", hash = "sha256:e608def5191baf505b6cde88bd679a0a95fc4cfeace4247adb60ac0f8a7e57ee", size = 983509 } wheels = [ - { url = "https://files.pythonhosted.org/packages/b2/1a/95fbe16cc0b9f4043b69612685b8848aaf5a89a2fa8ac645ba9333b5625d/bump_my_version-0.26.0-py3-none-any.whl", hash = "sha256:fe35ebae91e92deebe809ce06bfa37303e45e4f087ad4a371f605702e767623f", size = 51510 }, + { url = "https://files.pythonhosted.org/packages/ad/2c/10f770bf71116ecfcc8b2e67dd6752e7e135998579bc1dc98a6edb47bafc/bump_my_version-0.28.1-py3-none-any.whl", hash = "sha256:df7fdb02a1b43c122a6714df6d1fe4efc7a1220b5638ca5a0eb3018813c1b222", size = 52210 }, ] [[package]] @@ -212,69 +205,73 @@ wheels = [ [[package]] name = "coverage" -version = "7.6.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f7/08/7e37f82e4d1aead42a7443ff06a1e406aabf7302c4f00a546e4b320b994c/coverage-7.6.1.tar.gz", hash = "sha256:953510dfb7b12ab69d20135a0662397f077c59b1e6379a768e97c59d852ee51d", size = 798791 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7e/d4/300fc921dff243cd518c7db3a4c614b7e4b2431b0d1145c1e274fd99bd70/coverage-7.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:95cae0efeb032af8458fc27d191f85d1717b1d4e49f7cb226cf526ff28179778", size = 206983 }, - { url = "https://files.pythonhosted.org/packages/e1/ab/6bf00de5327ecb8db205f9ae596885417a31535eeda6e7b99463108782e1/coverage-7.6.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5621a9175cf9d0b0c84c2ef2b12e9f5f5071357c4d2ea6ca1cf01814f45d2391", size = 207221 }, - { url = "https://files.pythonhosted.org/packages/92/8f/2ead05e735022d1a7f3a0a683ac7f737de14850395a826192f0288703472/coverage-7.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:260933720fdcd75340e7dbe9060655aff3af1f0c5d20f46b57f262ab6c86a5e8", size = 240342 }, - { url = "https://files.pythonhosted.org/packages/0f/ef/94043e478201ffa85b8ae2d2c79b4081e5a1b73438aafafccf3e9bafb6b5/coverage-7.6.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07e2ca0ad381b91350c0ed49d52699b625aab2b44b65e1b4e02fa9df0e92ad2d", size = 237371 }, - { url = "https://files.pythonhosted.org/packages/1f/0f/c890339dd605f3ebc269543247bdd43b703cce6825b5ed42ff5f2d6122c7/coverage-7.6.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c44fee9975f04b33331cb8eb272827111efc8930cfd582e0320613263ca849ca", size = 239455 }, - { url = "https://files.pythonhosted.org/packages/d1/04/7fd7b39ec7372a04efb0f70c70e35857a99b6a9188b5205efb4c77d6a57a/coverage-7.6.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:877abb17e6339d96bf08e7a622d05095e72b71f8afd8a9fefc82cf30ed944163", size = 238924 }, - { url = "https://files.pythonhosted.org/packages/ed/bf/73ce346a9d32a09cf369f14d2a06651329c984e106f5992c89579d25b27e/coverage-7.6.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3e0cadcf6733c09154b461f1ca72d5416635e5e4ec4e536192180d34ec160f8a", size = 237252 }, - { url = "https://files.pythonhosted.org/packages/86/74/1dc7a20969725e917b1e07fe71a955eb34bc606b938316bcc799f228374b/coverage-7.6.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c3c02d12f837d9683e5ab2f3d9844dc57655b92c74e286c262e0fc54213c216d", size = 238897 }, - { url = "https://files.pythonhosted.org/packages/b6/e9/d9cc3deceb361c491b81005c668578b0dfa51eed02cd081620e9a62f24ec/coverage-7.6.1-cp312-cp312-win32.whl", hash = "sha256:e05882b70b87a18d937ca6768ff33cc3f72847cbc4de4491c8e73880766718e5", size = 209606 }, - { url = "https://files.pythonhosted.org/packages/47/c8/5a2e41922ea6740f77d555c4d47544acd7dc3f251fe14199c09c0f5958d3/coverage-7.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:b5d7b556859dd85f3a541db6a4e0167b86e7273e1cdc973e5b175166bb634fdb", size = 210373 }, - { url = "https://files.pythonhosted.org/packages/8c/f9/9aa4dfb751cb01c949c990d136a0f92027fbcc5781c6e921df1cb1563f20/coverage-7.6.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a4acd025ecc06185ba2b801f2de85546e0b8ac787cf9d3b06e7e2a69f925b106", size = 207007 }, - { url = "https://files.pythonhosted.org/packages/b9/67/e1413d5a8591622a46dd04ff80873b04c849268831ed5c304c16433e7e30/coverage-7.6.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a6d3adcf24b624a7b778533480e32434a39ad8fa30c315208f6d3e5542aeb6e9", size = 207269 }, - { url = "https://files.pythonhosted.org/packages/14/5b/9dec847b305e44a5634d0fb8498d135ab1d88330482b74065fcec0622224/coverage-7.6.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0c212c49b6c10e6951362f7c6df3329f04c2b1c28499563d4035d964ab8e08c", size = 239886 }, - { url = "https://files.pythonhosted.org/packages/7b/b7/35760a67c168e29f454928f51f970342d23cf75a2bb0323e0f07334c85f3/coverage-7.6.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e81d7a3e58882450ec4186ca59a3f20a5d4440f25b1cff6f0902ad890e6748a", size = 237037 }, - { url = "https://files.pythonhosted.org/packages/f7/95/d2fd31f1d638df806cae59d7daea5abf2b15b5234016a5ebb502c2f3f7ee/coverage-7.6.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78b260de9790fd81e69401c2dc8b17da47c8038176a79092a89cb2b7d945d060", size = 239038 }, - { url = "https://files.pythonhosted.org/packages/6e/bd/110689ff5752b67924efd5e2aedf5190cbbe245fc81b8dec1abaffba619d/coverage-7.6.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a78d169acd38300060b28d600344a803628c3fd585c912cacc9ea8790fe96862", size = 238690 }, - { url = "https://files.pythonhosted.org/packages/d3/a8/08d7b38e6ff8df52331c83130d0ab92d9c9a8b5462f9e99c9f051a4ae206/coverage-7.6.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2c09f4ce52cb99dd7505cd0fc8e0e37c77b87f46bc9c1eb03fe3bc9991085388", size = 236765 }, - { url = "https://files.pythonhosted.org/packages/d6/6a/9cf96839d3147d55ae713eb2d877f4d777e7dc5ba2bce227167d0118dfe8/coverage-7.6.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6878ef48d4227aace338d88c48738a4258213cd7b74fd9a3d4d7582bb1d8a155", size = 238611 }, - { url = "https://files.pythonhosted.org/packages/74/e4/7ff20d6a0b59eeaab40b3140a71e38cf52547ba21dbcf1d79c5a32bba61b/coverage-7.6.1-cp313-cp313-win32.whl", hash = "sha256:44df346d5215a8c0e360307d46ffaabe0f5d3502c8a1cefd700b34baf31d411a", size = 209671 }, - { url = "https://files.pythonhosted.org/packages/35/59/1812f08a85b57c9fdb6d0b383d779e47b6f643bc278ed682859512517e83/coverage-7.6.1-cp313-cp313-win_amd64.whl", hash = "sha256:8284cf8c0dd272a247bc154eb6c95548722dce90d098c17a883ed36e67cdb129", size = 210368 }, - { url = "https://files.pythonhosted.org/packages/9c/15/08913be1c59d7562a3e39fce20661a98c0a3f59d5754312899acc6cb8a2d/coverage-7.6.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:d3296782ca4eab572a1a4eca686d8bfb00226300dcefdf43faa25b5242ab8a3e", size = 207758 }, - { url = "https://files.pythonhosted.org/packages/c4/ae/b5d58dff26cade02ada6ca612a76447acd69dccdbb3a478e9e088eb3d4b9/coverage-7.6.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:502753043567491d3ff6d08629270127e0c31d4184c4c8d98f92c26f65019962", size = 208035 }, - { url = "https://files.pythonhosted.org/packages/b8/d7/62095e355ec0613b08dfb19206ce3033a0eedb6f4a67af5ed267a8800642/coverage-7.6.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a89ecca80709d4076b95f89f308544ec8f7b4727e8a547913a35f16717856cb", size = 250839 }, - { url = "https://files.pythonhosted.org/packages/7c/1e/c2967cb7991b112ba3766df0d9c21de46b476d103e32bb401b1b2adf3380/coverage-7.6.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a318d68e92e80af8b00fa99609796fdbcdfef3629c77c6283566c6f02c6d6704", size = 246569 }, - { url = "https://files.pythonhosted.org/packages/8b/61/a7a6a55dd266007ed3b1df7a3386a0d760d014542d72f7c2c6938483b7bd/coverage-7.6.1-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13b0a73a0896988f053e4fbb7de6d93388e6dd292b0d87ee51d106f2c11b465b", size = 248927 }, - { url = "https://files.pythonhosted.org/packages/c8/fa/13a6f56d72b429f56ef612eb3bc5ce1b75b7ee12864b3bd12526ab794847/coverage-7.6.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4421712dbfc5562150f7554f13dde997a2e932a6b5f352edcce948a815efee6f", size = 248401 }, - { url = "https://files.pythonhosted.org/packages/75/06/0429c652aa0fb761fc60e8c6b291338c9173c6aa0f4e40e1902345b42830/coverage-7.6.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:166811d20dfea725e2e4baa71fffd6c968a958577848d2131f39b60043400223", size = 246301 }, - { url = "https://files.pythonhosted.org/packages/52/76/1766bb8b803a88f93c3a2d07e30ffa359467810e5cbc68e375ebe6906efb/coverage-7.6.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:225667980479a17db1048cb2bf8bfb39b8e5be8f164b8f6628b64f78a72cf9d3", size = 247598 }, - { url = "https://files.pythonhosted.org/packages/66/8b/f54f8db2ae17188be9566e8166ac6df105c1c611e25da755738025708d54/coverage-7.6.1-cp313-cp313t-win32.whl", hash = "sha256:170d444ab405852903b7d04ea9ae9b98f98ab6d7e63e1115e82620807519797f", size = 210307 }, - { url = "https://files.pythonhosted.org/packages/9f/b0/e0dca6da9170aefc07515cce067b97178cefafb512d00a87a1c717d2efd5/coverage-7.6.1-cp313-cp313t-win_amd64.whl", hash = "sha256:b9f222de8cded79c49bf184bdbc06630d4c58eec9459b939b4a690c82ed05657", size = 211453 }, +version = "7.6.8" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ab/75/aecfd0a3adbec6e45753976bc2a9fed62b42cea9a206d10fd29244a77953/coverage-7.6.8.tar.gz", hash = "sha256:8b2b8503edb06822c86d82fa64a4a5cb0760bb8f31f26e138ec743f422f37cfc", size = 801425 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/76/ce/3edf581c8fe429ed8ced6e6d9ac693c25975ef9093413276dab6ed68a80a/coverage-7.6.8-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e683e6ecc587643f8cde8f5da6768e9d165cd31edf39ee90ed7034f9ca0eefee", size = 207285 }, + { url = "https://files.pythonhosted.org/packages/09/9c/cf102ab046c9cf8895c3f7aadcde6f489a4b2ec326757e8c6e6581829b5e/coverage-7.6.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1defe91d41ce1bd44b40fabf071e6a01a5aa14de4a31b986aa9dfd1b3e3e414a", size = 207522 }, + { url = "https://files.pythonhosted.org/packages/39/06/42aa6dd13dbfca72e1fd8ffccadbc921b6e75db34545ebab4d955d1e7ad3/coverage-7.6.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7ad66e8e50225ebf4236368cc43c37f59d5e6728f15f6e258c8639fa0dd8e6d", size = 240543 }, + { url = "https://files.pythonhosted.org/packages/a0/20/2932971dc215adeca8eeff446266a7fef17a0c238e881ffedebe7bfa0669/coverage-7.6.8-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3fe47da3e4fda5f1abb5709c156eca207eacf8007304ce3019eb001e7a7204cb", size = 237577 }, + { url = "https://files.pythonhosted.org/packages/ac/85/4323ece0cd5452c9522f4b6e5cc461e6c7149a4b1887c9e7a8b1f4e51146/coverage-7.6.8-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:202a2d645c5a46b84992f55b0a3affe4f0ba6b4c611abec32ee88358db4bb649", size = 239646 }, + { url = "https://files.pythonhosted.org/packages/77/52/b2537487d8f36241e518e84db6f79e26bc3343b14844366e35b090fae0d4/coverage-7.6.8-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4674f0daa1823c295845b6a740d98a840d7a1c11df00d1fd62614545c1583787", size = 239128 }, + { url = "https://files.pythonhosted.org/packages/7c/99/7f007762012186547d0ecc3d328da6b6f31a8c99f05dc1e13dcd929918cd/coverage-7.6.8-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:74610105ebd6f33d7c10f8907afed696e79c59e3043c5f20eaa3a46fddf33b4c", size = 237434 }, + { url = "https://files.pythonhosted.org/packages/97/53/e9b5cf0682a1cab9352adfac73caae0d77ae1d65abc88975d510f7816389/coverage-7.6.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:37cda8712145917105e07aab96388ae76e787270ec04bcb9d5cc786d7cbb8443", size = 239095 }, + { url = "https://files.pythonhosted.org/packages/0c/50/054f0b464fbae0483217186478eefa2e7df3a79917ed7f1d430b6da2cf0d/coverage-7.6.8-cp312-cp312-win32.whl", hash = "sha256:9e89d5c8509fbd6c03d0dd1972925b22f50db0792ce06324ba069f10787429ad", size = 209895 }, + { url = "https://files.pythonhosted.org/packages/df/d0/09ba870360a27ecf09e177ca2ff59d4337fc7197b456f22ceff85cffcfa5/coverage-7.6.8-cp312-cp312-win_amd64.whl", hash = "sha256:379c111d3558272a2cae3d8e57e6b6e6f4fe652905692d54bad5ea0ca37c5ad4", size = 210684 }, + { url = "https://files.pythonhosted.org/packages/9a/84/6f0ccf94a098ac3d6d6f236bd3905eeac049a9e0efcd9a63d4feca37ac4b/coverage-7.6.8-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0b0c69f4f724c64dfbfe79f5dfb503b42fe6127b8d479b2677f2b227478db2eb", size = 207313 }, + { url = "https://files.pythonhosted.org/packages/db/2b/e3b3a3a12ebec738c545897ac9f314620470fcbc368cdac88cf14974ba20/coverage-7.6.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c15b32a7aca8038ed7644f854bf17b663bc38e1671b5d6f43f9a2b2bd0c46f63", size = 207574 }, + { url = "https://files.pythonhosted.org/packages/db/c0/5bf95d42b6a8d21dfce5025ce187f15db57d6460a59b67a95fe8728162f1/coverage-7.6.8-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63068a11171e4276f6ece913bde059e77c713b48c3a848814a6537f35afb8365", size = 240090 }, + { url = "https://files.pythonhosted.org/packages/57/b8/d6fd17d1a8e2b0e1a4e8b9cb1f0f261afd422570735899759c0584236916/coverage-7.6.8-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6f4548c5ead23ad13fb7a2c8ea541357474ec13c2b736feb02e19a3085fac002", size = 237237 }, + { url = "https://files.pythonhosted.org/packages/d4/e4/a91e9bb46809c8b63e68fc5db5c4d567d3423b6691d049a4f950e38fbe9d/coverage-7.6.8-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b4b4299dd0d2c67caaaf286d58aef5e75b125b95615dda4542561a5a566a1e3", size = 239225 }, + { url = "https://files.pythonhosted.org/packages/31/9c/9b99b0591ec4555b7292d271e005f27b465388ce166056c435b288db6a69/coverage-7.6.8-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c9ebfb2507751f7196995142f057d1324afdab56db1d9743aab7f50289abd022", size = 238888 }, + { url = "https://files.pythonhosted.org/packages/a6/85/285c2df9a04bc7c31f21fd9d4a24d19e040ec5e2ff06e572af1f6514c9e7/coverage-7.6.8-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:c1b4474beee02ede1eef86c25ad4600a424fe36cff01a6103cb4533c6bf0169e", size = 236974 }, + { url = "https://files.pythonhosted.org/packages/cb/a1/95ec8522206f76cdca033bf8bb61fff56429fb414835fc4d34651dfd29fc/coverage-7.6.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d9fd2547e6decdbf985d579cf3fc78e4c1d662b9b0ff7cc7862baaab71c9cc5b", size = 238815 }, + { url = "https://files.pythonhosted.org/packages/8d/ac/687e9ba5e6d0979e9dab5c02e01c4f24ac58260ef82d88d3b433b3f84f1e/coverage-7.6.8-cp313-cp313-win32.whl", hash = "sha256:8aae5aea53cbfe024919715eca696b1a3201886ce83790537d1c3668459c7146", size = 209957 }, + { url = "https://files.pythonhosted.org/packages/2f/a3/b61cc8e3fcf075293fb0f3dee405748453c5ba28ac02ceb4a87f52bdb105/coverage-7.6.8-cp313-cp313-win_amd64.whl", hash = "sha256:ae270e79f7e169ccfe23284ff5ea2d52a6f401dc01b337efb54b3783e2ce3f28", size = 210711 }, + { url = "https://files.pythonhosted.org/packages/ee/4b/891c8b9acf1b62c85e4a71dac142ab9284e8347409b7355de02e3f38306f/coverage-7.6.8-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:de38add67a0af869b0d79c525d3e4588ac1ffa92f39116dbe0ed9753f26eba7d", size = 208053 }, + { url = "https://files.pythonhosted.org/packages/18/a9/9e330409b291cc002723d339346452800e78df1ce50774ca439ade1d374f/coverage-7.6.8-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:b07c25d52b1c16ce5de088046cd2432b30f9ad5e224ff17c8f496d9cb7d1d451", size = 208329 }, + { url = "https://files.pythonhosted.org/packages/9c/0d/33635fd429f6589c6e1cdfc7bf581aefe4c1792fbff06383f9d37f59db60/coverage-7.6.8-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62a66ff235e4c2e37ed3b6104d8b478d767ff73838d1222132a7a026aa548764", size = 251052 }, + { url = "https://files.pythonhosted.org/packages/23/32/8a08da0e46f3830bbb9a5b40614241b2e700f27a9c2889f53122486443ed/coverage-7.6.8-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09b9f848b28081e7b975a3626e9081574a7b9196cde26604540582da60235fdf", size = 246765 }, + { url = "https://files.pythonhosted.org/packages/56/3f/3b86303d2c14350fdb1c6c4dbf9bc76000af2382f42ca1d4d99c6317666e/coverage-7.6.8-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:093896e530c38c8e9c996901858ac63f3d4171268db2c9c8b373a228f459bbc5", size = 249125 }, + { url = "https://files.pythonhosted.org/packages/36/cb/c4f081b9023f9fd8646dbc4ef77be0df090263e8f66f4ea47681e0dc2cff/coverage-7.6.8-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9a7b8ac36fd688c8361cbc7bf1cb5866977ece6e0b17c34aa0df58bda4fa18a4", size = 248615 }, + { url = "https://files.pythonhosted.org/packages/32/ee/53bdbf67760928c44b57b2c28a8c0a4bf544f85a9ee129a63ba5c78fdee4/coverage-7.6.8-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:38c51297b35b3ed91670e1e4efb702b790002e3245a28c76e627478aa3c10d83", size = 246507 }, + { url = "https://files.pythonhosted.org/packages/57/49/5a57910bd0af6d8e802b4ca65292576d19b54b49f81577fd898505dee075/coverage-7.6.8-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:2e4e0f60cb4bd7396108823548e82fdab72d4d8a65e58e2c19bbbc2f1e2bfa4b", size = 247785 }, + { url = "https://files.pythonhosted.org/packages/bd/37/e450c9f6b297c79bb9858407396ed3e084dcc22990dd110ab01d5ceb9770/coverage-7.6.8-cp313-cp313t-win32.whl", hash = "sha256:6535d996f6537ecb298b4e287a855f37deaf64ff007162ec0afb9ab8ba3b8b71", size = 210605 }, + { url = "https://files.pythonhosted.org/packages/44/79/7d0c7dd237c6905018e2936cd1055fe1d42e7eba2ebab3c00f4aad2a27d7/coverage-7.6.8-cp313-cp313t-win_amd64.whl", hash = "sha256:c79c0685f142ca53256722a384540832420dff4ab15fec1863d7e5bc8691bdcc", size = 211777 }, ] [[package]] name = "cryptography" -version = "43.0.3" +version = "44.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/0d/05/07b55d1fa21ac18c3a8c79f764e2514e6f6a9698f1be44994f5adf0d29db/cryptography-43.0.3.tar.gz", hash = "sha256:315b9001266a492a6ff443b61238f956b214dbec9910a081ba5b6646a055a805", size = 686989 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/1f/f3/01fdf26701a26f4b4dbc337a26883ad5bccaa6f1bbbdd29cd89e22f18a1c/cryptography-43.0.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:bf7a1932ac4176486eab36a19ed4c0492da5d97123f1406cf15e41b05e787d2e", size = 6225303 }, - { url = "https://files.pythonhosted.org/packages/a3/01/4896f3d1b392025d4fcbecf40fdea92d3df8662123f6835d0af828d148fd/cryptography-43.0.3-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63efa177ff54aec6e1c0aefaa1a241232dcd37413835a9b674b6e3f0ae2bfd3e", size = 3760905 }, - { url = "https://files.pythonhosted.org/packages/0a/be/f9a1f673f0ed4b7f6c643164e513dbad28dd4f2dcdf5715004f172ef24b6/cryptography-43.0.3-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e1ce50266f4f70bf41a2c6dc4358afadae90e2a1e5342d3c08883df1675374f", size = 3977271 }, - { url = "https://files.pythonhosted.org/packages/4e/49/80c3a7b5514d1b416d7350830e8c422a4d667b6d9b16a9392ebfd4a5388a/cryptography-43.0.3-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:443c4a81bb10daed9a8f334365fe52542771f25aedaf889fd323a853ce7377d6", size = 3746606 }, - { url = "https://files.pythonhosted.org/packages/0e/16/a28ddf78ac6e7e3f25ebcef69ab15c2c6be5ff9743dd0709a69a4f968472/cryptography-43.0.3-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:74f57f24754fe349223792466a709f8e0c093205ff0dca557af51072ff47ab18", size = 3986484 }, - { url = "https://files.pythonhosted.org/packages/01/f5/69ae8da70c19864a32b0315049866c4d411cce423ec169993d0434218762/cryptography-43.0.3-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9762ea51a8fc2a88b70cf2995e5675b38d93bf36bd67d91721c309df184f49bd", size = 3852131 }, - { url = "https://files.pythonhosted.org/packages/fd/db/e74911d95c040f9afd3612b1f732e52b3e517cb80de8bf183be0b7d413c6/cryptography-43.0.3-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:81ef806b1fef6b06dcebad789f988d3b37ccaee225695cf3e07648eee0fc6b73", size = 4075647 }, - { url = "https://files.pythonhosted.org/packages/56/48/7b6b190f1462818b324e674fa20d1d5ef3e24f2328675b9b16189cbf0b3c/cryptography-43.0.3-cp37-abi3-win32.whl", hash = "sha256:cbeb489927bd7af4aa98d4b261af9a5bc025bd87f0e3547e11584be9e9427be2", size = 2623873 }, - { url = "https://files.pythonhosted.org/packages/eb/b1/0ebff61a004f7f89e7b65ca95f2f2375679d43d0290672f7713ee3162aff/cryptography-43.0.3-cp37-abi3-win_amd64.whl", hash = "sha256:f46304d6f0c6ab8e52770addfa2fc41e6629495548862279641972b6215451cd", size = 3068039 }, - { url = "https://files.pythonhosted.org/packages/30/d5/c8b32c047e2e81dd172138f772e81d852c51f0f2ad2ae8a24f1122e9e9a7/cryptography-43.0.3-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:8ac43ae87929a5982f5948ceda07001ee5e83227fd69cf55b109144938d96984", size = 6222984 }, - { url = "https://files.pythonhosted.org/packages/2f/78/55356eb9075d0be6e81b59f45c7b48df87f76a20e73893872170471f3ee8/cryptography-43.0.3-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:846da004a5804145a5f441b8530b4bf35afbf7da70f82409f151695b127213d5", size = 3762968 }, - { url = "https://files.pythonhosted.org/packages/2a/2c/488776a3dc843f95f86d2f957ca0fc3407d0242b50bede7fad1e339be03f/cryptography-43.0.3-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f996e7268af62598f2fc1204afa98a3b5712313a55c4c9d434aef49cadc91d4", size = 3977754 }, - { url = "https://files.pythonhosted.org/packages/7c/04/2345ca92f7a22f601a9c62961741ef7dd0127c39f7310dffa0041c80f16f/cryptography-43.0.3-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:f7b178f11ed3664fd0e995a47ed2b5ff0a12d893e41dd0494f406d1cf555cab7", size = 3749458 }, - { url = "https://files.pythonhosted.org/packages/ac/25/e715fa0bc24ac2114ed69da33adf451a38abb6f3f24ec207908112e9ba53/cryptography-43.0.3-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:c2e6fc39c4ab499049df3bdf567f768a723a5e8464816e8f009f121a5a9f4405", size = 3988220 }, - { url = "https://files.pythonhosted.org/packages/21/ce/b9c9ff56c7164d8e2edfb6c9305045fbc0df4508ccfdb13ee66eb8c95b0e/cryptography-43.0.3-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:e1be4655c7ef6e1bbe6b5d0403526601323420bcf414598955968c9ef3eb7d16", size = 3853898 }, - { url = "https://files.pythonhosted.org/packages/2a/33/b3682992ab2e9476b9c81fff22f02c8b0a1e6e1d49ee1750a67d85fd7ed2/cryptography-43.0.3-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:df6b6c6d742395dd77a23ea3728ab62f98379eff8fb61be2744d4679ab678f73", size = 4076592 }, - { url = "https://files.pythonhosted.org/packages/81/1e/ffcc41b3cebd64ca90b28fd58141c5f68c83d48563c88333ab660e002cd3/cryptography-43.0.3-cp39-abi3-win32.whl", hash = "sha256:d56e96520b1020449bbace2b78b603442e7e378a9b3bd68de65c782db1507995", size = 2623145 }, - { url = "https://files.pythonhosted.org/packages/87/5c/3dab83cc4aba1f4b0e733e3f0c3e7d4386440d660ba5b1e3ff995feb734d/cryptography-43.0.3-cp39-abi3-win_amd64.whl", hash = "sha256:0c580952eef9bf68c4747774cde7ec1d85a6e61de97281f2dba83c7d2c806362", size = 3068026 }, +sdist = { url = "https://files.pythonhosted.org/packages/91/4c/45dfa6829acffa344e3967d6006ee4ae8be57af746ae2eba1c431949b32c/cryptography-44.0.0.tar.gz", hash = "sha256:cd4e834f340b4293430701e772ec543b0fbe6c2dea510a5286fe0acabe153a02", size = 710657 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/55/09/8cc67f9b84730ad330b3b72cf867150744bf07ff113cda21a15a1c6d2c7c/cryptography-44.0.0-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:84111ad4ff3f6253820e6d3e58be2cc2a00adb29335d4cacb5ab4d4d34f2a123", size = 6541833 }, + { url = "https://files.pythonhosted.org/packages/7e/5b/3759e30a103144e29632e7cb72aec28cedc79e514b2ea8896bb17163c19b/cryptography-44.0.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b15492a11f9e1b62ba9d73c210e2416724633167de94607ec6069ef724fad092", size = 3922710 }, + { url = "https://files.pythonhosted.org/packages/5f/58/3b14bf39f1a0cfd679e753e8647ada56cddbf5acebffe7db90e184c76168/cryptography-44.0.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:831c3c4d0774e488fdc83a1923b49b9957d33287de923d58ebd3cec47a0ae43f", size = 4137546 }, + { url = "https://files.pythonhosted.org/packages/98/65/13d9e76ca19b0ba5603d71ac8424b5694415b348e719db277b5edc985ff5/cryptography-44.0.0-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:761817a3377ef15ac23cd7834715081791d4ec77f9297ee694ca1ee9c2c7e5eb", size = 3915420 }, + { url = "https://files.pythonhosted.org/packages/b1/07/40fe09ce96b91fc9276a9ad272832ead0fddedcba87f1190372af8e3039c/cryptography-44.0.0-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3c672a53c0fb4725a29c303be906d3c1fa99c32f58abe008a82705f9ee96f40b", size = 4154498 }, + { url = "https://files.pythonhosted.org/packages/75/ea/af65619c800ec0a7e4034207aec543acdf248d9bffba0533342d1bd435e1/cryptography-44.0.0-cp37-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:4ac4c9f37eba52cb6fbeaf5b59c152ea976726b865bd4cf87883a7e7006cc543", size = 3932569 }, + { url = "https://files.pythonhosted.org/packages/4e/d5/9cc182bf24c86f542129565976c21301d4ac397e74bf5a16e48241aab8a6/cryptography-44.0.0-cp37-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:60eb32934076fa07e4316b7b2742fa52cbb190b42c2df2863dbc4230a0a9b385", size = 4164756 }, + { url = "https://files.pythonhosted.org/packages/c7/af/d1deb0c04d59612e3d5e54203159e284d3e7a6921e565bb0eeb6269bdd8a/cryptography-44.0.0-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:ed3534eb1090483c96178fcb0f8893719d96d5274dfde98aa6add34614e97c8e", size = 4016721 }, + { url = "https://files.pythonhosted.org/packages/bd/69/7ca326c55698d0688db867795134bdfac87136b80ef373aaa42b225d6dd5/cryptography-44.0.0-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:f3f6fdfa89ee2d9d496e2c087cebef9d4fcbb0ad63c40e821b39f74bf48d9c5e", size = 4240915 }, + { url = "https://files.pythonhosted.org/packages/ef/d4/cae11bf68c0f981e0413906c6dd03ae7fa864347ed5fac40021df1ef467c/cryptography-44.0.0-cp37-abi3-win32.whl", hash = "sha256:eb33480f1bad5b78233b0ad3e1b0be21e8ef1da745d8d2aecbb20671658b9053", size = 2757925 }, + { url = "https://files.pythonhosted.org/packages/64/b1/50d7739254d2002acae64eed4fc43b24ac0cc44bf0a0d388d1ca06ec5bb1/cryptography-44.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:abc998e0c0eee3c8a1904221d3f67dcfa76422b23620173e28c11d3e626c21bd", size = 3202055 }, + { url = "https://files.pythonhosted.org/packages/11/18/61e52a3d28fc1514a43b0ac291177acd1b4de00e9301aaf7ef867076ff8a/cryptography-44.0.0-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:660cb7312a08bc38be15b696462fa7cc7cd85c3ed9c576e81f4dc4d8b2b31591", size = 6542801 }, + { url = "https://files.pythonhosted.org/packages/1a/07/5f165b6c65696ef75601b781a280fc3b33f1e0cd6aa5a92d9fb96c410e97/cryptography-44.0.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1923cb251c04be85eec9fda837661c67c1049063305d6be5721643c22dd4e2b7", size = 3922613 }, + { url = "https://files.pythonhosted.org/packages/28/34/6b3ac1d80fc174812486561cf25194338151780f27e438526f9c64e16869/cryptography-44.0.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:404fdc66ee5f83a1388be54300ae978b2efd538018de18556dde92575e05defc", size = 4137925 }, + { url = "https://files.pythonhosted.org/packages/d0/c7/c656eb08fd22255d21bc3129625ed9cd5ee305f33752ef2278711b3fa98b/cryptography-44.0.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:c5eb858beed7835e5ad1faba59e865109f3e52b3783b9ac21e7e47dc5554e289", size = 3915417 }, + { url = "https://files.pythonhosted.org/packages/ef/82/72403624f197af0db6bac4e58153bc9ac0e6020e57234115db9596eee85d/cryptography-44.0.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:f53c2c87e0fb4b0c00fa9571082a057e37690a8f12233306161c8f4b819960b7", size = 4155160 }, + { url = "https://files.pythonhosted.org/packages/a2/cd/2f3c440913d4329ade49b146d74f2e9766422e1732613f57097fea61f344/cryptography-44.0.0-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:9e6fc8a08e116fb7c7dd1f040074c9d7b51d74a8ea40d4df2fc7aa08b76b9e6c", size = 3932331 }, + { url = "https://files.pythonhosted.org/packages/31/d9/90409720277f88eb3ab72f9a32bfa54acdd97e94225df699e7713e850bd4/cryptography-44.0.0-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:9abcc2e083cbe8dde89124a47e5e53ec38751f0d7dfd36801008f316a127d7ba", size = 4165207 }, + { url = "https://files.pythonhosted.org/packages/7f/df/8be88797f0a1cca6e255189a57bb49237402b1880d6e8721690c5603ac23/cryptography-44.0.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:d2436114e46b36d00f8b72ff57e598978b37399d2786fd39793c36c6d5cb1c64", size = 4017372 }, + { url = "https://files.pythonhosted.org/packages/af/36/5ccc376f025a834e72b8e52e18746b927f34e4520487098e283a719c205e/cryptography-44.0.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a01956ddfa0a6790d594f5b34fc1bfa6098aca434696a03cfdbe469b8ed79285", size = 4239657 }, + { url = "https://files.pythonhosted.org/packages/46/b0/f4f7d0d0bcfbc8dd6296c1449be326d04217c57afb8b2594f017eed95533/cryptography-44.0.0-cp39-abi3-win32.whl", hash = "sha256:eca27345e1214d1b9f9490d200f9db5a874479be914199194e746c893788d417", size = 2758672 }, + { url = "https://files.pythonhosted.org/packages/97/9b/443270b9210f13f6ef240eff73fd32e02d381e7103969dc66ce8e89ee901/cryptography-44.0.0-cp39-abi3-win_amd64.whl", hash = "sha256:708ee5f1bafe76d041b53a4f95eb28cdeb8d18da17e597d46d7833ee59b97ede", size = 3202071 }, ] [[package]] @@ -288,36 +285,36 @@ wheels = [ [[package]] name = "deprecated" -version = "1.2.14" +version = "1.2.15" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "wrapt" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/92/14/1e41f504a246fc224d2ac264c227975427a85caf37c3979979edb9b1b232/Deprecated-1.2.14.tar.gz", hash = "sha256:e5323eb936458dccc2582dc6f9c322c852a775a27065ff2b0c4970b9d53d01b3", size = 2974416 } +sdist = { url = "https://files.pythonhosted.org/packages/2e/a3/53e7d78a6850ffdd394d7048a31a6f14e44900adedf190f9a165f6b69439/deprecated-1.2.15.tar.gz", hash = "sha256:683e561a90de76239796e6b6feac66b99030d2dd3fcf61ef996330f14bbb9b0d", size = 2977612 } wheels = [ - { url = "https://files.pythonhosted.org/packages/20/8d/778b7d51b981a96554f29136cd59ca7880bf58094338085bcf2a979a0e6a/Deprecated-1.2.14-py2.py3-none-any.whl", hash = "sha256:6fac8b097794a90302bdbb17b9b815e732d3c4720583ff1b198499d78470466c", size = 9561 }, + { url = "https://files.pythonhosted.org/packages/1d/8f/c7f227eb42cfeaddce3eb0c96c60cbca37797fa7b34f8e1aeadf6c5c0983/Deprecated-1.2.15-py2.py3-none-any.whl", hash = "sha256:353bc4a8ac4bfc96800ddab349d89c25dec1079f65fd53acdcc1e0b975b21320", size = 9941 }, ] [[package]] name = "distlib" -version = "0.3.8" +version = "0.3.9" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/c4/91/e2df406fb4efacdf46871c25cde65d3c6ee5e173b7e5a4547a47bae91920/distlib-0.3.8.tar.gz", hash = "sha256:1530ea13e350031b6312d8580ddb6b27a104275a31106523b8f123787f494f64", size = 609931 } +sdist = { url = "https://files.pythonhosted.org/packages/0d/dd/1bec4c5ddb504ca60fc29472f3d27e8d4da1257a854e1d96742f15c1d02d/distlib-0.3.9.tar.gz", hash = "sha256:a60f20dea646b8a33f3e7772f74dc0b2d0772d2837ee1342a00645c81edf9403", size = 613923 } wheels = [ - { url = "https://files.pythonhosted.org/packages/8e/41/9307e4f5f9976bc8b7fea0b66367734e8faf3ec84bc0d412d8cfabbb66cd/distlib-0.3.8-py2.py3-none-any.whl", hash = "sha256:034db59a0b96f8ca18035f36290806a9a6e6bd9d1ff91e45a7f172eb17e51784", size = 468850 }, + { url = "https://files.pythonhosted.org/packages/91/a1/cf2472db20f7ce4a6be1253a81cfdf85ad9c7885ffbed7047fb72c24cf87/distlib-0.3.9-py2.py3-none-any.whl", hash = "sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87", size = 468973 }, ] [[package]] name = "environs" -version = "11.0.0" +version = "11.2.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "marshmallow" }, { name = "python-dotenv" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f2/13/3d448cfbed9f1baff5765f49434cd849501351f14fd3f09f0f2e9bd35322/environs-11.0.0.tar.gz", hash = "sha256:069727a8f73d8ba8d033d3cd95c0da231d44f38f1da773bf076cef168d312ee8", size = 25787 } +sdist = { url = "https://files.pythonhosted.org/packages/77/08/2b7d9cacf2b27482c9218ee6762336aa47bdb9d07ee26a136d072a328297/environs-11.2.1.tar.gz", hash = "sha256:e068ae3174cef52ba4b95ead22e639056a02465f616e62323e04ae08e86a75a4", size = 27485 } wheels = [ - { url = "https://files.pythonhosted.org/packages/3f/30/ef8a3022e6cdcedfd7ba03ca88ab29e30334f8e958cdbf5ce120912397e8/environs-11.0.0-py3-none-any.whl", hash = "sha256:e0bcfd41c718c07a7db422f9109e490746450da38793fe4ee197f397b9343435", size = 12216 }, + { url = "https://files.pythonhosted.org/packages/1a/21/1e0d8de234e9d0c675ea8fd50f9e7ad66fae32c207bc982f1d14f7c0835b/environs-11.2.1-py3-none-any.whl", hash = "sha256:9d2080cf25807a26fc0d4301e2d7b62c64fbf547540f21e3a30cc02bc5fbe948", size = 12923 }, ] [[package]] @@ -331,11 +328,11 @@ wheels = [ [[package]] name = "filelock" -version = "3.15.4" +version = "3.16.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/08/dd/49e06f09b6645156550fb9aee9cc1e59aba7efbc972d665a1bd6ae0435d4/filelock-3.15.4.tar.gz", hash = "sha256:2207938cbc1844345cb01a5a95524dae30f0ce089eba5b00378295a17e3e90cb", size = 18007 } +sdist = { url = "https://files.pythonhosted.org/packages/9d/db/3ef5bb276dae18d6ec2124224403d1d67bccdbefc17af4cc8f553e341ab1/filelock-3.16.1.tar.gz", hash = "sha256:c249fbfcd5db47e5e2d6d62198e565475ee65e4831e2561c8e313fa7eb961435", size = 18037 } wheels = [ - { url = "https://files.pythonhosted.org/packages/ae/f0/48285f0262fe47103a4a45972ed2f9b93e4c80b8fd609fa98da78b2a5706/filelock-3.15.4-py3-none-any.whl", hash = "sha256:6ca1fffae96225dab4c6eaf1c4f4f28cd2568d3ec2a44e15a08520504de468e7", size = 16159 }, + { url = "https://files.pythonhosted.org/packages/b9/f8/feced7779d755758a52d1f6635d990b8d98dc0a29fa568bbe0625f18fdf3/filelock-3.16.1-py3-none-any.whl", hash = "sha256:2082e5703d51fbf98ea75855d9d5527e33d8ff23099bec374a134febee6946b0", size = 16163 }, ] [[package]] @@ -427,6 +424,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ab/00/e693a155da0a2a72fd2df75b8fe338146cae59d590ad6f56800adde90cb5/griffe-1.5.1-py3-none-any.whl", hash = "sha256:ad6a7980f8c424c9102160aafa3bcdf799df0e75f7829d75af9ee5aef656f860", size = 127132 }, ] +[[package]] +name = "griffe-pydantic" +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "griffe" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8e/6b/351be1b24e7afb1d5185095870f7a88403db6edd7af644c253b6671fc81b/griffe_pydantic-1.1.0.tar.gz", hash = "sha256:9c5a701cc485dab087857c1ac960b44671acee5008aaae0752f610b2aa82b068", size = 36997 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9d/4d/a667697bbe0da8810470e71d1034932f3ec590e47719c9a0b7a3dc0e54cf/griffe_pydantic-1.1.0-py3-none-any.whl", hash = "sha256:ac9cc2d9b016cf302d8d9f577c9b3ca2793d88060f500d0b2a65f33a4a785cf1", size = 10284 }, +] + [[package]] name = "icecream" version = "2.1.3" @@ -444,11 +453,11 @@ wheels = [ [[package]] name = "identify" -version = "2.6.0" +version = "2.6.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/32/f4/8e8f7db397a7ce20fbdeac5f25adaf567fc362472432938d25556008e03a/identify-2.6.0.tar.gz", hash = "sha256:cb171c685bdc31bcc4c1734698736a7d5b6c8bf2e0c15117f4d469c8640ae5cf", size = 99116 } +sdist = { url = "https://files.pythonhosted.org/packages/1a/5f/05f0d167be94585d502b4adf8c7af31f1dc0b1c7e14f9938a88fdbbcf4a7/identify-2.6.3.tar.gz", hash = "sha256:62f5dae9b5fef52c84cc188514e9ea4f3f636b1d8799ab5ebc475471f9e47a02", size = 99179 } wheels = [ - { url = "https://files.pythonhosted.org/packages/24/6c/a4f39abe7f19600b74528d0c717b52fff0b300bb0161081510d39c53cb00/identify-2.6.0-py2.py3-none-any.whl", hash = "sha256:e79ae4406387a9d300332b5fd366d8994f1525e8414984e1a59e058b2eda2dd0", size = 98962 }, + { url = "https://files.pythonhosted.org/packages/c9/f5/09644a3ad803fae9eca8efa17e1f2aef380c7f0b02f7ec4e8d446e51d64a/identify-2.6.3-py2.py3-none-any.whl", hash = "sha256:9edba65473324c2ea9684b1f944fe3191db3345e50b6d04571d10ed164f8d7bd", size = 99049 }, ] [[package]] @@ -462,11 +471,11 @@ wheels = [ [[package]] name = "immutabledict" -version = "4.2.0" +version = "4.2.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/55/f4/710c84db4d77767176342913ac6b25f43aaed6d0a0bdb9168a8d2936d9c7/immutabledict-4.2.0.tar.gz", hash = "sha256:e003fd81aad2377a5a758bf7e1086cf3b70b63e9a5cc2f46bce8d0a2b4727c5f", size = 6165 } +sdist = { url = "https://files.pythonhosted.org/packages/e0/c5/4240186fbabc58fba41bbe17c5f0cd37ffd4c0b85a5029ab104f946df175/immutabledict-4.2.1.tar.gz", hash = "sha256:d91017248981c72eb66c8ff9834e99c2f53562346f23e7f51e7a5ebcf66a3bcc", size = 6228 } wheels = [ - { url = "https://files.pythonhosted.org/packages/e2/13/3cf4ac5b3403f3456e645c4533883ef67b1bb0c72e56b79c707715f57a74/immutabledict-4.2.0-py3-none-any.whl", hash = "sha256:d728b2c2410d698d95e6200237feb50a695584d20289ad3379a439aa3d90baba", size = 4702 }, + { url = "https://files.pythonhosted.org/packages/59/56/25ca7b848164b7d93dbd5fc97dd7751700c93e324fe854afbeb562ee2f98/immutabledict-4.2.1-py3-none-any.whl", hash = "sha256:c56a26ced38c236f79e74af3ccce53772827cef5c3bce7cab33ff2060f756373", size = 4700 }, ] [[package]] @@ -534,32 +543,52 @@ wheels = [ [[package]] name = "markupsafe" -version = "2.1.5" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/87/5b/aae44c6655f3801e81aa3eef09dbbf012431987ba564d7231722f68df02d/MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b", size = 19384 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/53/bd/583bf3e4c8d6a321938c13f49d44024dbe5ed63e0a7ba127e454a66da974/MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1", size = 18215 }, - { url = "https://files.pythonhosted.org/packages/48/d6/e7cd795fc710292c3af3a06d80868ce4b02bfbbf370b7cee11d282815a2a/MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4", size = 14069 }, - { url = "https://files.pythonhosted.org/packages/51/b5/5d8ec796e2a08fc814a2c7d2584b55f889a55cf17dd1a90f2beb70744e5c/MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee", size = 29452 }, - { url = "https://files.pythonhosted.org/packages/0a/0d/2454f072fae3b5a137c119abf15465d1771319dfe9e4acbb31722a0fff91/MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5", size = 28462 }, - { url = "https://files.pythonhosted.org/packages/2d/75/fd6cb2e68780f72d47e6671840ca517bda5ef663d30ada7616b0462ad1e3/MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b", size = 27869 }, - { url = "https://files.pythonhosted.org/packages/b0/81/147c477391c2750e8fc7705829f7351cf1cd3be64406edcf900dc633feb2/MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a", size = 33906 }, - { url = "https://files.pythonhosted.org/packages/8b/ff/9a52b71839d7a256b563e85d11050e307121000dcebc97df120176b3ad93/MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f", size = 32296 }, - { url = "https://files.pythonhosted.org/packages/88/07/2dc76aa51b481eb96a4c3198894f38b480490e834479611a4053fbf08623/MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169", size = 33038 }, - { url = "https://files.pythonhosted.org/packages/96/0c/620c1fb3661858c0e37eb3cbffd8c6f732a67cd97296f725789679801b31/MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad", size = 16572 }, - { url = "https://files.pythonhosted.org/packages/3f/14/c3554d512d5f9100a95e737502f4a2323a1959f6d0d01e0d0997b35f7b10/MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb", size = 17127 }, +version = "3.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b2/97/5d42485e71dfc078108a86d6de8fa46db44a1a9295e89c5d6d4a06e23a62/markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0", size = 20537 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/22/09/d1f21434c97fc42f09d290cbb6350d44eb12f09cc62c9476effdb33a18aa/MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf", size = 14274 }, + { url = "https://files.pythonhosted.org/packages/6b/b0/18f76bba336fa5aecf79d45dcd6c806c280ec44538b3c13671d49099fdd0/MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225", size = 12348 }, + { url = "https://files.pythonhosted.org/packages/e0/25/dd5c0f6ac1311e9b40f4af06c78efde0f3b5cbf02502f8ef9501294c425b/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028", size = 24149 }, + { url = "https://files.pythonhosted.org/packages/f3/f0/89e7aadfb3749d0f52234a0c8c7867877876e0a20b60e2188e9850794c17/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8", size = 23118 }, + { url = "https://files.pythonhosted.org/packages/d5/da/f2eeb64c723f5e3777bc081da884b414671982008c47dcc1873d81f625b6/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c", size = 22993 }, + { url = "https://files.pythonhosted.org/packages/da/0e/1f32af846df486dce7c227fe0f2398dc7e2e51d4a370508281f3c1c5cddc/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557", size = 24178 }, + { url = "https://files.pythonhosted.org/packages/c4/f6/bb3ca0532de8086cbff5f06d137064c8410d10779c4c127e0e47d17c0b71/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22", size = 23319 }, + { url = "https://files.pythonhosted.org/packages/a2/82/8be4c96ffee03c5b4a034e60a31294daf481e12c7c43ab8e34a1453ee48b/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48", size = 23352 }, + { url = "https://files.pythonhosted.org/packages/51/ae/97827349d3fcffee7e184bdf7f41cd6b88d9919c80f0263ba7acd1bbcb18/MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30", size = 15097 }, + { url = "https://files.pythonhosted.org/packages/c1/80/a61f99dc3a936413c3ee4e1eecac96c0da5ed07ad56fd975f1a9da5bc630/MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87", size = 15601 }, + { url = "https://files.pythonhosted.org/packages/83/0e/67eb10a7ecc77a0c2bbe2b0235765b98d164d81600746914bebada795e97/MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd", size = 14274 }, + { url = "https://files.pythonhosted.org/packages/2b/6d/9409f3684d3335375d04e5f05744dfe7e9f120062c9857df4ab490a1031a/MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430", size = 12352 }, + { url = "https://files.pythonhosted.org/packages/d2/f5/6eadfcd3885ea85fe2a7c128315cc1bb7241e1987443d78c8fe712d03091/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094", size = 24122 }, + { url = "https://files.pythonhosted.org/packages/0c/91/96cf928db8236f1bfab6ce15ad070dfdd02ed88261c2afafd4b43575e9e9/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396", size = 23085 }, + { url = "https://files.pythonhosted.org/packages/c2/cf/c9d56af24d56ea04daae7ac0940232d31d5a8354f2b457c6d856b2057d69/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79", size = 22978 }, + { url = "https://files.pythonhosted.org/packages/2a/9f/8619835cd6a711d6272d62abb78c033bda638fdc54c4e7f4272cf1c0962b/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a", size = 24208 }, + { url = "https://files.pythonhosted.org/packages/f9/bf/176950a1792b2cd2102b8ffeb5133e1ed984547b75db47c25a67d3359f77/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca", size = 23357 }, + { url = "https://files.pythonhosted.org/packages/ce/4f/9a02c1d335caabe5c4efb90e1b6e8ee944aa245c1aaaab8e8a618987d816/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c", size = 23344 }, + { url = "https://files.pythonhosted.org/packages/ee/55/c271b57db36f748f0e04a759ace9f8f759ccf22b4960c270c78a394f58be/MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1", size = 15101 }, + { url = "https://files.pythonhosted.org/packages/29/88/07df22d2dd4df40aba9f3e402e6dc1b8ee86297dddbad4872bd5e7b0094f/MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f", size = 15603 }, + { url = "https://files.pythonhosted.org/packages/62/6a/8b89d24db2d32d433dffcd6a8779159da109842434f1dd2f6e71f32f738c/MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c", size = 14510 }, + { url = "https://files.pythonhosted.org/packages/7a/06/a10f955f70a2e5a9bf78d11a161029d278eeacbd35ef806c3fd17b13060d/MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb", size = 12486 }, + { url = "https://files.pythonhosted.org/packages/34/cf/65d4a571869a1a9078198ca28f39fba5fbb910f952f9dbc5220afff9f5e6/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c", size = 25480 }, + { url = "https://files.pythonhosted.org/packages/0c/e3/90e9651924c430b885468b56b3d597cabf6d72be4b24a0acd1fa0e12af67/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d", size = 23914 }, + { url = "https://files.pythonhosted.org/packages/66/8c/6c7cf61f95d63bb866db39085150df1f2a5bd3335298f14a66b48e92659c/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe", size = 23796 }, + { url = "https://files.pythonhosted.org/packages/bb/35/cbe9238ec3f47ac9a7c8b3df7a808e7cb50fe149dc7039f5f454b3fba218/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5", size = 25473 }, + { url = "https://files.pythonhosted.org/packages/e6/32/7621a4382488aa283cc05e8984a9c219abad3bca087be9ec77e89939ded9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a", size = 24114 }, + { url = "https://files.pythonhosted.org/packages/0d/80/0985960e4b89922cb5a0bac0ed39c5b96cbc1a536a99f30e8c220a996ed9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9", size = 24098 }, + { url = "https://files.pythonhosted.org/packages/82/78/fedb03c7d5380df2427038ec8d973587e90561b2d90cd472ce9254cf348b/MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6", size = 15208 }, + { url = "https://files.pythonhosted.org/packages/4f/65/6079a46068dfceaeabb5dcad6d674f5f5c61a6fa5673746f42a9f4c233b3/MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f", size = 15739 }, ] [[package]] name = "marshmallow" -version = "3.22.0" +version = "3.23.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "packaging" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/70/40/faa10dc4500bca85f41ca9d8cefab282dd23d0fcc7a9b5fab40691e72e76/marshmallow-3.22.0.tar.gz", hash = "sha256:4972f529104a220bb8637d595aa4c9762afbe7f7a77d82dc58c1615d70c5823e", size = 176836 } +sdist = { url = "https://files.pythonhosted.org/packages/6d/30/14d8609f65c8aeddddd3181c06d2c9582da6278f063b27c910bbf9903441/marshmallow-3.23.1.tar.gz", hash = "sha256:3a8dfda6edd8dcdbf216c0ede1d1e78d230a6dc9c5a088f58c4083b974a0d468", size = 177488 } wheels = [ - { url = "https://files.pythonhosted.org/packages/3c/78/c1de55eb3311f2c200a8b91724414b8d6f5ae78891c15d9d936ea43c3dba/marshmallow-3.22.0-py3-none-any.whl", hash = "sha256:71a2dce49ef901c3f97ed296ae5051135fd3febd2bf43afe0ae9a82143a494d9", size = 49334 }, + { url = "https://files.pythonhosted.org/packages/ac/a7/a78ff54e67ef92a3d12126b98eb98ab8abab3de4a8c46d240c87e514d6bb/marshmallow-3.23.1-py3-none-any.whl", hash = "sha256:fece2eb2c941180ea1b7fcbd4a83c51bfdd50093fdd3ad2585ee5e1df2508491", size = 49488 }, ] [[package]] @@ -711,15 +740,15 @@ wheels = [ [[package]] name = "mkdocs-include-markdown-plugin" -version = "7.0.0" +version = "7.1.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "mkdocs" }, { name = "wcmatch" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/61/00/0809a87912b7018669bb4d909ab88aafd78c048dcf74a72c06a46707c15f/mkdocs_include_markdown_plugin-7.0.0.tar.gz", hash = "sha256:a8eac8f2e6aa391d82d1d5e473b819b52393d91464060c02db5741834fe9008b", size = 21275 } +sdist = { url = "https://files.pythonhosted.org/packages/ce/c6/863c7564872aaebc0d00f3f002adf5ef85f1f5549a44f94aec4c4624c630/mkdocs_include_markdown_plugin-7.1.2.tar.gz", hash = "sha256:1b393157b1aa231b0e6c59ba80f52b723f4b7827bb7a1264b505334f8542aaf1", size = 22213 } wheels = [ - { url = "https://files.pythonhosted.org/packages/a3/62/c085d8744d7f8c93741b439d0ecfd44e6da9859d09a257c8a66c42c611ec/mkdocs_include_markdown_plugin-7.0.0-py3-none-any.whl", hash = "sha256:bf8d19245ae3fb2eea395888e80c60bc91806a0d879279707d707896c24319c3", size = 24916 }, + { url = "https://files.pythonhosted.org/packages/84/3c/41ffab81ef2f1c2186a0fa563680274ad03a651eddf02a1488f69a49524e/mkdocs_include_markdown_plugin-7.1.2-py3-none-any.whl", hash = "sha256:ff1175d1b4f83dea6a38e200d6f0c3db10308975bf60c197d31172671753dbc4", size = 25944 }, ] [[package]] @@ -736,7 +765,7 @@ wheels = [ [[package]] name = "mkdocs-material" -version = "9.5.44" +version = "9.5.46" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "babel" }, @@ -751,9 +780,9 @@ dependencies = [ { name = "regex" }, { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f7/56/182d8121db9ab553cdf9bc58d5972b89833f60b63272f693c1f2b849b640/mkdocs_material-9.5.44.tar.gz", hash = "sha256:f3a6c968e524166b3f3ed1fb97d3ed3e0091183b0545cedf7156a2a6804c56c0", size = 3964306 } +sdist = { url = "https://files.pythonhosted.org/packages/79/f1/3efdd8f000e497e9a13ba9429d4fdeb0d87f0f876bebd7d8613ff86a8910/mkdocs_material-9.5.46.tar.gz", hash = "sha256:ae2043f4238e572f9a40e0b577f50400d6fc31e2fef8ea141800aebf3bd273d7", size = 3910723 } wheels = [ - { url = "https://files.pythonhosted.org/packages/ed/eb/a801d00e0e210d82184aacce596906ec065422c78a7319244ba0771c4ded/mkdocs_material-9.5.44-py3-none-any.whl", hash = "sha256:47015f9c167d58a5ff5e682da37441fc4d66a1c79334bfc08d774763cacf69ca", size = 8674509 }, + { url = "https://files.pythonhosted.org/packages/9f/64/af210ec1bc40fb2f195b7feede4c895c54c94acc48b108a2ad28b79d226f/mkdocs_material-9.5.46-py3-none-any.whl", hash = "sha256:98f0a2039c62e551a68aad0791a8d41324ff90c03a6e6cea381a384b84908b83", size = 8625807 }, ] [[package]] @@ -817,11 +846,11 @@ wheels = [ [[package]] name = "more-itertools" -version = "10.4.0" +version = "10.5.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/92/0d/ad6a82320cb8eba710fd0dceb0f678d5a1b58d67d03ae5be14874baa39e0/more-itertools-10.4.0.tar.gz", hash = "sha256:fe0e63c4ab068eac62410ab05cccca2dc71ec44ba8ef29916a0090df061cf923", size = 120755 } +sdist = { url = "https://files.pythonhosted.org/packages/51/78/65922308c4248e0eb08ebcbe67c95d48615cc6f27854b6f2e57143e9178f/more-itertools-10.5.0.tar.gz", hash = "sha256:5482bfef7849c25dc3c6dd53a6173ae4795da2a41a80faea6700d9f5846c5da6", size = 121020 } wheels = [ - { url = "https://files.pythonhosted.org/packages/d8/0b/6a51175e1395774449fca317fb8861379b7a2d59be411b8cce3d19d6ce78/more_itertools-10.4.0-py3-none-any.whl", hash = "sha256:0f7d9f83a0a8dcfa8a2694a770590d98a67ea943e3d9f5298309a484758c4e27", size = 60935 }, + { url = "https://files.pythonhosted.org/packages/48/7e/3a64597054a70f7c86eb0a7d4fc315b8c1ab932f64883a297bdffeb5f967/more_itertools-10.5.0-py3-none-any.whl", hash = "sha256:037b0d3203ce90cca8ab1defbbdac29d5f993fc20131f3664dc8d6acfa872aef", size = 60952 }, ] [[package]] @@ -844,11 +873,11 @@ wheels = [ [[package]] name = "packaging" -version = "24.1" +version = "24.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/51/65/50db4dda066951078f0a96cf12f4b9ada6e4b811516bf0262c0f4f7064d4/packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002", size = 148788 } +sdist = { url = "https://files.pythonhosted.org/packages/d0/63/68dbb6eb2de9cb10ee4c9c14a0148804425e13c4fb20d61cce69f53106da/packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f", size = 163950 } wheels = [ - { url = "https://files.pythonhosted.org/packages/08/aa/cc0199a5f0ad350994d660967a8efb233fe0416e4639146c089643407ce6/packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124", size = 53985 }, + { url = "https://files.pythonhosted.org/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", size = 65451 }, ] [[package]] @@ -871,11 +900,11 @@ wheels = [ [[package]] name = "platformdirs" -version = "4.2.2" +version = "4.3.6" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f5/52/0763d1d976d5c262df53ddda8d8d4719eedf9594d046f117c25a27261a19/platformdirs-4.2.2.tar.gz", hash = "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3", size = 20916 } +sdist = { url = "https://files.pythonhosted.org/packages/13/fc/128cc9cb8f03208bdbf93d3aa862e16d376844a14f9a0ce5cf4507372de4/platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907", size = 21302 } wheels = [ - { url = "https://files.pythonhosted.org/packages/68/13/2aa1f0e1364feb2c9ef45302f387ac0bd81484e9c9a4c5688a322fbdfd08/platformdirs-4.2.2-py3-none-any.whl", hash = "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee", size = 18146 }, + { url = "https://files.pythonhosted.org/packages/3c/a6/bc1012356d8ece4d66dd75c4b9fc6c1f6650ddd5991e421177d9f8f671be/platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb", size = 18439 }, ] [[package]] @@ -889,7 +918,7 @@ wheels = [ [[package]] name = "pre-commit" -version = "3.8.0" +version = "4.0.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cfgv" }, @@ -898,14 +927,14 @@ dependencies = [ { name = "pyyaml" }, { name = "virtualenv" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/64/10/97ee2fa54dff1e9da9badbc5e35d0bbaef0776271ea5907eccf64140f72f/pre_commit-3.8.0.tar.gz", hash = "sha256:8bb6494d4a20423842e198980c9ecf9f96607a07ea29549e180eef9ae80fe7af", size = 177815 } +sdist = { url = "https://files.pythonhosted.org/packages/2e/c8/e22c292035f1bac8b9f5237a2622305bc0304e776080b246f3df57c4ff9f/pre_commit-4.0.1.tar.gz", hash = "sha256:80905ac375958c0444c65e9cebebd948b3cdb518f335a091a670a89d652139d2", size = 191678 } wheels = [ - { url = "https://files.pythonhosted.org/packages/07/92/caae8c86e94681b42c246f0bca35c059a2f0529e5b92619f6aba4cf7e7b6/pre_commit-3.8.0-py2.py3-none-any.whl", hash = "sha256:9a90a53bf82fdd8778d58085faf8d83df56e40dfe18f45b19446e26bf1b3a63f", size = 204643 }, + { url = "https://files.pythonhosted.org/packages/16/8f/496e10d51edd6671ebe0432e33ff800aa86775d2d147ce7d43389324a525/pre_commit-4.0.1-py2.py3-none-any.whl", hash = "sha256:efde913840816312445dc98787724647c65473daefe420785f885e8ed9a06878", size = 218713 }, ] [[package]] name = "project-forge" -version = "0.1.0" +version = "0.2.0" source = { editable = "." } dependencies = [ { name = "click" }, @@ -920,7 +949,7 @@ dependencies = [ { name = "tomlkit" }, ] -[package.optional-dependencies] +[package.dev-dependencies] dev = [ { name = "bump-my-version" }, { name = "generate-changelog" }, @@ -929,6 +958,7 @@ dev = [ ] docs = [ { name = "black" }, + { name = "griffe-pydantic" }, { name = "markdown-customblocks" }, { name = "mdx-truly-sane-lists" }, { name = "mkdocs" }, @@ -946,6 +976,7 @@ docs = [ ] test = [ { name = "coverage" }, + { name = "gitpython" }, { name = "pre-commit" }, { name = "pytest" }, { name = "pytest-cov" }, @@ -954,40 +985,50 @@ test = [ [package.metadata] requires-dist = [ - { name = "black", marker = "extra == 'docs'" }, - { name = "bump-my-version", marker = "extra == 'dev'" }, { name = "click", specifier = ">=8.1.7" }, - { name = "coverage", marker = "extra == 'test'", specifier = ">=6.1.2" }, { name = "environs", specifier = ">=9.3.5" }, - { name = "generate-changelog", marker = "extra == 'dev'", specifier = ">=0.7.6" }, - { name = "icecream", marker = "extra == 'dev'" }, { name = "immutabledict", specifier = ">=4.2.0" }, { name = "jinja2", specifier = ">=3.1.0" }, - { name = "markdown-customblocks", marker = "extra == 'docs'" }, - { name = "mdx-truly-sane-lists", marker = "extra == 'docs'" }, - { name = "mkdocs", marker = "extra == 'docs'" }, - { name = "mkdocs-click", marker = "extra == 'docs'" }, - { name = "mkdocs-gen-files", marker = "extra == 'docs'" }, - { name = "mkdocs-git-authors-plugin", marker = "extra == 'docs'" }, - { name = "mkdocs-git-committers-plugin", marker = "extra == 'docs'" }, - { name = "mkdocs-git-revision-date-localized-plugin", marker = "extra == 'docs'" }, - { name = "mkdocs-include-markdown-plugin", marker = "extra == 'docs'" }, - { name = "mkdocs-literate-nav", marker = "extra == 'docs'" }, - { name = "mkdocs-material", marker = "extra == 'docs'" }, - { name = "mkdocs-section-index", marker = "extra == 'docs'" }, - { name = "mkdocstrings", extras = ["python"], marker = "extra == 'docs'" }, { name = "platformdirs", specifier = ">=4.2.2" }, - { name = "pre-commit", marker = "extra == 'test'", specifier = ">=2.15.0" }, { name = "pydantic", specifier = ">=2.8.2" }, { name = "pydantic-settings", specifier = ">=2.4.0" }, - { name = "pytest", marker = "extra == 'test'", specifier = ">=6.0.0" }, - { name = "pytest-cov", marker = "extra == 'test'", specifier = ">=3.0.0" }, - { name = "pytest-sugar", marker = "extra == 'test'" }, - { name = "python-frontmatter", marker = "extra == 'docs'" }, { name = "pyyaml", specifier = ">=6.0.2" }, { name = "rich-click", specifier = ">=1.8.3" }, { name = "tomlkit", specifier = ">=0.13.2" }, - { name = "uv", marker = "extra == 'dev'" }, +] + +[package.metadata.requires-dev] +dev = [ + { name = "bump-my-version" }, + { name = "generate-changelog", specifier = ">=0.7.6" }, + { name = "icecream" }, + { name = "uv" }, +] +docs = [ + { name = "black" }, + { name = "griffe-pydantic" }, + { name = "markdown-customblocks" }, + { name = "mdx-truly-sane-lists" }, + { name = "mkdocs" }, + { name = "mkdocs-click" }, + { name = "mkdocs-gen-files" }, + { name = "mkdocs-git-authors-plugin" }, + { name = "mkdocs-git-committers-plugin" }, + { name = "mkdocs-git-revision-date-localized-plugin" }, + { name = "mkdocs-include-markdown-plugin" }, + { name = "mkdocs-literate-nav" }, + { name = "mkdocs-material" }, + { name = "mkdocs-section-index" }, + { name = "mkdocstrings", extras = ["python"] }, + { name = "python-frontmatter" }, +] +test = [ + { name = "coverage", specifier = ">=6.1.2" }, + { name = "gitpython" }, + { name = "pre-commit", specifier = ">=2.15.0" }, + { name = "pytest", specifier = ">=6.0.0" }, + { name = "pytest-cov", specifier = ">=3.0.0" }, + { name = "pytest-sugar" }, ] [[package]] @@ -1013,64 +1054,68 @@ wheels = [ [[package]] name = "pydantic" -version = "2.8.2" +version = "2.10.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "annotated-types" }, { name = "pydantic-core" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/8c/99/d0a5dca411e0a017762258013ba9905cd6e7baa9a3fd1fe8b6529472902e/pydantic-2.8.2.tar.gz", hash = "sha256:6f62c13d067b0755ad1c21a34bdd06c0c12625a22b0fc09c6b149816604f7c2a", size = 739834 } +sdist = { url = "https://files.pythonhosted.org/packages/41/86/a03390cb12cf64e2a8df07c267f3eb8d5035e0f9a04bb20fb79403d2a00e/pydantic-2.10.2.tar.gz", hash = "sha256:2bc2d7f17232e0841cbba4641e65ba1eb6fafb3a08de3a091ff3ce14a197c4fa", size = 785401 } wheels = [ - { url = "https://files.pythonhosted.org/packages/1f/fa/b7f815b8c9ad021c07f88875b601222ef5e70619391ade4a49234d12d278/pydantic-2.8.2-py3-none-any.whl", hash = "sha256:73ee9fddd406dc318b885c7a2eab8a6472b68b8fb5ba8150949fc3db939f23c8", size = 423875 }, + { url = "https://files.pythonhosted.org/packages/d5/74/da832196702d0c56eb86b75bfa346db9238617e29b0b7ee3b8b4eccfe654/pydantic-2.10.2-py3-none-any.whl", hash = "sha256:cfb96e45951117c3024e6b67b25cdc33a3cb7b2fa62e239f7af1378358a1d99e", size = 456364 }, ] [[package]] name = "pydantic-core" -version = "2.20.1" +version = "2.27.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/12/e3/0d5ad91211dba310f7ded335f4dad871172b9cc9ce204f5a56d76ccd6247/pydantic_core-2.20.1.tar.gz", hash = "sha256:26ca695eeee5f9f1aeeb211ffc12f10bcb6f71e2989988fda61dabd65db878d4", size = 388371 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/6f/47/ef0d60ae23c41aced42921728650460dc831a0adf604bfa66b76028cb4d0/pydantic_core-2.20.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:595ba5be69b35777474fa07f80fc260ea71255656191adb22a8c53aba4479231", size = 1839225 }, - { url = "https://files.pythonhosted.org/packages/6a/23/430f2878c9cd977a61bb39f71751d9310ec55cee36b3d5bf1752c6341fd0/pydantic_core-2.20.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a4f55095ad087474999ee28d3398bae183a66be4823f753cd7d67dd0153427c9", size = 1768604 }, - { url = "https://files.pythonhosted.org/packages/9e/2b/ec4e7225dee79e0dc80ccc3c35ab33cc2c4bbb8a1a7ecf060e5e453651ec/pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f9aa05d09ecf4c75157197f27cdc9cfaeb7c5f15021c6373932bf3e124af029f", size = 1789767 }, - { url = "https://files.pythonhosted.org/packages/64/b0/38b24a1fa6d2f96af3148362e10737ec073768cd44d3ec21dca3be40a519/pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e97fdf088d4b31ff4ba35db26d9cc472ac7ef4a2ff2badeabf8d727b3377fc52", size = 1772061 }, - { url = "https://files.pythonhosted.org/packages/5e/da/bb73274c42cb60decfa61e9eb0c9029da78b3b9af0a9de0309dbc8ff87b6/pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bc633a9fe1eb87e250b5c57d389cf28998e4292336926b0b6cdaee353f89a237", size = 1974573 }, - { url = "https://files.pythonhosted.org/packages/c8/65/41693110fb3552556180460daffdb8bbeefb87fc026fd9aa4b849374015c/pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d573faf8eb7e6b1cbbcb4f5b247c60ca8be39fe2c674495df0eb4318303137fe", size = 2625596 }, - { url = "https://files.pythonhosted.org/packages/09/b3/a5a54b47cccd1ab661ed5775235c5e06924753c2d4817737c5667bfa19a8/pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26dc97754b57d2fd00ac2b24dfa341abffc380b823211994c4efac7f13b9e90e", size = 2099064 }, - { url = "https://files.pythonhosted.org/packages/52/fa/443a7a6ea54beaba45ff3a59f3d3e6e3004b7460bcfb0be77bcf98719d3b/pydantic_core-2.20.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:33499e85e739a4b60c9dac710c20a08dc73cb3240c9a0e22325e671b27b70d24", size = 1900345 }, - { url = "https://files.pythonhosted.org/packages/8e/e6/9aca9ffae60f9cdf0183069de3e271889b628d0fb175913fcb3db5618fb1/pydantic_core-2.20.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:bebb4d6715c814597f85297c332297c6ce81e29436125ca59d1159b07f423eb1", size = 1968252 }, - { url = "https://files.pythonhosted.org/packages/46/5e/6c716810ea20a6419188992973a73c2fb4eb99cd382368d0637ddb6d3c99/pydantic_core-2.20.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:516d9227919612425c8ef1c9b869bbbee249bc91912c8aaffb66116c0b447ebd", size = 2119191 }, - { url = "https://files.pythonhosted.org/packages/06/fc/6123b00a9240fbb9ae0babad7a005d51103d9a5d39c957a986f5cdd0c271/pydantic_core-2.20.1-cp312-none-win32.whl", hash = "sha256:469f29f9093c9d834432034d33f5fe45699e664f12a13bf38c04967ce233d688", size = 1717788 }, - { url = "https://files.pythonhosted.org/packages/d5/36/e61ad5a46607a469e2786f398cd671ebafcd9fb17f09a2359985c7228df5/pydantic_core-2.20.1-cp312-none-win_amd64.whl", hash = "sha256:035ede2e16da7281041f0e626459bcae33ed998cca6a0a007a5ebb73414ac72d", size = 1898188 }, - { url = "https://files.pythonhosted.org/packages/49/75/40b0e98b658fdba02a693b3bacb4c875a28bba87796c7b13975976597d8c/pydantic_core-2.20.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:0827505a5c87e8aa285dc31e9ec7f4a17c81a813d45f70b1d9164e03a813a686", size = 1838688 }, - { url = "https://files.pythonhosted.org/packages/75/02/d8ba2d4a266591a6a623c68b331b96523d4b62ab82a951794e3ed8907390/pydantic_core-2.20.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:19c0fa39fa154e7e0b7f82f88ef85faa2a4c23cc65aae2f5aea625e3c13c735a", size = 1768409 }, - { url = "https://files.pythonhosted.org/packages/91/ae/25ecd9bc4ce4993e99a1a3c9ab111c082630c914260e129572fafed4ecc2/pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa223cd1e36b642092c326d694d8bf59b71ddddc94cdb752bbbb1c5c91d833b", size = 1789317 }, - { url = "https://files.pythonhosted.org/packages/7a/80/72057580681cdbe55699c367963d9c661b569a1d39338b4f6239faf36cdc/pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c336a6d235522a62fef872c6295a42ecb0c4e1d0f1a3e500fe949415761b8a19", size = 1771949 }, - { url = "https://files.pythonhosted.org/packages/a2/be/d9bbabc55b05019013180f141fcaf3b14dbe15ca7da550e95b60c321009a/pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7eb6a0587eded33aeefea9f916899d42b1799b7b14b8f8ff2753c0ac1741edac", size = 1974392 }, - { url = "https://files.pythonhosted.org/packages/79/2d/7bcd938c6afb0f40293283f5f09988b61fb0a4f1d180abe7c23a2f665f8e/pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:70c8daf4faca8da5a6d655f9af86faf6ec2e1768f4b8b9d0226c02f3d6209703", size = 2625565 }, - { url = "https://files.pythonhosted.org/packages/ac/88/ca758e979457096008a4b16a064509028e3e092a1e85a5ed6c18ced8da88/pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e9fa4c9bf273ca41f940bceb86922a7667cd5bf90e95dbb157cbb8441008482c", size = 2098784 }, - { url = "https://files.pythonhosted.org/packages/eb/de/2fad6d63c3c42e472e985acb12ec45b7f56e42e6f4cd6dfbc5e87ee8678c/pydantic_core-2.20.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:11b71d67b4725e7e2a9f6e9c0ac1239bbc0c48cce3dc59f98635efc57d6dac83", size = 1900198 }, - { url = "https://files.pythonhosted.org/packages/fe/50/077c7f35b6488dc369a6d22993af3a37901e198630f38ac43391ca730f5b/pydantic_core-2.20.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:270755f15174fb983890c49881e93f8f1b80f0b5e3a3cc1394a255706cabd203", size = 1968005 }, - { url = "https://files.pythonhosted.org/packages/5d/1f/f378631574ead46d636b9a04a80ff878b9365d4b361b1905ef1667d4182a/pydantic_core-2.20.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:c81131869240e3e568916ef4c307f8b99583efaa60a8112ef27a366eefba8ef0", size = 2118920 }, - { url = "https://files.pythonhosted.org/packages/7a/ea/e4943f17df7a3031d709481fe4363d4624ae875a6409aec34c28c9e6cf59/pydantic_core-2.20.1-cp313-none-win32.whl", hash = "sha256:b91ced227c41aa29c672814f50dbb05ec93536abf8f43cd14ec9521ea09afe4e", size = 1717397 }, - { url = "https://files.pythonhosted.org/packages/13/63/b95781763e8d84207025071c0cec16d921c0163c7a9033ae4b9a0e020dc7/pydantic_core-2.20.1-cp313-none-win_amd64.whl", hash = "sha256:65db0f2eefcaad1a3950f498aabb4875c8890438bc80b19362cf633b87a8ab20", size = 1898013 }, +sdist = { url = "https://files.pythonhosted.org/packages/a6/9f/7de1f19b6aea45aeb441838782d68352e71bfa98ee6fa048d5041991b33e/pydantic_core-2.27.1.tar.gz", hash = "sha256:62a763352879b84aa31058fc931884055fd75089cccbd9d58bb6afd01141b235", size = 412785 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/be/51/2e9b3788feb2aebff2aa9dfbf060ec739b38c05c46847601134cc1fed2ea/pydantic_core-2.27.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9cbd94fc661d2bab2bc702cddd2d3370bbdcc4cd0f8f57488a81bcce90c7a54f", size = 1895239 }, + { url = "https://files.pythonhosted.org/packages/7b/9e/f8063952e4a7d0127f5d1181addef9377505dcce3be224263b25c4f0bfd9/pydantic_core-2.27.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5f8c4718cd44ec1580e180cb739713ecda2bdee1341084c1467802a417fe0f02", size = 1805070 }, + { url = "https://files.pythonhosted.org/packages/2c/9d/e1d6c4561d262b52e41b17a7ef8301e2ba80b61e32e94520271029feb5d8/pydantic_core-2.27.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:15aae984e46de8d376df515f00450d1522077254ef6b7ce189b38ecee7c9677c", size = 1828096 }, + { url = "https://files.pythonhosted.org/packages/be/65/80ff46de4266560baa4332ae3181fffc4488ea7d37282da1a62d10ab89a4/pydantic_core-2.27.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1ba5e3963344ff25fc8c40da90f44b0afca8cfd89d12964feb79ac1411a260ac", size = 1857708 }, + { url = "https://files.pythonhosted.org/packages/d5/ca/3370074ad758b04d9562b12ecdb088597f4d9d13893a48a583fb47682cdf/pydantic_core-2.27.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:992cea5f4f3b29d6b4f7f1726ed8ee46c8331c6b4eed6db5b40134c6fe1768bb", size = 2037751 }, + { url = "https://files.pythonhosted.org/packages/b1/e2/4ab72d93367194317b99d051947c071aef6e3eb95f7553eaa4208ecf9ba4/pydantic_core-2.27.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0325336f348dbee6550d129b1627cb8f5351a9dc91aad141ffb96d4937bd9529", size = 2733863 }, + { url = "https://files.pythonhosted.org/packages/8a/c6/8ae0831bf77f356bb73127ce5a95fe115b10f820ea480abbd72d3cc7ccf3/pydantic_core-2.27.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7597c07fbd11515f654d6ece3d0e4e5093edc30a436c63142d9a4b8e22f19c35", size = 2161161 }, + { url = "https://files.pythonhosted.org/packages/f1/f4/b2fe73241da2429400fc27ddeaa43e35562f96cf5b67499b2de52b528cad/pydantic_core-2.27.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3bbd5d8cc692616d5ef6fbbbd50dbec142c7e6ad9beb66b78a96e9c16729b089", size = 1993294 }, + { url = "https://files.pythonhosted.org/packages/77/29/4bb008823a7f4cc05828198153f9753b3bd4c104d93b8e0b1bfe4e187540/pydantic_core-2.27.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:dc61505e73298a84a2f317255fcc72b710b72980f3a1f670447a21efc88f8381", size = 2001468 }, + { url = "https://files.pythonhosted.org/packages/f2/a9/0eaceeba41b9fad851a4107e0cf999a34ae8f0d0d1f829e2574f3d8897b0/pydantic_core-2.27.1-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:e1f735dc43da318cad19b4173dd1ffce1d84aafd6c9b782b3abc04a0d5a6f5bb", size = 2091413 }, + { url = "https://files.pythonhosted.org/packages/d8/36/eb8697729725bc610fd73940f0d860d791dc2ad557faaefcbb3edbd2b349/pydantic_core-2.27.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:f4e5658dbffe8843a0f12366a4c2d1c316dbe09bb4dfbdc9d2d9cd6031de8aae", size = 2154735 }, + { url = "https://files.pythonhosted.org/packages/52/e5/4f0fbd5c5995cc70d3afed1b5c754055bb67908f55b5cb8000f7112749bf/pydantic_core-2.27.1-cp312-none-win32.whl", hash = "sha256:672ebbe820bb37988c4d136eca2652ee114992d5d41c7e4858cdd90ea94ffe5c", size = 1833633 }, + { url = "https://files.pythonhosted.org/packages/ee/f2/c61486eee27cae5ac781305658779b4a6b45f9cc9d02c90cb21b940e82cc/pydantic_core-2.27.1-cp312-none-win_amd64.whl", hash = "sha256:66ff044fd0bb1768688aecbe28b6190f6e799349221fb0de0e6f4048eca14c16", size = 1986973 }, + { url = "https://files.pythonhosted.org/packages/df/a6/e3f12ff25f250b02f7c51be89a294689d175ac76e1096c32bf278f29ca1e/pydantic_core-2.27.1-cp312-none-win_arm64.whl", hash = "sha256:9a3b0793b1bbfd4146304e23d90045f2a9b5fd5823aa682665fbdaf2a6c28f3e", size = 1883215 }, + { url = "https://files.pythonhosted.org/packages/0f/d6/91cb99a3c59d7b072bded9959fbeab0a9613d5a4935773c0801f1764c156/pydantic_core-2.27.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:f216dbce0e60e4d03e0c4353c7023b202d95cbaeff12e5fd2e82ea0a66905073", size = 1895033 }, + { url = "https://files.pythonhosted.org/packages/07/42/d35033f81a28b27dedcade9e967e8a40981a765795c9ebae2045bcef05d3/pydantic_core-2.27.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a2e02889071850bbfd36b56fd6bc98945e23670773bc7a76657e90e6b6603c08", size = 1807542 }, + { url = "https://files.pythonhosted.org/packages/41/c2/491b59e222ec7e72236e512108ecad532c7f4391a14e971c963f624f7569/pydantic_core-2.27.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42b0e23f119b2b456d07ca91b307ae167cc3f6c846a7b169fca5326e32fdc6cf", size = 1827854 }, + { url = "https://files.pythonhosted.org/packages/e3/f3/363652651779113189cefdbbb619b7b07b7a67ebb6840325117cc8cc3460/pydantic_core-2.27.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:764be71193f87d460a03f1f7385a82e226639732214b402f9aa61f0d025f0737", size = 1857389 }, + { url = "https://files.pythonhosted.org/packages/5f/97/be804aed6b479af5a945daec7538d8bf358d668bdadde4c7888a2506bdfb/pydantic_core-2.27.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1c00666a3bd2f84920a4e94434f5974d7bbc57e461318d6bb34ce9cdbbc1f6b2", size = 2037934 }, + { url = "https://files.pythonhosted.org/packages/42/01/295f0bd4abf58902917e342ddfe5f76cf66ffabfc57c2e23c7681a1a1197/pydantic_core-2.27.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3ccaa88b24eebc0f849ce0a4d09e8a408ec5a94afff395eb69baf868f5183107", size = 2735176 }, + { url = "https://files.pythonhosted.org/packages/9d/a0/cd8e9c940ead89cc37812a1a9f310fef59ba2f0b22b4e417d84ab09fa970/pydantic_core-2.27.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c65af9088ac534313e1963443d0ec360bb2b9cba6c2909478d22c2e363d98a51", size = 2160720 }, + { url = "https://files.pythonhosted.org/packages/73/ae/9d0980e286627e0aeca4c352a60bd760331622c12d576e5ea4441ac7e15e/pydantic_core-2.27.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:206b5cf6f0c513baffaeae7bd817717140770c74528f3e4c3e1cec7871ddd61a", size = 1992972 }, + { url = "https://files.pythonhosted.org/packages/bf/ba/ae4480bc0292d54b85cfb954e9d6bd226982949f8316338677d56541b85f/pydantic_core-2.27.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:062f60e512fc7fff8b8a9d680ff0ddaaef0193dba9fa83e679c0c5f5fbd018bc", size = 2001477 }, + { url = "https://files.pythonhosted.org/packages/55/b7/e26adf48c2f943092ce54ae14c3c08d0d221ad34ce80b18a50de8ed2cba8/pydantic_core-2.27.1-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:a0697803ed7d4af5e4c1adf1670af078f8fcab7a86350e969f454daf598c4960", size = 2091186 }, + { url = "https://files.pythonhosted.org/packages/ba/cc/8491fff5b608b3862eb36e7d29d36a1af1c945463ca4c5040bf46cc73f40/pydantic_core-2.27.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:58ca98a950171f3151c603aeea9303ef6c235f692fe555e883591103da709b23", size = 2154429 }, + { url = "https://files.pythonhosted.org/packages/78/d8/c080592d80edd3441ab7f88f865f51dae94a157fc64283c680e9f32cf6da/pydantic_core-2.27.1-cp313-none-win32.whl", hash = "sha256:8065914ff79f7eab1599bd80406681f0ad08f8e47c880f17b416c9f8f7a26d05", size = 1833713 }, + { url = "https://files.pythonhosted.org/packages/83/84/5ab82a9ee2538ac95a66e51f6838d6aba6e0a03a42aa185ad2fe404a4e8f/pydantic_core-2.27.1-cp313-none-win_amd64.whl", hash = "sha256:ba630d5e3db74c79300d9a5bdaaf6200172b107f263c98a0539eeecb857b2337", size = 1987897 }, + { url = "https://files.pythonhosted.org/packages/df/c3/b15fb833926d91d982fde29c0624c9f225da743c7af801dace0d4e187e71/pydantic_core-2.27.1-cp313-none-win_arm64.whl", hash = "sha256:45cf8588c066860b623cd11c4ba687f8d7175d5f7ef65f7129df8a394c502de5", size = 1882983 }, ] [[package]] name = "pydantic-settings" -version = "2.4.0" +version = "2.6.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pydantic" }, { name = "python-dotenv" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/58/14/7bfb313ccee79f97dc235721b035174af94ef4472cfe455c259cd2971f2f/pydantic_settings-2.4.0.tar.gz", hash = "sha256:ed81c3a0f46392b4d7c0a565c05884e6e54b3456e6f0fe4d8814981172dc9a88", size = 63033 } +sdist = { url = "https://files.pythonhosted.org/packages/b5/d4/9dfbe238f45ad8b168f5c96ee49a3df0598ce18a0795a983b419949ce65b/pydantic_settings-2.6.1.tar.gz", hash = "sha256:e0f92546d8a9923cb8941689abf85d6601a8c19a23e97a34b2964a2e3f813ca0", size = 75646 } wheels = [ - { url = "https://files.pythonhosted.org/packages/93/46/7f90f36c1bdcf24962d2b7b0e11aba3bbd65ea7904cb2553072882a4e6b7/pydantic_settings-2.4.0-py3-none-any.whl", hash = "sha256:bb6849dc067f1687574c12a639e231f3a6feeed0a12d710c1382045c5db1c315", size = 23996 }, + { url = "https://files.pythonhosted.org/packages/5e/f9/ff95fd7d760af42f647ea87f9b8a383d891cdb5e5dbd4613edaeb094252a/pydantic_settings-2.6.1-py3-none-any.whl", hash = "sha256:7fb0637c786a558d3103436278a7c4f1cfd29ba8973238a50c5bb9a55387da87", size = 28595 }, ] [[package]] @@ -1101,11 +1146,11 @@ wheels = [ [[package]] name = "pyjwt" -version = "2.9.0" +version = "2.10.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/fb/68/ce067f09fca4abeca8771fe667d89cc347d1e99da3e093112ac329c6020e/pyjwt-2.9.0.tar.gz", hash = "sha256:7e1e5b56cc735432a7369cbfa0efe50fa113ebecdc04ae6922deba8b84582d0c", size = 78825 } +sdist = { url = "https://files.pythonhosted.org/packages/e7/46/bd74733ff231675599650d3e47f361794b22ef3e3770998dda30d3b63726/pyjwt-2.10.1.tar.gz", hash = "sha256:3cc5772eb20009233caf06e9d8a0577824723b44e6648ee0a2aedb6cf9381953", size = 87785 } wheels = [ - { url = "https://files.pythonhosted.org/packages/79/84/0fdf9b18ba31d69877bd39c9cd6052b47f3761e9910c15de788e519f079f/PyJWT-2.9.0-py3-none-any.whl", hash = "sha256:3b02fb0f44517787776cf48f2ae25d8e14f300e6d7545a4315cee571a415e850", size = 22344 }, + { url = "https://files.pythonhosted.org/packages/61/ad/689f02752eeec26aed679477e80e632ef1b682313be70793d798c1d5fc8f/PyJWT-2.10.1-py3-none-any.whl", hash = "sha256:dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb", size = 22997 }, ] [package.optional-dependencies] @@ -1148,7 +1193,7 @@ wheels = [ [[package]] name = "pytest" -version = "8.3.2" +version = "8.3.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, @@ -1156,22 +1201,22 @@ dependencies = [ { name = "packaging" }, { name = "pluggy" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b4/8c/9862305bdcd6020bc7b45b1b5e7397a6caf1a33d3025b9a003b39075ffb2/pytest-8.3.2.tar.gz", hash = "sha256:c132345d12ce551242c87269de812483f5bcc87cdbb4722e48487ba194f9fdce", size = 1439314 } +sdist = { url = "https://files.pythonhosted.org/packages/8b/6c/62bbd536103af674e227c41a8f3dcd022d591f6eed5facb5a0f31ee33bbc/pytest-8.3.3.tar.gz", hash = "sha256:70b98107bd648308a7952b06e6ca9a50bc660be218d53c257cc1fc94fda10181", size = 1442487 } wheels = [ - { url = "https://files.pythonhosted.org/packages/0f/f9/cf155cf32ca7d6fa3601bc4c5dd19086af4b320b706919d48a4c79081cf9/pytest-8.3.2-py3-none-any.whl", hash = "sha256:4ba08f9ae7dcf84ded419494d229b48d0903ea6407b030eaec46df5e6a73bba5", size = 341802 }, + { url = "https://files.pythonhosted.org/packages/6b/77/7440a06a8ead44c7757a64362dd22df5760f9b12dc5f11b6188cd2fc27a0/pytest-8.3.3-py3-none-any.whl", hash = "sha256:a6853c7375b2663155079443d2e45de913a911a11d669df02a50814944db57b2", size = 342341 }, ] [[package]] name = "pytest-cov" -version = "5.0.0" +version = "6.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "coverage" }, { name = "pytest" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/74/67/00efc8d11b630c56f15f4ad9c7f9223f1e5ec275aaae3fa9118c6a223ad2/pytest-cov-5.0.0.tar.gz", hash = "sha256:5837b58e9f6ebd335b0f8060eecce69b662415b16dc503883a02f45dfeb14857", size = 63042 } +sdist = { url = "https://files.pythonhosted.org/packages/be/45/9b538de8cef30e17c7b45ef42f538a94889ed6a16f2387a6c89e73220651/pytest-cov-6.0.0.tar.gz", hash = "sha256:fde0b595ca248bb8e2d76f020b465f3b107c9632e6a1d1705f17834c89dcadc0", size = 66945 } wheels = [ - { url = "https://files.pythonhosted.org/packages/78/3a/af5b4fa5961d9a1e6237b530eb87dd04aea6eb83da09d2a4073d81b54ccf/pytest_cov-5.0.0-py3-none-any.whl", hash = "sha256:4f0764a1219df53214206bf1feea4633c3b558a2925c8b59f144f682861ce652", size = 21990 }, + { url = "https://files.pythonhosted.org/packages/36/3b/48e79f2cd6a61dbbd4807b4ed46cb564b4fd50a76166b1c4ea5c1d9e2371/pytest_cov-6.0.0-py3-none-any.whl", hash = "sha256:eee6f1b9e61008bd34975a4d5bab25801eb31898b032dd55addc93e96fcaaa35", size = 22949 }, ] [[package]] @@ -1361,29 +1406,29 @@ wheels = [ [[package]] name = "rich" -version = "13.7.1" +version = "13.9.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markdown-it-py" }, { name = "pygments" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b3/01/c954e134dc440ab5f96952fe52b4fdc64225530320a910473c1fe270d9aa/rich-13.7.1.tar.gz", hash = "sha256:9be308cb1fe2f1f57d67ce99e95af38a1e2bc71ad9813b0e247cf7ffbcc3a432", size = 221248 } +sdist = { url = "https://files.pythonhosted.org/packages/ab/3a/0316b28d0761c6734d6bc14e770d85506c986c85ffb239e688eeaab2c2bc/rich-13.9.4.tar.gz", hash = "sha256:439594978a49a09530cff7ebc4b5c7103ef57baf48d5ea3184f21d9a2befa098", size = 223149 } wheels = [ - { url = "https://files.pythonhosted.org/packages/87/67/a37f6214d0e9fe57f6ae54b2956d550ca8365857f42a1ce0392bb21d9410/rich-13.7.1-py3-none-any.whl", hash = "sha256:4edbae314f59eb482f54e9e30bf00d33350aaa94f4bfcd4e9e3110e64d0d7222", size = 240681 }, + { url = "https://files.pythonhosted.org/packages/19/71/39c7c0d87f8d4e6c020a393182060eaefeeae6c01dab6a84ec346f2567df/rich-13.9.4-py3-none-any.whl", hash = "sha256:6049d5e6ec054bf2779ab3358186963bac2ea89175919d699e378b99738c2a90", size = 242424 }, ] [[package]] name = "rich-click" -version = "1.8.3" +version = "1.8.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, { name = "rich" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/3a/a9/a1f1af87e83832d794342fbc09c96cc7cd6798b8dfb8adfbe6ccbef8d70c/rich_click-1.8.3.tar.gz", hash = "sha256:6d75bdfa7aa9ed2c467789a0688bc6da23fbe3a143e19aa6ad3f8bac113d2ab3", size = 38209 } +sdist = { url = "https://files.pythonhosted.org/packages/fc/f4/e48dc2850662526a26fb0961aacb0162c6feab934312b109b748ae4efee2/rich_click-1.8.4.tar.gz", hash = "sha256:0f49471f04439269d0e66a6f43120f52d11d594869a2a0be600cfb12eb0616b9", size = 38247 } wheels = [ - { url = "https://files.pythonhosted.org/packages/c6/ea/5a0c5a8e6532e971983d1b0fc99268eb66a10f489da35d9022ce01044191/rich_click-1.8.3-py3-none-any.whl", hash = "sha256:636d9c040d31c5eee242201b5bf4f2d358bfae4db14bb22ec1cafa717cfd02cd", size = 35032 }, + { url = "https://files.pythonhosted.org/packages/84/f3/72f93d8494ee641bde76bfe1208cf4abc44c6f9448673762f6077bc162d6/rich_click-1.8.4-py3-none-any.whl", hash = "sha256:2d2841b3cebe610d5682baa1194beaf78ab00c4fa31931533261b5eba2ee80b7", size = 35071 }, ] [[package]] @@ -1400,27 +1445,35 @@ wheels = [ [[package]] name = "ruamel-yaml-clib" -version = "0.2.8" +version = "0.2.12" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/46/ab/bab9eb1566cd16f060b54055dd39cf6a34bfa0240c53a7218c43e974295b/ruamel.yaml.clib-0.2.8.tar.gz", hash = "sha256:beb2e0404003de9a4cab9753a8805a8fe9320ee6673136ed7f04255fe60bb512", size = 213824 } +sdist = { url = "https://files.pythonhosted.org/packages/20/84/80203abff8ea4993a87d823a5f632e4d92831ef75d404c9fc78d0176d2b5/ruamel.yaml.clib-0.2.12.tar.gz", hash = "sha256:6c8fbb13ec503f99a91901ab46e0b07ae7941cd527393187039aec586fdfd36f", size = 225315 } wheels = [ - { url = "https://files.pythonhosted.org/packages/7a/a2/eb5e9d088cb9d15c24d956944c09dca0a89108ad6e2e913c099ef36e3f0d/ruamel.yaml.clib-0.2.8-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:ebc06178e8821efc9692ea7544aa5644217358490145629914d8020042c24aa1", size = 144636 }, - { url = "https://files.pythonhosted.org/packages/66/98/8de4f22bbfd9135deb3422e96d450c4bc0a57d38c25976119307d2efe0aa/ruamel.yaml.clib-0.2.8-cp312-cp312-macosx_13_0_arm64.whl", hash = "sha256:edaef1c1200c4b4cb914583150dcaa3bc30e592e907c01117c08b13a07255ec2", size = 135684 }, - { url = "https://files.pythonhosted.org/packages/30/d3/5fe978cd01a61c12efd24d65fa68c6f28f28c8073a06cf11db3a854390ca/ruamel.yaml.clib-0.2.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d176b57452ab5b7028ac47e7b3cf644bcfdc8cacfecf7e71759f7f51a59e5c92", size = 734571 }, - { url = "https://files.pythonhosted.org/packages/55/b3/e2531a050758b717c969cbf76c103b75d8a01e11af931b94ba656117fbe9/ruamel.yaml.clib-0.2.8-cp312-cp312-manylinux_2_24_aarch64.whl", hash = "sha256:1dc67314e7e1086c9fdf2680b7b6c2be1c0d8e3a8279f2e993ca2a7545fecf62", size = 643946 }, - { url = "https://files.pythonhosted.org/packages/0d/aa/06db7ca0995b513538402e11280282c615b5ae5f09eb820460d35fb69715/ruamel.yaml.clib-0.2.8-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:3213ece08ea033eb159ac52ae052a4899b56ecc124bb80020d9bbceeb50258e9", size = 692169 }, - { url = "https://files.pythonhosted.org/packages/27/38/4cf4d482b84ecdf51efae6635cc5483a83cf5ca9d9c13e205a750e251696/ruamel.yaml.clib-0.2.8-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:aab7fd643f71d7946f2ee58cc88c9b7bfc97debd71dcc93e03e2d174628e7e2d", size = 740325 }, - { url = "https://files.pythonhosted.org/packages/6f/67/c62c6eea53a4feb042727a3d6c18f50dc99683c2b199c06bd2a9e3db8e22/ruamel.yaml.clib-0.2.8-cp312-cp312-win32.whl", hash = "sha256:5c365d91c88390c8d0a8545df0b5857172824b1c604e867161e6b3d59a827eaa", size = 98639 }, - { url = "https://files.pythonhosted.org/packages/10/d2/52a3d810d0b5b3720725c0504a27b3fced7b6f310fe928f7019d79387bc1/ruamel.yaml.clib-0.2.8-cp312-cp312-win_amd64.whl", hash = "sha256:1758ce7d8e1a29d23de54a16ae867abd370f01b5a69e1a3ba75223eaa3ca1a1b", size = 115305 }, + { url = "https://files.pythonhosted.org/packages/48/41/e7a405afbdc26af961678474a55373e1b323605a4f5e2ddd4a80ea80f628/ruamel.yaml.clib-0.2.12-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:20b0f8dc160ba83b6dcc0e256846e1a02d044e13f7ea74a3d1d56ede4e48c632", size = 133433 }, + { url = "https://files.pythonhosted.org/packages/ec/b0/b850385604334c2ce90e3ee1013bd911aedf058a934905863a6ea95e9eb4/ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:943f32bc9dedb3abff9879edc134901df92cfce2c3d5c9348f172f62eb2d771d", size = 647362 }, + { url = "https://files.pythonhosted.org/packages/44/d0/3f68a86e006448fb6c005aee66565b9eb89014a70c491d70c08de597f8e4/ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95c3829bb364fdb8e0332c9931ecf57d9be3519241323c5274bd82f709cebc0c", size = 754118 }, + { url = "https://files.pythonhosted.org/packages/52/a9/d39f3c5ada0a3bb2870d7db41901125dbe2434fa4f12ca8c5b83a42d7c53/ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:749c16fcc4a2b09f28843cda5a193e0283e47454b63ec4b81eaa2242f50e4ccd", size = 706497 }, + { url = "https://files.pythonhosted.org/packages/b0/fa/097e38135dadd9ac25aecf2a54be17ddf6e4c23e43d538492a90ab3d71c6/ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bf165fef1f223beae7333275156ab2022cffe255dcc51c27f066b4370da81e31", size = 698042 }, + { url = "https://files.pythonhosted.org/packages/ec/d5/a659ca6f503b9379b930f13bc6b130c9f176469b73b9834296822a83a132/ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:32621c177bbf782ca5a18ba4d7af0f1082a3f6e517ac2a18b3974d4edf349680", size = 745831 }, + { url = "https://files.pythonhosted.org/packages/b1/82/85cb92f15a4231c89b95dfe08b09eb6adca929ef7df7e17ab59902b6f589/ruamel.yaml.clib-0.2.12-cp312-cp312-win32.whl", hash = "sha256:e8c4ebfcfd57177b572e2040777b8abc537cdef58a2120e830124946aa9b42c5", size = 98777 }, + { url = "https://files.pythonhosted.org/packages/d7/8f/c3654f6f1ddb75daf3922c3d8fc6005b1ab56671ad56ffb874d908bfa668/ruamel.yaml.clib-0.2.12-cp312-cp312-win_amd64.whl", hash = "sha256:0467c5965282c62203273b838ae77c0d29d7638c8a4e3a1c8bdd3602c10904e4", size = 115523 }, + { url = "https://files.pythonhosted.org/packages/29/00/4864119668d71a5fa45678f380b5923ff410701565821925c69780356ffa/ruamel.yaml.clib-0.2.12-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:4c8c5d82f50bb53986a5e02d1b3092b03622c02c2eb78e29bec33fd9593bae1a", size = 132011 }, + { url = "https://files.pythonhosted.org/packages/7f/5e/212f473a93ae78c669ffa0cb051e3fee1139cb2d385d2ae1653d64281507/ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux2014_aarch64.whl", hash = "sha256:e7e3736715fbf53e9be2a79eb4db68e4ed857017344d697e8b9749444ae57475", size = 642488 }, + { url = "https://files.pythonhosted.org/packages/1f/8f/ecfbe2123ade605c49ef769788f79c38ddb1c8fa81e01f4dbf5cf1a44b16/ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b7e75b4965e1d4690e93021adfcecccbca7d61c7bddd8e22406ef2ff20d74ef", size = 745066 }, + { url = "https://files.pythonhosted.org/packages/e2/a9/28f60726d29dfc01b8decdb385de4ced2ced9faeb37a847bd5cf26836815/ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96777d473c05ee3e5e3c3e999f5d23c6f4ec5b0c38c098b3a5229085f74236c6", size = 701785 }, + { url = "https://files.pythonhosted.org/packages/84/7e/8e7ec45920daa7f76046578e4f677a3215fe8f18ee30a9cb7627a19d9b4c/ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:3bc2a80e6420ca8b7d3590791e2dfc709c88ab9152c00eeb511c9875ce5778bf", size = 693017 }, + { url = "https://files.pythonhosted.org/packages/c5/b3/d650eaade4ca225f02a648321e1ab835b9d361c60d51150bac49063b83fa/ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:e188d2699864c11c36cdfdada94d781fd5d6b0071cd9c427bceb08ad3d7c70e1", size = 741270 }, + { url = "https://files.pythonhosted.org/packages/30/8c/ed73f047a73638257aa9377ad356bea4d96125b305c34a28766f4445cc0f/ruamel.yaml.clib-0.2.12-cp313-cp313-win32.whl", hash = "sha256:6442cb36270b3afb1b4951f060eccca1ce49f3d087ca1ca4563a6eb479cb3de6", size = 98583 }, + { url = "https://files.pythonhosted.org/packages/b0/85/e8e751d8791564dd333d5d9a4eab0a7a115f7e349595417fd50ecae3395c/ruamel.yaml.clib-0.2.12-cp313-cp313-win_amd64.whl", hash = "sha256:e5b8daf27af0b90da7bb903a876477a9e6d7270be6146906b276605997c7e9a3", size = 115190 }, ] [[package]] name = "setuptools" -version = "75.3.0" +version = "75.6.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ed/22/a438e0caa4576f8c383fa4d35f1cc01655a46c75be358960d815bfbb12bd/setuptools-75.3.0.tar.gz", hash = "sha256:fba5dd4d766e97be1b1681d98712680ae8f2f26d7881245f2ce9e40714f1a686", size = 1351577 } +sdist = { url = "https://files.pythonhosted.org/packages/43/54/292f26c208734e9a7f067aea4a7e282c080750c4546559b58e2e45413ca0/setuptools-75.6.0.tar.gz", hash = "sha256:8199222558df7c86216af4f84c30e9b34a61d8ba19366cc914424cdbd28252f6", size = 1337429 } wheels = [ - { url = "https://files.pythonhosted.org/packages/90/12/282ee9bce8b58130cb762fbc9beabd531549952cac11fc56add11dcb7ea0/setuptools-75.3.0-py3-none-any.whl", hash = "sha256:f2504966861356aa38616760c0f66568e535562374995367b4e69c7143cf6bcd", size = 1251070 }, + { url = "https://files.pythonhosted.org/packages/55/21/47d163f615df1d30c094f6c8bbb353619274edccf0327b185cc2493c2c33/setuptools-75.6.0-py3-none-any.whl", hash = "sha256:ce74b49e8f7110f9bf04883b730f4765b774ef3ef28f722cce7c273d253aaf7d", size = 1224032 }, ] [[package]] @@ -1461,11 +1514,11 @@ wheels = [ [[package]] name = "termcolor" -version = "2.4.0" +version = "2.5.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/10/56/d7d66a84f96d804155f6ff2873d065368b25a07222a6fd51c4f24ef6d764/termcolor-2.4.0.tar.gz", hash = "sha256:aab9e56047c8ac41ed798fa36d892a37aca6b3e9159f3e0c24bc64a9b3ac7b7a", size = 12664 } +sdist = { url = "https://files.pythonhosted.org/packages/37/72/88311445fd44c455c7d553e61f95412cf89054308a1aa2434ab835075fc5/termcolor-2.5.0.tar.gz", hash = "sha256:998d8d27da6d48442e8e1f016119076b690d962507531df4890fcd2db2ef8a6f", size = 13057 } wheels = [ - { url = "https://files.pythonhosted.org/packages/d9/5f/8c716e47b3a50cbd7c146f45881e11d9414def768b7cd9c5e6650ec2a80a/termcolor-2.4.0-py3-none-any.whl", hash = "sha256:9297c0df9c99445c2412e832e882a7884038a25617c60cea2ad69488d4040d63", size = 7719 }, + { url = "https://files.pythonhosted.org/packages/7f/be/df630c387a0a054815d60be6a97eb4e8f17385d5d6fe660e1c02750062b4/termcolor-2.5.0-py3-none-any.whl", hash = "sha256:37b17b5fc1e604945c2642c872a3764b5d547a48009871aea3edd3afa180afb8", size = 7755 }, ] [[package]] @@ -1479,7 +1532,7 @@ wheels = [ [[package]] name = "typer" -version = "0.12.5" +version = "0.14.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, @@ -1487,9 +1540,9 @@ dependencies = [ { name = "shellingham" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c5/58/a79003b91ac2c6890fc5d90145c662fd5771c6f11447f116b63300436bc9/typer-0.12.5.tar.gz", hash = "sha256:f592f089bedcc8ec1b974125d64851029c3b1af145f04aca64d69410f0c9b722", size = 98953 } +sdist = { url = "https://files.pythonhosted.org/packages/0d/7e/24af5b9aaa0872f9f6dc5dcf789dc3e57ceb23b4c570b852cd4db0d98f14/typer-0.14.0.tar.gz", hash = "sha256:af58f737f8d0c0c37b9f955a6d39000b9ff97813afcbeef56af5e37cf743b45a", size = 98836 } wheels = [ - { url = "https://files.pythonhosted.org/packages/a8/2b/886d13e742e514f704c33c4caa7df0f3b89e5a25ef8db02aa9ca3d9535d5/typer-0.12.5-py3-none-any.whl", hash = "sha256:62fe4e471711b147e3365034133904df3e235698399bc4de2b36c8579298d52b", size = 47288 }, + { url = "https://files.pythonhosted.org/packages/bb/d8/a3ab71d5587b42b832a7ef2e65b3e51a18f8da32b6ce169637d4d21995ed/typer-0.14.0-py3-none-any.whl", hash = "sha256:f476233a25770ab3e7b2eebf7c68f3bc702031681a008b20167573a4b7018f09", size = 44707 }, ] [[package]] @@ -1512,41 +1565,41 @@ wheels = [ [[package]] name = "uv" -version = "0.3.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/27/15/3b0d6a8bb23bfec7e521f4b39cfdcc565c4b219be6af63cb66e89311b681/uv-0.3.3.tar.gz", hash = "sha256:ea5831a529f1a5b526ae22f96451ccbe73766b4d746d4c71bb4abeddfcac2cc1", size = 1785423 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/fe/6b/f37e19f40afab20bd1373ee91dff84e3575d843b4ea6169fcc3166d5ddf7/uv-0.3.3-py3-none-linux_armv6l.whl", hash = "sha256:ba5d09a21729d6c7b0b94b4960127fa0d36f287b51e7d95aaf5c57a146c44706", size = 10699616 }, - { url = "https://files.pythonhosted.org/packages/cd/67/355eb7025f75738f0f3d1185f07fc6dd4b484b20714ebdd8e7879d1c92be/uv-0.3.3-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:eea08b2b183d0ae960a162e3e1e9525b6d734e7c3e36a860ba565e59d736c0c6", size = 11147041 }, - { url = "https://files.pythonhosted.org/packages/9a/d4/a93e05dbcb60e8d78bef1bba2e3e6dd3eae6f1449bde4e739a28236420fd/uv-0.3.3-py3-none-macosx_11_0_arm64.whl", hash = "sha256:0f30d8bca3c1dfd35b555adeb654e83b1ebacf9bdbf27255f78e8e9924a62dd3", size = 10302350 }, - { url = "https://files.pythonhosted.org/packages/e9/f8/ec98f401c5f7e57306bfc192fb5272380e46fc1fbbf0264fd15e64e235f6/uv-0.3.3-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_1_aarch64.whl", hash = "sha256:d8a916b1f005e993d08bcba545dd71dd06a5665f20fd19031a4a25d795ada6b9", size = 10596508 }, - { url = "https://files.pythonhosted.org/packages/40/f9/98fbe38f67e588471693674ec4687018f9795197a33182d95eb7c25afced/uv-0.3.3-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fc9bd9c2c08703aa962567e34645e34b707fd7eaba211fe2e88b080a0875933e", size = 10518364 }, - { url = "https://files.pythonhosted.org/packages/5d/2f/04589b6cce3cc66053e74e54462bedd10104b9c681ad12fd05b3a2874800/uv-0.3.3-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07fd6da67ee35a1d1b36612981edd56527a5b44f953eded2005672eb7b1ffaca", size = 11114108 }, - { url = "https://files.pythonhosted.org/packages/16/ea/4868031c78ae75bc93b0c2e4e0c0aa6a9a7ec08e602f1a6072d3cf844df1/uv-0.3.3-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:3789887b4f6f5f3b91f8432726ca7e172efd4030b121fd347fa108d4724d13ac", size = 11915369 }, - { url = "https://files.pythonhosted.org/packages/5c/04/3d23a4ccc3e0c91ac28512d66f0c8a30f10eddec0d237db3f8ad27ad118e/uv-0.3.3-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:df5a8d536ddce8cd3a3efadab73b4f2e71bb51ee39d5844241cf499ba107a27b", size = 11738243 }, - { url = "https://files.pythonhosted.org/packages/67/99/34142d01be2d326cd0a442673835ee51da791c5e0f4af38e644006eb0414/uv-0.3.3-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:61f8d32c40d5b4fdb63748bf2f244272ce2b10ce13623b8233a4cc8df7bdc19f", size = 14643695 }, - { url = "https://files.pythonhosted.org/packages/eb/51/a198cabe57a37b4f8c2011375d832756ee5bfa41a5e767ff368da90e7b18/uv-0.3.3-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d7bf7913f3b29d15608dc3f1c8c840ec8b79494a9b7e3b535419e01014e32a5", size = 11496768 }, - { url = "https://files.pythonhosted.org/packages/af/4d/bc7a03adc51000a480e275baf9fcf0c1a964f7164427a281521034b969ec/uv-0.3.3-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:de158a3e5c5d09d774d5170442392e4fff85b5f2864662c3e904815b35e1158a", size = 10694027 }, - { url = "https://files.pythonhosted.org/packages/a3/c1/fc8779d0811cd8a3f7f103a1a0bb4f6c5999c96944b293295b7bbe709c16/uv-0.3.3-py3-none-musllinux_1_1_armv7l.whl", hash = "sha256:ba6971490edd30fd41e416892741cb70a121438c9a4d8a4ea6aa68d737ae15c0", size = 10522350 }, - { url = "https://files.pythonhosted.org/packages/55/29/d484123df8be79b7c4836c6fa72878fcff87e7d37f81a6c559502fd6224f/uv-0.3.3-py3-none-musllinux_1_1_i686.whl", hash = "sha256:97bb2c052429944e2bcf91933f019ab68a7dde136983f643b9c95c80a2751b27", size = 10923617 }, - { url = "https://files.pythonhosted.org/packages/1b/29/2e9e8f7b0e3b933708c0a4db3204f3bf126bcdd7a56910f35c0cd9374a10/uv-0.3.3-py3-none-musllinux_1_1_ppc64le.whl", hash = "sha256:28adae4f63059fd6a3dd9f5c7b6e5e3aeff07a7c50dd87ad0ba26bce640a9369", size = 12677415 }, - { url = "https://files.pythonhosted.org/packages/cb/00/d928e387b2c6dfbf9475cd6224d80d0c5cda5f6e0d511a2cc3428499a194/uv-0.3.3-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:ae7722f4eb6ceb996474e9d66321c1f816e3be4f5ec8c05c829aa12b61629940", size = 11629339 }, - { url = "https://files.pythonhosted.org/packages/54/7b/cd2f063f64ff8f7df3242f157ba30eba09532a83b8a70b483717f41bc90b/uv-0.3.3-py3-none-win32.whl", hash = "sha256:405bfff62e9c87af28fe3a32d48d4be1c4f59cbf5bf5ea2d5c05f51c75c31723", size = 10996200 }, - { url = "https://files.pythonhosted.org/packages/67/be/fb8dd066fe77f537dbe869c413d2fbc329d60205830110e79edbd0cbd10e/uv-0.3.3-py3-none-win_amd64.whl", hash = "sha256:94ae6b56bba1d51669e7a76d742ce94c774b17447656d564fe5acc82c1fd3f6e", size = 12139904 }, +version = "0.5.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/46/95/ba000f161640015c9f2ecc2681f38eb161b8edac600a0451b36e4ad15aa4/uv-0.5.5.tar.gz", hash = "sha256:7f8db4bdf7eaef6be271457c4b2a167f41ad115434944a09f5034018a29b4093", size = 2324705 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6d/91/ac61feea1b11e4dc342a4fd174f311b628a04ec3b4614a24676c4d214bd1/uv-0.5.5-py3-none-linux_armv6l.whl", hash = "sha256:d091e88a9c2c830169c3ccf95fd972759e0ab629dacc2d5eff525e5ba3583904", size = 13887911 }, + { url = "https://files.pythonhosted.org/packages/84/18/461af22fd1f80f86548013639ab345810dbf35aa44dff1732c6faf311a48/uv-0.5.5-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:f0bfc7ced2fe0c85b3070dfa219072a1406133e18aab2f2fe10b6455ede0f8b2", size = 13900075 }, + { url = "https://files.pythonhosted.org/packages/68/5f/7a236ad48f81c580691f9e5f28dd47289a9819f18410f12ee3c621791efd/uv-0.5.5-py3-none-macosx_11_0_arm64.whl", hash = "sha256:553901e95cb5a4da1da19e288c29c5f886793f981750400e5cef48e3031b970b", size = 12869530 }, + { url = "https://files.pythonhosted.org/packages/94/d6/d6f441fd041fb4883332b999481896e28502b51681bcb786a001fb1e4a50/uv-0.5.5-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_1_aarch64.whl", hash = "sha256:a4f0c7647187044056dc6f6f5d31b01f445d8695eb7d2f442b29fd5c9216a56f", size = 13158009 }, + { url = "https://files.pythonhosted.org/packages/9b/3d/cc1e44e14266bbdb71eb020d14454f4f24f72fcc2eb84a52bf809e030918/uv-0.5.5-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:34e894c922ba29a59bbe812a458a7095a575f76b87dfc362e0c3f4f650d6f631", size = 13676515 }, + { url = "https://files.pythonhosted.org/packages/10/5f/b81ed7ab715687a790b9b06a6f4e2781d7f7222840eead0392c3ef6f80ea/uv-0.5.5-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f5569798fc8eaad58fbb4fb70ced8f09ebe607fbbfb95fa42c559f57bbe0cabd", size = 14245499 }, + { url = "https://files.pythonhosted.org/packages/f7/e1/ce5a88bc5ed61ee310a8e0acc3fa3032280bb2d49514fd48b801bb36f96f/uv-0.5.5-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:59d53cce11718ce5d5367afc8c93ebcfc5e1cddfa4a44aedbf08d08d9b738381", size = 14920230 }, + { url = "https://files.pythonhosted.org/packages/03/84/6fa2deb5bed9dab815cb7f57e14885ecf8de22249b992f9c4ea5dd042c28/uv-0.5.5-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3dee9517ebba13d07d8f139c439c5ff63e438d31ebda4d7eb0af8d0f0cc6a181", size = 14701845 }, + { url = "https://files.pythonhosted.org/packages/59/b2/7078d52a73c1e13d984c22fae1888993e5cd3f40cea029ab2666d79d92a7/uv-0.5.5-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:29286cd6b9f8e040d02894a67c6b6304811ea393ca9dfade109e93cf4b3b842c", size = 18963098 }, + { url = "https://files.pythonhosted.org/packages/b9/89/a91d927574ce2103d22b7beab319468d915a1d04757cf82b6eaf79b56a10/uv-0.5.5-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f7f04ae5a5430873d8610d8ea0a5d35df92e60bf701f80b3cf24857e0ac5e72", size = 14442788 }, + { url = "https://files.pythonhosted.org/packages/46/3d/2c5a9d362771aeef13c2ba1c9b1267b469e11331b874486f03f6c6fc5eb1/uv-0.5.5-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:5a47345ccafc0105b2f0cc22fcb0bb05be4d0e60df67f5beea28069b0bb372c8", size = 13394955 }, + { url = "https://files.pythonhosted.org/packages/cf/92/8d646385401472e7358cdf0fc86015edc9bf9132c9b79d7e2a11c300dd84/uv-0.5.5-py3-none-musllinux_1_1_armv7l.whl", hash = "sha256:b55d507bfe2bd2330c41680e4b0077972381f40975a59b53007254196abc4477", size = 13639522 }, + { url = "https://files.pythonhosted.org/packages/da/23/5e00b71f9c8b9c16f0947bf84b71265bafdf24947d2e271a657da00a0c6a/uv-0.5.5-py3-none-musllinux_1_1_i686.whl", hash = "sha256:365715e7247c2cd8ef661e8f96927b181248f689c07e48b076c9dbc78a4a0877", size = 13957451 }, + { url = "https://files.pythonhosted.org/packages/02/38/0c624a8d89416fa6c849c6670066c74f420aa898eafdf7cefd3adf77d686/uv-0.5.5-py3-none-musllinux_1_1_ppc64le.whl", hash = "sha256:0314a4b9a25bf00afe4e5472c338c8c6bd34688c23d63ce1ad35462cf087b492", size = 15840287 }, + { url = "https://files.pythonhosted.org/packages/a8/bd/1a81700d2555be504f0b1ff82f86d666384805e354c8eec2fdf7558d0cf9/uv-0.5.5-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:f4e9ddcffc29f009f692cda699912b02f6a12089d741b71d2fcd0b181eb71c5d", size = 14560282 }, + { url = "https://files.pythonhosted.org/packages/cd/71/c0b137c62a5a8ab5ecc0a8f505b77e5a05d5b94fd9da7560a247dac000f3/uv-0.5.5-py3-none-win32.whl", hash = "sha256:9af7018430da1f0960eee1592c820c343e2619f2d71f66c3be62da330826c537", size = 13810875 }, + { url = "https://files.pythonhosted.org/packages/e3/d8/56dbbe07aba3cf561fff52b8ed75ce7b694a0710ab676fae4cd7fbf1bdae/uv-0.5.5-py3-none-win_amd64.whl", hash = "sha256:69e15f24493d86c3a2da3764891e35a033ceda09404c1f9b386671d509db95f3", size = 15604848 }, ] [[package]] name = "virtualenv" -version = "20.26.3" +version = "20.28.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "distlib" }, { name = "filelock" }, { name = "platformdirs" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/68/60/db9f95e6ad456f1872486769c55628c7901fb4de5a72c2f7bdd912abf0c1/virtualenv-20.26.3.tar.gz", hash = "sha256:4c43a2a236279d9ea36a0d76f98d84bd6ca94ac4e0f4a3b9d46d05e10fea542a", size = 9057588 } +sdist = { url = "https://files.pythonhosted.org/packages/bf/75/53316a5a8050069228a2f6d11f32046cfa94fbb6cc3f08703f59b873de2e/virtualenv-20.28.0.tar.gz", hash = "sha256:2c9c3262bb8e7b87ea801d715fae4495e6032450c71d2309be9550e7364049aa", size = 7650368 } wheels = [ - { url = "https://files.pythonhosted.org/packages/07/4d/410156100224c5e2f0011d435e477b57aed9576fc7fe137abcf14ec16e11/virtualenv-20.26.3-py3-none-any.whl", hash = "sha256:8cc4a31139e796e9a7de2cd5cf2489de1217193116a8fd42328f1bd65f434589", size = 5684792 }, + { url = "https://files.pythonhosted.org/packages/10/f9/0919cf6f1432a8c4baa62511f8f8da8225432d22e83e3476f5be1a1edc6e/virtualenv-20.28.0-py3-none-any.whl", hash = "sha256:23eae1b4516ecd610481eda647f3a7c09aea295055337331bb4e6892ecce47b0", size = 4276702 }, ] [[package]] @@ -1575,14 +1628,14 @@ wheels = [ [[package]] name = "wcmatch" -version = "9.0" +version = "10.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "bracex" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/55/90/a29d5b359c128c48e32a2dc161464d6aab822df82d3bf1c1286231eda3c2/wcmatch-9.0.tar.gz", hash = "sha256:567d66b11ad74384954c8af86f607857c3bdf93682349ad32066231abd556c92", size = 113625 } +sdist = { url = "https://files.pythonhosted.org/packages/41/ab/b3a52228538ccb983653c446c1656eddf1d5303b9cb8b9aef6a91299f862/wcmatch-10.0.tar.gz", hash = "sha256:e72f0de09bba6a04e0de70937b0cf06e55f36f37b3deb422dfaf854b867b840a", size = 115578 } wheels = [ - { url = "https://files.pythonhosted.org/packages/ea/da/0633223f30f5db6e52236567e09c28e37ff455b3dfbe0843029206e609e6/wcmatch-9.0-py3-none-any.whl", hash = "sha256:af25922e2b6dbd1550fa37a4c8de7dd558d6c1bb330c641de9b907b9776cb3c4", size = 39139 }, + { url = "https://files.pythonhosted.org/packages/ab/df/4ee467ab39cc1de4b852c212c1ed3becfec2e486a51ac1ce0091f85f38d7/wcmatch-10.0-py3-none-any.whl", hash = "sha256:0dd927072d03c0a6527a20d2e6ad5ba8d0380e60870c383bc533b71744df7b7a", size = 39347 }, ] [[package]] @@ -1596,33 +1649,51 @@ wheels = [ [[package]] name = "wrapt" -version = "1.16.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/95/4c/063a912e20bcef7124e0df97282a8af3ff3e4b603ce84c481d6d7346be0a/wrapt-1.16.0.tar.gz", hash = "sha256:5f370f952971e7d17c7d1ead40e49f32345a7f7a5373571ef44d800d06b1899d", size = 53972 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/92/17/224132494c1e23521868cdd57cd1e903f3b6a7ba6996b7b8f077ff8ac7fe/wrapt-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5eb404d89131ec9b4f748fa5cfb5346802e5ee8836f57d516576e61f304f3b7b", size = 37614 }, - { url = "https://files.pythonhosted.org/packages/6a/d7/cfcd73e8f4858079ac59d9db1ec5a1349bc486ae8e9ba55698cc1f4a1dff/wrapt-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9090c9e676d5236a6948330e83cb89969f433b1943a558968f659ead07cb3b36", size = 38316 }, - { url = "https://files.pythonhosted.org/packages/7e/79/5ff0a5c54bda5aec75b36453d06be4f83d5cd4932cc84b7cb2b52cee23e2/wrapt-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94265b00870aa407bd0cbcfd536f17ecde43b94fb8d228560a1e9d3041462d73", size = 86322 }, - { url = "https://files.pythonhosted.org/packages/c4/81/e799bf5d419f422d8712108837c1d9bf6ebe3cb2a81ad94413449543a923/wrapt-1.16.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2058f813d4f2b5e3a9eb2eb3faf8f1d99b81c3e51aeda4b168406443e8ba809", size = 79055 }, - { url = "https://files.pythonhosted.org/packages/62/62/30ca2405de6a20448ee557ab2cd61ab9c5900be7cbd18a2639db595f0b98/wrapt-1.16.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98b5e1f498a8ca1858a1cdbffb023bfd954da4e3fa2c0cb5853d40014557248b", size = 87291 }, - { url = "https://files.pythonhosted.org/packages/49/4e/5d2f6d7b57fc9956bf06e944eb00463551f7d52fc73ca35cfc4c2cdb7aed/wrapt-1.16.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:14d7dc606219cdd7405133c713f2c218d4252f2a469003f8c46bb92d5d095d81", size = 90374 }, - { url = "https://files.pythonhosted.org/packages/a6/9b/c2c21b44ff5b9bf14a83252a8b973fb84923764ff63db3e6dfc3895cf2e0/wrapt-1.16.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:49aac49dc4782cb04f58986e81ea0b4768e4ff197b57324dcbd7699c5dfb40b9", size = 83896 }, - { url = "https://files.pythonhosted.org/packages/14/26/93a9fa02c6f257df54d7570dfe8011995138118d11939a4ecd82cb849613/wrapt-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:418abb18146475c310d7a6dc71143d6f7adec5b004ac9ce08dc7a34e2babdc5c", size = 91738 }, - { url = "https://files.pythonhosted.org/packages/a2/5b/4660897233eb2c8c4de3dc7cefed114c61bacb3c28327e64150dc44ee2f6/wrapt-1.16.0-cp312-cp312-win32.whl", hash = "sha256:685f568fa5e627e93f3b52fda002c7ed2fa1800b50ce51f6ed1d572d8ab3e7fc", size = 35568 }, - { url = "https://files.pythonhosted.org/packages/5c/cc/8297f9658506b224aa4bd71906447dea6bb0ba629861a758c28f67428b91/wrapt-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:dcdba5c86e368442528f7060039eda390cc4091bfd1dca41e8046af7c910dda8", size = 37653 }, - { url = "https://files.pythonhosted.org/packages/ff/21/abdedb4cdf6ff41ebf01a74087740a709e2edb146490e4d9beea054b0b7a/wrapt-1.16.0-py3-none-any.whl", hash = "sha256:6906c4100a8fcbf2fa735f6059214bb13b97f75b1a61777fcf6432121ef12ef1", size = 23362 }, +version = "1.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/24/a1/fc03dca9b0432725c2e8cdbf91a349d2194cf03d8523c124faebe581de09/wrapt-1.17.0.tar.gz", hash = "sha256:16187aa2317c731170a88ef35e8937ae0f533c402872c1ee5e6d079fcf320801", size = 55542 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/85/82/518605474beafff11f1a34759f6410ab429abff9f7881858a447e0d20712/wrapt-1.17.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:89fc28495896097622c3fc238915c79365dd0ede02f9a82ce436b13bd0ab7569", size = 38904 }, + { url = "https://files.pythonhosted.org/packages/80/6c/17c3b2fed28edfd96d8417c865ef0b4c955dc52c4e375d86f459f14340f1/wrapt-1.17.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:875d240fdbdbe9e11f9831901fb8719da0bd4e6131f83aa9f69b96d18fae7504", size = 88622 }, + { url = "https://files.pythonhosted.org/packages/4a/11/60ecdf3b0fd3dca18978d89acb5d095a05f23299216e925fcd2717c81d93/wrapt-1.17.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5ed16d95fd142e9c72b6c10b06514ad30e846a0d0917ab406186541fe68b451", size = 80920 }, + { url = "https://files.pythonhosted.org/packages/d2/50/dbef1a651578a3520d4534c1e434989e3620380c1ad97e309576b47f0ada/wrapt-1.17.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18b956061b8db634120b58f668592a772e87e2e78bc1f6a906cfcaa0cc7991c1", size = 89170 }, + { url = "https://files.pythonhosted.org/packages/44/a2/78c5956bf39955288c9e0dd62e807b308c3aa15a0f611fbff52aa8d6b5ea/wrapt-1.17.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:daba396199399ccabafbfc509037ac635a6bc18510ad1add8fd16d4739cdd106", size = 86748 }, + { url = "https://files.pythonhosted.org/packages/99/49/2ee413c78fc0bdfebe5bee590bf3becdc1fab0096a7a9c3b5c9666b2415f/wrapt-1.17.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:4d63f4d446e10ad19ed01188d6c1e1bb134cde8c18b0aa2acfd973d41fcc5ada", size = 79734 }, + { url = "https://files.pythonhosted.org/packages/c0/8c/4221b7b270e36be90f0930fe15a4755a6ea24093f90b510166e9ed7861ea/wrapt-1.17.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8a5e7cc39a45fc430af1aefc4d77ee6bad72c5bcdb1322cfde852c15192b8bd4", size = 87552 }, + { url = "https://files.pythonhosted.org/packages/4c/6b/1aaccf3efe58eb95e10ce8e77c8909b7a6b0da93449a92c4e6d6d10b3a3d/wrapt-1.17.0-cp312-cp312-win32.whl", hash = "sha256:0a0a1a1ec28b641f2a3a2c35cbe86c00051c04fffcfcc577ffcdd707df3f8635", size = 36647 }, + { url = "https://files.pythonhosted.org/packages/b3/4f/243f88ac49df005b9129194c6511b3642818b3e6271ddea47a15e2ee4934/wrapt-1.17.0-cp312-cp312-win_amd64.whl", hash = "sha256:3c34f6896a01b84bab196f7119770fd8466c8ae3dfa73c59c0bb281e7b588ce7", size = 38830 }, + { url = "https://files.pythonhosted.org/packages/67/9c/38294e1bb92b055222d1b8b6591604ca4468b77b1250f59c15256437644f/wrapt-1.17.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:714c12485aa52efbc0fc0ade1e9ab3a70343db82627f90f2ecbc898fdf0bb181", size = 38904 }, + { url = "https://files.pythonhosted.org/packages/78/b6/76597fb362cbf8913a481d41b14b049a8813cd402a5d2f84e57957c813ae/wrapt-1.17.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da427d311782324a376cacb47c1a4adc43f99fd9d996ffc1b3e8529c4074d393", size = 88608 }, + { url = "https://files.pythonhosted.org/packages/bc/69/b500884e45b3881926b5f69188dc542fb5880019d15c8a0df1ab1dfda1f7/wrapt-1.17.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba1739fb38441a27a676f4de4123d3e858e494fac05868b7a281c0a383c098f4", size = 80879 }, + { url = "https://files.pythonhosted.org/packages/52/31/f4cc58afe29eab8a50ac5969963010c8b60987e719c478a5024bce39bc42/wrapt-1.17.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e711fc1acc7468463bc084d1b68561e40d1eaa135d8c509a65dd534403d83d7b", size = 89119 }, + { url = "https://files.pythonhosted.org/packages/aa/9c/05ab6bf75dbae7a9d34975fb6ee577e086c1c26cde3b6cf6051726d33c7c/wrapt-1.17.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:140ea00c87fafc42739bd74a94a5a9003f8e72c27c47cd4f61d8e05e6dec8721", size = 86778 }, + { url = "https://files.pythonhosted.org/packages/0e/6c/4b8d42e3db355603d35fe5c9db79c28f2472a6fd1ccf4dc25ae46739672a/wrapt-1.17.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:73a96fd11d2b2e77d623a7f26e004cc31f131a365add1ce1ce9a19e55a1eef90", size = 79793 }, + { url = "https://files.pythonhosted.org/packages/69/23/90e3a2ee210c0843b2c2a49b3b97ffcf9cad1387cb18cbeef9218631ed5a/wrapt-1.17.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0b48554952f0f387984da81ccfa73b62e52817a4386d070c75e4db7d43a28c4a", size = 87606 }, + { url = "https://files.pythonhosted.org/packages/5f/06/3683126491ca787d8d71d8d340e775d40767c5efedb35039d987203393b7/wrapt-1.17.0-cp313-cp313-win32.whl", hash = "sha256:498fec8da10e3e62edd1e7368f4b24aa362ac0ad931e678332d1b209aec93045", size = 36651 }, + { url = "https://files.pythonhosted.org/packages/f1/bc/3bf6d2ca0d2c030d324ef9272bea0a8fdaff68f3d1fa7be7a61da88e51f7/wrapt-1.17.0-cp313-cp313-win_amd64.whl", hash = "sha256:fd136bb85f4568fffca995bd3c8d52080b1e5b225dbf1c2b17b66b4c5fa02838", size = 38835 }, + { url = "https://files.pythonhosted.org/packages/ce/b5/251165c232d87197a81cd362eeb5104d661a2dd3aa1f0b33e4bf61dda8b8/wrapt-1.17.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:17fcf043d0b4724858f25b8826c36e08f9fb2e475410bece0ec44a22d533da9b", size = 40146 }, + { url = "https://files.pythonhosted.org/packages/89/33/1e1bdd3e866eeb73d8c4755db1ceb8a80d5bd51ee4648b3f2247adec4e67/wrapt-1.17.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4a557d97f12813dc5e18dad9fa765ae44ddd56a672bb5de4825527c847d6379", size = 113444 }, + { url = "https://files.pythonhosted.org/packages/9f/7c/94f53b065a43f5dc1fbdd8b80fd8f41284315b543805c956619c0b8d92f0/wrapt-1.17.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0229b247b0fc7dee0d36176cbb79dbaf2a9eb7ecc50ec3121f40ef443155fb1d", size = 101246 }, + { url = "https://files.pythonhosted.org/packages/62/5d/640360baac6ea6018ed5e34e6e80e33cfbae2aefde24f117587cd5efd4b7/wrapt-1.17.0-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8425cfce27b8b20c9b89d77fb50e368d8306a90bf2b6eef2cdf5cd5083adf83f", size = 109320 }, + { url = "https://files.pythonhosted.org/packages/e3/cf/6c7a00ae86a2e9482c91170aefe93f4ccda06c1ac86c4de637c69133da59/wrapt-1.17.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9c900108df470060174108012de06d45f514aa4ec21a191e7ab42988ff42a86c", size = 110193 }, + { url = "https://files.pythonhosted.org/packages/cd/cc/aa718df0d20287e8f953ce0e2f70c0af0fba1d3c367db7ee8bdc46ea7003/wrapt-1.17.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:4e547b447073fc0dbfcbff15154c1be8823d10dab4ad401bdb1575e3fdedff1b", size = 100460 }, + { url = "https://files.pythonhosted.org/packages/f7/16/9f3ac99fe1f6caaa789d67b4e3c562898b532c250769f5255fa8b8b93983/wrapt-1.17.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:914f66f3b6fc7b915d46c1cc424bc2441841083de01b90f9e81109c9759e43ab", size = 106347 }, + { url = "https://files.pythonhosted.org/packages/64/85/c77a331b2c06af49a687f8b926fc2d111047a51e6f0b0a4baa01ff3a673a/wrapt-1.17.0-cp313-cp313t-win32.whl", hash = "sha256:a4192b45dff127c7d69b3bdfb4d3e47b64179a0b9900b6351859f3001397dabf", size = 37971 }, + { url = "https://files.pythonhosted.org/packages/05/9b/b2469f8be9efed24283fd7b9eeb8e913e9bc0715cf919ea8645e428ab7af/wrapt-1.17.0-cp313-cp313t-win_amd64.whl", hash = "sha256:4f643df3d4419ea3f856c5c3f40fec1d65ea2e89ec812c83f7767c8730f9827a", size = 40755 }, + { url = "https://files.pythonhosted.org/packages/4b/d9/a8ba5e9507a9af1917285d118388c5eb7a81834873f45df213a6fe923774/wrapt-1.17.0-py3-none-any.whl", hash = "sha256:d2c63b93548eda58abf5188e505ffed0229bf675f7c3090f8e36ad55b8cbc371", size = 23592 }, ] [[package]] name = "yamlns" -version = "0.11.0" +version = "0.12.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pytest" }, + { name = "pytest-cov" }, { name = "pyyaml" }, { name = "setuptools" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/44/b4/3b8b64cb198d6bffbee674687043ad1dd1b40193c0de1d93efe689641e65/yamlns-0.11.0.tar.gz", hash = "sha256:d5cad27ada26d0872c4124c87601a71150e75f699ff347f53f1c2ec3b329de49", size = 20479 } +sdist = { url = "https://files.pythonhosted.org/packages/e9/e2/d969ecc12c640621d32ebd7d20a373766929200f13fa193eb47ebd55776b/yamlns-0.12.0.tar.gz", hash = "sha256:c6869decfd520bf59ab35b3610e123b2aa7fbf403674d03e94bc40f484b178c4", size = 20920 } wheels = [ - { url = "https://files.pythonhosted.org/packages/e1/c2/cec459e3a0deda1570220f1481014d5fe480d129be10bc0571432a6a5e72/yamlns-0.11.0-py3-none-any.whl", hash = "sha256:abc4b013bf82670c5d6f0d70afb286037f48762b52942bc4d7e1c0274844ca50", size = 20525 }, + { url = "https://files.pythonhosted.org/packages/b8/1a/a46cca13f58a65d04586ca9dd8617a63b09738fb910cbc328315abd3367d/yamlns-0.12.0-py3-none-any.whl", hash = "sha256:40ad707c02ed01aad684a5e22f6e37c13fe4a4487cf0f4670f5f93d1b32d58c8", size = 21070 }, ]